From 770118152a9fd51ff328554ba19b523663cea1d2 Mon Sep 17 00:00:00 2001 From: Yan Lin Date: Wed, 8 Oct 2025 10:06:43 +0200 Subject: [PATCH] Add title filter --- modules/yt-dlp.nix | 42 ++++++++++++++++++++++++++++++++---------- 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/modules/yt-dlp.nix b/modules/yt-dlp.nix index f14f1f7..a2aad97 100644 --- a/modules/yt-dlp.nix +++ b/modules/yt-dlp.nix @@ -135,6 +135,7 @@ in local custom_retries="" local min_duration="" local max_duration="" + local title_filter="" local url="" # Parse arguments @@ -160,6 +161,10 @@ in max_duration="$2" shift 2 ;; + --title) + title_filter="$2" + shift 2 + ;; youtube|bilibili) platform="$1" shift @@ -186,12 +191,14 @@ in echo " -r, --retries Number of retry attempts (0 for no retries, default: 10)" echo " --min Minimum video duration in minutes" echo " --max Maximum video duration in minutes" + echo " --title Filter videos by title (case-insensitive)" echo "" echo "Examples:" - echo " dlv youtube - Download single YouTube video" - echo " dlv youtube -p - Download YouTube playlist" - echo " dlv youtube --min 5 --max 30 - Download videos between 5-30 minutes" - echo " dlv bilibili -p -n 10 - Download first 10 videos from playlist" + echo " dlv youtube - Download single YouTube video" + echo " dlv youtube -p - Download YouTube playlist" + echo " dlv youtube --min 5 --max 30 - Download videos between 5-30 minutes" + echo " dlv youtube --title \"tutorial\" - Download videos with 'tutorial' in title" + echo " dlv bilibili -p -n 10 - Download first 10 videos from playlist" return 1 fi @@ -213,8 +220,11 @@ in ;; esac - # Build duration filter - local duration_filter="" + # Build match filter (duration and/or title) + local match_filter="" + local filter_parts=() + + # Duration filter if [[ -n "$min_duration" ]] || [[ -n "$max_duration" ]]; then local min_sec="" local max_sec="" @@ -222,14 +232,26 @@ in [[ -n "$max_duration" ]] && max_sec=$((max_duration * 60)) if [[ -n "$min_sec" ]] && [[ -n "$max_sec" ]]; then - duration_filter="--match-filter \"duration >= $min_sec & duration <= $max_sec\"" + filter_parts+=("duration >= $min_sec & duration <= $max_sec") elif [[ -n "$min_sec" ]]; then - duration_filter="--match-filter \"duration >= $min_sec\"" + filter_parts+=("duration >= $min_sec") elif [[ -n "$max_sec" ]]; then - duration_filter="--match-filter \"duration <= $max_sec\"" + filter_parts+=("duration <= $max_sec") fi fi + # Title filter + if [[ -n "$title_filter" ]]; then + filter_parts+=("title ~= '(?i).*$title_filter.*'") + fi + + # Combine filters + if [[ ''${#filter_parts[@]} -gt 0 ]]; then + local combined_filter + combined_filter=$(IFS=" & "; echo "''${filter_parts[*]}") + match_filter="--match-filter \"$combined_filter\"" + fi + # Build output template based on playlist mode local output_template if [[ "$playlist_mode" == true ]]; then @@ -253,7 +275,7 @@ in echo "Output directory: $DOWNLOAD_DIR/$platform_name" # Build command - local cmd="yt-dlp $platform_flags $duration_filter" + local cmd="yt-dlp $platform_flags $match_filter" if [[ "$playlist_mode" == true ]]; then cmd="$cmd --yes-playlist" fi