From d83d235e3cd68ed8acc4f0d4c3bdf20d7fc980ee Mon Sep 17 00:00:00 2001 From: Nihal Mirpuri Date: Sun, 2 Jun 2024 20:00:14 +0100 Subject: [PATCH] Allow configuration for choosing to delete files (#154) --- src/main/resources/config-template.yaml | 3 +++ src/main/scala/PlexTokenDeleteSync.scala | 6 +++--- src/main/scala/configuration/Configuration.scala | 3 ++- .../scala/configuration/ConfigurationRedactor.scala | 1 + src/main/scala/configuration/ConfigurationUtils.scala | 4 +++- src/main/scala/configuration/Keys.scala | 1 + src/main/scala/radarr/RadarrUtils.scala | 10 ++++++---- src/main/scala/sonarr/SonarrUtils.scala | 10 ++++++---- src/test/scala/PlexTokenSyncSpec.scala | 3 ++- .../scala/configuration/ConfigurationUtilsSpec.scala | 1 + 10 files changed, 28 insertions(+), 14 deletions(-) diff --git a/src/main/resources/config-template.yaml b/src/main/resources/config-template.yaml index f77116a..7224b23 100644 --- a/src/main/resources/config-template.yaml +++ b/src/main/resources/config-template.yaml @@ -91,3 +91,6 @@ ## Number of days to wait before deleting content from the arrs (Deleting must be enabled). DEFAULT: 7 # interval.days: 7 + +## Choose whether you want to delete the files as well, or only the entry in Sonarr/Radarr. DEFAULT: true +# deleteFiles: true diff --git a/src/main/scala/PlexTokenDeleteSync.scala b/src/main/scala/PlexTokenDeleteSync.scala index e4d6523..2754565 100644 --- a/src/main/scala/PlexTokenDeleteSync.scala +++ b/src/main/scala/PlexTokenDeleteSync.scala @@ -69,7 +69,7 @@ object PlexTokenDeleteSync extends PlexUtils with SonarrUtils with RadarrUtils { private def deleteMovie(client: HttpClient, config: Configuration)(movie: Item): EitherT[IO, Throwable, Unit] = if (config.deleteConfiguration.movieDeleting) { - deleteFromRadarr(client, config.radarrConfiguration)(movie) + deleteFromRadarr(client, config.radarrConfiguration, config.deleteConfiguration.deleteFiles)(movie) } else { logger.info(s"Found movie \"${movie.title}\" which is not watchlisted on Plex") EitherT.pure[IO, Throwable](()) @@ -77,9 +77,9 @@ object PlexTokenDeleteSync extends PlexUtils with SonarrUtils with RadarrUtils { private def deleteSeries(client: HttpClient, config: Configuration)(show: Item): EitherT[IO, Throwable, Unit] = if (show.ended.contains(true) && config.deleteConfiguration.endedShowDeleting) { - deleteFromSonarr(client, config.sonarrConfiguration)(show) + deleteFromSonarr(client, config.sonarrConfiguration, config.deleteConfiguration.deleteFiles)(show) } else if (show.ended.contains(false) && config.deleteConfiguration.continuingShowDeleting) { - deleteFromSonarr(client, config.sonarrConfiguration)(show) + deleteFromSonarr(client, config.sonarrConfiguration, config.deleteConfiguration.deleteFiles)(show) } else { logger.info(s"Found show \"${show.title}\" which is not watchlisted on Plex") EitherT[IO, Throwable, Unit](IO.pure(Right(()))) diff --git a/src/main/scala/configuration/Configuration.scala b/src/main/scala/configuration/Configuration.scala index 632ae42..f176788 100644 --- a/src/main/scala/configuration/Configuration.scala +++ b/src/main/scala/configuration/Configuration.scala @@ -43,5 +43,6 @@ case class DeleteConfiguration( movieDeleting: Boolean, endedShowDeleting: Boolean, continuingShowDeleting: Boolean, - deleteInterval: FiniteDuration + deleteInterval: FiniteDuration, + deleteFiles: Boolean ) diff --git a/src/main/scala/configuration/ConfigurationRedactor.scala b/src/main/scala/configuration/ConfigurationRedactor.scala index e2efdc4..c1ab3e1 100644 --- a/src/main/scala/configuration/ConfigurationRedactor.scala +++ b/src/main/scala/configuration/ConfigurationRedactor.scala @@ -34,6 +34,7 @@ object ConfigurationRedactor { | endedShowDeleting: ${config.deleteConfiguration.endedShowDeleting} | continuingShowDeleting: ${config.deleteConfiguration.continuingShowDeleting} | deleteInterval: ${config.deleteConfiguration.deleteInterval.toDays} days + | deleteFiles: ${config.deleteConfiguration.deleteFiles} | |""".stripMargin } diff --git a/src/main/scala/configuration/ConfigurationUtils.scala b/src/main/scala/configuration/ConfigurationUtils.scala index 5eaf4ac..dfff352 100644 --- a/src/main/scala/configuration/ConfigurationUtils.scala +++ b/src/main/scala/configuration/ConfigurationUtils.scala @@ -46,6 +46,7 @@ object ConfigurationUtils { .flatMap(_.toBooleanOption) .getOrElse(false) deleteInterval = configReader.getConfigOption(Keys.deleteIntervalDays).flatMap(_.toIntOption).getOrElse(7).days + deleteFiles = configReader.getConfigOption(Keys.deleteFiles).flatMap(_.toBooleanOption).getOrElse(true) hasPlexPass = plexWatchlistUrls.nonEmpty } yield Configuration( if (hasPlexPass) refreshInterval else 19.minutes, @@ -77,7 +78,8 @@ object ConfigurationUtils { deleteMovies, deleteEndedShows, deleteContinuingShows, - deleteInterval + deleteInterval, + deleteFiles ) ) diff --git a/src/main/scala/configuration/Keys.scala b/src/main/scala/configuration/Keys.scala index af609cc..5e7ec4d 100644 --- a/src/main/scala/configuration/Keys.scala +++ b/src/main/scala/configuration/Keys.scala @@ -27,4 +27,5 @@ private[configuration] object Keys { val deleteMovies = "delete.movie" val deleteEndedShow = "delete.endedShow" val deleteContinuingShow = "delete.continuingShow" + val deleteFiles = "delete.deleteFiles" } diff --git a/src/main/scala/radarr/RadarrUtils.scala b/src/main/scala/radarr/RadarrUtils.scala index 86f81cc..315f17b 100644 --- a/src/main/scala/radarr/RadarrUtils.scala +++ b/src/main/scala/radarr/RadarrUtils.scala @@ -50,7 +50,7 @@ trait RadarrUtils extends RadarrConversions { } } - protected def deleteFromRadarr(client: HttpClient, config: RadarrConfiguration)( + protected def deleteFromRadarr(client: HttpClient, config: RadarrConfiguration, deleteFiles: Boolean)( item: Item ): EitherT[IO, Throwable, Unit] = { val movieId = item.getRadarrId.getOrElse { @@ -58,7 +58,7 @@ trait RadarrUtils extends RadarrConversions { 0L } - deleteToArr(client)(config.radarrBaseUrl, config.radarrApiKey, movieId) + deleteToArr(client)(config.radarrBaseUrl, config.radarrApiKey, movieId, deleteFiles) .map { r => logger.info(s"Deleted ${item.title} from Radarr") r @@ -85,9 +85,11 @@ trait RadarrUtils extends RadarrConversions { decoded <- EitherT.fromOption[IO](maybeDecoded.toOption, new Throwable("Unable to decode response from Radarr")) } yield decoded - private def deleteToArr(client: HttpClient)(baseUrl: Uri, apiKey: String, id: Long): EitherT[IO, Throwable, Unit] = { + private def deleteToArr( + client: HttpClient + )(baseUrl: Uri, apiKey: String, id: Long, deleteFiles: Boolean): EitherT[IO, Throwable, Unit] = { val urlWithQueryParams = (baseUrl / "api" / "v3" / "movie" / id) - .withQueryParam("deleteFiles", true) + .withQueryParam("deleteFiles", deleteFiles) .withQueryParam("addImportExclusion", false) EitherT(client.httpRequest(Method.DELETE, urlWithQueryParams, Some(apiKey))) diff --git a/src/main/scala/sonarr/SonarrUtils.scala b/src/main/scala/sonarr/SonarrUtils.scala index f3eb183..eeeaf3d 100644 --- a/src/main/scala/sonarr/SonarrUtils.scala +++ b/src/main/scala/sonarr/SonarrUtils.scala @@ -53,7 +53,7 @@ trait SonarrUtils extends SonarrConversions { } } - protected def deleteFromSonarr(client: HttpClient, config: SonarrConfiguration)( + protected def deleteFromSonarr(client: HttpClient, config: SonarrConfiguration, deleteFiles: Boolean)( item: Item ): EitherT[IO, Throwable, Unit] = { val showId = item.getSonarrId.getOrElse { @@ -61,16 +61,18 @@ trait SonarrUtils extends SonarrConversions { 0L } - deleteToArr(client)(config.sonarrBaseUrl, config.sonarrApiKey, showId) + deleteToArr(client)(config.sonarrBaseUrl, config.sonarrApiKey, showId, deleteFiles) .map { r => logger.info(s"Deleted ${item.title} from Sonarr") r } } - private def deleteToArr(client: HttpClient)(baseUrl: Uri, apiKey: String, id: Long): EitherT[IO, Throwable, Unit] = { + private def deleteToArr( + client: HttpClient + )(baseUrl: Uri, apiKey: String, id: Long, deleteFiles: Boolean): EitherT[IO, Throwable, Unit] = { val urlWithQueryParams = (baseUrl / "api" / "v3" / "series" / id) - .withQueryParam("deleteFiles", true) + .withQueryParam("deleteFiles", deleteFiles) .withQueryParam("addImportListExclusion", false) EitherT(client.httpRequest(Method.DELETE, urlWithQueryParams, Some(apiKey))) diff --git a/src/test/scala/PlexTokenSyncSpec.scala b/src/test/scala/PlexTokenSyncSpec.scala index 22a5c54..6701e94 100644 --- a/src/test/scala/PlexTokenSyncSpec.scala +++ b/src/test/scala/PlexTokenSyncSpec.scala @@ -60,7 +60,8 @@ class PlexTokenSyncSpec extends AnyFlatSpec with Matchers with MockFactory { movieDeleting = false, endedShowDeleting = false, continuingShowDeleting = false, - deleteInterval = 7.days + deleteInterval = 7.days, + deleteFiles = true ) ) diff --git a/src/test/scala/configuration/ConfigurationUtilsSpec.scala b/src/test/scala/configuration/ConfigurationUtilsSpec.scala index cb7e9ef..566ab89 100644 --- a/src/test/scala/configuration/ConfigurationUtilsSpec.scala +++ b/src/test/scala/configuration/ConfigurationUtilsSpec.scala @@ -203,6 +203,7 @@ class ConfigurationUtilsSpec extends AnyFlatSpec with Matchers with MockFactory (mockConfigReader.getConfigOption _).expects(Keys.deleteIntervalDays).returning(unset).anyNumberOfTimes() (mockConfigReader.getConfigOption _).expects(Keys.sonarrTags).returning(tags).anyNumberOfTimes() (mockConfigReader.getConfigOption _).expects(Keys.radarrTags).returning(tags).anyNumberOfTimes() + (mockConfigReader.getConfigOption _).expects(Keys.deleteFiles).returning(unset).anyNumberOfTimes() mockConfigReader }