Skip to content

Instantly share code, notes, and snippets.

@Nikos410
Last active March 18, 2023 17:14
Show Gist options
  • Save Nikos410/a0b7beca115b589eef43a1be7b81a9cc to your computer and use it in GitHub Desktop.
Save Nikos410/a0b7beca115b589eef43a1be7b81a9cc to your computer and use it in GitHub Desktop.
#!/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