-
Notifications
You must be signed in to change notification settings - Fork 1
/
mass-yt-dlp.sh
133 lines (123 loc) · 3.42 KB
/
mass-yt-dlp.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#!/usr/bin/env bash
# Default arguments
default_parallel=4
output_dir="./videos"
# Function to display usage help
usage() {
echo "Usage: $0 --help"
echo " $0 -n <number_of_processes> [-u <'url1 url2 ...'>] [-f <path_to_file>] [-o <output_directory>]"
echo ""
echo "Options:"
echo " -n Set the number of parallel processes (default is 4)"
echo " -u Provide the URLs enclosed in quotes and separated by spaces"
echo " -f Provide the path to a file containing one URL per line"
echo " -o Specify the output directory where new directories will be placed (default is ./videos)"
echo " -h Show this help message and exit"
exit 1
}
# Check if yt-dlp is installed
check_ytdlp() {
if ! command -v yt-dlp &> /dev/null; then
echo "yt-dlp could not be found."
read -p "Would you like to install yt-dlp using pip? (y/N) " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
pip install yt-dlp || { echo "Failed to install yt-dlp. Please install it manually."; exit 1; }
else
echo "Please install yt-dlp and rerun the script."
exit 1
fi
fi
}
# Parse named arguments
while :; do
case "$1" in
-o)
if [ "$2" ]; then
output_dir=$2
shift 2
else
echo "Error: -o requires a non-empty argument."
usage
fi
;;
-n)
if [ "$2" ]; then
parallel_processes=$2
shift 2
else
echo "Error: -n requires a numerical argument."
usage
fi
;;
-u)
if [ "$2" ]; then
IFS=' ' read -r -a urls <<< "$2"
shift 2
else
echo "Error: -u requires a string argument."
usage
fi
;;
-f)
if [ "$2" ]; then
file_path=$2
if [ ! -f "$file_path" ]; then
echo "Error: The file specified does not exist."
exit 2
fi
while IFS= read -r line; do
file_urls+=("$line")
done < "$file_path"
shift 2
else
echo "Error: -f requires a file path argument."
usage
fi
;;
-h)
usage
;;
--)
shift
break
;;
-*)
echo "Error: Unknown option: $1" >&2
usage
;;
*)
break
;;
esac
done
# Run the yt-dlp check function after arguments parsing
check_ytdlp
# Combine file URLs and command line URLs
if [ "${#file_urls[@]}" -gt 0 ] && [ "${#urls[@]}" -gt 0 ]; then
urls=("${urls[@]}" "${file_urls[@]}")
elif [ "${#file_urls[@]}" -gt 0 ]; then
urls=("${file_urls[@]}")
fi
# Check for required arguments
if [ -z "${urls+x}" ]; then
echo "Error: URLs are required, either through -u or -f option."
usage
fi
# Set the default number of parallel processes if not provided
if [ -z "${parallel_processes+x}" ]; then
parallel_processes=$default_parallel
fi
# Generate video directories and run yt-dlp in parallel processes
for url in "${urls[@]}"; do
title=$(yt-dlp --get-filename -o "%(title)s" -- "$url")
dirname="${title//[^a-zA-Z0-9_]/_}" # Replace disallowed characters with underscores
full_output_path="$output_dir/$dirname" # Prepend the specified output directory
mkdir -p "$full_output_path" # Create directory including the output directory path
yt-dlp --write-auto-sub --convert-subs srt --remux-video mp4 -o "$full_output_path/%(title)s.%(ext)s" -- "$url" &
while [ $(jobs -r | wc -l) -ge "$parallel_processes" ]; do
sleep 1
done
done
# Wait for all background processes to finish
wait