diff --git a/lidarr/Audio.service.bash b/lidarr/Audio.service.bash index 32a6283..f5bbd87 100644 --- a/lidarr/Audio.service.bash +++ b/lidarr/Audio.service.bash @@ -1,38 +1,59 @@ #!/usr/bin/with-contenv bash -scriptVersion="2.48" + +set -euo pipefail + +while [[ $# -gt 0 ]]; do + case $1 in + --state-dir) + STATE_DIR="$2" + shift + shift + ;; + --runtime-dir) + RUNTIME_DIR="$2" + shift + shift + ;; + *) + echo "Unknown option $1" + exit 1 + ;; + esac +done + scriptName="Audio" ### Import Settings -source /config/extended.conf +# shellcheck source=./extended.conf +source "${STATE_DIR}/lidarr-dl.conf" #### Import Functions -source /config/extended/functions +source ../universal/functions.bash AddTag () { log "adding arr-extended tag" - lidarrProcessIt=$(curl -s "$arrUrl/api/v1/tag" --header "X-Api-Key:"${arrApiKey} -H "Content-Type: application/json" --data-raw '{"label":"arr-extended"}') + lidarrProcessIt=$(curl -s "$arrUrl/api/v1/tag" --header "X-Api-Key:" "${arrApiKey}" -H "Content-Type: application/json" --data-raw '{"label":"arr-extended"}') } AddDownloadClient () { - downloadClientsData=$(curl -s "$arrUrl/api/v1/downloadclient" --header "X-Api-Key:"${arrApiKey} -H "Content-Type: application/json") - downloadClientCheck="$(echo $downloadClientsData | grep "Arr-Extended")" + downloadClientsData=$(curl -s "$arrUrl/api/v1/downloadclient" --header "X-Api-Key:" "${arrApiKey}" -H "Content-Type: application/json") + downloadClientCheck="$(echo "$downloadClientsData" | grep "Arr-Extended")" if [ -z "$downloadClientCheck" ]; then AddTag if [ ! -d "$importPath" ]; then mkdir -p "$importPath" - chmod 777 -R "$importPath" fi log "Adding download Client" - lidarrProcessIt=$(curl -s "$arrUrl/api/v1/downloadclient" --header "X-Api-Key:"${arrApiKey} -H "Content-Type: application/json" --data-raw "{\"enable\":true,\"protocol\":\"usenet\",\"priority\":10,\"removeCompletedDownloads\":true,\"removeFailedDownloads\":true,\"name\":\"Arr-Extended\",\"fields\":[{\"name\":\"nzbFolder\",\"value\":\"$importPath\"},{\"name\":\"watchFolder\",\"value\":\"$importPath\"}],\"implementationName\":\"Usenet Blackhole\",\"implementation\":\"UsenetBlackhole\",\"configContract\":\"UsenetBlackholeSettings\",\"infoLink\":\"https://wiki.servarr.com/lidarr/supported#usenetblackhole\",\"tags\":[]}") + lidarrProcessIt=$(curl -s "$arrUrl/api/v1/downloadclient" --header "X-Api-Key:" "${arrApiKey}" -H "Content-Type: application/json" --data-raw "{\"enable\":true,\"protocol\":\"usenet\",\"priority\":10,\"removeCompletedDownloads\":true,\"removeFailedDownloads\":true,\"name\":\"Arr-Extended\",\"fields\":[{\"name\":\"nzbFolder\",\"value\":\"$importPath\"},{\"name\":\"watchFolder\",\"value\":\"$importPath\"}],\"implementationName\":\"Usenet Blackhole\",\"implementation\":\"UsenetBlackhole\",\"configContract\":\"UsenetBlackholeSettings\",\"infoLink\":\"https://wiki.servarr.com/lidarr/supported#usenetblackhole\",\"tags\":[]}") fi } verifyConfig () { ### Import Settings - source /config/extended.conf + # shellcheck source=./extended.conf + source "${STATE_DIR}/lidarr-dl.conf" if [ "$enableAudio" != "true" ]; then log "Script is not enabled, enable by setting enableAudio to \"true\" by modifying the \"/config/extended.conf\" config file..." - log "Sleeping (infinity)" - sleep infinity + exit 0 fi if [ -z "$audioScriptInterval" ]; then @@ -80,32 +101,13 @@ Configuration () { sleepTimer=0.5 tidaldlFail=0 deemixFail=0 - log "-----------------------------------------------------------------------------" - log " |~) _ ._ _| _ ._ _ |\ |o._ o _ |~|_|_|" - log " |~\(_|| |(_|(_)| | || \||| |_|(_||~| | |<" - log " Presents: $scriptName ($scriptVersion)" - log " May the beats be with you!" - log "-----------------------------------------------------------------------------" - log "Donate: https://github.com/sponsors/RandomNinjaAtk" - log "Project: https://github.com/RandomNinjaAtk/arr-scripts" - log "Support: https://github.com/RandomNinjaAtk/arr-scripts/discussions" - log "-----------------------------------------------------------------------------" sleep 5 - log "" - log "Lift off in..."; sleep 0.5 - log "5"; sleep 1 - log "4"; sleep 1 - log "3"; sleep 1 - log "2"; sleep 1 - log "1"; sleep 1 - - - if [ ! -d /config/xdg ]; then - mkdir -p /config/xdg + if [ ! -d "${STATE_DIR}/xdg" ]; then + mkdir -p "${STATE_DIR}/xdg" fi - if [ -z $topLimit ]; then + if [ -z "$topLimit" ]; then topLimit=10 fi @@ -175,10 +177,10 @@ Configuration () { if [ $enableBeetsTagging = true ]; then log "Beets Tagging Enabled" log "Beets Matching Threshold ${beetsMatchPercentage}%" - beetsMatchPercentage=$(expr 100 - $beetsMatchPercentage ) - if cat /config/extended/beets-config.yaml | grep "strong_rec_thresh: 0.04" | read; then + beetsMatchPercentage=$((100 - beetsMatchPercentage )) + if grep "strong_rec_thresh: 0.04" "${STATE_DIR}/extended/beets-config.yaml" | read -r; then log "Configuring Beets Matching Threshold" - sed -i "s/strong_rec_thresh: 0.04/strong_rec_thresh: 0.${beetsMatchPercentage}/g" /config/extended/beets-config.yaml + sed -i "s/strong_rec_thresh: 0.04/strong_rec_thresh: 0.${beetsMatchPercentage}/g" "${STATE_DIR}/extended/beets-config.yaml" fi else log "Beets Tagging Disabled" @@ -195,11 +197,7 @@ Configuration () { } DownloadClientFreyr () { - timeout $downloadClientTimeOut freyr --no-bar --no-net-check -d $audioPath/incomplete deezer:album:$1 2>&1 | tee -a "/config/logs/$logFileName" - # Resolve issue 94 - if [ -d /root/.cache/FreyrCLI ]; then - rm -rf /root/.cache/FreyrCLI/* - fi + timeout $downloadClientTimeOut freyr --no-bar --no-net-check -d "$audioPath/incomplete" "deezer:album:$1" 2>&1 } DownloadFormat () { @@ -222,9 +220,7 @@ DownloadFormat () { log "ERROR :: Change audioBitrate to a low, high, or lossless..." log "ERROR :: Exiting..." NotifyWebhook "FatalError" "Invalid audioFormat and audioBitrate options set" - log "Script sleeping for $audioScriptInterval..." - sleep $audioScriptInterval - exit + exit 1 fi else bitrateError="false" @@ -246,9 +242,7 @@ DownloadFormat () { log "ERROR :: Change audioBitrate to a desired bitrate number, example: 192..." log "ERROR :: Exiting..." NotifyWebhook "FatalError" "audioBitrate options set" - log "Script sleeping for $audioScriptInterval..." - sleep $audioScriptInterval - exit + exit 1 fi case "$audioFormat" in @@ -281,45 +275,32 @@ DownloadFolderCleaner () { if [ -d "$audioPath/complete" ]; then log "Removing prevously completed downloads that failed to import..." # check for completed downloads older than 1 day - if find "$audioPath"/complete -mindepth 1 -type d -mtime +1 | read; then + if find "$audioPath/complete" -mindepth 1 -type d -mtime +1 | read -r; then # delete completed downloads older than 1 day, these most likely failed to import due to Lidarr failing to match - find "$audioPath"/complete -mindepth 1 -type d -mtime +1 -exec rm -rf "{}" \; &>/dev/null - fi - fi -} - -NotFoundFolderCleaner () { - # check for completed download folder - if [ -d /config/extended/logs/notfound ]; then - # check for notfound entries older than X days - if find /config/extended/logs/notfound -mindepth 1 -type f -mtime +$retryNotFound | read; then - log "Removing prevously notfound lidarr album ids older than $retryNotFound days to give them a retry..." - # delete ntofound entries older than X days - find /config/extended/logs/notfound -mindepth 1 -type f -mtime +$retryNotFound -delete + find "$audioPath/complete" -mindepth 1 -type d -mtime +1 -exec rm -rf "{}" \; &>/dev/null fi fi } TidalClientSetup () { log "TIDAL :: Verifying tidal-dl configuration" - touch /config/xdg/.tidal-dl.log - if [ -f /config/xdg/.tidal-dl.json ]; then - rm /config/xdg/.tidal-dl.json + touch "${STATE_DIR}/xdg/.tidal-dl.log" + if [ -f "${STATE_DIR}/xdg/.tidal-dl.json" ]; then + rm "${STATE_DIR}/xdg/.tidal-dl.json" fi - if [ ! -f /config/xdg/.tidal-dl.json ]; then + if [ ! -f "${STATE_DIR}/xdg/.tidal-dl.json" ]; then log "TIDAL :: No default config found, importing default config \"tidal.json\"" - if [ -f /config/extended/tidal-dl.json ]; then - cp /config/extended/tidal-dl.json /config/xdg/.tidal-dl.json - chmod 777 -R /config/xdg/ + if [ -f "${STATE_DIR}/extended/tidal-dl.json" ]; then + cp "${STATE_DIR}/extended/tidal-dl.json" "${STATE_DIR}/xdg/.tidal-dl.json" fi fi TidaldlStatusCheck - tidal-dl -o "$audioPath"/incomplete 2>&1 | tee -a "/config/logs/$logFileName" + tidal-dl -o "$audioPath/incomplete" 2>&1 DownloadFormat - if [ ! -f /config/xdg/.tidal-dl.token.json ]; then + if [ ! -f "${STATE_DIR}/xdg/.tidal-dl.token.json" ]; then TidaldlStatusCheck #log "TIDAL :: ERROR :: Downgrade tidal-dl for workaround..." #pip3 install tidal-dl==2022.3.4.2 --no-cache-dir &>/dev/null @@ -329,21 +310,19 @@ TidalClientSetup () { tidal-dl fi - if [ ! -d /config/extended/cache/tidal ]; then - mkdir -p /config/extended/cache/tidal - chmod 777 /config/extended/cache/tidal + if [ ! -d "${STATE_DIR}/extended/cache/tidal" ]; then + mkdir -p "${STATE_DIR}/extended/cache/tidal" fi - if [ -d /config/extended/cache/tidal ]; then + if [ -d "${STATE_DIR}/extended/cache/tidal" ]; then log "TIDAL :: Purging album list cache..." - rm /config/extended/cache/tidal/*-albums.json &>/dev/null + rm "${STATE_DIR}/extended/cache/tidal/*-albums.json" &>/dev/null fi if [ ! -d "$audioPath/incomplete" ]; then mkdir -p "$audioPath"/incomplete - chmod 777 "$audioPath"/incomplete else - rm -rf "$audioPath"/incomplete/* + rm -rf "$audioPath/incomplete/*" fi TidaldlStatusCheck @@ -353,16 +332,15 @@ TidalClientSetup () { } TidaldlStatusCheck () { - until false - do - running=no - if ps aux | grep "tidal-dl" | grep -v "grep" | read; then - running=yes - log "STATUS :: TIDAL-DL :: BUSY :: Pausing/waiting for all active tidal-dl tasks to end..." - sleep 2 - continue - fi - break + until false; do + running=no + if pgrep -f "tidal-dl" | read -r; then + running=yes + log "STATUS :: TIDAL-DL :: BUSY :: Pausing/waiting for all active tidal-dl tasks to end..." + sleep 2 + continue + fi + break done } @@ -370,37 +348,42 @@ TidalClientTest () { log "TIDAL :: tidal-dl client setup verification..." i=0 while [ $i -lt 3 ]; do - i=$(( $i + 1 )) + i=$(( i + 1 )) TidaldlStatusCheck - tidal-dl -q Normal -o "$audioPath"/incomplete -l "$tidalClientTestDownloadId" 2>&1 | tee -a "/config/logs/$logFileName" - downloadCount=$(find "$audioPath"/incomplete -type f -regex ".*/.*\.\(flac\|opus\|m4a\|mp3\)" | wc -l) - if [ $downloadCount -le 0 ]; then + tidal-dl -q Normal -o "$audioPath/incomplete" -l "$tidalClientTestDownloadId" 2>&1 + downloadCount=$(find "$audioPath/incomplete" -type f -regex ".*/.*\.\(flac\|opus\|m4a\|mp3\)" | wc -l) + if [ "$downloadCount" -le 0 ]; then continue else break fi done tidalClientTest="unknown" - if [ $downloadCount -le 0 ]; then - if [ -f /config/xdg/.tidal-dl.token.json ]; then - rm /config/xdg/.tidal-dl.token.json + if [ "$downloadCount" -le 0 ]; then + if [ -f "${STATE_DIR}/xdg/.tidal-dl.token.json" ]; then + rm "${STATE_DIR}/xdg/.tidal-dl.token.json" fi log "TIDAL :: ERROR :: Download failed" log "TIDAL :: ERROR :: You will need to re-authenticate on next script run..." log "TIDAL :: ERROR :: Exiting..." - rm -rf "$audioPath"/incomplete/* + rm -rf "$audioPath/incomplete/*" NotifyWebhook "Error" "TIDAL not authenticated but configured" tidalClientTest="failed" log "Script sleeping for $audioScriptInterval..." sleep $audioScriptInterval exit else - rm -rf "$audioPath"/incomplete/* + rm -rf "$audioPath/incomplete/*" log "TIDAL :: Successfully Verified" tidalClientTest="success" fi } +logDl () { + log "$page :: $wantedAlbumListSource :: $processNumber of $wantedListAlbumTotal :: \ + $lidarrArtistName :: $lidarrAlbumTitle :: $lidarrAlbumType :: $1" +} + DownloadProcess () { # Required Input Data @@ -412,107 +395,71 @@ DownloadProcess () { # Create Required Directories if [ ! -d "$audioPath/incomplete" ]; then - mkdir -p "$audioPath"/incomplete - chmod 777 "$audioPath"/incomplete + mkdir -p "$audioPath/incomplete" else - rm -rf "$audioPath"/incomplete/* + rm -rf "$audioPath/incomplete/*" fi if [ ! -d "$audioPath/complete" ]; then - mkdir -p "$audioPath"/complete - chmod 777 "$audioPath"/complete + mkdir -p "$audioPath/complete" else - rm -rf "$audioPath"/complete/* + rm -rf "$audioPath/complete/*" fi + - if [ ! -d "/config/extended/logs" ]; then - mkdir -p /config/extended/logs - chmod 777 /config/extended/logs - fi - - if [ ! -d "/config/extended/logs/downloaded" ]; then - mkdir -p /config/extended/logs/downloaded - chmod 777 /config/extended/logs/downloaded - fi - - if [ ! -d "/config/extended/logs/downloaded/deezer" ]; then - mkdir -p /config/extended/logs/downloaded/deezer - chmod 777 /config/extended/logs/downloaded/deezer - fi - - if [ ! -d "/config/extended/logs/downloaded/tidal" ]; then - mkdir -p /config/extended/logs/downloaded/tidal - chmod 777 /config/extended/logs/downloaded/tidal - fi - - if [ ! -d /config/extended/logs/downloaded/failed/deezer ]; then - mkdir -p /config/extended/logs/downloaded/failed/deezer - chmod 777 /config/extended/logs/downloaded/failed/deezer - fi - - if [ ! -d /config/extended/logs/downloaded/failed/tidal ]; then - mkdir -p /config/extended/logs/downloaded/failed/tidal - chmod 777 /config/extended/logs/downloaded/failed/tidal - fi + logPaths=( "deezer" "tidal" "failed/deezer" "failed/tidal" ) + for p in "${!logPaths[@]}"; do + if [ ! -d "${STATE_DIR}/extended/logs/downloaded/${logPaths[$p]}" ]; then + mkdir -p "${STATE_DIR}/extended/logs/downloaded/${logPaths[$p]}" + fi + done if [ ! -d "$importPath" ]; then mkdir -p "$importPath" - chmod 777 "$importPath" fi AddDownloadClient downloadedAlbumTitleClean="$(echo "$4" | sed -e "s%[^[:alpha:][:digit:]._' ]% %g" -e "s/ */ /g" | sed 's/^[.]*//' | sed 's/[.]*$//g' | sed 's/^ *//g' | sed 's/ *$//g')" - if find "$audioPath"/complete -type d -iname "$lidarrArtistNameSanitized-$downloadedAlbumTitleClean ($3)-*-$1-$2" | read; then - log "$page :: $wantedAlbumListSource :: $processNumber of $wantedListAlbumTotal :: $lidarrArtistName :: $lidarrAlbumTitle :: $lidarrAlbumType :: ERROR :: Previously Downloaded..." + if find "$audioPath/complete" -type d -iname "$lidarrArtistNameSanitized-$downloadedAlbumTitleClean ($3)-*-$1-$2" | read -r; then + logDl "ERROR :: Previously Downloaded..." return fi # check for log file - if [ "$2" == "DEEZER" ]; then - if [ -f /config/extended/logs/downloaded/deezer/$1 ]; then - log "$page :: $wantedAlbumListSource :: $processNumber of $wantedListAlbumTotal :: $lidarrArtistName :: $lidarrAlbumTitle :: $lidarrAlbumType :: ERROR :: Previously Downloaded ($1)..." - return - fi - if [ -f /config/extended/logs/downloaded/failed/deezer/$1 ]; then - log "$page :: $wantedAlbumListSource :: $processNumber of $wantedListAlbumTotal :: $lidarrArtistName :: $lidarrAlbumTitle :: $lidarrAlbumType :: ERROR :: Previously Attempted Download ($1)..." - return - fi - fi + + for i in "DEEZER" "TIDAL"; do + if [ "$2" == $i ]; then + if [ -f "${STATE_DIR}/extended/logs/downloaded/${i,,}/$1" ]; then + logDl "ERROR :: Previously Downloaded ($1)..." + return + fi + if [ -f "${STATE_DIR}/extended/logs/downloaded/failed/${i,,}/$1" ]; then + logDl "ERROR :: Previously Attempted Download ($1)..." + return + fi + fi + done - # check for log file - if [ "$2" == "TIDAL" ]; then - if [ -f /config/extended/logs/downloaded/tidal/$1 ]; then - log "$page :: $wantedAlbumListSource :: $processNumber of $wantedListAlbumTotal :: $lidarrArtistName :: $lidarrAlbumTitle :: $lidarrAlbumType :: ERROR :: Previously Downloaded ($1)..." - return - fi - if [ -f /config/extended/logs/downloaded/failed/tidal/$1 ]; then - log "$page :: $wantedAlbumListSource :: $processNumber of $wantedListAlbumTotal :: $lidarrArtistName :: $lidarrAlbumTitle :: $lidarrAlbumType :: ERROR :: Previously Attempted Download ($1)..." - return - fi - fi - - - downloadTry=0 until false do - downloadTry=$(( $downloadTry + 1 )) - if [ -f /temp-download ]; then - rm /temp-download + downloadTry=$(( downloadTry + 1 )) + if [ -f /tmp/temp-download ]; then + rm /tmp/temp-download sleep 0.1 fi - touch /temp-download + touch /tmp/temp-download sleep 0.1 - log "$page :: $wantedAlbumListSource :: $processNumber of $wantedListAlbumTotal :: $lidarrArtistName :: $lidarrAlbumTitle :: $lidarrAlbumType :: Download Attempt number $downloadTry" + logDl "Download Attempt number $downloadTry" if [ "$2" == "DEEZER" ]; then - if [ -z $arlToken ]; then - DownloadClientFreyr $1 + if [ -z "$arlToken" ]; then + DownloadClientFreyr "$1" else - deemix -b $deemixQuality -p "$audioPath"/incomplete "https://www.deezer.com/album/$1" 2>&1 | tee -a "/config/logs/$logFileName" + deemix -b $deemixQuality -p "$audioPath"/incomplete "https://www.deezer.com/album/$1" 2>&1 fi if [ -d "/tmp/deemix-imgs" ]; then @@ -521,49 +468,43 @@ DownloadProcess () { # Verify Client Works... clientTestDlCount=$(find "$audioPath"/incomplete/ -type f -regex ".*/.*\.\(flac\|opus\|m4a\|mp3\)" | wc -l) - if [ $clientTestDlCount -le 0 ]; then + if [ "$clientTestDlCount" -le 0 ]; then # Add +1 to failed attempts - deemixFail=$(( $deemixFail + 1)) + deemixFail=$(( deemixFail + 1)) else # Reset for successful download deemixFail=0 fi # If download failes X times, exit with error... - if [ $deemixFail -eq $failedDownloadAttemptThreshold ]; then - if [ -z $arlToken ]; then - rm -rf "$audioPath"/incomplete/* - log "$page :: $wantedAlbumListSource :: $processNumber of $wantedListAlbumTotal :: $lidarrArtistName :: $lidarrAlbumTitle :: $lidarrAlbumType :: All $failedDownloadAttemptThreshold Download Attempts failed, skipping..." - else - DeezerClientTest - if [ "$deezerClientTest" == "success" ]; then - log "$page :: $wantedAlbumListSource :: $processNumber of $wantedListAlbumTotal :: $lidarrArtistName :: $lidarrAlbumTitle :: $lidarrAlbumType :: All $failedDownloadAttemptThreshold Download Attempts failed, skipping..." - deemixFail=0 - fi + if [ $deemixFail -eq $failedDownloadAttemptThreshold ] && [ -z "$arlToken" ]; then + rm -rf "$audioPath"/incomplete/* + logDl "All $failedDownloadAttemptThreshold Download Attempts failed, skipping..." + else + DeezerClientTest + if [ "$deezerClientTest" == "success" ]; then + logDl "All $failedDownloadAttemptThreshold Download Attempts failed, skipping..." + deemixFail=0 fi fi fi - if [ "$2" == "DEEZER" ]; then - if [ $deemixFail -eq $failedDownloadAttemptThreshold ]; then - if [ -z $arlToken ]; then - DownloadClientFreyr $1 - else - deemix -b $deemixQuality -p "$audioPath"/incomplete "https://www.deezer.com/album/$1" 2>&1 | tee -a "/config/logs/$logFileName" - fi - fi - fi + if [ "$2" == "DEEZER" ] && [ $deemixFail -eq $failedDownloadAttemptThreshold ] && [ -z "$arlToken" ]; then + DownloadClientFreyr "$1" + else + deemix -b $deemixQuality -p "$audioPath"/incomplete "https://www.deezer.com/album/$1" 2>&1 + fi if [ "$2" == "TIDAL" ]; then TidaldlStatusCheck - tidal-dl -q $tidalQuality -o "$audioPath/incomplete" -l "$1" 2>&1 | tee -a "/config/logs/$logFileName" + tidal-dl -q $tidalQuality -o "$audioPath/incomplete" -l "$1" 2>&1 # Verify Client Works... clientTestDlCount=$(find "$audioPath"/incomplete/ -type f -regex ".*/.*\.\(flac\|opus\|m4a\|mp3\)" | wc -l) - if [ $clientTestDlCount -le 0 ]; then + if [ "$clientTestDlCount" -le 0 ]; then # Add +1 to failed attempts - tidaldlFail=$(( $tidaldlFail + 1)) + tidaldlFail=$(( tidaldlFail + 1)) else # Reset for successful download tidaldlFail=0 @@ -571,29 +512,29 @@ DownloadProcess () { # If download failes X times, exit with error... if [ $tidaldlFail -eq $failedDownloadAttemptThreshold ]; then - TidalClientTest - if [ "$tidalClientTest" == "success" ]; then - log "$page :: $wantedAlbumListSource :: $processNumber of $wantedListAlbumTotal :: $lidarrArtistName :: $lidarrAlbumTitle :: $lidarrAlbumType :: All $failedDownloadAttemptThreshold Download Attempts failed, skipping..." + TidalClientTest + if [ "$tidalClientTest" == "success" ]; then + logDl "All $failedDownloadAttemptThreshold Download Attempts failed, skipping..." fi fi fi - find "$audioPath/incomplete" -type f -iname "*.flac" -newer "/temp-download" -print0 | while IFS= read -r -d '' file; do + find "$audioPath/incomplete" -type f -iname "*.flac" -newer "/tmp/temp-download" -print0 | while IFS= read -r -d '' file; do audioFlacVerification "$file" if [ "$verifiedFlacFile" == "0" ]; then - log "$page :: $wantedAlbumListSource :: $processNumber of $wantedListAlbumTotal :: $lidarrArtistName :: $lidarrAlbumTitle :: $lidarrAlbumType :: Flac Verification :: $file :: Verified" + logDl "Flac Verification :: $file :: Verified" else - log "$page :: $wantedAlbumListSource :: $processNumber of $wantedListAlbumTotal :: $lidarrArtistName :: $lidarrAlbumTitle :: $lidarrAlbumType :: Flac Verification :: $file :: ERROR :: Failed Verification" + logDl "Flac Verification :: $file :: ERROR :: Failed Verification" rm "$file" fi done downloadCount=$(find "$audioPath"/incomplete/ -type f -regex ".*/.*\.\(flac\|m4a\|mp3\)" | wc -l) if [ "$downloadCount" -ne "$5" ]; then - log "$page :: $wantedAlbumListSource :: $processNumber of $wantedListAlbumTotal :: $lidarrArtistName :: $lidarrAlbumTitle :: $lidarrAlbumType :: ERROR :: download failed, missing tracks..." + logDl "ERROR :: download failed, missing tracks..." completedVerification="false" else - log "$page :: $wantedAlbumListSource :: $processNumber of $wantedListAlbumTotal :: $lidarrArtistName :: $lidarrAlbumTitle :: $lidarrAlbumType :: Success" + logDl "Success" completedVerification="true" fi @@ -605,13 +546,13 @@ DownloadProcess () { fi break else - log "$page :: $wantedAlbumListSource :: $processNumber of $wantedListAlbumTotal :: $lidarrArtistName :: $lidarrAlbumTitle :: $lidarrAlbumType :: Retry Download in 1 second fix errors..." + logDl "Retry Download in 1 second fix errors..." sleep 1 fi done # Consolidate files to a single folder - log "$page :: $wantedAlbumListSource :: $processNumber of $wantedListAlbumTotal :: $lidarrArtistName :: $lidarrAlbumTitle :: $lidarrAlbumType :: Consolidating files to single folder" + logDl "Consolidating files to single folder" find "$audioPath/incomplete" -type f -exec mv "{}" "$audioPath"/incomplete/ \; 2>/dev/null find $audioPath/incomplete/ -type d -mindepth 1 -maxdepth 1 -exec rm -rf {} \; 2>/dev/null @@ -623,34 +564,28 @@ DownloadProcess () { downloadCount=$(find "$audioPath"/incomplete/ -type f -regex ".*/.*\.\(flac\|m4a\|mp3\)" | wc -l) if [ "$downloadCount" -ne "$5" ]; then - log "$page :: $wantedAlbumListSource :: $processNumber of $wantedListAlbumTotal :: $lidarrArtistName :: $lidarrAlbumTitle :: $lidarrAlbumType :: ERROR :: All download Attempts failed..." - log "$page :: $wantedAlbumListSource :: $processNumber of $wantedListAlbumTotal :: $lidarrArtistName :: $lidarrAlbumTitle :: $lidarrAlbumType :: Logging $1 as failed download..." + logDl "ERROR :: All download Attempts failed..." + logDl "Logging $1 as failed download..." - if [ "$2" == "DEEZER" ]; then - touch /config/extended/logs/downloaded/failed/deezer/$1 - fi - if [ "$2" == "TIDAL" ]; then - touch /config/extended/logs/downloaded/failed/tidal/$1 - fi + for awa in "DEEZER" "TIDAL"; do + [ "$2" == $awa ] \ + && touch "${STATE_DIR}/extended/logs/downloaded/failed/${awa,,}/$1" + done return fi # Log Completed Download - log "$page :: $wantedAlbumListSource :: $processNumber of $wantedListAlbumTotal :: $lidarrArtistName :: $lidarrAlbumTitle :: $lidarrAlbumType :: Logging $1 as successfully downloaded..." - if [ "$2" == "DEEZER" ]; then - touch /config/extended/logs/downloaded/deezer/$1 - fi - if [ "$2" == "TIDAL" ]; then - touch /config/extended/logs/downloaded/tidal/$1 - fi + logDl "Logging $1 as successfully downloaded..." + for awa in "DEEZER" "TIDAL"; do + [ "$2" == $awa ] \ + && touch "${STATE_DIR}/extended/logs/downloaded/${awa,,}/$1" + done # Tag with beets if [ "$enableBeetsTagging" == "true" ]; then - if [ -f /config/extended/beets-error ]; then - rm /config/extended/beets-error - fi - log "$page :: $wantedAlbumListSource :: $processNumber of $wantedListAlbumTotal :: $lidarrArtistName :: $lidarrAlbumTitle :: $lidarrAlbumType :: Processing files with beets..." + [ -f "${STATE_DIR}/extended/beets-error" ] && rm "${STATE_DIR}/extended/beets-error" + logDl "Processing files with beets..." ProcessWithBeets "$audioPath/incomplete" fi @@ -658,33 +593,30 @@ DownloadProcess () { find "$audioPath/incomplete" -type f -iname "*.flac" -print0 | while IFS= read -r -d '' file; do lrcFile="${file%.*}.lrc" if [ -f "$lrcFile" ]; then - log "$page :: $wantedAlbumListSource :: $processNumber of $wantedListAlbumTotal :: $lidarrArtistName :: $lidarrAlbumTitle :: $lidarrAlbumType :: Embedding lyrics (lrc) into $file" + logDl "Embedding lyrics (lrc) into $file" metaflac --remove-tag=Lyrics "$file" metaflac --set-tag-from-file="Lyrics=$lrcFile" "$file" fi done if [ "$audioFormat" != "native" ]; then - log "$page :: $wantedAlbumListSource :: $processNumber of $wantedListAlbumTotal :: $lidarrArtistName :: $lidarrAlbumTitle :: $lidarrAlbumType :: Converting Flac Audio to ${audioFormat^^} ($audioBitrateText)" - if [ "$audioFormat" == "opus" ]; then - options="-c:a libopus -b:a ${audioBitrate}k -application audio -vbr off" - extension="opus" - fi + logDl "Converting Flac Audio to ${audioFormat^^} ($audioBitrateText)" - if [ "$audioFormat" == "mp3" ]; then - options="-c:a libmp3lame -b:a ${audioBitrate}k" - extension="mp3" - fi + [ "$audioFormat" == "opus" ] \ + && options="-c:a libopus -b:a ${audioBitrate}k -application audio -vbr off" \ + && extension=$audioFormat - if [ "$audioFormat" == "aac" ]; then - options="-c:a aac -b:a ${audioBitrate}k -movflags faststart" - extension="m4a" - fi + [ "$audioFormat" == "mp3" ] \ + && options="-c:a libmp3lame -b:a ${audioBitrate}k" \ + && extension=$audioFormat - if [ "$audioFormat" == "alac" ]; then - options="-c:a alac -movflags faststart" - extension="m4a" - fi + [ "$audioFormat" == "aac" ] \ + && options="-c:a aac -b:a ${audioBitrate}k -movflags faststart" \ + && extension="m4a" + + [ "$audioFormat" == "alac" ] \ + && options="-c:a alac -movflags faststart" \ + && extension="m4a" find "$audioPath/incomplete" -type f -iname "*.flac" -print0 | while IFS= read -r -d '' audio; do file="${audio}" @@ -693,20 +625,20 @@ DownloadProcess () { filenamenoext="${filename%.*}" if [ "$audioFormat" == "opus" ]; then if opusenc --bitrate ${audioBitrate} --vbr --music "$file" "$foldername/${filenamenoext}.$extension"; then - log "$page :: $wantedAlbumListSource :: $processNumber of $wantedListAlbumTotal :: $lidarrArtistName :: $lidarrAlbumTitle :: $lidarrAlbumType :: $filename :: Conversion to $audioFormat ($audioBitrateText) successful" + logDl "$filename :: Conversion to $audioFormat ($audioBitrateText) successful" rm "$file" else - log "$page :: $wantedAlbumListSource :: $processNumber of $wantedListAlbumTotal :: $lidarrArtistName :: $lidarrAlbumTitle :: $lidarrAlbumType :: $filename :: ERROR :: Conversion Failed" + logDl "$filename :: ERROR :: Conversion Failed" rm "$foldername/${filenamenoext}.$extension" fi continue fi - if ffmpeg -loglevel warning -hide_banner -nostats -i "$file" -n -vn $options "$foldername/${filenamenoext}.$extension" < /dev/null; then - log "$page :: $wantedAlbumListSource :: $processNumber of $wantedListAlbumTotal :: $lidarrArtistName :: $lidarrAlbumTitle :: $lidarrAlbumType :: $filename :: Conversion to $audioFormat ($audioBitrateText) successful" + if ffmpeg -loglevel warning -hide_banner -nostats -i "$file" -n -vn "$options" "$foldername/${filenamenoext}.$extension" < /dev/null; then + logDl "$filename :: Conversion to $audioFormat ($audioBitrateText) successful" rm "$file" else - log "$page :: $wantedAlbumListSource :: $processNumber of $wantedListAlbumTotal :: $lidarrArtistName :: $lidarrAlbumTitle :: $lidarrAlbumType :: $filename :: ERROR :: Conversion Failed" + logDl "$filename :: ERROR :: Conversion Failed" rm "$foldername/${filenamenoext}.$extension" fi done @@ -716,10 +648,10 @@ DownloadProcess () { if [ "$enableReplaygainTags" == "true" ]; then AddReplaygainTags "$audioPath/incomplete" else - log "$page :: $wantedAlbumListSource :: $processNumber of $wantedListAlbumTotal :: $lidarrArtistName :: $lidarrAlbumTitle :: $lidarrAlbumType :: Replaygain Tagging Disabled (set enableReplaygainTags=true to enable...)" + logDl "Replaygain Tagging Disabled (set enableReplaygainTags=true to enable...)" fi - albumquality="$(find "$audioPath"/incomplete/ -type f -regex ".*/.*\.\(flac\|opus\|m4a\|mp3\)" | head -n 1 | egrep -i -E -o "\.{1}\w*$" | sed 's/\.//g')" + albumquality="$(find "$audioPath"/incomplete/ -type f -regex ".*/.*\.\(flac\|opus\|m4a\|mp3\)" | head -n 1 | grep -i -E -o "\.{1}\w*$" | sed 's/\.//g')" downloadedAlbumFolder="${lidarrArtistNameSanitized}-${downloadedAlbumTitleClean:0:100} (${3})" find "$audioPath/incomplete" -type f -regex ".*/.*\.\(flac\|opus\|m4a\|mp3\)" -print0 | while IFS= read -r -d '' audio; do @@ -754,172 +686,146 @@ DownloadProcess () { ProcessWithBeets () { # Input # $1 Download Folder to process - if [ -f /config/extended/beets-library.blb ]; then - rm /config/extended/beets-library.blb - sleep 0.5 - fi - if [ -f /config/extended/beets.log ]; then - rm /config/extended/beets.log - sleep 0.5 - fi + for awa in "extended/beets-library.blb" "extended/beets.log" "beets-match"; do + [ -f "${STATE_DIR}/${awa}" ] \ + && rm "${STATE_DIR}/${awa}" \ + && sleep 0.5 + done - if [ -f "/config/beets-match" ]; then - rm "/config/beets-match" - sleep 0.5 - fi touch "/config/beets-match" sleep 0.5 - beet -c /config/extended/beets-config.yaml -l /config/extended/beets-library.blb -d "$1" import -qC "$1" - if [ $(find "$1" -type f -regex ".*/.*\.\(flac\|opus\|m4a\|mp3\)" -newer "/config/beets-match" | wc -l) -gt 0 ]; then - log "$page :: $wantedAlbumListSource :: $processNumber of $wantedListAlbumTotal :: $lidarrArtistName :: $lidarrAlbumTitle :: $lidarrAlbumType :: SUCCESS: Matched with beets!" - log "$page :: $wantedAlbumListSource :: $processNumber of $wantedListAlbumTotal :: $lidarrArtistName :: $lidarrAlbumTitle :: $lidarrAlbumType :: fixing track tags" + beet -c "${STATE_DIR}/extended/beets-config.yaml" \ + -l "${STATE_DIR}/extended/beets-library.blb" -d "$1" import -qC "$1" + + if [ "$(find "$1" -type f -regex ".*/.*\.\(flac\|opus\|m4a\|mp3\)" -newer "${STATE_DIR}/beets-match" | wc -l)" -gt 0 ]; then + + logDl "SUCCESS: Matched with beets!" + logDl "fixing track tags" + find "$audioPath/incomplete" -type f -iname "*.flac" -print0 | while IFS= read -r -d '' file; do getArtistCredit="$(ffprobe -loglevel 0 -print_format json -show_format -show_streams "$file" | jq -r ".format.tags.ARTIST_CREDIT" | sed "s/null//g" | sed "/^$/d")" # album artist - metaflac --remove-tag=ALBUMARTIST "$file" - metaflac --remove-tag=ALBUMARTIST_CREDIT "$file" - metaflac --remove-tag=ALBUM_ARTIST "$file" - metaflac --remove-tag="ALBUM ARTIST" "$file" - # artist - metaflac --remove-tag=ARTIST "$file" - metaflac --remove-tag=ARTIST_CREDIT "$file" - if [ ! -z "$getArtistCredit" ]; then - metaflac --set-tag=ARTIST="$getArtistCredit" "$file" + metaflac \ + --remove-tag=ALBUMARTIST --remove-tag=ALBUMARTIST_CREDIT --remove-tag=ALBUM_ARTIST \ + --remove-tag="ALBUM ARTIST" --remove-tag=ARTIST --remove-tag=ARTIST_CREDIT \ + --remove-tag=ARTISTSORT --remove-tag=COMPOSERSORT --remove-tag=ALBUMARTISTSORT \ + --remove-tag=MUSICBRAINZ_ARTISTID --remove-tag=MUSICBRAINZ_ALBUMARTISTID \ + "$file" + + metaflac \ + --set-tag=ALBUMARTIST="$lidarrArtistName" \ + --set-tag=MUSICBRAINZ_ARTISTID="$lidarrArtistForeignArtistId" \ + --set-tag=MUSICBRAINZ_ALBUMARTISTID="$lidarrArtistForeignArtistId" \ + "$file" + + if [ -n "$getArtistCredit" ]; then + metaflac --set-tag=ARTIST="$getArtistCredit" "$file" else metaflac --set-tag=ARTIST="$lidarrArtistName" "$file" fi - # sorts - metaflac --remove-tag=ARTISTSORT "$file" - metaflac --remove-tag=COMPOSERSORT "$file" - metaflac --remove-tag=ALBUMARTISTSORT "$file" - # lidarr - metaflac --set-tag=ALBUMARTIST="$lidarrArtistName" "$file" - # mbrainz - metaflac --remove-tag=MUSICBRAINZ_ARTISTID "$file" - metaflac --remove-tag=MUSICBRAINZ_ALBUMARTISTID "$file" - metaflac --set-tag=MUSICBRAINZ_ARTISTID="$lidarrArtistForeignArtistId" "$file" - metaflac --set-tag=MUSICBRAINZ_ALBUMARTISTID="$lidarrArtistForeignArtistId" "$file" - log "$page :: $wantedAlbumListSource :: $processNumber of $wantedListAlbumTotal :: $lidarrArtistName :: $lidarrAlbumTitle :: $lidarrAlbumType :: FIXED : $file" + + log "FIXED : $file" done else - log "$page :: $wantedAlbumListSource :: $processNumber of $wantedListAlbumTotal :: $lidarrArtistName :: $lidarrAlbumTitle :: $lidarrAlbumType :: ERROR :: Unable to match using beets to a musicbrainz release..." + log "ERROR :: Unable to match using beets to a musicbrainz release..." return fi - if [ -f "/config/beets-match" ]; then - rm "/config/beets-match" - sleep 0.1 - fi + [ -f "${STATE_DIR}/beets-match" ] \ + && rm "${STATE_DIR}/beets-match" \ + && sleep 0.1 # Get file metadata GetFile=$(find "$audioPath/incomplete" -type f -regex ".*/.*\.\(flac\|opus\|m4a\|mp3\)" | head -n1) extension="${GetFile##*.}" + + ffprobeGet=$(ffprobe -hide_banner -loglevel fatal -show_error -show_format -show_streams \ + -show_programs -show_chapters -show_private_data -print_format json \ + "$GetFile" + ) + if [ "$extension" == "opus" ]; then - matchedTags=$(ffprobe -hide_banner -loglevel fatal -show_error -show_format -show_streams -show_programs -show_chapters -show_private_data -print_format json "$GetFile" | jq -r ".streams[].tags") + matchedTags=$(${ffprobeGet} | jq -r ".streams[].tags") else - matchedTags=$(ffprobe -hide_banner -loglevel fatal -show_error -show_format -show_streams -show_programs -show_chapters -show_private_data -print_format json "$GetFile" | jq -r ".format.tags") + matchedTags=$(${ffprobeGet} | jq -r ".format.tags") fi # Get Musicbrainz Release Group ID and Album Artist ID from tagged file if [ "$extension" == "flac" ] || [ "$extension" == "opus" ]; then - matchedTagsAlbumReleaseGroupId="$(echo $matchedTags | jq -r ".MUSICBRAINZ_RELEASEGROUPID")" - matchedTagsAlbumArtistId="$(echo $matchedTags | jq -r ".MUSICBRAINZ_ALBUMARTISTID")" + matchedTagsAlbumReleaseGroupId="$(echo "$matchedTags" | jq -r ".MUSICBRAINZ_RELEASEGROUPID")" + matchedTagsAlbumArtistId="$(echo "$matchedTags" | jq -r ".MUSICBRAINZ_ALBUMARTISTID")" elif [ "$extension" == "mp3" ] || [ "$extension" == "m4a" ]; then - matchedTagsAlbumReleaseGroupId="$(echo $matchedTags | jq -r '."MusicBrainz Release Group Id"')" - matchedLidarrAlbumArtistId="$(echo $matchedTags | jq -r '."MusicBrainz Ablum Artist Id"')" + matchedTagsAlbumReleaseGroupId="$(echo "$matchedTags" | jq -r '."MusicBrainz Release Group Id"')" + matchedLidarrAlbumArtistId="$(echo "$matchedTags" | jq -r '."MusicBrainz Ablum Artist Id"')" fi - if [ ! -d "/config/extended/logs/downloaded/musicbrainz_matched" ]; then - mkdir -p "/config/extended/logs/downloaded/musicbrainz_matched" - chmod 777 "/config/extended/logs/downloaded/musicbrainz_matched" - fi + [ ! -d "${STATE_DIR}/extended/logs/downloaded/musicbrainz_matched" ] \ + && mkdir -p "${STATE_DIR}/extended/logs/downloaded/musicbrainz_matched" - if [ ! -f "/config/extended/logs/downloaded/musicbrainz_matched/$matchedTagsAlbumReleaseGroupId" ]; then - log "$page :: $wantedAlbumListSource :: $processNumber of $wantedListAlbumTotal :: $lidarrArtistName :: $lidarrAlbumTitle :: $lidarrAlbumType :: Marking MusicBrainz Release Group ($matchedTagsAlbumReleaseGroupId) as successfully downloaded..." - touch "/config/extended/logs/downloaded/musicbrainz_matched/$matchedTagsAlbumReleaseGroupId" - - fi + [ ! -f "${STATE_DIR}/extended/logs/downloaded/musicbrainz_matched/$matchedTagsAlbumReleaseGroupId" ] \ + && log "Marking MusicBrainz Release Group ($matchedTagsAlbumReleaseGroupId) as successfully downloaded..." \ + && touch "/config/extended/logs/downloaded/musicbrainz_matched/$matchedTagsAlbumReleaseGroupId" } DownloadQualityCheck () { - if [ "$requireQuality" == "true" ]; then - log "$page :: $wantedAlbumListSource :: $processNumber of $wantedListAlbumTotal :: $lidarrArtistName :: $lidarrAlbumTitle :: $lidarrAlbumType :: Checking for unwanted files" + [ "$requireQuality" != "true" ] \ + && logDl "Skipping download quality check... (enable by setting: requireQuality=true)" \ + && return - if [ "$audioFormat" != "native" ]; then - if find "$1" -type f -regex ".*/.*\.\(opus\|m4a\|mp3\)"| read; then - log "$page :: $wantedAlbumListSource :: $processNumber of $wantedListAlbumTotal :: $lidarrArtistName :: $lidarrAlbumTitle :: $lidarrAlbumType :: Unwanted files found!" - log "$page :: $wantedAlbumListSource :: $processNumber of $wantedListAlbumTotal :: $lidarrArtistName :: $lidarrAlbumTitle :: $lidarrAlbumType :: Performing cleanup..." - rm "$1"/* - else - log "$page :: $wantedAlbumListSource :: $processNumber of $wantedListAlbumTotal :: $lidarrArtistName :: $lidarrAlbumTitle :: $lidarrAlbumType :: No unwanted files found!" - fi - fi - if [ "$audioFormat" == "native" ]; then - if [ "$audioBitrate" == "master" ]; then - if find "$1" -type f -regex ".*/.*\.\(opus\|m4a\|mp3\)"| read; then - log "$page :: $wantedAlbumListSource :: $processNumber of $wantedListAlbumTotal :: $lidarrArtistName :: $lidarrAlbumTitle :: $lidarrAlbumType :: Unwanted files found!" - log "$page :: $wantedAlbumListSource :: $processNumber of $wantedListAlbumTotal :: $lidarrArtistName :: $lidarrAlbumTitle :: $lidarrAlbumType :: Performing cleanup..." - rm "$1"/* - else - log "$page :: $wantedAlbumListSource :: $processNumber of $wantedListAlbumTotal :: $lidarrArtistName :: $lidarrAlbumTitle :: $lidarrAlbumType :: No unwanted files found!" - fi - elif [ "$audioBitrate" == "lossless" ]; then - if find "$1" -type f -regex ".*/.*\.\(opus\|m4a\|mp3\)"| read; then - log "$page :: $wantedAlbumListSource :: $processNumber of $wantedListAlbumTotal :: $lidarrArtistName :: $lidarrAlbumTitle :: $lidarrAlbumType :: Unwanted files found!" - log "$page :: $wantedAlbumListSource :: $processNumber of $wantedListAlbumTotal :: $lidarrArtistName :: $lidarrAlbumTitle :: $lidarrAlbumType :: Performing cleanup..." - rm "$1"/* - else - log "$page :: $wantedAlbumListSource :: $processNumber of $wantedListAlbumTotal :: $lidarrArtistName :: $lidarrAlbumTitle :: $lidarrAlbumType :: No unwanted files found!" - fi - elif [ "$2" == "DEEZER" ]; then - if find "$1" -type f -regex ".*/.*\.\(opus\|m4a\|flac\)"| read; then - log "$page :: $wantedAlbumListSource :: $processNumber of $wantedListAlbumTotal :: $lidarrArtistName :: $lidarrAlbumTitle :: $lidarrAlbumType :: Unwanted files found!" - log "$page :: $wantedAlbumListSource :: $processNumber of $wantedListAlbumTotal :: $lidarrArtistName :: $lidarrAlbumTitle :: $lidarrAlbumType :: Performing cleanup..." - rm "$1"/* - else - log "$page :: $wantedAlbumListSource :: $processNumber of $wantedListAlbumTotal :: $lidarrArtistName :: $lidarrAlbumTitle :: $lidarrAlbumType :: No unwanted files found!" - fi - elif [ "$2" == "TIDAL" ]; then - if find "$1" -type f -regex ".*/.*\.\(opus\|flac\|mp3\)"| read; then - log "$page :: $wantedAlbumListSource :: $processNumber of $wantedListAlbumTotal :: $lidarrArtistName :: $lidarrAlbumTitle :: $lidarrAlbumType :: Unwanted files found!" - log "$page :: $wantedAlbumListSource :: $processNumber of $wantedListAlbumTotal :: $lidarrArtistName :: $lidarrAlbumTitle :: $lidarrAlbumType :: Performing cleanup..." - rm "$1"/* - else - log "$page :: $wantedAlbumListSource :: $processNumber of $wantedListAlbumTotal :: $lidarrArtistName :: $lidarrAlbumTitle :: $lidarrAlbumType :: No unwanted files found!" - fi - fi - fi + logDl "Checking for unwanted files" + + local deezer + local tidal + local other + local notNative + notNative=$([ "$audioFormat" != "native" ] \ + && find "$1" -type f -regex ".*/.*\.\(opus\|m4a\|mp3\)" | read -r + ) + other=$([ "$audioBitrate" == "master" ] || [ "$audioBitrate" == "lossless" ] \ + && find "$1" -type f -regex ".*/.*\.\(opus\|m4a\|mp3\)" | read -r + ) + deezer=$([ "$2" == "DEEZER" ] \ + && find "$1" -type f -regex ".*/.*\.\(opus\|m4a\|flac\)" | read -r + ) + tidal=$([ "$2" == "TIDAL" ] \ + && find "$1" -type f -regex ".*/.*\.\(opus\|flac\|mp3\)" | read -r + ) + + if $notNative || $deezer || $tidal || $other; then + logDl "Unwanted files found!" + logDl "Performing cleanup..." + rm "$1"/* else - log "$page :: $wantedAlbumListSource :: $processNumber of $wantedListAlbumTotal :: $lidarrArtistName :: $lidarrAlbumTitle :: $lidarrAlbumType :: Skipping download quality check... (enable by setting: requireQuality=true)" + logDl "No unwanted files found!" fi } AddReplaygainTags () { # Input Data # $1 Folder path to scan and add tags - log "$page :: $wantedAlbumListSource :: $processNumber of $wantedListAlbumTotal :: $lidarrArtistName :: $lidarrAlbumTitle :: $lidarrAlbumType :: Adding Replaygain Tags using r128gain" + logDl "Adding Replaygain Tags using r128gain" r128gain -r -c 1 -a "$1" &>/dev/null } NotifyLidarrForImport () { - LidarrProcessIt=$(curl -s "$arrUrl/api/v1/command" --header "X-Api-Key:"${arrApiKey} -H "Content-Type: application/json" --data "{\"name\":\"DownloadedAlbumsScan\", \"path\":\"$1\"}") - log "$page :: $wantedAlbumListSource :: $processNumber of $wantedListAlbumTotal :: $lidarrArtistName :: $lidarrAlbumTitle :: $lidarrAlbumType :: LIDARR IMPORT NOTIFICATION SENT! :: $1" + curl -s "$arrUrl/api/v1/command" --header "X-Api-Key:" "${arrApiKey}" -H "Content-Type: application/json" --data "{\"name\":\"DownloadedAlbumsScan\", \"path\":\"$1\"}" + logDl "LIDARR IMPORT NOTIFICATION SENT! :: $1" } DeemixClientSetup () { log "DEEZER :: Verifying deemix configuration" - if [ ! -z "$arlToken" ]; then - arlToken="$(echo $arlToken | sed -e "s%[^[:alpha:][:digit:]]%%g" -e "s/ */ /g" | sed 's/^[.]*//' | sed 's/[.]*$//g' | sed 's/^ *//g' | sed 's/ *$//g')" + if [ -n "$arlToken" ]; then + arlToken="$(echo "$arlToken" | sed -e "s%[^[:alpha:][:digit:]]%%g" -e "s/ */ /g" | sed 's/^[.]*//' | sed 's/[.]*$//g' | sed 's/^ *//g' | sed 's/ *$//g')" # Create directories - mkdir -p /config/xdg/deemix - if [ -f "/config/xdg/deemix/.arl" ]; then - rm "/config/xdg/deemix/.arl" + mkdir -p "${STATE_DIR}/xdg/deemix" + if [ -f "${STATE_DIR}/xdg/deemix/.arl" ]; then + rm "${STATE_DIR}/xdg/deemix/.arl" fi - if [ ! -f "/config/xdg/deemix/.arl" ]; then - echo -n "$arlToken" > "/config/xdg/deemix/.arl" + if [ ! -f "${STATE_DIR}/xdg/deemix/.arl" ]; then + echo -n "$arlToken" > "/${STATE_DIR}/xdg/deemix/.arl" fi log "DEEZER :: ARL Token: Configured" else @@ -1783,9 +1689,6 @@ AudioProcess () { Configuration - # Perform NotFound Folder Cleanup process - NotFoundFolderCleaner - LidarrRootFolderCheck DownloadFormat @@ -1821,14 +1724,13 @@ AudioProcess () { log "Starting Script...." for (( ; ; )); do - let i++ - logfileSetup - verifyConfig + (( i++ )) || true + verifyConfig getArrAppInfo verifyApiAccess AudioProcess log "Script sleeping for $audioScriptInterval..." - sleep $audioScriptInterval + sleep "$audioScriptInterval" done exit