From 49d2dcffd240f77252761af6d3cef911373d34c2 Mon Sep 17 00:00:00 2001 From: chu23465 <130033130+chu23465@users.noreply.github.com> Date: Wed, 9 Apr 2025 11:37:22 +0530 Subject: [PATCH] Added --closest-resolution flag --- vinetrimmer/commands/dl.py | 19 +++++++++++++++++-- vinetrimmer/key_store.db | Bin 331776 -> 331776 bytes 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/vinetrimmer/commands/dl.py b/vinetrimmer/commands/dl.py index 44bdcdc..74740f3 100644 --- a/vinetrimmer/commands/dl.py +++ b/vinetrimmer/commands/dl.py @@ -126,7 +126,7 @@ def get_cdm(log, service, profile=None, cdm_name=None): def get_service_config(service): """Get both service config and service secrets as one merged dictionary.""" - print(filenames.service_config.format(service=service.lower())) + #print(filenames.service_config.format(service=service.lower())) # This line is probably where the error while loading config under Linux originates #TO-DO service_config = load_yaml(filenames.service_config.format(service=service.lower())) user_config = (load_yaml(filenames.user_service_config.format(service=service.lower())) or load_yaml(filenames.user_service_config.format(service=service))) @@ -195,6 +195,8 @@ def get_credentials(service, profile="default"): help="Profile to use when multiple profiles are defined for a service.") @click.option("-q", "--quality", callback=quality_param, default=None, help="Download Resolution, defaults to best available.") +@click.option("-cr", "--closest-resolution", is_flag=True, default=False, + help="If resolution specified not found, defaults to closest resolution available") @click.option("-v", "--vcodec", callback=vcodec_param, default="H264", help="Video Codec, defaults to H264.") @click.option("-a", "--acodec", callback=acodec_param, default=None, @@ -306,7 +308,7 @@ def dl(ctx, profile, cdm, *_, **__): @dl.result_callback() @click.pass_context -def result(ctx, service, quality, range_, wanted, alang, slang, audio_only, subs_only, chapters_only, audio_description, +def result(ctx, service, quality, closest_resolution, range_, wanted, alang, slang, audio_only, subs_only, chapters_only, audio_description, list_, keys, cache, no_cache, no_subs, no_audio, no_video, no_chapters, atmos, vbitrate: int, abitrate: int, no_mux, mux, selected, latest_episode, *_, **__): def ccextractor(): log.info("Extracting EIA-608 captions from stream with CCExtractor") @@ -390,6 +392,16 @@ def result(ctx, service, quality, range_, wanted, alang, slang, audio_only, subs title.tracks.print() try: + # Modified video track selection to choose closest resolution if exact match not found + if quality and closest_resolution: + available_resolutions = [int(track.height) for track in title.tracks.videos] + if not available_resolutions: + log.error(" - No video tracks available") + continue + if quality not in available_resolutions: + closest_res = min(available_resolutions, key=lambda x: abs(x - quality)) + log.warning(f" - No {quality}p resolution available, using closest available: {closest_res}p") + quality = closest_res #title.tracks.select_videos(by_quality=quality, by_range=range_, one_only=True) title.tracks.select_videos(by_quality=quality, by_vbitrate=vbitrate, by_range=range_, one_only=True) title.tracks.select_audios(by_language=alang, by_bitrate=abitrate, with_descriptive=audio_description) @@ -507,6 +519,9 @@ def result(ctx, service, quality, range_, wanted, alang, slang, audio_only, subs session_id=session_id ) assert license + # Convert bytes to string if necessary + if isinstance(license, bytes): + license_response = license_response.decode('utf-8') ctx.obj.cdm.parse_license( session_id, license diff --git a/vinetrimmer/key_store.db b/vinetrimmer/key_store.db index 4274ba61474a3ee760410a3385be4d4571153237..87b8c01a0e9e8f1f24d74fbf515288f9ffacc4af 100644 GIT binary patch delta 1217 zcmbu8%}Z557>DniQLpzZQXrQi!&ElZyL4@ z7~~L=+*xd}r`8}F<;ZBxOH8RFB93h_Hw-&w9dV2k?Y$(D6Xp?xTY1EsxelwXOL=hv zK25^*K+?Io@H;_8m?Ury?$vV_?$&b$?$mP|Zr5`QZq;)$8rpmZRk@|SUcjMsAC4v+ zBjM^ktR%_n{N_F!OBz*>OgZk9v@Yc|>X32P%-M{lS~F%OA;#&KNlzP-#+(VvS4*pHbzb z<7k`{Wf1mSNRq;xeBmp+GXamZ-wwroaC+@%|8V>8{h4ZOp<2C_Hd$n-{Y@%Cjewq^ znXx*t*(DFPPFM+NM-Pajbz-cxDFug#BMoAcMFspPPJMFh;Eq@7MBn7L9wrVqJU01X Phxxu1k`MQ_y!rGWA>dg{ delta 324 zcmZozAkwfvWP&tf)kGO*#;T18UH**6H^26me86nVaC$ns0i*GB8v{lIdA|9aOE_Qi zMRIg=xH7adAOSbV1q^P}-7^@Swx2d&tYv5FVw^1h++q5;3`W=O=Pejb-9=0p>KVAb zxS6^3aFufDbH3nQ$Qd