diff --git a/archivebox/plugins/ytdlp/config.json b/archivebox/plugins/ytdlp/config.json index be6f89a4..69ae5566 100644 --- a/archivebox/plugins/ytdlp/config.json +++ b/archivebox/plugins/ytdlp/config.json @@ -41,20 +41,31 @@ "type": "array", "items": {"type": "string"}, "default": [ + "--restrict-filenames", + "--trim-filenames", "128", + "--write-description", "--write-info-json", "--write-thumbnail", "--write-sub", - "--embed-subs", - "--write-auto-sub" + "--write-auto-subs", + "--convert-subs=srt", + "--yes-playlist", + "--continue", + "--no-abort-on-error", + "--ignore-errors", + "--geo-bypass", + "--add-metadata", + "--no-progress", + "-o", "%(title)s.%(ext)s" ], "x-aliases": ["MEDIA_ARGS"], - "description": "Default yt-dlp arguments" + "description": "Default yt-dlp arguments (override to customize behavior)" }, "YTDLP_EXTRA_ARGS": { "type": "string", "default": "", "x-aliases": ["MEDIA_EXTRA_ARGS"], - "description": "Extra arguments for yt-dlp (space-separated)" + "description": "Extra arguments for yt-dlp (space-separated, appended after YTDLP_ARGS)" } } } diff --git a/archivebox/plugins/ytdlp/on_Snapshot__63_ytdlp.bg.py b/archivebox/plugins/ytdlp/on_Snapshot__63_ytdlp.bg.py index 6a5282e0..6471645d 100644 --- a/archivebox/plugins/ytdlp/on_Snapshot__63_ytdlp.bg.py +++ b/archivebox/plugins/ytdlp/on_Snapshot__63_ytdlp.bg.py @@ -9,7 +9,8 @@ Environment variables: YTDLP_BINARY: Path to yt-dlp binary YTDLP_TIMEOUT: Timeout in seconds (default: 3600 for large downloads) YTDLP_CHECK_SSL_VALIDITY: Whether to check SSL certificates (default: True) - YTDLP_EXTRA_ARGS: Extra arguments for yt-dlp (space-separated) + YTDLP_ARGS: JSON array of yt-dlp arguments (overrides defaults) + YTDLP_EXTRA_ARGS: Extra arguments for yt-dlp (space-separated, appended) YTDLP_MAX_SIZE: Maximum file size (default: 750m) # Feature toggles (with backwards-compatible aliases) @@ -66,26 +67,39 @@ def has_staticfile_output() -> bool: return staticfile_dir.exists() and any(staticfile_dir.iterdir()) -# Default yt-dlp args (from old YTDLP_CONFIG) -def get_ytdlp_default_args(max_size: str = '750m') -> list[str]: - """Build default yt-dlp arguments.""" - return [ - '--restrict-filenames', - '--trim-filenames', '128', - '--write-description', - '--write-info-json', - '--write-thumbnail', - '--write-sub', - '--write-auto-subs', - '--convert-subs=srt', - '--yes-playlist', - '--continue', - '--no-abort-on-error', - '--ignore-errors', - '--geo-bypass', - '--add-metadata', - f'--format=(bv*+ba/b)[filesize<={max_size}][filesize_approx<=?{max_size}]/(bv*+ba/b)', - ] +# Default yt-dlp args (can be overridden via YTDLP_ARGS env var) +YTDLP_DEFAULT_ARGS = [ + '--restrict-filenames', + '--trim-filenames', '128', + '--write-description', + '--write-info-json', + '--write-thumbnail', + '--write-sub', + '--write-auto-subs', + '--convert-subs=srt', + '--yes-playlist', + '--continue', + '--no-abort-on-error', + '--ignore-errors', + '--geo-bypass', + '--add-metadata', + '--no-progress', + '-o', '%(title)s.%(ext)s', +] + + +def get_ytdlp_args() -> list[str]: + """Get yt-dlp arguments from YTDLP_ARGS env var or use defaults.""" + ytdlp_args_str = get_env('YTDLP_ARGS', '') + if ytdlp_args_str: + try: + # Try to parse as JSON array + args = json.loads(ytdlp_args_str) + if isinstance(args, list): + return [str(arg) for arg in args] + except json.JSONDecodeError: + pass + return YTDLP_DEFAULT_ARGS def save_ytdlp(url: str, binary: str) -> tuple[bool, str | None, str]: @@ -103,12 +117,12 @@ def save_ytdlp(url: str, binary: str) -> tuple[bool, str | None, str]: # Output directory is current directory (hook already runs in output dir) output_dir = Path(OUTPUT_DIR) - # Build command (later options take precedence) + # Build command using configurable YTDLP_ARGS (later options take precedence) cmd = [ binary, - *get_ytdlp_default_args(max_size), - '--no-progress', - '-o', '%(title)s.%(ext)s', + *get_ytdlp_args(), + # Format with max_size limit (appended after YTDLP_ARGS so it can be overridden by YTDLP_EXTRA_ARGS) + f'--format=(bv*+ba/b)[filesize<={max_size}][filesize_approx<=?{max_size}]/(bv*+ba/b)', ] if not check_ssl: