From 4617f26ded2d743f07e69da5310dfe41a81fee6b Mon Sep 17 00:00:00 2001 From: Kalioz Date: Tue, 14 Feb 2023 21:21:38 +0100 Subject: [PATCH] feat: add option to download subtitles The option also include a way to convert the subtitles to srt, to support older video players --- .dockerignore | 3 +++ Makefile | 13 +++++++++++++ templates/index.html | 5 +++++ youtube-dl-server.png | Bin 22146 -> 41661 bytes youtube-dl-server.py | 39 +++++++++++++++++++++++++++++++++++++-- 5 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 .dockerignore create mode 100644 Makefile diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..9eaf7a40 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,3 @@ +.venv +__pycache__ +.vscode \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..f9e0eb16 --- /dev/null +++ b/Makefile @@ -0,0 +1,13 @@ +.PHONY=venv +venv: + test -d .venv || python3 -m venv .venv + . .venv/bin/activate + +requirements: + pip install -r requirements.txt + +build: + docker build . --tag youtube-dl-server:develop + +run: + docker run -v /tmp/youtube-dl:/youtube-dl -p 8080:8080 youtube-dl-server:develop diff --git a/templates/index.html b/templates/index.html index 25967026..2657fded 100644 --- a/templates/index.html +++ b/templates/index.html @@ -76,6 +76,11 @@

youtube-dl

+ diff --git a/youtube-dl-server.png b/youtube-dl-server.png index 1766139480a9ef83d189fc5212b20329630d7055..8dba5dfccd37c110d638663f7fe304ff75452f7d 100644 GIT binary patch literal 41661 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

fOJ5E#~ozho>GKu~8{~1P~(A!?LJ&C$_ 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 DZ1H>8 literal 22146 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 diff --git a/youtube-dl-server.py b/youtube-dl-server.py index c31a898f..575dde2c 100644 --- a/youtube-dl-server.py +++ b/youtube-dl-server.py @@ -23,6 +23,8 @@ "YDL_OUTPUT_TEMPLATE": config("YDL_OUTPUT_TEMPLATE", cast=str, default="/youtube-dl/%(title).200s [%(id)s].%(ext)s"), "YDL_ARCHIVE_FILE": config("YDL_ARCHIVE_FILE", default=None), "YDL_UPDATE_TIME": config("YDL_UPDATE_TIME", cast=bool, default=True), + "YDL_WRITE_SUBTITLES": config("YDL_WRITE_SUBTITLES", cast=bool, default=False), + "YDL_SUBTITLES_SRT": config("YDL_SUBTITLES_SRT", cast=bool, default=False), } @@ -38,7 +40,10 @@ async def q_put(request): form = await request.form() url = form.get("url").strip() ui = form.get("ui") - options = {"format": form.get("format")} + options = { + "format": form.get("format"), + "subtitles": form.get("subtitles") + } if not url: return JSONResponse( @@ -82,6 +87,7 @@ def get_ydl_options(request_options): } requested_format = request_options.get("format", "bestvideo") + requested_subtitles = request_options.get("subtitles", "no-subtitles") if requested_format in ["aac", "flac", "mp3", "m4a", "opus", "vorbis", "wav"]: request_vars["YDL_EXTRACT_AUDIO_FORMAT"] = requested_format @@ -89,6 +95,11 @@ def get_ydl_options(request_options): request_vars["YDL_EXTRACT_AUDIO_FORMAT"] = "best" elif requested_format in ["mp4", "flv", "webm", "ogg", "mkv", "avi"]: request_vars["YDL_RECODE_VIDEO_FORMAT"] = requested_format + + if requested_subtitles != "no-subtitles": + request_vars["YDL_WRITE_SUBTITLES"] = True + if requested_subtitles == "all-srt": + request_vars["YDL_SUBTITLES_SRT"] = True ydl_vars = app_defaults | request_vars @@ -110,6 +121,25 @@ def get_ydl_options(request_options): "preferedformat": ydl_vars["YDL_RECODE_VIDEO_FORMAT"], } ) + + if ydl_vars["YDL_SUBTITLES_SRT"] == True and ydl_vars["YDL_WRITE_SUBTITLES"] == True: + # convert the subtitles to SRT - required if your video player cannot read new formats (e.g. Kodi 18) + postprocessors.append( + { + "key": "FFmpegSubtitlesConvertor", + 'format': "srt" + } + ) + + if ydl_vars["YDL_WRITE_SUBTITLES"] == True: + # merge the subtitles in the output file + postprocessors.append( + { + "key": "FFmpegEmbedSubtitle", + 'already_have_subtitle': False + } + ) + return { "format": ydl_vars["YDL_FORMAT"], @@ -117,11 +147,16 @@ def get_ydl_options(request_options): "outtmpl": ydl_vars["YDL_OUTPUT_TEMPLATE"], "download_archive": ydl_vars["YDL_ARCHIVE_FILE"], "updatetime": ydl_vars["YDL_UPDATE_TIME"] == "True", + "writesubtitles": ydl_vars["YDL_WRITE_SUBTITLES"], + "subtitleslangs": ["all"], + "allsubtitles": True } def download(url, request_options): - with YoutubeDL(get_ydl_options(request_options)) as ydl: + opts = get_ydl_options(request_options) + print(f"downloading {url} with options {opts}") + with YoutubeDL(opts) as ydl: ydl.download([url])