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)
}
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
*/

View File

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

View File

@ -170,8 +170,7 @@ class MediaFragment(private val mediaIdStr: String) : Fragment() {
}
// if has similar titles
// TODO reimplement
// if (media.similar.isNotEmpty()) {
// if (model.similarTo.total > 0) {
// MediaFragmentSimilar().also {
// fragments.add(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.decoration.MediaItemDecoration
import org.mosad.teapod.util.showFragment
import org.mosad.teapod.util.toItemMediaList
class MediaFragmentSimilar : Fragment() {
@ -27,14 +28,14 @@ class MediaFragmentSimilar : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
adapterSimilar = MediaItemAdapter(emptyList()) //(model.media.similar)
adapterSimilar = MediaItemAdapter(model.similarTo.toItemMediaList())
binding.recyclerMediaSimilar.adapter = adapterSimilar
binding.recyclerMediaSimilar.addItemDecoration(MediaItemDecoration(9))
// set onItemClick only in adapter is initialized
if (this::adapterSimilar.isInitialized) {
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) {
// var mediaCrunchy = NoneItem
// internal set
var seriesCrunchy = NoneSeries // movies are also series
internal set
var seasonsCrunchy = NoneSeasons
@ -33,6 +31,9 @@ class MediaFragmentViewModel(application: Application) : AndroidViewModel(applic
var isWatchlist = false
internal set
var upNextSeries = NoneUpNextSeriesItem
internal set
var similarTo = NoneSimilarToResult
internal set
// TMDB stuff
var mediaType = MediaType.OTHER
@ -52,7 +53,8 @@ class MediaFragmentViewModel(application: Application) : AndroidViewModel(applic
viewModelScope.launch { seriesCrunchy = Crunchyroll.series(crunchyId) },
viewModelScope.launch { seasonsCrunchy = Crunchyroll.seasons(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()
// load the preferred season (preferred language, language per season, not per stream)