Show Seerr source ratings on Jellyfin movie and series details
This commit is contained in:
parent
15b082ccd8
commit
38db9e5127
5 changed files with 34 additions and 2 deletions
|
|
@ -339,6 +339,7 @@ fun MovieDetailsContent(
|
||||||
chosenStreams = state.chosenStreams,
|
chosenStreams = state.chosenStreams,
|
||||||
bringIntoViewRequester = bringIntoViewRequester,
|
bringIntoViewRequester = bringIntoViewRequester,
|
||||||
overviewOnClick = overviewOnClick,
|
overviewOnClick = overviewOnClick,
|
||||||
|
sourceRatings = state.sourceRatings,
|
||||||
modifier =
|
modifier =
|
||||||
Modifier
|
Modifier
|
||||||
.fillMaxWidth()
|
.fillMaxWidth()
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,8 @@ import androidx.tv.material3.Text
|
||||||
import com.github.damontecres.wholphin.R
|
import com.github.damontecres.wholphin.R
|
||||||
import com.github.damontecres.wholphin.data.ChosenStreams
|
import com.github.damontecres.wholphin.data.ChosenStreams
|
||||||
import com.github.damontecres.wholphin.data.model.BaseItem
|
import com.github.damontecres.wholphin.data.model.BaseItem
|
||||||
|
import com.github.damontecres.wholphin.data.model.SourceRatings
|
||||||
|
import com.github.damontecres.wholphin.data.model.withSourceRatings
|
||||||
import com.github.damontecres.wholphin.preferences.UserPreferences
|
import com.github.damontecres.wholphin.preferences.UserPreferences
|
||||||
import com.github.damontecres.wholphin.ui.components.GenreText
|
import com.github.damontecres.wholphin.ui.components.GenreText
|
||||||
import com.github.damontecres.wholphin.ui.components.HeaderUtils
|
import com.github.damontecres.wholphin.ui.components.HeaderUtils
|
||||||
|
|
@ -41,8 +43,10 @@ fun MovieDetailsHeader(
|
||||||
bringIntoViewRequester: BringIntoViewRequester,
|
bringIntoViewRequester: BringIntoViewRequester,
|
||||||
overviewOnClick: () -> Unit,
|
overviewOnClick: () -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
|
sourceRatings: SourceRatings? = null,
|
||||||
) {
|
) {
|
||||||
val dto = movie.data
|
val dto = movie.data
|
||||||
|
val quickDetails = remember(movie, sourceRatings) { movie.ui.quickDetails.withSourceRatings(sourceRatings) }
|
||||||
val context = LocalContext.current
|
val context = LocalContext.current
|
||||||
val scope = rememberCoroutineScope()
|
val scope = rememberCoroutineScope()
|
||||||
Column(
|
Column(
|
||||||
|
|
@ -64,7 +68,7 @@ fun MovieDetailsHeader(
|
||||||
modifier = Modifier.fillMaxWidth(.60f),
|
modifier = Modifier.fillMaxWidth(.60f),
|
||||||
) {
|
) {
|
||||||
QuickDetails(
|
QuickDetails(
|
||||||
movie.ui.quickDetails,
|
quickDetails,
|
||||||
movie.timeRemainingOrRuntime,
|
movie.timeRemainingOrRuntime,
|
||||||
Modifier.padding(start = HeaderUtils.startPadding),
|
Modifier.padding(start = HeaderUtils.startPadding),
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,7 @@ import com.github.damontecres.wholphin.data.model.Chapter
|
||||||
import com.github.damontecres.wholphin.data.model.DiscoverItem
|
import com.github.damontecres.wholphin.data.model.DiscoverItem
|
||||||
import com.github.damontecres.wholphin.data.model.ItemPlayback
|
import com.github.damontecres.wholphin.data.model.ItemPlayback
|
||||||
import com.github.damontecres.wholphin.data.model.Person
|
import com.github.damontecres.wholphin.data.model.Person
|
||||||
|
import com.github.damontecres.wholphin.data.model.SourceRatings
|
||||||
import com.github.damontecres.wholphin.data.model.Trailer
|
import com.github.damontecres.wholphin.data.model.Trailer
|
||||||
import com.github.damontecres.wholphin.services.BackdropService
|
import com.github.damontecres.wholphin.services.BackdropService
|
||||||
import com.github.damontecres.wholphin.services.ExtrasService
|
import com.github.damontecres.wholphin.services.ExtrasService
|
||||||
|
|
@ -19,6 +20,7 @@ import com.github.damontecres.wholphin.services.FavoriteWatchManager
|
||||||
import com.github.damontecres.wholphin.services.MediaManagementService
|
import com.github.damontecres.wholphin.services.MediaManagementService
|
||||||
import com.github.damontecres.wholphin.services.NavigationManager
|
import com.github.damontecres.wholphin.services.NavigationManager
|
||||||
import com.github.damontecres.wholphin.services.PeopleFavorites
|
import com.github.damontecres.wholphin.services.PeopleFavorites
|
||||||
|
import com.github.damontecres.wholphin.services.SeerrRatingsService
|
||||||
import com.github.damontecres.wholphin.services.SeerrService
|
import com.github.damontecres.wholphin.services.SeerrService
|
||||||
import com.github.damontecres.wholphin.services.ServerReportService
|
import com.github.damontecres.wholphin.services.ServerReportService
|
||||||
import com.github.damontecres.wholphin.services.StreamChoiceService
|
import com.github.damontecres.wholphin.services.StreamChoiceService
|
||||||
|
|
@ -57,6 +59,7 @@ class MovieViewModel
|
||||||
constructor(
|
constructor(
|
||||||
private val api: ApiClient,
|
private val api: ApiClient,
|
||||||
private val seerrService: SeerrService,
|
private val seerrService: SeerrService,
|
||||||
|
private val ratingsService: SeerrRatingsService,
|
||||||
@param:ApplicationContext private val context: Context,
|
@param:ApplicationContext private val context: Context,
|
||||||
private val navigationManager: NavigationManager,
|
private val navigationManager: NavigationManager,
|
||||||
val serverRepository: ServerRepository,
|
val serverRepository: ServerRepository,
|
||||||
|
|
@ -152,6 +155,11 @@ class MovieViewModel
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
viewModelScope.launchIO {
|
||||||
|
ratingsService.forItem(movie).collect { ratings ->
|
||||||
|
_state.update { it.copy(sourceRatings = ratings) }
|
||||||
|
}
|
||||||
|
}
|
||||||
viewModelScope.launchIO {
|
viewModelScope.launchIO {
|
||||||
val results = seerrService.similar(movie).orEmpty()
|
val results = seerrService.similar(movie).orEmpty()
|
||||||
_state.update {
|
_state.update {
|
||||||
|
|
@ -305,6 +313,8 @@ data class MovieState(
|
||||||
val extras: List<ExtrasItem> = emptyList(),
|
val extras: List<ExtrasItem> = emptyList(),
|
||||||
val similar: List<BaseItem> = emptyList(),
|
val similar: List<BaseItem> = emptyList(),
|
||||||
val discovered: List<DiscoverItem> = emptyList(),
|
val discovered: List<DiscoverItem> = emptyList(),
|
||||||
|
/** Seerr ratings, null until they load or if unavailable */
|
||||||
|
val sourceRatings: SourceRatings? = null,
|
||||||
val chosenStreams: ChosenStreams? = null,
|
val chosenStreams: ChosenStreams? = null,
|
||||||
val canDelete: Boolean = false,
|
val canDelete: Boolean = false,
|
||||||
) {
|
) {
|
||||||
|
|
|
||||||
|
|
@ -44,8 +44,10 @@ import com.github.damontecres.wholphin.data.ExtrasItem
|
||||||
import com.github.damontecres.wholphin.data.model.BaseItem
|
import com.github.damontecres.wholphin.data.model.BaseItem
|
||||||
import com.github.damontecres.wholphin.data.model.DiscoverItem
|
import com.github.damontecres.wholphin.data.model.DiscoverItem
|
||||||
import com.github.damontecres.wholphin.data.model.Person
|
import com.github.damontecres.wholphin.data.model.Person
|
||||||
|
import com.github.damontecres.wholphin.data.model.SourceRatings
|
||||||
import com.github.damontecres.wholphin.data.model.Trailer
|
import com.github.damontecres.wholphin.data.model.Trailer
|
||||||
import com.github.damontecres.wholphin.data.model.studioNames
|
import com.github.damontecres.wholphin.data.model.studioNames
|
||||||
|
import com.github.damontecres.wholphin.data.model.withSourceRatings
|
||||||
import com.github.damontecres.wholphin.preferences.UserPreferences
|
import com.github.damontecres.wholphin.preferences.UserPreferences
|
||||||
import com.github.damontecres.wholphin.services.TrailerService
|
import com.github.damontecres.wholphin.services.TrailerService
|
||||||
import com.github.damontecres.wholphin.ui.Cards
|
import com.github.damontecres.wholphin.ui.Cards
|
||||||
|
|
@ -253,6 +255,7 @@ fun SeriesDetails(
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
discovered = state.discovered,
|
discovered = state.discovered,
|
||||||
|
sourceRatings = state.sourceRatings,
|
||||||
onClickDiscover = { index, item ->
|
onClickDiscover = { index, item ->
|
||||||
viewModel.navigateTo(item.destination)
|
viewModel.navigateTo(item.destination)
|
||||||
},
|
},
|
||||||
|
|
@ -330,6 +333,7 @@ fun SeriesDetailsContent(
|
||||||
extras: List<ExtrasItem>,
|
extras: List<ExtrasItem>,
|
||||||
people: List<Person>,
|
people: List<Person>,
|
||||||
discovered: List<DiscoverItem>,
|
discovered: List<DiscoverItem>,
|
||||||
|
sourceRatings: SourceRatings?,
|
||||||
played: Boolean,
|
played: Boolean,
|
||||||
favorite: Boolean,
|
favorite: Boolean,
|
||||||
canDelete: Boolean,
|
canDelete: Boolean,
|
||||||
|
|
@ -377,6 +381,7 @@ fun SeriesDetailsContent(
|
||||||
showLogo = preferences.appPreferences.interfacePreferences.showLogos,
|
showLogo = preferences.appPreferences.interfacePreferences.showLogos,
|
||||||
overviewOnClick = overviewOnClick,
|
overviewOnClick = overviewOnClick,
|
||||||
bringIntoViewRequester = bringIntoViewRequester,
|
bringIntoViewRequester = bringIntoViewRequester,
|
||||||
|
sourceRatings = sourceRatings,
|
||||||
modifier =
|
modifier =
|
||||||
Modifier
|
Modifier
|
||||||
.fillMaxWidth()
|
.fillMaxWidth()
|
||||||
|
|
@ -654,9 +659,11 @@ fun SeriesDetailsHeader(
|
||||||
overviewOnClick: () -> Unit,
|
overviewOnClick: () -> Unit,
|
||||||
bringIntoViewRequester: BringIntoViewRequester,
|
bringIntoViewRequester: BringIntoViewRequester,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
|
sourceRatings: SourceRatings? = null,
|
||||||
) {
|
) {
|
||||||
val scope = rememberCoroutineScope()
|
val scope = rememberCoroutineScope()
|
||||||
val dto = series.data
|
val dto = series.data
|
||||||
|
val quickDetails = remember(series, sourceRatings) { series.ui.quickDetails.withSourceRatings(sourceRatings) }
|
||||||
Column(
|
Column(
|
||||||
verticalArrangement = Arrangement.spacedBy(4.dp),
|
verticalArrangement = Arrangement.spacedBy(4.dp),
|
||||||
modifier = modifier,
|
modifier = modifier,
|
||||||
|
|
@ -674,7 +681,7 @@ fun SeriesDetailsHeader(
|
||||||
modifier = Modifier.fillMaxWidth(.60f),
|
modifier = Modifier.fillMaxWidth(.60f),
|
||||||
) {
|
) {
|
||||||
QuickDetails(
|
QuickDetails(
|
||||||
series.ui.quickDetails,
|
quickDetails,
|
||||||
null,
|
null,
|
||||||
Modifier.padding(start = HeaderUtils.startPadding),
|
Modifier.padding(start = HeaderUtils.startPadding),
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,7 @@ import com.github.damontecres.wholphin.data.model.BaseItem
|
||||||
import com.github.damontecres.wholphin.data.model.DiscoverItem
|
import com.github.damontecres.wholphin.data.model.DiscoverItem
|
||||||
import com.github.damontecres.wholphin.data.model.ItemPlayback
|
import com.github.damontecres.wholphin.data.model.ItemPlayback
|
||||||
import com.github.damontecres.wholphin.data.model.Person
|
import com.github.damontecres.wholphin.data.model.Person
|
||||||
|
import com.github.damontecres.wholphin.data.model.SourceRatings
|
||||||
import com.github.damontecres.wholphin.data.model.Trailer
|
import com.github.damontecres.wholphin.data.model.Trailer
|
||||||
import com.github.damontecres.wholphin.preferences.AppPreferences
|
import com.github.damontecres.wholphin.preferences.AppPreferences
|
||||||
import com.github.damontecres.wholphin.services.BackdropService
|
import com.github.damontecres.wholphin.services.BackdropService
|
||||||
|
|
@ -20,6 +21,7 @@ import com.github.damontecres.wholphin.services.FavoriteWatchManager
|
||||||
import com.github.damontecres.wholphin.services.MediaManagementService
|
import com.github.damontecres.wholphin.services.MediaManagementService
|
||||||
import com.github.damontecres.wholphin.services.NavigationManager
|
import com.github.damontecres.wholphin.services.NavigationManager
|
||||||
import com.github.damontecres.wholphin.services.PeopleFavorites
|
import com.github.damontecres.wholphin.services.PeopleFavorites
|
||||||
|
import com.github.damontecres.wholphin.services.SeerrRatingsService
|
||||||
import com.github.damontecres.wholphin.services.SeerrService
|
import com.github.damontecres.wholphin.services.SeerrService
|
||||||
import com.github.damontecres.wholphin.services.ServerReportService
|
import com.github.damontecres.wholphin.services.ServerReportService
|
||||||
import com.github.damontecres.wholphin.services.StreamChoiceService
|
import com.github.damontecres.wholphin.services.StreamChoiceService
|
||||||
|
|
@ -100,6 +102,7 @@ class SeriesViewModel
|
||||||
private val userPreferencesService: UserPreferencesService,
|
private val userPreferencesService: UserPreferencesService,
|
||||||
private val backdropService: BackdropService,
|
private val backdropService: BackdropService,
|
||||||
private val seerrService: SeerrService,
|
private val seerrService: SeerrService,
|
||||||
|
private val ratingsService: SeerrRatingsService,
|
||||||
private val mediaManagementService: MediaManagementService,
|
private val mediaManagementService: MediaManagementService,
|
||||||
@Assisted val seriesId: UUID,
|
@Assisted val seriesId: UUID,
|
||||||
@Assisted val seasonEpisodeIds: SeasonEpisodeIds?,
|
@Assisted val seasonEpisodeIds: SeasonEpisodeIds?,
|
||||||
|
|
@ -251,6 +254,11 @@ class SeriesViewModel
|
||||||
_state.update { it.copy(similar = similar) }
|
_state.update { it.copy(similar = similar) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
viewModelScope.launchIO {
|
||||||
|
ratingsService.forItem(series).collect { ratings ->
|
||||||
|
_state.update { it.copy(sourceRatings = ratings) }
|
||||||
|
}
|
||||||
|
}
|
||||||
viewModelScope.launchIO {
|
viewModelScope.launchIO {
|
||||||
val results = seerrService.similar(series).orEmpty()
|
val results = seerrService.similar(series).orEmpty()
|
||||||
_state.update { it.copy(discovered = results) }
|
_state.update { it.copy(discovered = results) }
|
||||||
|
|
@ -895,5 +903,7 @@ data class SeriesState(
|
||||||
val peopleInEpisode: PeopleInItem = PeopleInItem(),
|
val peopleInEpisode: PeopleInItem = PeopleInItem(),
|
||||||
val discovered: List<DiscoverItem> = emptyList(),
|
val discovered: List<DiscoverItem> = emptyList(),
|
||||||
val discoverSeries: DiscoverItem? = null,
|
val discoverSeries: DiscoverItem? = null,
|
||||||
|
/** Seerr ratings, null until they load or if unavailable */
|
||||||
|
val sourceRatings: SourceRatings? = null,
|
||||||
val chosenStreams: ChosenStreams? = null,
|
val chosenStreams: ChosenStreams? = null,
|
||||||
)
|
)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue