[FEATURE] inspect subcommand
This commit is contained in:
parent
b2056bec5d
commit
91116aa6f7
3 changed files with 180 additions and 0 deletions
|
|
@ -24,6 +24,8 @@ from ytdl_sub.utils.file_handler import FileHandler
|
||||||
from ytdl_sub.utils.file_lock import working_directory_lock
|
from ytdl_sub.utils.file_lock import working_directory_lock
|
||||||
from ytdl_sub.utils.logger import Logger
|
from ytdl_sub.utils.logger import Logger
|
||||||
|
|
||||||
|
# pylint: disable=too-many-branches
|
||||||
|
|
||||||
logger = Logger.get()
|
logger = Logger.get()
|
||||||
|
|
||||||
# View is a command to run a simple dry-run on a URL using the `_view` preset.
|
# View is a command to run a simple dry-run on a URL using the `_view` preset.
|
||||||
|
|
@ -196,6 +198,32 @@ def _view_url_from_cli(config: ConfigFile, url: str, split_chapters: bool) -> Su
|
||||||
return subscription
|
return subscription
|
||||||
|
|
||||||
|
|
||||||
|
def _inspect(
|
||||||
|
config: ConfigFile,
|
||||||
|
subscription_paths: List[str],
|
||||||
|
subscription_matches: List[str],
|
||||||
|
subscription_override_dict: Dict,
|
||||||
|
) -> None:
|
||||||
|
|
||||||
|
subscriptions: List[Subscription] = []
|
||||||
|
for path in subscription_paths:
|
||||||
|
subscriptions += Subscription.from_file_path(
|
||||||
|
config=config,
|
||||||
|
subscription_path=path,
|
||||||
|
subscription_matches=subscription_matches,
|
||||||
|
subscription_override_dict=subscription_override_dict,
|
||||||
|
)
|
||||||
|
|
||||||
|
if len(subscriptions) > 1:
|
||||||
|
print(
|
||||||
|
"inspect can only inspect a single subscription. "
|
||||||
|
"Use --match to filter for a single one"
|
||||||
|
)
|
||||||
|
return
|
||||||
|
|
||||||
|
print(subscriptions[0].resolved_yaml())
|
||||||
|
|
||||||
|
|
||||||
def main() -> List[Subscription]:
|
def main() -> List[Subscription]:
|
||||||
"""
|
"""
|
||||||
Entrypoint for ytdl-sub, without the error handling
|
Entrypoint for ytdl-sub, without the error handling
|
||||||
|
|
@ -222,6 +250,21 @@ def main() -> List[Subscription]:
|
||||||
|
|
||||||
subscriptions: List[Subscription] = []
|
subscriptions: List[Subscription] = []
|
||||||
|
|
||||||
|
if args.subparser == "inspect":
|
||||||
|
subscription_override_dict = {}
|
||||||
|
if args.dl_override:
|
||||||
|
subscription_override_dict = DownloadArgsParser.from_dl_override(
|
||||||
|
override=args.dl_override, config=config
|
||||||
|
).to_subscription_dict()
|
||||||
|
|
||||||
|
_inspect(
|
||||||
|
config=config,
|
||||||
|
subscription_paths=args.subscription_paths,
|
||||||
|
subscription_matches=args.match,
|
||||||
|
subscription_override_dict=subscription_override_dict,
|
||||||
|
)
|
||||||
|
return []
|
||||||
|
|
||||||
# If transaction log file is specified, make sure we can open it
|
# If transaction log file is specified, make sure we can open it
|
||||||
_maybe_validate_transaction_log_file(transaction_log_file_path=args.transaction_log)
|
_maybe_validate_transaction_log_file(transaction_log_file_path=args.transaction_log)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -225,3 +225,49 @@ view_parser.add_argument("url", help="URL to view source variables for")
|
||||||
###################################################################################################
|
###################################################################################################
|
||||||
# CLI-TO-SUB PARSER
|
# CLI-TO-SUB PARSER
|
||||||
cli_to_sub_parser = subparsers.add_parser("cli-to-sub")
|
cli_to_sub_parser = subparsers.add_parser("cli-to-sub")
|
||||||
|
|
||||||
|
###################################################################################################
|
||||||
|
# INSPECT PARSER
|
||||||
|
|
||||||
|
|
||||||
|
class InspectArguments:
|
||||||
|
INCLUDE_OVERRIDES = CLIArgument(
|
||||||
|
short="-v",
|
||||||
|
long="--include-overrides",
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
inspect_parser = subparsers.add_parser("inspect")
|
||||||
|
inspect_parser.add_argument(
|
||||||
|
InspectArguments.INCLUDE_OVERRIDES.short,
|
||||||
|
InspectArguments.INCLUDE_OVERRIDES.long,
|
||||||
|
action="store_true",
|
||||||
|
help="Whether to show override variables.",
|
||||||
|
default=False,
|
||||||
|
)
|
||||||
|
inspect_parser.add_argument(
|
||||||
|
MainArguments.MATCH.short,
|
||||||
|
MainArguments.MATCH.long,
|
||||||
|
dest="match",
|
||||||
|
nargs="+",
|
||||||
|
action="extend",
|
||||||
|
type=str,
|
||||||
|
help="match subscription names to one or more substrings, and only run those subscriptions",
|
||||||
|
default=[],
|
||||||
|
)
|
||||||
|
|
||||||
|
inspect_parser.add_argument(
|
||||||
|
"subscription_paths",
|
||||||
|
metavar="SUBPATH",
|
||||||
|
nargs="*",
|
||||||
|
help="path to subscription files, uses subscriptions.yaml if not provided",
|
||||||
|
default=["subscriptions.yaml"],
|
||||||
|
)
|
||||||
|
|
||||||
|
inspect_parser.add_argument(
|
||||||
|
SubArguments.OVERRIDE.short,
|
||||||
|
SubArguments.OVERRIDE.long,
|
||||||
|
type=str,
|
||||||
|
help="override all subscription config values using `dl` syntax, "
|
||||||
|
"i.e. --dl-override='--ytdl_options.max_downloads 3'",
|
||||||
|
)
|
||||||
|
|
|
||||||
91
tests/integration/cli/test_inspect.py
Normal file
91
tests/integration/cli/test_inspect.py
Normal file
|
|
@ -0,0 +1,91 @@
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
import yaml
|
||||||
|
from conftest import mock_run_from_cli
|
||||||
|
|
||||||
|
|
||||||
|
class TestInspect:
|
||||||
|
@pytest.mark.parametrize("config_provided", [True, False])
|
||||||
|
def test_inspect_command(
|
||||||
|
self,
|
||||||
|
capsys,
|
||||||
|
default_config_path: str,
|
||||||
|
tv_show_subscriptions_path: Path,
|
||||||
|
output_directory: str,
|
||||||
|
config_provided: bool,
|
||||||
|
):
|
||||||
|
args = f"--config {default_config_path} " if config_provided else ""
|
||||||
|
args += f"inspect {tv_show_subscriptions_path} --match 'Jake Trains'"
|
||||||
|
|
||||||
|
subscriptions = mock_run_from_cli(args=args)
|
||||||
|
assert len(subscriptions) == 0
|
||||||
|
|
||||||
|
captured_as_dict = yaml.safe_load(capsys.readouterr().out)
|
||||||
|
assert captured_as_dict == {
|
||||||
|
"chapters": {
|
||||||
|
"allow_chapters_from_comments": False,
|
||||||
|
"embed_chapters": True,
|
||||||
|
"enable": "True",
|
||||||
|
"force_key_frames": False,
|
||||||
|
},
|
||||||
|
"date_range": {"breaks": "True", "enable": "True", "type": "upload_date"},
|
||||||
|
"download": [
|
||||||
|
{
|
||||||
|
"download_reverse": "True",
|
||||||
|
"include_sibling_metadata": False,
|
||||||
|
"playlist_thumbnails": [
|
||||||
|
{
|
||||||
|
"name": "{avatar_uncropped_thumbnail_file_name}",
|
||||||
|
"uid": "avatar_uncropped",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "{banner_uncropped_thumbnail_file_name}",
|
||||||
|
"uid": "banner_uncropped",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
"source_thumbnails": [
|
||||||
|
{
|
||||||
|
"name": "{avatar_uncropped_thumbnail_file_name}",
|
||||||
|
"uid": "avatar_uncropped",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "{banner_uncropped_thumbnail_file_name}",
|
||||||
|
"uid": "banner_uncropped",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
"url": "https://www.youtube.com/@JakeTrains",
|
||||||
|
"variables": {},
|
||||||
|
"webpage_url": "{modified_webpage_url}",
|
||||||
|
"ytdl_options": {},
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"file_convert": {"convert_to": "mp4", "convert_with": "yt-dlp", "enable": "True"},
|
||||||
|
"format": "(bv*[ext=mp4][vcodec~='^((he|a)vc|h26[45])']+ba[ext=m4a]) / (bv[ext=mp4]*+ba[ext=m4a]/b)",
|
||||||
|
"output_options": {
|
||||||
|
"download_archive_name": ".ytdl-sub-Jake Trains-download-archive.json",
|
||||||
|
"file_name": "{episode_file_path}.{ext}",
|
||||||
|
"info_json_name": "{episode_file_path}.{info_json_ext}",
|
||||||
|
"keep_files_date_eval": "{episode_date_standardized}",
|
||||||
|
"maintain_download_archive": True,
|
||||||
|
"output_directory": f"{output_directory}/Jake Trains",
|
||||||
|
"preserve_mtime": False,
|
||||||
|
"thumbnail_name": "{thumbnail_file_name}",
|
||||||
|
},
|
||||||
|
"throttle_protection": {
|
||||||
|
"enable": True,
|
||||||
|
"sleep_per_download_s": {"max": "28.4", "min": "13.8"},
|
||||||
|
"sleep_per_request_s": {"max": "0.75", "min": "0.0"},
|
||||||
|
"sleep_per_subscription_s": {"max": "26.1", "min": "16.3"},
|
||||||
|
},
|
||||||
|
"video_tags": {
|
||||||
|
"contentRating": "{episode_content_rating}",
|
||||||
|
"date": "{episode_date_standardized}",
|
||||||
|
"episode_id": "{episode_number}",
|
||||||
|
"genre": "{tv_show_genre}",
|
||||||
|
"show": "{tv_show_name}",
|
||||||
|
"synopsis": "{episode_plot}",
|
||||||
|
"title": "{episode_title}",
|
||||||
|
"year": "{episode_year}",
|
||||||
|
},
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue