clean up some AoDParser related code

This commit is contained in:
Jannik 2021-07-25 19:15:31 +02:00
parent 876ed97d6d
commit 801742d630
Signed by: Seil0
GPG Key ID: E8459F3723C52C24
12 changed files with 77 additions and 77 deletions

View File

@ -11,7 +11,7 @@ android {
minSdkVersion 23
targetSdkVersion 30
versionCode 4200 //00.04.200
versionName "0.4.2"
versionName "0.5.0-alpha1"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
resValue "string", "build_time", buildTime()

View File

@ -49,7 +49,10 @@ object AoDParser {
private var loginSuccess = false
private val mediaList = arrayListOf<Media>() // actual media (data)
val itemMediaList = arrayListOf<ItemMedia>() // gui media
private val aodMediaList = arrayListOf<IAoDMedia>()
// gui media
val guiMediaList = arrayListOf<ItemMedia>()
val highlightsList = arrayListOf<ItemMedia>()
val newEpisodesList = arrayListOf<ItemMedia>()
val newSimulcastsList = arrayListOf<ItemMedia>()
@ -110,8 +113,8 @@ object AoDParser {
* get a media by it's ID (int)
* @return Media
*/
suspend fun getMediaById(mediaId: Int): Media {
val media = mediaList.first { it.id == mediaId }
suspend fun getMediaById(aodId: Int): Media {
val media = mediaList.first { it.id == aodId }
if (media.episodes.isEmpty()) {
loadStreams(media).join()
@ -180,24 +183,39 @@ object AoDParser {
val resAnimes = Jsoup.connect(baseUrl + libraryPath).get()
//println(resAnimes)
itemMediaList.clear()
guiMediaList.clear()
mediaList.clear()
resAnimes.select("div.animebox").forEach {
val type = if (it.select("p.animebox-link").select("a").text().lowercase(Locale.ROOT) == "zur serie") {
MediaType.TVSHOW
} else {
MediaType.MOVIE
}
val mediaTitle = it.select("h3.animebox-title").text()
val mediaLink = it.select("p.animebox-link").select("a").attr("href")
val mediaImage = it.select("p.animebox-image").select("img").attr("src")
val mediaShortText = it.select("p.animebox-shorttext").text()
val mediaId = mediaLink.substringAfterLast("/").toInt()
val animes = resAnimes.select("div.animebox")
itemMediaList.add(ItemMedia(mediaId, mediaTitle, mediaImage))
mediaList.add(Media(mediaId, mediaLink, type).apply {
info.title = mediaTitle
info.posterUrl = mediaImage
guiMediaList.addAll(
animes.map {
ItemMedia(
id = it.select("p.animebox-link").select("a")
.attr("href").substringAfterLast("/").toInt(),
title = it.select("h3.animebox-title").text(),
posterUrl = it.select("p.animebox-image").select("img")
.attr("src")
)
}
)
// TODO legacy
resAnimes.select("div.animebox").forEach {
val id = it.select("p.animebox-link").select("a").attr("href")
.substringAfterLast("/").toInt()
val title = it.select("h3.animebox-title").text()
val image = it.select("p.animebox-image").select("img").attr("src")
val link = it.select("p.animebox-link").select("a").attr("href")
val type = when (it.select("p.animebox-link").select("a").text().lowercase(Locale.ROOT)) {
"zur serie" -> MediaType.TVSHOW
"zum film" -> MediaType.MOVIE
else -> MediaType.OTHER
}
val mediaShortText = it.select("p.animebox-shorttext").text()
mediaList.add(Media(id, link, type).apply {
info.title = title
info.posterUrl = image
info.shortDesc = mediaShortText
})
}
@ -410,9 +428,9 @@ object AoDParser {
/**
* don't use Gson().fromJson() as we don't have any control over the api and it may change
*/
private fun parsePlaylistAsync(playlistPath: String, language: String): Deferred<AoDObject> {
private fun parsePlaylistAsync(playlistPath: String, language: String): Deferred<AoDPlaylist> {
if (playlistPath == "[]") {
return CompletableDeferred(AoDObject(listOf(), language))
return CompletableDeferred(AoDPlaylist(listOf(), language))
}
return CoroutineScope(Dispatchers.IO).async(Dispatchers.IO) {
@ -435,7 +453,7 @@ object AoDParser {
//Gson().fromJson(res.body(), AoDObject::class.java)
return@async AoDObject(JsonParser.parseString(res.body()).asJsonObject
return@async AoDPlaylist(JsonParser.parseString(res.body()).asJsonObject
.get("playlist").asJsonArray.map {
Playlist(
sources = it.asJsonObject.get("sources").asJsonArray.map { source ->

View File

@ -120,24 +120,24 @@ class HomeFragment : Fragment() {
activity?.showFragment(MediaFragment(highlightMedia.id))
}
adapterMyList.onItemClick = { mediaId, _ ->
activity?.showFragment(MediaFragment(mediaId))
adapterMyList.onItemClick = { id, _ ->
activity?.showFragment(MediaFragment(id))
}
adapterNewEpisodes.onItemClick = { mediaId, _ ->
activity?.showFragment(MediaFragment(mediaId))
adapterNewEpisodes.onItemClick = { id, _ ->
activity?.showFragment(MediaFragment(id))
}
adapterNewSimulcasts.onItemClick = { mediaId, _ ->
activity?.showFragment(MediaFragment(mediaId))
adapterNewSimulcasts.onItemClick = { id, _ ->
activity?.showFragment(MediaFragment(id))
}
adapterNewTitles.onItemClick = { mediaId, _ ->
activity?.showFragment(MediaFragment(mediaId))
adapterNewTitles.onItemClick = { id, _ ->
activity?.showFragment(MediaFragment(id))
}
adapterTopTen.onItemClick = { mediaId, _ ->
activity?.showFragment(MediaFragment(mediaId))
adapterTopTen.onItemClick = { id, _ ->
activity?.showFragment(MediaFragment(id))
}
}
@ -154,7 +154,7 @@ class HomeFragment : Fragment() {
private fun mapMyListToItemMedia(): List<ItemMedia> {
return StorageController.myList.mapNotNull { elementId ->
AoDParser.itemMediaList.firstOrNull { it.id == elementId }.also {
AoDParser.guiMediaList.firstOrNull { it.id == elementId }.also {
// it the my list entry wasn't found in itemMediaList Log it
if (it == null) {
Log.w(javaClass.name, "The element with the id $elementId was not found.")

View File

@ -30,7 +30,7 @@ class LibraryFragment : Fragment() {
lifecycleScope.launch {
// create and set the adapter, needs context
context?.let {
adapter = MediaItemAdapter(AoDParser.itemMediaList)
adapter = MediaItemAdapter(AoDParser.guiMediaList)
adapter.onItemClick = { mediaId, _ ->
activity?.showFragment(MediaFragment(mediaId))
}

View File

@ -25,7 +25,7 @@ import org.mosad.teapod.ui.activity.main.viewmodel.MediaFragmentViewModel
import org.mosad.teapod.util.DataTypes.MediaType
import org.mosad.teapod.util.Episode
import org.mosad.teapod.util.StorageController
import org.mosad.teapod.util.tmdb.Movie
import org.mosad.teapod.util.tmdb.TMDBMovie
import org.mosad.teapod.util.tmdb.TMDBApiController
/**
@ -138,7 +138,7 @@ class MediaFragment(private val mediaId: Int) : Fragment() {
fragments.add(MediaFragmentEpisodes())
pagerAdapter.notifyDataSetChanged()
} else if (media.type == MediaType.MOVIE) {
val tmdbMovie = (tmdbResult as Movie?)
val tmdbMovie = (tmdbResult as TMDBMovie?)
if (tmdbMovie?.runtime != null) {
binding.textEpisodesOrRuntime.text = resources.getQuantityString(
@ -171,7 +171,7 @@ class MediaFragment(private val mediaId: Int) : Fragment() {
when (media.type) {
MediaType.MOVIE -> playEpisode(media.episodes.first())
MediaType.TVSHOW -> playEpisode(nextEpisode)
else -> Log.e(javaClass.name, "Wrong Type: $media.type")
else -> Log.e(javaClass.name, "Wrong Type: ${media.type}")
}
}

View File

@ -30,7 +30,7 @@ class SearchFragment : Fragment() {
lifecycleScope.launch {
// create and set the adapter, needs context
context?.let {
adapter = MediaItemAdapter(AoDParser.itemMediaList)
adapter = MediaItemAdapter(AoDParser.guiMediaList)
adapter!!.onItemClick = { mediaId, _ ->
binding.searchText.clearFocus()
activity?.showFragment(MediaFragment(mediaId))

View File

@ -8,7 +8,7 @@ import org.mosad.teapod.util.*
import org.mosad.teapod.util.DataTypes.MediaType
import org.mosad.teapod.util.tmdb.TMDBApiController
import org.mosad.teapod.util.tmdb.TMDBResult
import org.mosad.teapod.util.tmdb.TVSeason
import org.mosad.teapod.util.tmdb.TMDBTVSeason
/**
* handle media, next ep and tmdb
@ -22,7 +22,7 @@ class MediaFragmentViewModel(application: Application) : AndroidViewModel(applic
internal set
var tmdbResult: TMDBResult? = null // TODO rename
internal set
var tmdbTVSeason: TVSeason? =null
var tmdbTVSeason: TMDBTVSeason? =null
internal set
var mediaMeta: Meta? = null
internal set
@ -67,24 +67,6 @@ class MediaFragmentViewModel(application: Application) : AndroidViewModel(applic
null
}
// TESTING
// if (media.type == MediaType.TVSHOW) {
// if (mediaMeta != null) {
// val tvShowMeta = mediaMeta as TVShowMeta
// val tmdbTVSeason = tmdbApiController.getTVSeasonDetails(tvShowMeta.tmdbId, tvShowMeta.tmdbSeasonNumber)
// } else {
// // for tv shows not in metaDB, try to guess/search
//
// val seasonNumber = guessSeasonFromTitle(media.info.title)
// Log.d("test", "season number: $seasonNumber")
//
// val tmdbTVSeason = tmdbApiController.getTVSeasonDetails(tmdbId, seasonNumber)
// Log.d("test", "Season Info: $tmdbTVSeason.")
// }
// }
// TESTING END
if (media.type == MediaType.TVSHOW) {
nextEpisode = media.episodes.firstOrNull{ !it.watched } ?: media.episodes.first()
}

View File

@ -36,7 +36,7 @@ data class ThirdPartyComponent(
* it is uses in the ItemMediaAdapter (RecyclerView)
*/
data class ItemMedia(
val id: Int,
val id: Int, // aod path id
val title: String,
val posterUrl: String
)
@ -101,9 +101,9 @@ data class Stream(
/**
* this class is used to represent the aod json API?
*/
data class AoDObject(
val playlist: List<Playlist>,
val extLanguage: String
data class AoDPlaylist(
val list: List<Playlist>,
val language: String
)
data class Playlist(

View File

@ -12,9 +12,9 @@ import jp.wasabeef.glide.transformations.RoundedCornersTransformation
import org.mosad.teapod.R
import org.mosad.teapod.databinding.ItemEpisodeBinding
import org.mosad.teapod.util.Episode
import org.mosad.teapod.util.tmdb.TVEpisode
import org.mosad.teapod.util.tmdb.TMDBTVEpisode
class EpisodeItemAdapter(private val episodes: List<Episode>, private val tmdbEpisodes: List<TVEpisode>?) : RecyclerView.Adapter<EpisodeItemAdapter.EpisodeViewHolder>() {
class EpisodeItemAdapter(private val episodes: List<Episode>, private val tmdbEpisodes: List<TMDBTVEpisode>?) : RecyclerView.Adapter<EpisodeItemAdapter.EpisodeViewHolder>() {
var onImageClick: ((String, Int) -> Unit)? = null

View File

@ -85,12 +85,12 @@ class TMDBApiController {
* @param movieId The tmdb ID of the movie
* @return A tmdb movie object, or null if not found
*/
suspend fun getMovieDetails(movieId: Int): Movie? = withContext(Dispatchers.IO) {
suspend fun getMovieDetails(movieId: Int): TMDBMovie? = withContext(Dispatchers.IO) {
val url = URL("$detailsMovieUrl/$movieId?api_key=$apiKey&language=$language")
return@withContext try {
val json = url.readText()
Gson().fromJson(json, Movie::class.java)
Gson().fromJson(json, TMDBMovie::class.java)
} catch (ex: FileNotFoundException) {
Log.w(javaClass.name, "Waring: The requested media was not found. Requested ID: $movieId", ex)
null
@ -103,12 +103,12 @@ class TMDBApiController {
* @param tvId The tmdb ID of the tv show
* @return A tmdb tv show object, or null if not found
*/
suspend fun getTVShowDetails(tvId: Int): TVShow? = withContext(Dispatchers.IO) {
suspend fun getTVShowDetails(tvId: Int): TMDBTVShow? = withContext(Dispatchers.IO) {
val url = URL("$detailsTVUrl/$tvId?api_key=$apiKey&language=$language")
return@withContext try {
val json = url.readText()
Gson().fromJson(json, TVShow::class.java)
Gson().fromJson(json, TMDBTVShow::class.java)
} catch (ex: FileNotFoundException) {
Log.w(javaClass.name, "Waring: The requested media was not found. Requested ID: $tvId", ex)
null
@ -122,12 +122,12 @@ class TMDBApiController {
* @param seasonNumber The tmdb season number
* @return A tmdb tv season object, or null if not found
*/
suspend fun getTVSeasonDetails(tvId: Int, seasonNumber: Int): TVSeason? = withContext(Dispatchers.IO) {
suspend fun getTVSeasonDetails(tvId: Int, seasonNumber: Int): TMDBTVSeason? = withContext(Dispatchers.IO) {
val url = URL("$detailsTVUrl/$tvId/season/$seasonNumber?api_key=$apiKey&language=$language")
return@withContext try {
val json = url.readText()
Gson().fromJson(json, TVSeason::class.java)
Gson().fromJson(json, TMDBTVSeason::class.java)
} catch (ex: FileNotFoundException) {
Log.w(javaClass.name, "Waring: The requested media was not found. Requested ID: $tvId, Season: $seasonNumber", ex)
null

View File

@ -37,7 +37,7 @@ abstract class TMDBResult{
abstract val backdropPath: String?
}
data class Movie(
data class TMDBMovie(
override val id: Int,
override val name: String,
override val overview: String?,
@ -52,7 +52,7 @@ data class Movie(
// TODO generes
): TMDBResult()
data class TVShow(
data class TMDBTVShow(
override val id: Int,
override val name: String,
override val overview: String,
@ -67,7 +67,7 @@ data class TVShow(
// TODO generes
): TMDBResult()
data class TVSeason(
data class TMDBTVSeason(
val id: Int,
val name: String,
val overview: String,
@ -76,12 +76,12 @@ data class TVSeason(
@SerializedName("air_date")
val airDate: String,
@SerializedName("episodes")
val episodes: List<TVEpisode>,
val episodes: List<TMDBTVEpisode>,
@SerializedName("season_number")
val seasonNumber: Int
)
data class TVEpisode(
data class TMDBTVEpisode(
val id: Int,
val name: String,
val overview: String,

View File

@ -1,6 +1,6 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
ext.kotlin_version = "1.5.20"
ext.kotlin_version = "1.5.21"
repositories {
google()
mavenCentral()