#!/bin/sh # check flags for i; do case "$i" in "-"*) unset GETARTIST GETALBUM GETTITLE esac [ -n "$GETURL" ] && URL="$i" && unset GETURL [ -n "$GETARTIST" ] && ARTIST="$ARTIST $i" [ -n "$GETALBUM" ] && ALBUM="$ALBUM $i" [ -n "$GETTITLE" ] && TITLE="$TITLE $i" [ -n "$GETTRACKNUM" ] && TRACKNUM="$i" && unset GETTRACKNUM [ -n "$GETYEAR" ] && YEAR="$i" && unset GETYEAR case "$i" in "-h") printf "Grabs music (either individual songs or albums) and formats it.\n" printf "\n" printf " -s | downloads and formats a single song.\n" printf " -l | downloads and formats a whole album.\n" printf " -p | downloads and formats an album (via a playlist).\n" printf " -u | the url to download.\n" printf " -a | the artist name (to tag every song with).\n" printf " -A | the album name (to tag every song with).\n" printf " -t | the title of the song (if downloading a single song).\n" printf " -T | the number of the track in its album (if downloading a single song).\n" printf " -y | the year of release.\n" exit 0 ;; "-s") SPLITTER_SELECTION="s" ;; "-l") SPLITTER_SELECTION="a" ;; "-p") SPLITTER_SELECTION="p" ;; "-u") GETURL="y" ;; "-a") GETARTIST="y" ;; "-A") GETALBUM="y" ;; "-t") GETTITLE="y" ;; "-T") GETTRACKNUM="y" ;; "-y") GETYEAR="y" ;; esac done ARTIST="$(echo "$ARTIST" | sed 's/^ //')" ALBUM="$(echo "$ALBUM" | sed 's/^ //')" TITLE="$(echo "$TITLE" | sed 's/^ //')" printf "Received Tags: Artist: %s Album: %s Song: %s Number: %s Year: %s\n\n" "$ARTIST" "$ALBUM" "$TITLE" "$TRACKNUM" "$YEAR" notify-send "songgrab started" "Received Tags: Album: $ALBUM Song: $TITLE Number: $TRACKNUM Year: $YEAR\n\n" printf "\n" # prompt to determine later tagging if [ -z "$SPLITTER_SELECTION" ]; then printf "Will the link be for a [p]laylist, a[l]bum video, or [s]ong video? " read -r SPLITTER_SELECTION printf "\n" fi # prompt to get the URL if [ -z "$URL" ]; then printf "Enter the link: " read -r URL printf "\n" fi # if song, don't download playlist if [ "$SPLITTER_SELECTION" = "s" ]; then NO_PLAYLIST="yes" fi # download the video(s) notify-send "songgrab" "Starting download..." printf "Starting download..." MATCHSTRING="$(echo "$URL" | cut -d'=' -f2 | cut -d'&' -f1)" for file in ./*; do case "$file" in *${MATCHSTRING}*) true ;; *) yt-dlp ${NO_PLAYLIST:+"--no-playlist"} --format bestaudio --restrict-filenames "$URL" ;; esac done notify-send "songgrab" "Download stopped." printf "Download stopped." # while loop to remove files from list printf "Do you want to remove any tracks?\n\n" while true; do find ./* | nl printf "Enter the line number: " read -r WHILE_RESPONSE [ -z "$WHILE_RESPONSE" ] && break rm -rf "$(find . | head -n "$WHILE_RESPONSE" | tail -1)" done # convert the downloaded files to mp3 printf "Starting to convert files..." notify-send "songgrab" "Starting to convert files..." for i in *.m4a *.webm; do imp3=$(echo "$i" | sed 's/\.m4a$/.mp3/;s/\.webm$/.mp3/') notify-send "songgrab" "Converting $i to $imp3" [ ! -f "$imp3" ] && ffmpeg -i "$i" -acodec mp3 "$imp3" || echo "File not converted" done printf "Finished converting files.\n\n" notify-send "songgrab" "Finished converting files." # fix names for suggestions vimv # tag songs with tagmp3 notify-send "songgrab" "Tagging songs..." printf "Tagging songs..." for i in *.mp3; do tagmp3 ${ARTIST:+"-a"} ${ARTIST:+"$ARTIST"} ${ALBUM:+"-A"} ${ALBUM:+"$ALBUM"} \ ${TITLE:+"-t"} ${TITLE:+"$TITLE"} ${TRACKNUM:+"-T"} ${TRACKNUM:+"$TRACKNUM"} \ ${YEAR:+"-y"} ${YEAR:+"$YEAR"} "$i" done notify-send "songgrab" "Done." printf "Done.\n\n"