|
| 1 | +#!/bin/bash |
| 2 | +source "$HOME/.config/scripts/settings.sh" |
| 3 | + |
| 4 | +declare -A FLAGS |
| 5 | +FLAGS[a]='AUDIO_ONLY="-x -f bestaudio"' |
| 6 | +FLAGS[c]='SUBS=--embed-subs' |
| 7 | +FLAGS[u]='URL=${OPTARG}' |
| 8 | +FLAGS[f]='FORMAT="-f "${OPTARG}' |
| 9 | +FLAGS[d]='DEST_FOLDER=${OPTARG}' |
| 10 | +FLAGS[l]='LINKS_FILE=${OPTARG}' |
| 11 | +FLAGS[D]='DEBUG=1' |
| 12 | +FLAGS_STRING='acf:u:d:l:D' |
| 13 | + |
| 14 | +declare -A COMMANDS |
| 15 | +COMMANDS[dwl]="download content" |
| 16 | +COMMANDS[nv_album]="download audio files from youtube links" |
| 17 | +COMMANDS[all_lyrics]="download lyrics from lrclib.net" |
| 18 | + |
| 19 | +# constants |
| 20 | +COLLECTION_DIR="$HOME/collection" |
| 21 | +BASEURL="https://lrclib.net/api/get?" |
| 22 | +LOG_DIR="$SCRIPTS_LOGS_FOLDER/$(basename $0 .sh)"; if test ! -d $LOG_DIR;then mkdir "$LOG_DIR";fi |
| 23 | +NOW="$(date +%s)" |
| 24 | +YT_DLP_PROGRESS_FILE='/tmp/progress.txt' |
| 25 | +NV_ALBUM_DIR="/tmp/nv_album" |
| 26 | + |
| 27 | +function dwl() { |
| 28 | + if [[ -z $DEST_FOLDER ]] || [[ -z $URL ]]; then help; exit 1; fi |
| 29 | + # setting yt-dlp command |
| 30 | + YT_DLP_CMD="yt-dlp \ |
| 31 | + --ignore-errors \ |
| 32 | + --continue \ |
| 33 | + --no-overwrites \ |
| 34 | + --download-archive $YT_DLP_PROGRESS_FILE \ |
| 35 | + ${AUDIO_ONLY} \ |
| 36 | + ${SUBS} \ |
| 37 | + ${FORMAT} \ |
| 38 | + -P $DEST_FOLDER \ |
| 39 | + $URL" |
| 40 | + |
| 41 | + # printing command for debugging purposes |
| 42 | + if [[ "$DEBUG" == "1" ]]; then echo "running $YT_DLP_CMD"; fi |
| 43 | + |
| 44 | + # run command |
| 45 | + $YT_DLP_CMD |
| 46 | + |
| 47 | + # remove progress file |
| 48 | + rm -f "$YT_DLP_PROGRESS_FILE" |
| 49 | +} |
| 50 | + |
| 51 | +function nv_album(){ |
| 52 | + |
| 53 | + if [[ -n $LINKS_FILE ]]; then |
| 54 | + cat "$LINKS_FILE" | while read link; do |
| 55 | + echo "downloading $link" |
| 56 | + ($0 dwl -a -d $NV_ALBUM_DIR -u "$link") |
| 57 | + done |
| 58 | + elif [[ -n $URL ]]; then |
| 59 | + ($0 dwl -a -d $NV_ALBUM_DIR -u "$URL") |
| 60 | + fi |
| 61 | + |
| 62 | +} |
| 63 | + |
| 64 | +function all_lyrics(){ |
| 65 | + # loop all music files in collection |
| 66 | + find "$COLLECTION_DIR" -regextype posix-egrep -regex ".*\.(m4a|opus|wav)$" | while read file; do |
| 67 | + lyrics "$file" |
| 68 | + done |
| 69 | +} |
| 70 | + |
| 71 | +function lyrics(){ |
| 72 | + # test if a lyrics file is already downloaded |
| 73 | + if test ! -f "${file%.*}.lrc" && test ! -f "${file%.*}.txt"; then |
| 74 | + |
| 75 | + echo "processing: $file" | tee -a "$LOG_DIR/log-$NOW" |
| 76 | + |
| 77 | + # reading metadata from file |
| 78 | + metadata="$(ffprobe -show_entries 'stream_tags : format_tags' "$file" 2>/dev/null)" |
| 79 | + album="$(echo "$metadata" | grep -i 'TAG:album=' | awk -F'=' '{$1="";print $0}' | awk '{$1=$1;print}')"; |
| 80 | + title="$(echo "$metadata" | grep -i 'TAG:title=' | awk -F'=' '{$1="";print $0}' | awk '{$1=$1;print}')"; |
| 81 | + artist="$(echo "$metadata" | grep -i 'TAG:artist=' | awk -F'=' '{$1="";print $0}' | awk '{$1=$1;print}')"; |
| 82 | + |
| 83 | + # encoding url with parameter |
| 84 | + url_encoded="${BASEURL}artist_name=$(printf "$artist" | jq --slurp --raw-input --raw-output @uri )&track_name=$(printf "$title" | jq --slurp --raw-input --raw-output @uri )&album_name=$(printf "$album" | jq --slurp --raw-input --raw-output @uri)" |
| 85 | + |
| 86 | + echo "librc url: $url_encoded" | tee -a "$LOG_DIR/log-$NOW" |
| 87 | + |
| 88 | + # retrieve plain and synced lyrics from lrclib.net |
| 89 | + api_response="$(curl "$url_encoded")" |
| 90 | + echo "api response: $api_response" | tee -a "$LOG_DIR/log-$NOW" |
| 91 | + |
| 92 | + synced_lyrics=$(echo "$api_response" | jq '.syncedLyrics' -r) |
| 93 | + plain_lyrics=$(echo "$api_response" | jq '.plainLyrics' -r) |
| 94 | + |
| 95 | + # check if synced lyrics exists and print to file, use plain lyrics as fallback |
| 96 | + if [[ "$synced_lyrics" != 'null' ]];then |
| 97 | + echo "writing synced lyrics in ${file%.*}.lrc" | tee -a "$LOG_DIR/log-$NOW" |
| 98 | + echo "$synced_lyrics" > "${file%.*}.lrc" |
| 99 | + elif [[ "$plain_lyrics" != 'null' ]];then |
| 100 | + echo "writing plain lyrics in ${file%.*}.txt" | tee -a "$LOG_DIR/log-$NOW" |
| 101 | + echo "$plain_lyrics" > "${file%.*}.txt" |
| 102 | + fi |
| 103 | + |
| 104 | + fi |
| 105 | +} |
| 106 | + |
| 107 | +source "$SCRIPTS_LIB_FOLDER/cli.sh" |
0 commit comments