From 69a4b3c31870fd61e724fa9aabf32162f00952f6 Mon Sep 17 00:00:00 2001 From: Luna712 <142361265+Luna712@users.noreply.github.com> Date: Sat, 21 Oct 2023 17:09:28 -0600 Subject: [PATCH] Support showing content ratings for TmdbProvider --- .../com/lagradost/cloudstream3/MainAPI.kt | 6 +++ .../metaproviders/TmdbProvider.kt | 49 +++++++++++++++++++ .../ui/result/ResultFragmentPhone.kt | 1 + .../ui/result/ResultFragmentTv.kt | 1 + .../ui/result/ResultViewModel2.kt | 2 + app/src/main/res/layout/fragment_result.xml | 6 +++ .../main/res/layout/fragment_result_tv.xml | 6 +++ 7 files changed, 71 insertions(+) diff --git a/app/src/main/java/com/lagradost/cloudstream3/MainAPI.kt b/app/src/main/java/com/lagradost/cloudstream3/MainAPI.kt index 5b674c4c..da3600ee 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/MainAPI.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/MainAPI.kt @@ -1193,6 +1193,7 @@ interface LoadResponse { var syncData: MutableMap var posterHeaders: Map? var backgroundPosterUrl: String? + var contentRating: String? companion object { private val malIdPrefix = malApi.idPrefix @@ -1490,6 +1491,7 @@ data class TorrentLoadResponse( override var syncData: MutableMap = mutableMapOf(), override var posterHeaders: Map? = null, override var backgroundPosterUrl: String? = null, + override var contentRating: String? = null, ) : LoadResponse data class AnimeLoadResponse( @@ -1521,6 +1523,7 @@ data class AnimeLoadResponse( override var nextAiring: NextAiring? = null, override var seasonNames: List? = null, override var backgroundPosterUrl: String? = null, + override var contentRating: String? = null, ) : LoadResponse, EpisodeResponse { override fun getLatestEpisodes(): Map { return episodes.map { (status, episodes) -> @@ -1583,6 +1586,7 @@ data class LiveStreamLoadResponse( override var syncData: MutableMap = mutableMapOf(), override var posterHeaders: Map? = null, override var backgroundPosterUrl: String? = null, + override var contentRating: String? = null, ) : LoadResponse data class MovieLoadResponse( @@ -1606,6 +1610,7 @@ data class MovieLoadResponse( override var syncData: MutableMap = mutableMapOf(), override var posterHeaders: Map? = null, override var backgroundPosterUrl: String? = null, + override var contentRating: String? = null, ) : LoadResponse suspend fun MainAPI.newMovieLoadResponse( @@ -1730,6 +1735,7 @@ data class TvSeriesLoadResponse( override var nextAiring: NextAiring? = null, override var seasonNames: List? = null, override var backgroundPosterUrl: String? = null, + override var contentRating: String? = null, ) : LoadResponse, EpisodeResponse { override fun getLatestEpisodes(): Map { val maxSeason = diff --git a/app/src/main/java/com/lagradost/cloudstream3/metaproviders/TmdbProvider.kt b/app/src/main/java/com/lagradost/cloudstream3/metaproviders/TmdbProvider.kt index 314177af..13d1b78a 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/metaproviders/TmdbProvider.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/metaproviders/TmdbProvider.kt @@ -151,6 +151,8 @@ open class TmdbProvider : MainAPI() { recommendations = (this@toLoadResponse.recommendations ?: this@toLoadResponse.similar)?.results?.map { it.toSearchResponse() } addActors(credits?.cast?.toList().toActors()) + + contentRating = fetchContentRating(id, "US", true) } } @@ -193,6 +195,8 @@ open class TmdbProvider : MainAPI() { recommendations = (this@toLoadResponse.recommendations ?: this@toLoadResponse.similar)?.results?.map { it.toSearchResponse() } addActors(credits?.cast?.toList().toActors()) + + contentRating = fetchContentRating(id, "US", false) } } @@ -264,6 +268,51 @@ open class TmdbProvider : MainAPI() { return null } + open suspend fun fetchContentRating(id: Int?, country: String, isTvSeries: Boolean): String? { + id ?: return null + return if (isTvSeries) { + val contentRatings = tmdb.tvService().content_ratings(id).awaitResponse().body() + contentRatings?.results + ?.find { it.iso_3166_1 == country } + ?.rating + } else { + val releaseDates = tmdb.moviesService().releaseDates(id).awaitResponse().body()?.results + val certification = findFirstNonEmptyCertificationWithCountry(releaseDates, country) + if (!certification.isNullOrEmpty()) { + certification + } else { + null + } + } + } + + private fun findFirstNonEmptyCertificationWithCountry( + releaseDatesResults: List?, + country: String + ): String? { + for (releaseDateResult in releaseDatesResults.orEmpty()) { + if (releaseDateResult.iso_3166_1 == country) { + val certification = findFirstNonEmptyCertification(releaseDateResult.release_dates) + if (!certification.isNullOrEmpty()) { + return certification + } + } + } + + return null + } + + private fun findFirstNonEmptyCertification(releaseDates: List?): String? { + for (releaseDate in releaseDates.orEmpty()) { + val certification = releaseDate.certification + if (!certification.isNullOrBlank()) { + return certification + } + } + + return null + } + // Possible to add recommendations and such here. override suspend fun load(url: String): LoadResponse? { // https://www.themoviedb.org/movie/7445-brothers diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragmentPhone.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragmentPhone.kt index a0d82062..53203595 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragmentPhone.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragmentPhone.kt @@ -675,6 +675,7 @@ open class ResultFragmentPhone : FullScreenPlayer() { resultMetaYear.setText(d.yearText) resultMetaDuration.setText(d.durationText) resultMetaRating.setText(d.ratingText) + resultMetaContentRating.setText(d.contentRatingText) resultCastText.setText(d.actorsText) resultNextAiring.setText(d.nextAiringEpisode) resultNextAiringTime.setText(d.nextAiringDate) diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragmentTv.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragmentTv.kt index 13734b67..fe8f8544 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragmentTv.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragmentTv.kt @@ -780,6 +780,7 @@ class ResultFragmentTv : Fragment() { resultMetaYear.setText(d.yearText) resultMetaDuration.setText(d.durationText) resultMetaRating.setText(d.ratingText) + resultMetaContentRating.setText(d.contentRatingText) resultCastText.setText(d.actorsText) resultNextAiring.setText(d.nextAiringEpisode) resultNextAiringTime.setText(d.nextAiringDate) diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultViewModel2.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultViewModel2.kt index e5ed7b92..0634c50f 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultViewModel2.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultViewModel2.kt @@ -100,6 +100,7 @@ data class ResultData( val plotText: UiText, val apiName: UiText, val ratingText: UiText?, + val contentRatingText: UiText?, val vpnText: UiText?, val metaText: UiText?, val durationText: UiText?, @@ -219,6 +220,7 @@ fun LoadResponse.toResultData(repo: APIRepository): ResultData { apiName = txt(apiName), ratingText = rating?.div(1000f) ?.let { if (it <= 0.1f) null else txt(R.string.rating_format, it) }, + contentRatingText = txt(contentRating), vpnText = txt( when (repo.vpnStatus) { VPNStatus.None -> null diff --git a/app/src/main/res/layout/fragment_result.xml b/app/src/main/res/layout/fragment_result.xml index 9d748c5a..0b15cf0f 100644 --- a/app/src/main/res/layout/fragment_result.xml +++ b/app/src/main/res/layout/fragment_result.xml @@ -388,6 +388,12 @@ android:id="@+id/result_meta_duration" style="@style/ResultInfoText" tools:text="121min" /> + +