Add title filter

This commit is contained in:
Yan Lin 2025-10-08 10:06:43 +02:00
parent ffdfa74abe
commit 770118152a

View file

@ -135,6 +135,7 @@ in
local custom_retries="" local custom_retries=""
local min_duration="" local min_duration=""
local max_duration="" local max_duration=""
local title_filter=""
local url="" local url=""
# Parse arguments # Parse arguments
@ -160,6 +161,10 @@ in
max_duration="$2" max_duration="$2"
shift 2 shift 2
;; ;;
--title)
title_filter="$2"
shift 2
;;
youtube|bilibili) youtube|bilibili)
platform="$1" platform="$1"
shift shift
@ -186,11 +191,13 @@ in
echo " -r, --retries <number> Number of retry attempts (0 for no retries, default: 10)" echo " -r, --retries <number> Number of retry attempts (0 for no retries, default: 10)"
echo " --min <minutes> Minimum video duration in minutes" echo " --min <minutes> Minimum video duration in minutes"
echo " --max <minutes> Maximum video duration in minutes" echo " --max <minutes> Maximum video duration in minutes"
echo " --title <string> Filter videos by title (case-insensitive)"
echo "" echo ""
echo "Examples:" echo "Examples:"
echo " dlv youtube <url> - Download single YouTube video" echo " dlv youtube <url> - Download single YouTube video"
echo " dlv youtube -p <url> - Download YouTube playlist" echo " dlv youtube -p <url> - Download YouTube playlist"
echo " dlv youtube --min 5 --max 30 <url> - Download videos between 5-30 minutes" echo " dlv youtube --min 5 --max 30 <url> - Download videos between 5-30 minutes"
echo " dlv youtube --title \"tutorial\" <url> - Download videos with 'tutorial' in title"
echo " dlv bilibili -p -n 10 <url> - Download first 10 videos from playlist" echo " dlv bilibili -p -n 10 <url> - Download first 10 videos from playlist"
return 1 return 1
fi fi
@ -213,8 +220,11 @@ in
;; ;;
esac esac
# Build duration filter # Build match filter (duration and/or title)
local duration_filter="" local match_filter=""
local filter_parts=()
# Duration filter
if [[ -n "$min_duration" ]] || [[ -n "$max_duration" ]]; then if [[ -n "$min_duration" ]] || [[ -n "$max_duration" ]]; then
local min_sec="" local min_sec=""
local max_sec="" local max_sec=""
@ -222,14 +232,26 @@ in
[[ -n "$max_duration" ]] && max_sec=$((max_duration * 60)) [[ -n "$max_duration" ]] && max_sec=$((max_duration * 60))
if [[ -n "$min_sec" ]] && [[ -n "$max_sec" ]]; then 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 elif [[ -n "$min_sec" ]]; then
duration_filter="--match-filter \"duration >= $min_sec\"" filter_parts+=("duration >= $min_sec")
elif [[ -n "$max_sec" ]]; then elif [[ -n "$max_sec" ]]; then
duration_filter="--match-filter \"duration <= $max_sec\"" filter_parts+=("duration <= $max_sec")
fi fi
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 # Build output template based on playlist mode
local output_template local output_template
if [[ "$playlist_mode" == true ]]; then if [[ "$playlist_mode" == true ]]; then
@ -253,7 +275,7 @@ in
echo "Output directory: $DOWNLOAD_DIR/$platform_name" echo "Output directory: $DOWNLOAD_DIR/$platform_name"
# Build command # Build command
local cmd="yt-dlp $platform_flags $duration_filter" local cmd="yt-dlp $platform_flags $match_filter"
if [[ "$playlist_mode" == true ]]; then if [[ "$playlist_mode" == true ]]; then
cmd="$cmd --yes-playlist" cmd="$cmd --yes-playlist"
fi fi