First commit

This commit is contained in:
DarkCat09 2023-01-26 17:43:34 +04:00
commit 33b4738baa
2 changed files with 207 additions and 0 deletions

2
.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
files/
.vscode/

205
autoytdlp.sh Executable file
View 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