Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ kotlin {
api(projects.core.scaffold)

implementation(projects.feature.addToAccount)
implementation(projects.feature.collections)
implementation(projects.feature.credits)
implementation(projects.feature.details)
implementation(projects.feature.discover)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ object DetailsResponseApiFactory {
fun Movie() = DetailsResponseApi.Movie(
adult = false,
backdropPath = "/xRyINp9KfMLVjRiO5nCsoRDdvvF.jpg",
belongToCollection = null,
collection = null,
budget = 63000000,
genres = listOf(
GenreResponseFactory.Movie.thriller,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import com.divinelink.core.navigation.route.Navigation.JellyseerrSettingsRoute
import com.divinelink.core.scaffold.NavGraphExtension
import com.divinelink.feature.add.to.account.list.navigation.addToListScreen
import com.divinelink.feature.add.to.account.modal.navigation.defaultMediaActionMenu
import com.divinelink.feature.collections.ui.navigation.collectionsScreen
import com.divinelink.feature.credits.navigation.creditsScreen
import com.divinelink.feature.details.navigation.detailsScreen
import com.divinelink.feature.details.navigation.personScreen
Expand Down Expand Up @@ -306,6 +307,14 @@ val navigationModule = module {
}
}

single<NavGraphExtension>(named<Navigation.CollectionRoute>()) {
{ navController, _ ->
collectionsScreen(
onNavigate = navController::findNavigation,
)
}
}

single<List<NavGraphExtension>> {
getAll<NavGraphExtension>()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.divinelink.scenepeek.di
import com.divinelink.core.domain.components.SwitchViewButtonViewModel
import com.divinelink.feature.add.to.account.list.AddToListViewModel
import com.divinelink.feature.add.to.account.modal.ActionMenuViewModel
import com.divinelink.feature.collections.CollectionsViewModel
import com.divinelink.feature.credits.ui.CreditsViewModel
import com.divinelink.feature.details.media.ui.DetailsViewModel
import com.divinelink.feature.details.person.ui.PersonViewModel
Expand Down Expand Up @@ -34,6 +35,7 @@ import org.koin.dsl.module
val appViewModelModule = module {
viewModelOf(::AccountSettingsViewModel)
viewModelOf(::AppearanceSettingsViewModel)
viewModelOf(::CollectionsViewModel)
viewModelOf(::CreditsViewModel)
viewModelOf(::DetailsViewModel)
viewModelOf(::HomeViewModel)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import androidx.navigation.NavController
import com.divinelink.core.model.search.SearchEntryPoint
import com.divinelink.core.navigation.route.Navigation
import com.divinelink.core.navigation.route.navigateToAddToList
import com.divinelink.core.navigation.route.navigateToCollection
import com.divinelink.core.navigation.route.navigateToCreateList
import com.divinelink.core.navigation.route.navigateToDetails
import com.divinelink.core.navigation.route.navigateToDiscover
Expand Down Expand Up @@ -70,6 +71,7 @@ fun NavController.findNavigation(route: Navigation) {
is Navigation.MediaListsRoute -> navigateToMediaLists(route)
is Navigation.SeasonRoute -> navigateToSeason(route)
is Navigation.EpisodeRoute -> navigateToEpisode(route)
is Navigation.CollectionRoute -> navigateToCollection(route)

// This is from top level navigation
Navigation.HomeRoute -> Unit
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.divinelink.core.data.details.repository
import com.divinelink.core.model.PaginationData
import com.divinelink.core.model.account.AccountMediaDetails
import com.divinelink.core.model.credits.AggregateCredits
import com.divinelink.core.model.details.CollectionDetails
import com.divinelink.core.model.details.MediaDetails
import com.divinelink.core.model.details.rating.ExternalRatings
import com.divinelink.core.model.details.rating.RatingDetails
Expand Down Expand Up @@ -60,4 +61,6 @@ interface DetailsRepository {
): Flow<Result<RatingDetails>>

fun findById(id: String): Flow<Result<MediaItem>>

suspend fun fetchCollectionDetails(id: Int): Result<CollectionDetails>
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import com.divinelink.core.database.media.dao.MediaDao
import com.divinelink.core.model.PaginationData
import com.divinelink.core.model.account.AccountMediaDetails
import com.divinelink.core.model.credits.AggregateCredits
import com.divinelink.core.model.details.CollectionDetails
import com.divinelink.core.model.details.MediaDetails
import com.divinelink.core.model.details.TV
import com.divinelink.core.model.details.rating.ExternalRatings
Expand All @@ -27,6 +28,7 @@ import com.divinelink.core.model.media.MediaItem
import com.divinelink.core.model.media.MediaReference
import com.divinelink.core.model.media.MediaType
import com.divinelink.core.network.Resource
import com.divinelink.core.network.media.mapper.details.map
import com.divinelink.core.network.media.mapper.find.map
import com.divinelink.core.network.media.model.MediaRequestApi
import com.divinelink.core.network.media.model.credits.AggregateCreditsApi
Expand Down Expand Up @@ -254,4 +256,8 @@ class ProdDetailsRepository(
.map {
Result.success(it.map())
}

override suspend fun fetchCollectionDetails(id: Int): Result<CollectionDetails> = mediaRemote
.fetchCollectionDetails(id)
.map { it.map() }
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ object DetailsDataFactory {
genres = null,
creators = null,
information = null,
collection = null,
)

fun cast(isTv: Boolean) = DetailsData.Cast(
Expand Down Expand Up @@ -43,6 +44,7 @@ object DetailsDataFactory {
genres = MediaDetailsFactory.FightClub().genres,
creators = MediaDetailsFactory.FightClub().creators,
information = MediaDetailsFactory.FightClub().information,
collection = null, // MediaDetailsFactory.FightClub().information
)

fun cast() = DetailsData.Cast(
Expand All @@ -66,6 +68,7 @@ object DetailsDataFactory {
genres = MediaDetailsFactory.TheOffice().genres,
creators = MediaDetailsFactory.TheOffice().creators,
information = MediaDetailsFactory.TheOffice().information,
collection = null,
)

fun cast() = DetailsData.Cast(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ object MediaDetailsFactory {
imdbId = "tt0137523",
tagline = "You don't talk about Fight Club.",
popularity = 21.6213,
collection = null,
information = MediaDetailsInformation.Movie(
originalTitle = "Fight Club",
status = "Released",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.divinelink.core.model.details

import kotlinx.serialization.Serializable

@Serializable
data class Collection(
val id: Int,
val name: String,
val posterPath: String?,
val backdropPath: String?,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.divinelink.core.model.details

import com.divinelink.core.model.media.MediaItem
import kotlinx.serialization.Serializable

@Serializable
data class CollectionDetails(
val collection: Collection,
val overview: String,
val movies: List<MediaItem.Media.Movie>,
)
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ sealed class MediaDetails {
runtime = runtime,
imdbId = imdbId,
popularity = popularity,
collection = collection,
information = information,
)
is TV -> TV(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ data class Movie(
val runtime: String?,
val cast: List<Person>,
val creators: List<Person>?,
val collection: Collection?,
override val imdbId: String?,
override val information: MediaDetailsInformation.Movie,
override val popularity: Double,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.divinelink.core.model.details.media

import com.divinelink.core.model.Genre
import com.divinelink.core.model.details.Collection
import com.divinelink.core.model.details.Person
import com.divinelink.core.model.details.Season
import com.divinelink.core.model.details.review.Review
Expand All @@ -13,6 +14,7 @@ sealed interface DetailsData {
val genres: List<Genre>?,
val creators: List<Person>?,
val information: MediaDetailsInformation?,
val collection: Collection?,
) : DetailsData

data class Cast(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.divinelink.core.network.media.mapper.details

import com.divinelink.core.model.details.Collection
import com.divinelink.core.network.media.model.movie.BelongsToCollectionResponse

fun BelongsToCollectionResponse.map() = Collection(
id = id,
name = name,
posterPath = posterPath,
backdropPath = backdropPath,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.divinelink.core.network.media.mapper.details

import com.divinelink.core.model.details.Collection
import com.divinelink.core.model.details.CollectionDetails
import com.divinelink.core.network.media.model.details.CollectionDetailsResponse
import com.divinelink.core.network.media.model.movie.toMovie

fun CollectionDetailsResponse.map() = CollectionDetails(
collection = Collection(
id = id,
name = name,
posterPath = posterPath,
backdropPath = backdropPath,
),
overview = overview,
movies = parts.map { it.toMovie() },
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.divinelink.core.network.media.model.details

import com.divinelink.core.network.media.model.movie.MovieResponseApi
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class CollectionDetailsResponse(
val id: Int,
val name: String,
@SerialName("original_name") val originalName: String,
val overview: String,
@SerialName("poster_path") val posterPath: String?,
@SerialName("backdrop_path") val backdropPath: String?,
val parts: List<MovieResponseApi>,
)
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,9 @@ import com.divinelink.core.network.media.model.details.credits.CrewApi
import com.divinelink.core.network.media.model.details.credits.SeriesCreatorApi
import com.divinelink.core.network.media.model.details.season.SeasonResponseApi
import com.divinelink.core.network.media.model.details.tv.NextEpisodeToAirResponse
import com.divinelink.core.network.media.model.movie.BelongsToCollectionResponse
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.JsonObject

@Serializable(with = DetailsResponseApiSerializer::class)
sealed class DetailsResponseApi {
Expand Down Expand Up @@ -59,7 +59,6 @@ sealed class DetailsResponseApi {
override val id: Int,
override val adult: Boolean,
@SerialName("backdrop_path") override val backdropPath: String?,
@SerialName("belongs_to_collection") val belongToCollection: JsonObject? = null,
val budget: Int,
override val genres: List<GenreResponse>,
val homepage: String? = null,
Expand All @@ -82,6 +81,7 @@ sealed class DetailsResponseApi {
@SerialName("vote_count") override val voteCount: Int,
val credits: CreditsApi? = null, // TODO credits call should be made separately
val status: String? = null,
@SerialName("belongs_to_collection") val collection: BelongsToCollectionResponse?,
) : DetailsResponseApi()

@Serializable
Expand Down Expand Up @@ -138,6 +138,7 @@ private fun DetailsResponseApi.Movie.toDomainMovie(): MediaDetails = Movie(
isFavorite = false,
imdbId = this.imdbId,
popularity = popularity,
collection = collection?.map(),
information = MediaDetailsInformation.Movie(
originalTitle = originalTitle,
status = status ?: "-",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.divinelink.core.network.media.model.movie

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class BelongsToCollectionResponse(
val id: Int,
val name: String,
@SerialName("poster_path") val posterPath: String?,
@SerialName("backdrop_path") val backdropPath: String?,
)
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ fun MoviesResponseApi.map(): PaginationData<MediaItem.Media> = PaginationData(
list = this.results.map(MovieResponseApi::toMovie),
)

private fun MovieResponseApi.toMovie() = MediaItem.Media.Movie(
fun MovieResponseApi.toMovie() = MediaItem.Media.Movie(
id = this.id,
posterPath = this.posterPath ?: "",
releaseDate = this.releaseDate,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import com.divinelink.core.model.sort.SortOption
import com.divinelink.core.network.media.model.GenresListResponse
import com.divinelink.core.network.media.model.MediaRequestApi
import com.divinelink.core.network.media.model.credits.AggregateCreditsApi
import com.divinelink.core.network.media.model.details.CollectionDetailsResponse
import com.divinelink.core.network.media.model.details.DetailsResponseApi
import com.divinelink.core.network.media.model.details.reviews.ReviewsResponseApi
import com.divinelink.core.network.media.model.details.season.SeasonDetailsResponse
Expand Down Expand Up @@ -83,4 +84,6 @@ interface MediaService {
showId: Int,
season: Int,
): Result<SeasonDetailsResponse>

suspend fun fetchCollectionDetails(id: Int): Result<CollectionDetailsResponse>
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import com.divinelink.core.network.client.TMDbClient
import com.divinelink.core.network.media.model.GenresListResponse
import com.divinelink.core.network.media.model.MediaRequestApi
import com.divinelink.core.network.media.model.credits.AggregateCreditsApi
import com.divinelink.core.network.media.model.details.CollectionDetailsResponse
import com.divinelink.core.network.media.model.details.DetailsResponseApi
import com.divinelink.core.network.media.model.details.reviews.ReviewsResponseApi
import com.divinelink.core.network.media.model.details.season.SeasonDetailsResponse
Expand All @@ -28,6 +29,7 @@ import com.divinelink.core.network.media.model.search.multi.MultiSearchResponseA
import com.divinelink.core.network.media.model.states.AccountMediaDetailsRequestApi
import com.divinelink.core.network.media.model.states.AccountMediaDetailsResponseApi
import com.divinelink.core.network.media.model.tv.TvResponseApi
import com.divinelink.core.network.media.util.buildCollectionsUrl
import com.divinelink.core.network.media.util.buildDiscoverUrl
import com.divinelink.core.network.media.util.buildFetchDetailsUrl
import com.divinelink.core.network.media.util.buildFetchMediaListUrl
Expand Down Expand Up @@ -271,4 +273,9 @@ class ProdMediaService(
),
)
}

override suspend fun fetchCollectionDetails(id: Int): Result<CollectionDetailsResponse> =
runCatching {
restClient.get<CollectionDetailsResponse>(url = buildCollectionsUrl(id = id))
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -148,3 +148,13 @@ fun buildSeasonDetailsUrl(
}
}
}.toString()

fun buildCollectionsUrl(id: Int): String = buildUrl {
protocol = URLProtocol.HTTPS
host = Routes.TMDb.HOST
encodedPath = Routes.TMDb.V3 + "/collection/$id"

parameters.apply {
append("language", "en")
}
}.toString()
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.divinelink.core.navigation.route

import androidx.navigation.NavController

fun NavController.navigateToCollection(route: Navigation.CollectionRoute) = navigate(
route = route,
)
Original file line number Diff line number Diff line change
Expand Up @@ -157,4 +157,12 @@ sealed interface Navigation {

@Serializable
data class MediaListsRoute(val section: MediaListSection) : Navigation

@Serializable
data class CollectionRoute(
val id: Int,
val name: String,
val backdropPath: String?,
val posterPath: String?,
) : Navigation
}
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ fun SharedTransitionScope.CollapsibleHeaderContent(
if (posterPath != null) {
PosterImage(
modifier = Modifier
.align(Alignment.Top)
.sharedElement(
sharedContentState = rememberSharedContentState(
SharedElementKeys.MediaPoster(posterPath),
Expand Down
Loading