Last active
March 18, 2023 17:14
-
-
Save Nikos410/a0b7beca115b589eef43a1be7b81a9cc to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/zsh | |
set -e | |
setopt EXTENDED_GLOB | |
echo "URL?" | |
read url | |
uuid=$(uuidgen) | |
work_directory="/tmp/yt-dl/$uuid" | |
result_directory=~/Downloads/youtube-dl | |
mkdir -p "${work_directory}" | |
mkdir -p "${result_directory}" | |
trap "rm -rf '$work_directory'; exit" ERR EXIT | |
echo "" | |
echo "Using work directory $work_directory" | |
echo "Using base result directory $result_directory" | |
echo "" | |
echo "#######################################" | |
echo "# Step 1: Downloading playlist tracks #" | |
echo "#######################################" | |
echo "" | |
yt-dlp \ | |
--write-thumbnail \ | |
-o "pl_thumbnail:$work_directory/thumb.%(ext)s" \ | |
-o "thumbnail:" \ | |
-f bestaudio \ | |
--extract-audio \ | |
-o "$work_directory/audio_%(playlist_index)s---%(disc_number)s---%(track_number)s---%(uploader)s---%(album_artist)s---%(artist)s---%(playlist_title)s---%(title)s---%(track)s.%(ext)s" \ | |
"${url}" \ | |
|| true | |
echo "" | |
echo "##############################" | |
echo "# Step 2: Analyzing metadata #" | |
echo "##############################" | |
echo "" | |
album_artist="NA" | |
artist="NA" | |
for audio_file in $work_directory/audio_*; do | |
audio_file_name_with_prefix="${audio_file:t:r}" | |
audio_file_name_without_prefix="${audio_file_name_with_prefix//audio_/}" | |
album_artist_part="${audio_file_name_without_prefix[(ws:---:)5]}" | |
if [[ $album_artist == "NA" && $album_artist_part != "NA" ]] | |
then | |
album_artist="$album_artist_part" | |
fi | |
artist_part="${audio_file_name_without_prefix[(ws:---:)6]}" | |
if [[ $artist == "NA" && $artist_part != "NA" ]] | |
then | |
artist="$artist_part" | |
fi | |
done | |
if [[ $album_artist == "NA" && $artist != "NA" ]] | |
then | |
album_artist="${artist[(ws:, :)1]}" | |
echo "Found artist but no album artist. Using first artist as album artist." | |
fi | |
first_audio_file=($work_directory/audio_*(N[1])) | |
first_audio_file_name_with_prefix="${first_audio_file:t:r}" | |
first_audio_file_name_without_prefix="${first_audio_file_name_with_prefix//audio_/}" | |
album="${first_audio_file_name_without_prefix[(ws:---:)7]}" | |
if [[ $album_artist == "NA" ]] | |
then | |
album_artist="${first_audio_file_name_without_prefix[(ws:---:)4]}" | |
echo "Found no artist or album artist. Using uploader." | |
fi | |
album_artist="${album_artist// - Topic/}" | |
album_artist="${album_artist//Vevo/}" | |
album_artist="${album_artist// Vevo/}" | |
album_artist="${album_artist//VEVO/}" | |
album_artist="${album_artist// VEVO/}" | |
album_artist="${album_artist//Official/}" | |
album_artist="${album_artist// Official/}" | |
thumbnail_file=($work_directory/thumb.*(N[1])) | |
echo "" | |
echo "===================>" | |
echo " Common info:" | |
echo " - Album artist: $album_artist" | |
echo " - Album: $album" | |
echo " - Thumbnail file: $thumbnail_file" | |
echo "===================>" | |
echo "" | |
read -s -k '?Press any key to continue.' | |
echo " ok" | |
echo "" | |
echo "######################################" | |
echo "# Step 3: Setting per-track metadata #" | |
echo "######################################" | |
echo "" | |
first_track=1 | |
for audio_file in $work_directory/audio_*; do | |
audio_file_name_with_prefix="${audio_file:t:r}" | |
audio_file_extension="${audio_file:t:e}" | |
audio_file_name="${audio_file_name_with_prefix//audio_/}" | |
track_title="${audio_file_name[(ws:---:)9]}" | |
if [[ $track_title == "NA" ]] | |
then | |
track_title="${audio_file_name[(ws:---:)8]}" | |
# Cleanup | |
for str in "$album_artist" "Official Music Video Remastered" "Official Remastered Video" "Official Music Video" "Official Video" "Music Video" "Official Audio" "Official visualizer" "Full AUdio" "Offizielles Musikvideo" "Musikvideo" "Official Lyric Video" "Official" "Full Album Stream" "Lyric Video" "Lyrics Video" "Lyrics" "Lyric" "Video" | |
do | |
for with_case in "${str}" "${str:l}" "${str:u}" "${(C)str}" | |
do | |
for with_pattern in "($with_case)" "[$with_case]" "$with_case-" "$with_case -" "-$with_case" "- $with_case" "$with_case–" "$with_case –" "–$with_case" "– $with_case" "$with_case—" "$with_case —" "—$with_case" "— $with_case" "$with_case:" "\/\/$with_case" "\/\/ $with_case" "$with_case\/\/" "$with_case \/\/" "$with_case" | |
do | |
for with_spaces in " $with_pattern " " $with_pattern" "$with_pattern " | |
do | |
temp="${track_title//$with_spaces/}" | |
#echo "DEBUG | $track_title -> $temp | $with_pattern" | |
track_title="$temp" | |
done | |
done | |
done | |
done | |
# Trim whitespace | |
track_title=$(echo $track_title | xargs -0) | |
fi | |
disc_number="${audio_file_name[(ws:---:)2]}" | |
track_number="${audio_file_name[(ws:---:)3]}" | |
if [[ $track_number == "NA" ]] | |
then | |
track_number="${audio_file_name[(ws:---:)1]}" | |
fi | |
album_directory="$result_directory/$album_artist/$album" | |
result_file_name="$track_number - $album_artist - $album - $track_title.$audio_file_extension" | |
if [[ $disc_number != "NA" ]] | |
then | |
result_file_name="$disc_number-$result_file_name" | |
fi | |
# Remove forward slashes | |
result_file_name="${result_file_name//'\/'/_}" | |
result_file="$album_directory/$result_file_name" | |
echo "===================>" | |
echo " - Track title: $track_title" | |
echo " - Disc number: $disc_number" | |
echo " - Track number: $track_number" | |
echo " - Result file: $result_file" | |
echo "===================>" | |
echo "" | |
if [[ $first_track == 1 ]] | |
then | |
read -s -k '?Press any key to continue.' | |
echo " ok" | |
echo "" | |
first_track=0 | |
fi | |
kid3-cli -c "set title: '${track_title//'/\'}'" "$audio_file" | |
kid3-cli -c "set artist: '${album_artist//'/\'}'" "$audio_file" | |
kid3-cli -c "set album: '${album//'/\'}'" "$audio_file" | |
kid3-cli -c "set tracknumber: '${track_number//'/\'}'" "$audio_file" | |
if [[ $disc_number != "NA" ]] | |
then | |
kid3-cli -c "set discnumber: '${disc_number//'/\'}'" "$audio_file" | |
fi | |
kid3-cli -c "set picture:'$thumbnail_file' 'desc'" "$audio_file" | |
mkdir -p "$album_directory" | |
mv "$audio_file" "$result_file" | |
done |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment