From 839474145b34d62870405866592a4ed450d0f74f Mon Sep 17 00:00:00 2001 From: Nihal Mirpuri Date: Fri, 16 Feb 2024 16:40:33 +0000 Subject: [PATCH] Bugfix: Watchlists larger than 300 items will now work (#96) --- src/main/scala/plex/MediaContainer.scala | 2 +- src/main/scala/plex/PlexUtils.scala | 16 +++++++++++----- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/main/scala/plex/MediaContainer.scala b/src/main/scala/plex/MediaContainer.scala index abc6523..fbb4357 100644 --- a/src/main/scala/plex/MediaContainer.scala +++ b/src/main/scala/plex/MediaContainer.scala @@ -1,3 +1,3 @@ package plex -private[plex] case class MediaContainer(Metadata: List[TokenWatchlistItem]) +private[plex] case class MediaContainer(Metadata: List[TokenWatchlistItem], totalSize: Int) diff --git a/src/main/scala/plex/PlexUtils.scala b/src/main/scala/plex/PlexUtils.scala index 8f22fed..2e01231 100644 --- a/src/main/scala/plex/PlexUtils.scala +++ b/src/main/scala/plex/PlexUtils.scala @@ -49,17 +49,23 @@ trait PlexUtils { } }.toList.sequence.map(_ => ()) - protected def getSelfWatchlist(config: PlexConfiguration, client: HttpClient): EitherT[IO, Throwable, Set[Item]] = config.plexTokens.map { token => + protected def getSelfWatchlist(config: PlexConfiguration, client: HttpClient, containerStart: Int = 0): EitherT[IO, Throwable, Set[Item]] = config.plexTokens.map { token => + val containerSize = 300 val url = Uri .unsafeFromString("https://metadata.provider.plex.tv/library/sections/watchlist/all") .withQueryParam("X-Plex-Token", token) - .withQueryParam("X-Plex-Container-Start", 0) // todo: pagination - .withQueryParam("X-Plex-Container-Size", 300) + .withQueryParam("X-Plex-Container-Start", containerStart) + .withQueryParam("X-Plex-Container-Size", containerSize) for { response <- EitherT(client.httpRequest(Method.GET, url)) - result <- EitherT(response.as[TokenWatchlist].map(toItems(config, client)).sequence).leftMap(err => new Throwable(err)) - } yield result + tokenWatchlist <- EitherT(IO.pure(response.as[TokenWatchlist])).leftMap(err => new Throwable(err)) + result <- EitherT.liftF(toItems(config, client)(tokenWatchlist)) + nextPage <- if (tokenWatchlist.MediaContainer.totalSize > containerStart + containerSize) + getSelfWatchlist(config, client, containerStart + containerSize) + else + EitherT.pure[IO, Throwable](Set.empty[Item]) + } yield result ++ nextPage }.toList.sequence.map(_.toSet.flatten) protected def getOthersWatchlist(config: PlexConfiguration, client: HttpClient): EitherT[IO, Throwable, Set[Item]] =