add similarTo function to crunchyroll parser

This will allow us to show similar tv shows in MediaFragment
This commit is contained in:
Jannik 2022-04-03 16:14:22 +02:00
parent b2196f11da
commit 629c144c5b
Signed by: Seil0
GPG Key ID: E8459F3723C52C24
5 changed files with 37 additions and 13 deletions

View File

@ -458,7 +458,7 @@ object Crunchyroll {
} }
/** /**
* Additional media functions: watchlist (series), playhead * Additional media functions: watchlist (series), playhead, similar to
*/ */
/** /**
@ -546,6 +546,22 @@ object Crunchyroll {
requestPost(playheadsEndpoint, parameters, json) requestPost(playheadsEndpoint, parameters, json)
} }
suspend fun similarTo(seriesId: String, n: Int = 10): SimilarToResult {
val similarToEndpoint = "/content/v1/$accountID/similar_to"
val parameters = listOf(
"guid" to seriesId,
"locale" to Preferences.preferredLocale.toLanguageTag(),
"n" to n
)
return try {
requestGet(similarToEndpoint, parameters)
}catch (ex: SerializationException) {
Log.e(TAG, "SerializationException in similarTo().", ex)
NoneSimilarToResult
}
}
/** /**
* Listing functions: watchlist (list), up_next_account * Listing functions: watchlist (list), up_next_account
*/ */

View File

@ -101,6 +101,7 @@ data class Collection<T>(
typealias SearchResult = Collection<SearchCollection> typealias SearchResult = Collection<SearchCollection>
typealias SearchCollection = Collection<Item> typealias SearchCollection = Collection<Item>
typealias BrowseResult = Collection<Item> typealias BrowseResult = Collection<Item>
typealias SimilarToResult = Collection<Item>
typealias DiscSeasonList = Collection<SeasonListItem> typealias DiscSeasonList = Collection<SeasonListItem>
typealias Watchlist = Collection<Item> typealias Watchlist = Collection<Item>
typealias ContinueWatchingList = Collection<ContinueWatchingItem> typealias ContinueWatchingList = Collection<ContinueWatchingItem>
@ -117,7 +118,7 @@ data class UpNextSeriesItem(
* panel data classes * panel data classes
*/ */
// the data class Item is used in browse and search // the data class Item is used in browse, search, watchlist and similar to
// TODO rename to MediaPanel // TODO rename to MediaPanel
@Serializable @Serializable
data class Item( data class Item(
@ -128,6 +129,7 @@ data class Item(
val description: String, val description: String,
val images: Images val images: Images
// TODO series_metadata etc. // TODO series_metadata etc.
// TODO add slug_title if present in search, browse, similar to
) )
@Serializable @Serializable
@ -197,13 +199,14 @@ val NoneEpisodePanel = EpisodePanel("", "", "", "", "", NoneEpisodeMetadata, Thu
val NoneCollection = Collection<Item>(0, emptyList()) val NoneCollection = Collection<Item>(0, emptyList())
val NoneSearchResult = SearchResult(0, emptyList()) val NoneSearchResult = SearchResult(0, emptyList())
val NoneBrowseResult = BrowseResult(0, emptyList()) val NoneBrowseResult = BrowseResult(0, emptyList())
val NoneSimilarToResult = SimilarToResult(0, emptyList())
val NoneDiscSeasonList = DiscSeasonList(0, emptyList()) val NoneDiscSeasonList = DiscSeasonList(0, emptyList())
val NoneContinueWatchingList = ContinueWatchingList(0, emptyList()) val NoneContinueWatchingList = ContinueWatchingList(0, emptyList())
val NoneUpNextSeriesItem = UpNextSeriesItem(0, false, false, NoneEpisodePanel) val NoneUpNextSeriesItem = UpNextSeriesItem(0, false, false, NoneEpisodePanel)
/** /**
* Series data type * series data class
*/ */
@Serializable @Serializable
data class Series( data class Series(
@ -216,7 +219,7 @@ data class Series(
val NoneSeries = Series("", "", "", Images(emptyList(), emptyList()), emptyList()) val NoneSeries = Series("", "", "", Images(emptyList(), emptyList()), emptyList())
/** /**
* Seasons data type * Seasons data classes
*/ */
@Serializable @Serializable
data class Seasons( data class Seasons(
@ -250,7 +253,7 @@ val NoneSeason = Season("", "", "", "", 0, isSubbed = false, isDubbed = false)
/** /**
* Episodes data type * Episodes data classes
*/ */
@Serializable @Serializable
data class Episodes( data class Episodes(
@ -314,7 +317,7 @@ data class PlayheadObject(
) )
/** /**
* Playback/stream data type * playback/stream data classes
*/ */
@Serializable @Serializable
data class Playback( data class Playback(
@ -362,6 +365,9 @@ val NonePlayback = Playback(
) )
) )
/**
* profile data class
*/
@Serializable @Serializable
data class Profile( data class Profile(
@SerialName("avatar") val avatar: String, @SerialName("avatar") val avatar: String,

View File

@ -170,8 +170,7 @@ class MediaFragment(private val mediaIdStr: String) : Fragment() {
} }
// if has similar titles // if has similar titles
// TODO reimplement // if (model.similarTo.total > 0) {
// if (media.similar.isNotEmpty()) {
// MediaFragmentSimilar().also { // MediaFragmentSimilar().also {
// fragments.add(it) // fragments.add(it)
// pagerAdapter.notifyItemInserted(fragments.indexOf(it)) // pagerAdapter.notifyItemInserted(fragments.indexOf(it))

View File

@ -11,6 +11,7 @@ import org.mosad.teapod.ui.activity.main.viewmodel.MediaFragmentViewModel
import org.mosad.teapod.util.adapter.MediaItemAdapter import org.mosad.teapod.util.adapter.MediaItemAdapter
import org.mosad.teapod.util.decoration.MediaItemDecoration import org.mosad.teapod.util.decoration.MediaItemDecoration
import org.mosad.teapod.util.showFragment import org.mosad.teapod.util.showFragment
import org.mosad.teapod.util.toItemMediaList
class MediaFragmentSimilar : Fragment() { class MediaFragmentSimilar : Fragment() {
@ -27,14 +28,14 @@ class MediaFragmentSimilar : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
adapterSimilar = MediaItemAdapter(emptyList()) //(model.media.similar) adapterSimilar = MediaItemAdapter(model.similarTo.toItemMediaList())
binding.recyclerMediaSimilar.adapter = adapterSimilar binding.recyclerMediaSimilar.adapter = adapterSimilar
binding.recyclerMediaSimilar.addItemDecoration(MediaItemDecoration(9)) binding.recyclerMediaSimilar.addItemDecoration(MediaItemDecoration(9))
// set onItemClick only in adapter is initialized // set onItemClick only in adapter is initialized
if (this::adapterSimilar.isInitialized) { if (this::adapterSimilar.isInitialized) {
adapterSimilar.onItemClick = { mediaId, _ -> adapterSimilar.onItemClick = { mediaId, _ ->
activity?.showFragment(MediaFragment("")) //(mediaId)) activity?.showFragment(MediaFragment(mediaId))
} }
} }
} }

View File

@ -16,8 +16,6 @@ import org.mosad.teapod.util.tmdb.*
*/ */
class MediaFragmentViewModel(application: Application) : AndroidViewModel(application) { class MediaFragmentViewModel(application: Application) : AndroidViewModel(application) {
// var mediaCrunchy = NoneItem
// internal set
var seriesCrunchy = NoneSeries // movies are also series var seriesCrunchy = NoneSeries // movies are also series
internal set internal set
var seasonsCrunchy = NoneSeasons var seasonsCrunchy = NoneSeasons
@ -33,6 +31,9 @@ class MediaFragmentViewModel(application: Application) : AndroidViewModel(applic
var isWatchlist = false var isWatchlist = false
internal set internal set
var upNextSeries = NoneUpNextSeriesItem var upNextSeries = NoneUpNextSeriesItem
internal set
var similarTo = NoneSimilarToResult
internal set
// TMDB stuff // TMDB stuff
var mediaType = MediaType.OTHER var mediaType = MediaType.OTHER
@ -52,7 +53,8 @@ class MediaFragmentViewModel(application: Application) : AndroidViewModel(applic
viewModelScope.launch { seriesCrunchy = Crunchyroll.series(crunchyId) }, viewModelScope.launch { seriesCrunchy = Crunchyroll.series(crunchyId) },
viewModelScope.launch { seasonsCrunchy = Crunchyroll.seasons(crunchyId) }, viewModelScope.launch { seasonsCrunchy = Crunchyroll.seasons(crunchyId) },
viewModelScope.launch { isWatchlist = Crunchyroll.isWatchlist(crunchyId) }, viewModelScope.launch { isWatchlist = Crunchyroll.isWatchlist(crunchyId) },
viewModelScope.launch { upNextSeries = Crunchyroll.upNextSeries(crunchyId) } viewModelScope.launch { upNextSeries = Crunchyroll.upNextSeries(crunchyId) },
viewModelScope.launch { similarTo = Crunchyroll.similarTo(crunchyId) }
).joinAll() ).joinAll()
// load the preferred season (preferred language, language per season, not per stream) // load the preferred season (preferred language, language per season, not per stream)