206 lines
4.1 KiB
Bash
206 lines
4.1 KiB
Bash
|
#!/usr/bin/env bash
|
||
|
|
||
|
watching=1
|
||
|
links=()
|
||
|
|
||
|
# -------
|
||
|
# Helpers
|
||
|
|
||
|
getcb () {
|
||
|
xclip -selection clipboard -o
|
||
|
}
|
||
|
|
||
|
sigint () {
|
||
|
echo
|
||
|
if [[ $watching == 1 ]]; then
|
||
|
watching=0
|
||
|
else
|
||
|
echo 'Ctrl+C was pressed'
|
||
|
echo 'Exit'
|
||
|
exit 0
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
ytlink () {
|
||
|
echo -n "$1" | \
|
||
|
sed -E 's#^https?://([A-Za-z0-9.-]+/watch\?v=|(yt\.be|youtu\.be)/)([A-Za-z0-9_-]+)|.+#\3#'
|
||
|
}
|
||
|
|
||
|
bold () {
|
||
|
echo -e "\033[1m$1\033[0m"
|
||
|
}
|
||
|
|
||
|
# ------------------------
|
||
|
# yt-dlp and piped api wrappers
|
||
|
|
||
|
dlwith_piped () {
|
||
|
|
||
|
bold 'Choose the type of stream: 1.audio or 2.video'
|
||
|
read -r stream_num
|
||
|
if [[ $stream_num == 1 ]]; then
|
||
|
stream='audio'
|
||
|
maxby='.bitrate'
|
||
|
else
|
||
|
stream='video'
|
||
|
maxby='.width*.height'
|
||
|
fi
|
||
|
|
||
|
jqexpr=".${stream}Streams|map(select(.videoOnly==false))|max_by(${maxby})"
|
||
|
|
||
|
echo
|
||
|
bold 'Here is an expression for JQ utility.'
|
||
|
echo 'Press Enter to leave it intact, or type another expression.'
|
||
|
echo "$jqexpr"
|
||
|
read -r newexpr
|
||
|
if [[ $newexpr == "" ]]; then
|
||
|
:
|
||
|
else
|
||
|
jqexpr="$newexpr"
|
||
|
fi
|
||
|
|
||
|
echo
|
||
|
bold 'Started'
|
||
|
echo
|
||
|
|
||
|
for link in "${links[@]}"; do
|
||
|
|
||
|
echo "Parsing link"
|
||
|
video_id=$(ytlink "$link")
|
||
|
|
||
|
echo "Requesting URL for $link"
|
||
|
video_obj=$(curl -sL "https://ytapi.dc09.ru/streams/$video_id" | jq "$jqexpr")
|
||
|
|
||
|
video_url=$(echo "$video_obj" | jq ".url" | sed s/^\"// | sed s/\"$//)
|
||
|
|
||
|
video_mime=$(echo "$video_obj" | jq ".mimeType")
|
||
|
case "$video_mime" in
|
||
|
"\"audio/mp4\"")
|
||
|
ext='m4a'
|
||
|
;;
|
||
|
"\"audio/webm\"")
|
||
|
ext='webm'
|
||
|
;;
|
||
|
"\"video/mp4\"")
|
||
|
ext='mp4'
|
||
|
;;
|
||
|
"\"video/webm\"")
|
||
|
ext='webm'
|
||
|
;;
|
||
|
*)
|
||
|
ext='mp4'
|
||
|
;;
|
||
|
esac
|
||
|
|
||
|
video_file="./files/${video_id}.${ext}"
|
||
|
|
||
|
echo "Downloading with wget"
|
||
|
wget -O "$video_file" "$video_url"
|
||
|
|
||
|
echo
|
||
|
done
|
||
|
}
|
||
|
|
||
|
dlwith_ytdlp () {
|
||
|
|
||
|
bold 'Enter the format to download:'
|
||
|
echo 'Use "b" without quotes for video and audio'
|
||
|
echo ' "bv" to download only video'
|
||
|
echo ' "ba" to download only audio'
|
||
|
echo 'details: https://github.com/yt-dlp/yt-dlp#format-selection'
|
||
|
read -r format
|
||
|
|
||
|
echo
|
||
|
bold 'Started'
|
||
|
echo
|
||
|
|
||
|
for link in "${links[@]}"; do
|
||
|
|
||
|
video_id=$(ytlink "$link")
|
||
|
if [[ $video_id != "" ]]; then
|
||
|
# Convert YT and Piped links to YT
|
||
|
newlink="https://youtube.com/watch?v=$video_id"
|
||
|
else
|
||
|
newlink="$link"
|
||
|
fi
|
||
|
|
||
|
echo "URL: $newlink"
|
||
|
|
||
|
yt-dlp -f "$format" -o "%(id)s.%(ext)s" -P ./files/ "$newlink"
|
||
|
done
|
||
|
}
|
||
|
|
||
|
# ---------
|
||
|
# Functions
|
||
|
|
||
|
# A title and a small manual
|
||
|
title () {
|
||
|
echo
|
||
|
echo -ne '\033[1m'
|
||
|
echo -ne '***'
|
||
|
echo -ne '\033[1;34m'
|
||
|
echo -ne ' Auto YT-DLP Script '
|
||
|
echo -ne '\033[0m\033[1m'
|
||
|
echo -ne '***'
|
||
|
echo -e '\033[0m'
|
||
|
}
|
||
|
|
||
|
usage () {
|
||
|
echo 'Copy video links to the clipboard,'
|
||
|
echo 'the script will automatically'
|
||
|
echo 'detect them.'
|
||
|
echo 'Then press Ctrl+C'
|
||
|
echo 'to stop clipboard watcher.'
|
||
|
echo
|
||
|
}
|
||
|
|
||
|
# Watching for the clipboard content
|
||
|
watch () {
|
||
|
prev=$(getcb)
|
||
|
while [[ $watching == 1 ]]; do
|
||
|
cb=$(getcb)
|
||
|
if [[ "$cb" != "$prev" ]]; then
|
||
|
prev="$cb"
|
||
|
if [[ "$cb" =~ ^https?:// ]]; then
|
||
|
links+=("$cb")
|
||
|
echo "Found link: $cb"
|
||
|
fi
|
||
|
fi
|
||
|
sleep 0.01
|
||
|
done
|
||
|
}
|
||
|
|
||
|
# ----
|
||
|
# Main
|
||
|
|
||
|
main() {
|
||
|
# Setup
|
||
|
trap 'sigint' SIGINT
|
||
|
|
||
|
# Some info
|
||
|
title
|
||
|
usage
|
||
|
|
||
|
# Clipboard watching
|
||
|
watch
|
||
|
|
||
|
# Create a directory for downloaded files
|
||
|
mkdir -p ./files
|
||
|
|
||
|
# Ask for downloading method
|
||
|
bold 'The script can work with 1.yt-dlp and 2.Piped API'
|
||
|
echo -n 'Which one you prefer? (1 or 2) '
|
||
|
read -r downloader
|
||
|
echo
|
||
|
if [[ $downloader == 2 ]]; then
|
||
|
dlwith_piped
|
||
|
else
|
||
|
dlwith_ytdlp
|
||
|
fi
|
||
|
|
||
|
# Waiting for the response
|
||
|
echo 'Press Ctrl+C to exit'
|
||
|
while true; do :; done
|
||
|
}
|
||
|
|
||
|
main
|