First commit
This commit is contained in:
commit
33b4738baa
2 changed files with 207 additions and 0 deletions
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
|||
files/
|
||||
.vscode/
|
205
autoytdlp.sh
Executable file
205
autoytdlp.sh
Executable file
|
@ -0,0 +1,205 @@
|
|||
#!/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
|
Reference in a new issue