add similarTo function to crunchyroll parser
This will allow us to show similar tv shows in MediaFragment
This commit is contained in:
parent
b2196f11da
commit
629c144c5b
|
@ -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
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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))
|
||||||
|
|
|
@ -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))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue