diff --git a/fastanime/Utility/downloader/downloader.py b/fastanime/Utility/downloader/downloader.py index 7d5b951..0cd833a 100644 --- a/fastanime/Utility/downloader/downloader.py +++ b/fastanime/Utility/downloader/downloader.py @@ -45,6 +45,7 @@ class YtDLPDownloader: prompt=True, force_ffmpeg=False, hls_use_mpegts=False, + hls_use_h264=False, ): """Helper function that downloads anime given url and path details @@ -104,7 +105,21 @@ class YtDLPDownloader: } if hls_use_mpegts: options = options | { - "hls_use_mpegts": hls_use_mpegts, + "hls_use_mpegts": True, + "outtmpl": ".".join(options["outtmpl"].split(".")[:-1]) + ".ts", # force .ts extension + } + elif hls_use_h264: + options = options | { + "external_downloader_args": options["external_downloader_args"] | { + "ffmpeg_o1": [ + "-c:v", "copy", + "-c:a", "aac", + "-bsf:a", "aac_adtstoasc", + "-q:a", "1", + "-ac", "2", + "-af", "loudnorm=I=-22:TP=-2.5:LRA=11,alimiter=limit=-1.5dB", # prevent clipping from HE-AAC to AAC convertion + ], + } } with yt_dlp.YoutubeDL(options) as ydl: diff --git a/fastanime/cli/commands/anilist/download.py b/fastanime/cli/commands/anilist/download.py index 3060905..02a2897 100644 --- a/fastanime/cli/commands/anilist/download.py +++ b/fastanime/cli/commands/anilist/download.py @@ -116,7 +116,12 @@ from .data import ( @click.option( "--hls-use-mpegts", is_flag=True, - help="Use mpegts for hls streams (useful for some streams: see Docs) (this option forces --force-ffmpeg to be True)", + help="Use mpegts for hls streams, resulted in .ts file (useful for some streams: see Docs) (this option forces --force-ffmpeg to be True)", +) +@click.option( + "--hls-use-h264", + is_flag=True, + help="Use H.264 (MP4) for hls streams, resulted in .mp4 file (useful for some streams: see Docs) (this option forces --force-ffmpeg to be True)", ) @click.option( "--max-results", "-M", type=int, help="The maximum number of results to show" @@ -143,13 +148,14 @@ def download( prompt, force_ffmpeg, hls_use_mpegts, + hls_use_h264, max_results, ): from rich import print from ....anilist import AniList - force_ffmpeg |= hls_use_mpegts + force_ffmpeg |= (hls_use_mpegts or hls_use_h264) success, anilist_search_results = AniList.search( query=title, @@ -379,6 +385,7 @@ def download( prompt=prompt, force_ffmpeg=force_ffmpeg, hls_use_mpegts=hls_use_mpegts, + hls_use_h264=hls_use_h264, ) except Exception as e: print(e) diff --git a/fastanime/cli/commands/download.py b/fastanime/cli/commands/download.py index c14a620..ecf5ecc 100644 --- a/fastanime/cli/commands/download.py +++ b/fastanime/cli/commands/download.py @@ -122,7 +122,12 @@ if TYPE_CHECKING: @click.option( "--hls-use-mpegts", is_flag=True, - help="Use mpegts for hls streams (useful for some streams: see Docs) (this option forces --force-ffmpeg to be True)", + help="Use mpegts for hls streams, resulted in .ts file (useful for some streams: see Docs) (this option forces --force-ffmpeg to be True)", +) +@click.option( + "--hls-use-h264", + is_flag=True, + help="Use H.264 (MP4) for hls streams, resulted in .mp4 file (useful for some streams: see Docs) (this option forces --force-ffmpeg to be True)", ) @click.pass_obj def download( @@ -139,6 +144,7 @@ def download( prompt, force_ffmpeg, hls_use_mpegts, + hls_use_h264, ): import time @@ -158,7 +164,7 @@ def download( move_preferred_subtitle_lang_to_top, ) - force_ffmpeg |= hls_use_mpegts + force_ffmpeg |= (hls_use_mpegts or hls_use_h264) anime_provider = AnimeProvider(config.provider) anilist_anime_info = None @@ -201,6 +207,7 @@ def download( prompt, force_ffmpeg, hls_use_mpegts, + hls_use_h264, ) return search_results = search_results["results"] @@ -254,6 +261,7 @@ def download( prompt, force_ffmpeg, hls_use_mpegts, + hls_use_h264, ) return @@ -389,6 +397,7 @@ def download( prompt=prompt, force_ffmpeg=force_ffmpeg, hls_use_mpegts=hls_use_mpegts, + hls_use_h264=hls_use_h264, ) except Exception as e: print(e)