diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/TmdbClient.kt b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/TmdbClient.kt index 53d6cea..4a11217 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/TmdbClient.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/TmdbClient.kt @@ -86,6 +86,10 @@ class TmdbClient: KoinComponent { return clientV4.create(ListV4Api::class.java) } + private fun ignoreErrorResponseCode(urlSegments: List): Boolean { + return (urlSegments.last() == "0" && urlSegments[urlSegments.size-2] == "season") + } + @SuppressLint("AutoboxingStateValueProperty") private fun handleResponseCode(response: Response) { when (response.code) { @@ -106,10 +110,9 @@ class TmdbClient: KoinComponent { val apiParam = QueryParam("api_key", BuildConfig.TMDB_ApiKey) val segments = chain.request().url.encodedPathSegments - val sessionIdParam: QueryParam? = sessionIdParam(segments) val builder = chain.request().url.newBuilder() - builder.addQueryParams(apiParam, sessionIdParam) + builder.addQueryParams(apiParam) if (shouldIncludeLanguageParam(segments)) { val locale = Locale.current @@ -130,22 +133,13 @@ class TmdbClient: KoinComponent { val request = requestBuilder.build() val response = chain.proceed(request) - handleResponseCode(response) + if (!ignoreErrorResponseCode(segments)) { + handleResponseCode(response) + } return response } - private fun sessionIdParam(urlSegments: List): QueryParam? { - var sessionIdParam: QueryParam? = null - if (urlSegments.size > 1 && urlSegments[1] == "account") { - val currentSession = SessionManager.currentSession.value - if (!currentSession?.sessionId.isNullOrEmpty()) { - sessionIdParam = QueryParam("session_id", currentSession!!.sessionId) - } - } - return sessionIdParam - } - private fun shouldIncludeLanguageParam(urlSegments: List): Boolean { val ignoredRoutes = listOf("images", "account") for (route in ignoredRoutes) { @@ -157,7 +151,7 @@ class TmdbClient: KoinComponent { } private fun shouldIncludeSessionIdParam(urlSegments: List): Boolean { - val includedRoutes = listOf("account_states") + val includedRoutes = listOf("account_states", "account") for (route in includedRoutes) { if (urlSegments.contains(route)) { return true @@ -191,7 +185,9 @@ class TmdbClient: KoinComponent { val response = chain.proceed(builder.build()) - handleResponseCode(response) + if (!ignoreErrorResponseCode(chain.request().url.encodedPathSegments)) { + handleResponseCode(response) + } return response } diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/TvService.kt b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/TvService.kt index 42ebf8d..e3ab48a 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/TvService.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/TvService.kt @@ -172,9 +172,13 @@ class TvService: KoinComponent, DetailService, HomePageService { suspend fun getSeason(seriesId: Int, seasonId: Int, refreshing: Boolean) { loadRemoteData( { service.getSeason(seriesId, seasonId) }, - { - _seasons[seriesId]?.add(it) ?: run { - _seasons[seriesId] = mutableSetOf(it) + { season -> + _seasons[seriesId]?.let { seasonSet -> + if (seasonSet.find { it.seasonNumber == seasonId } == null) { + seasonSet.add(season) + } + } ?: run { + _seasons[seriesId] = mutableSetOf(season) } }, seasonsLoadingState, diff --git a/app/src/main/java/com/owenlejeune/tvtime/ui/screens/SeasonListScreen.kt b/app/src/main/java/com/owenlejeune/tvtime/ui/screens/SeasonListScreen.kt index 85a3f83..a883616 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/ui/screens/SeasonListScreen.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/ui/screens/SeasonListScreen.kt @@ -82,7 +82,7 @@ fun SeasonListScreen( LaunchedEffect(Unit) { val numSeasons = mainViewModel.detailedTv[id]!!.numberOfSeasons for (i in 0..numSeasons) { - mainViewModel.getSeason(id, i) + mainViewModel.getSeason(id, i, true) } } @@ -112,8 +112,8 @@ fun SeasonListScreen( val seasonsMap = remember { mainViewModel.tvSeasons } val seasons = seasonsMap[id] ?: emptySet() - seasons.sortedBy { it.seasonNumber }.forEach { season -> - SeasonSection(season = season, singleSeason = isSingleSeason(seasons)) + seasons.sortedBy { it.seasonNumber }.forEachIndexed { index, season -> + SeasonSection(season = season, expandedByDefault = index == 0) } Spacer(modifier = Modifier.height(6.dp)) @@ -123,8 +123,8 @@ fun SeasonListScreen( } @Composable -private fun SeasonSection(season: Season, singleSeason: Boolean) { - var isExpanded by remember { mutableStateOf(singleSeason) } +private fun SeasonSection(season: Season, expandedByDefault: Boolean) { + var isExpanded by remember { mutableStateOf(expandedByDefault) } Row( modifier = Modifier.padding(horizontal = 12.dp), @@ -256,8 +256,4 @@ private fun EpisodeItem(episode: Episode) { } } } -} - -private fun isSingleSeason(seasons: Set): Boolean { - return seasons.size == 1 || (seasons.size == 2 && seasons.any { it.seasonNumber == 0 }) } \ No newline at end of file