From e54383c612b766e118eede44eb356a2215077bdd Mon Sep 17 00:00:00 2001 From: RandomNinjaAtk Date: Thu, 2 Nov 2023 11:12:37 +0000 Subject: [PATCH] 1.3 - Support trimming via series "Tag" #105 --- sonarr/DailySeriesEpisodeTrimmer.bash | 88 +++++++++++++++------------ 1 file changed, 50 insertions(+), 38 deletions(-) diff --git a/sonarr/DailySeriesEpisodeTrimmer.bash b/sonarr/DailySeriesEpisodeTrimmer.bash index 25cefb4..5f6c053 100644 --- a/sonarr/DailySeriesEpisodeTrimmer.bash +++ b/sonarr/DailySeriesEpisodeTrimmer.bash @@ -1,6 +1,6 @@ #!/usr/bin/env bash -scriptVersion="1.2" -scriptName="DailySeriesEpisodeTrimmer" +scriptVersion="1.3" +scriptName="SeriesEpisodeTrimmer" #### Import Settings source /config/extended.conf @@ -27,57 +27,69 @@ seriesId=$sonarr_series_id seriesData=$(curl -s "$arrUrl/api/v3/series/$seriesId?apikey=$arrApiKey") seriesTitle=$(echo $seriesData | jq -r ".title") seriesType=$(echo $seriesData | jq -r ".seriesType") +seriesTags=$(echo $seriesData | jq -r ".tags[]") seriesEpisodeData=$(curl -s "$arrUrl/api/v3/episode?seriesId=$seriesId&apikey=$arrApiKey") seriesEpisodeIds=$(echo "$seriesEpisodeData" | jq -r " . | sort_by(.airDate) | reverse | .[] | select(.hasFile==true) | .id") seriesEpisodeIdsCount=$(echo "$seriesEpisodeIds" | wc -l) +# If sonarr series is tagged, match via tag to support series that are not considered daily +if [ -z "$sonarrSeriesEpisodeTrimmerTag" ]; then + tagMatch="false" +else + tagMatch="false" + for tagId in $seriesTags; do + tagLabel="$(curl -s "$arrUrl/api/v3/tag/$tagId?apikey=$arrApiKey" | jq -r ".label")" + if [ "$sonarrSeriesEpisodeTrimmerTag" == "$tagLabel" ]; then + tagMatch="true" + break + fi + done +fi # Verify series is marked as "daily" type by sonarr, skip if not... -if [ $seriesType != "daily" ]; then - log "$seriesTitle (ID:$seriesId) :: TYPE :: $seriesType :: ERROR :: Non-daily series, skipping..." +if [ $seriesType != "daily" ] && [ "$tagMatch" == "false" ]; then + log "$seriesTitle (ID:$seriesId) :: ERROR :: Series does not match TYPE: Daily or TAG: $sonarrSeriesEpisodeTrimmerTag, skipping..." exit fi + # Skip processing if less than 14 episodes were found to be downloaded if [ $seriesEpisodeIdsCount -lt $maximumDailyEpisodes ]; then - log "$seriesTitle (ID:$seriesId) :: TYPE :: $seriesType :: ERROR :: Series has not exceeded $maximumDailyEpisodes downloaded episodes ($seriesEpisodeIdsCount files found), skipping..." + log "$seriesTitle (ID:$seriesId) :: ERROR :: Series has not exceeded $maximumDailyEpisodes downloaded episodes ($seriesEpisodeIdsCount files found), skipping..." exit fi # Begin processing "daily" series type -if [ $seriesType == daily ]; then - seriesEpisodeData=$(curl -s "$arrUrl/api/v3/episode?seriesId=$seriesId&apikey=$arrApiKey") - seriesEpisodeIds=$(echo "$seriesEpisodeData"| jq -r " . | sort_by(.airDate) | reverse | .[] | select(.hasFile==true) | .id") - processId=0 - seriesRefreshRequired=false - for id in $seriesEpisodeIds; do - processId=$(( $processId + 1 )) - if [ $processId -gt $maximumDailyEpisodes ]; then - episodeData=$(curl -s "http://localhost:8989/api/v3/episode/$id?apikey=$arrApiKey") - episodeSeriesId=$(echo "$episodeData" | jq -r ".seriesId") - episodeTitle=$(echo "$episodeData" | jq -r ".title") - episodeSeasonNumber=$(echo "$episodeData" | jq -r ".seasonNumber") - episodeNumber=$(echo "$episodeData" | jq -r ".episodeNumber") - episodeAirDate=$(echo "$episodeData" | jq -r ".airDate") - episodeFileId=$(echo "$episodeData" | jq -r ".episodeFileId") +seriesEpisodeData=$(curl -s "$arrUrl/api/v3/episode?seriesId=$seriesId&apikey=$arrApiKey") +seriesEpisodeIds=$(echo "$seriesEpisodeData"| jq -r " . | sort_by(.airDate) | reverse | .[] | select(.hasFile==true) | .id") +processId=0 +seriesRefreshRequired=false +for id in $seriesEpisodeIds; do + processId=$(( $processId + 1 )) + episodeData=$(curl -s "http://localhost:8989/api/v3/episode/$id?apikey=$arrApiKey") + episodeSeriesId=$(echo "$episodeData" | jq -r ".seriesId") + if [ $processId -gt $maximumDailyEpisodes ]; then + episodeTitle=$(echo "$episodeData" | jq -r ".title") + episodeSeasonNumber=$(echo "$episodeData" | jq -r ".seasonNumber") + episodeNumber=$(echo "$episodeData" | jq -r ".episodeNumber") + episodeAirDate=$(echo "$episodeData" | jq -r ".airDate") + episodeFileId=$(echo "$episodeData" | jq -r ".episodeFileId") + + # Unmonitor downloaded episode if greater than 14 downloaded episodes + log "$seriesTitle (ID:$episodeSeriesId) :: S${episodeSeasonNumber}E${episodeNumber} :: $episodeTitle :: Unmonitored Episode ID :: $id" + umonitorEpisode=$(curl -s "$arrUrl/api/v3/episode/monitor?apikey=$arrApiKey" -X PUT --data-raw "{\"episodeIds\":[$id],\"monitored\":false}") - # Unmonitor downloaded episode if greater than 14 downloaded episodes - log "$seriesTitle (ID:$episodeSeriesId) :: TYPE :: $seriesType :: S${episodeSeasonNumber}E${episodeNumber} :: $episodeAirDate :: $episodeTitle :: Unmonitored Episode ID :: $id" - umonitorEpisode=$(curl -s "$arrUrl/api/v3/episode/monitor?apikey=$arrApiKey" -X PUT --data-raw "{\"episodeIds\":[$id],\"monitored\":false}") - - # Delete downloaded episode if greater than 14 downloaded episodes - log "$seriesTitle (ID:$episodeSeriesId) :: TYPE :: $seriesType :: S${episodeSeasonNumber}E${episodeNumber} :: $episodeAirDate :: $episodeTitle :: Deleted File ID :: $episodeFileId" - deleteFile=$(curl -s "$arrUrl/api/v3/episodefile/$episodeFileId?apikey=$arrApiKey" -X DELETE) - seriesRefreshRequired=true - else - # Skip if less than required 14 downloaded episodes exist - log "$seriesTitle (ID:$episodeSeriesId) :: TYPE :: $seriesType :: Skipping Episode ID :: $id" - fi - done - if [ "$seriesRefreshRequired" = "true" ]; then - # Refresh Series after changes - log "$seriesTitle (ID:$episodeSeriesId) :: TYPE :: $seriesType :: Refresh Series" - refreshSeries=$(curl -s "$arrUrl/api/v3/command?apikey=$arrApiKey" -X POST --data-raw "{\"name\":\"RefreshSeries\",\"seriesId\":$episodeSeriesId}") + # Delete downloaded episode if greater than 14 downloaded episodes + log "$seriesTitle (ID:$episodeSeriesId) :: S${episodeSeasonNumber}E${episodeNumber} :: $episodeTitle :: Deleted File ID :: $episodeFileId" + deleteFile=$(curl -s "$arrUrl/api/v3/episodefile/$episodeFileId?apikey=$arrApiKey" -X DELETE) + seriesRefreshRequired=true + else + # Skip if less than required 14 downloaded episodes exist + log "$seriesTitle (ID:$episodeSeriesId) :: Skipping Episode ID :: $id" fi +done +if [ "$seriesRefreshRequired" = "true" ]; then + # Refresh Series after changes + log "$seriesTitle (ID:$episodeSeriesId) :: Refresh Series" + refreshSeries=$(curl -s "$arrUrl/api/v3/command?apikey=$arrApiKey" -X POST --data-raw "{\"name\":\"RefreshSeries\",\"seriesId\":$episodeSeriesId}") fi - exit