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 minSdkVersion 23
targetSdkVersion 30 targetSdkVersion 30
versionCode 4200 //00.04.200 versionCode 4200 //00.04.200
versionName "0.4.2" versionName "0.5.0-alpha1"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
resValue "string", "build_time", buildTime() resValue "string", "build_time", buildTime()

View File

@ -49,7 +49,10 @@ object AoDParser {
private var loginSuccess = false private var loginSuccess = false
private val mediaList = arrayListOf<Media>() // actual media (data) 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 highlightsList = arrayListOf<ItemMedia>()
val newEpisodesList = arrayListOf<ItemMedia>() val newEpisodesList = arrayListOf<ItemMedia>()
val newSimulcastsList = arrayListOf<ItemMedia>() val newSimulcastsList = arrayListOf<ItemMedia>()
@ -110,8 +113,8 @@ object AoDParser {
* get a media by it's ID (int) * get a media by it's ID (int)
* @return Media * @return Media
*/ */
suspend fun getMediaById(mediaId: Int): Media { suspend fun getMediaById(aodId: Int): Media {
val media = mediaList.first { it.id == mediaId } val media = mediaList.first { it.id == aodId }
if (media.episodes.isEmpty()) { if (media.episodes.isEmpty()) {
loadStreams(media).join() loadStreams(media).join()
@ -180,24 +183,39 @@ object AoDParser {
val resAnimes = Jsoup.connect(baseUrl + libraryPath).get() val resAnimes = Jsoup.connect(baseUrl + libraryPath).get()
//println(resAnimes) //println(resAnimes)
itemMediaList.clear() guiMediaList.clear()
mediaList.clear() mediaList.clear()
resAnimes.select("div.animebox").forEach { val animes = resAnimes.select("div.animebox")
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()
itemMediaList.add(ItemMedia(mediaId, mediaTitle, mediaImage)) guiMediaList.addAll(
mediaList.add(Media(mediaId, mediaLink, type).apply { animes.map {
info.title = mediaTitle ItemMedia(
info.posterUrl = mediaImage 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 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 * 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 == "[]") { if (playlistPath == "[]") {
return CompletableDeferred(AoDObject(listOf(), language)) return CompletableDeferred(AoDPlaylist(listOf(), language))
} }
return CoroutineScope(Dispatchers.IO).async(Dispatchers.IO) { return CoroutineScope(Dispatchers.IO).async(Dispatchers.IO) {
@ -435,7 +453,7 @@ object AoDParser {
//Gson().fromJson(res.body(), AoDObject::class.java) //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 { .get("playlist").asJsonArray.map {
Playlist( Playlist(
sources = it.asJsonObject.get("sources").asJsonArray.map { source -> sources = it.asJsonObject.get("sources").asJsonArray.map { source ->

View File

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

View File

@ -30,7 +30,7 @@ class LibraryFragment : Fragment() {
lifecycleScope.launch { lifecycleScope.launch {
// create and set the adapter, needs context // create and set the adapter, needs context
context?.let { context?.let {
adapter = MediaItemAdapter(AoDParser.itemMediaList) adapter = MediaItemAdapter(AoDParser.guiMediaList)
adapter.onItemClick = { mediaId, _ -> adapter.onItemClick = { mediaId, _ ->
activity?.showFragment(MediaFragment(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.DataTypes.MediaType
import org.mosad.teapod.util.Episode import org.mosad.teapod.util.Episode
import org.mosad.teapod.util.StorageController 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 import org.mosad.teapod.util.tmdb.TMDBApiController
/** /**
@ -138,7 +138,7 @@ class MediaFragment(private val mediaId: Int) : Fragment() {
fragments.add(MediaFragmentEpisodes()) fragments.add(MediaFragmentEpisodes())
pagerAdapter.notifyDataSetChanged() pagerAdapter.notifyDataSetChanged()
} else if (media.type == MediaType.MOVIE) { } else if (media.type == MediaType.MOVIE) {
val tmdbMovie = (tmdbResult as Movie?) val tmdbMovie = (tmdbResult as TMDBMovie?)
if (tmdbMovie?.runtime != null) { if (tmdbMovie?.runtime != null) {
binding.textEpisodesOrRuntime.text = resources.getQuantityString( binding.textEpisodesOrRuntime.text = resources.getQuantityString(
@ -171,7 +171,7 @@ class MediaFragment(private val mediaId: Int) : Fragment() {
when (media.type) { when (media.type) {
MediaType.MOVIE -> playEpisode(media.episodes.first()) MediaType.MOVIE -> playEpisode(media.episodes.first())
MediaType.TVSHOW -> playEpisode(nextEpisode) 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 { lifecycleScope.launch {
// create and set the adapter, needs context // create and set the adapter, needs context
context?.let { context?.let {
adapter = MediaItemAdapter(AoDParser.itemMediaList) adapter = MediaItemAdapter(AoDParser.guiMediaList)
adapter!!.onItemClick = { mediaId, _ -> adapter!!.onItemClick = { mediaId, _ ->
binding.searchText.clearFocus() binding.searchText.clearFocus()
activity?.showFragment(MediaFragment(mediaId)) 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.DataTypes.MediaType
import org.mosad.teapod.util.tmdb.TMDBApiController import org.mosad.teapod.util.tmdb.TMDBApiController
import org.mosad.teapod.util.tmdb.TMDBResult 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 * handle media, next ep and tmdb
@ -22,7 +22,7 @@ class MediaFragmentViewModel(application: Application) : AndroidViewModel(applic
internal set internal set
var tmdbResult: TMDBResult? = null // TODO rename var tmdbResult: TMDBResult? = null // TODO rename
internal set internal set
var tmdbTVSeason: TVSeason? =null var tmdbTVSeason: TMDBTVSeason? =null
internal set internal set
var mediaMeta: Meta? = null var mediaMeta: Meta? = null
internal set internal set
@ -67,24 +67,6 @@ class MediaFragmentViewModel(application: Application) : AndroidViewModel(applic
null 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) { if (media.type == MediaType.TVSHOW) {
nextEpisode = media.episodes.firstOrNull{ !it.watched } ?: media.episodes.first() 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) * it is uses in the ItemMediaAdapter (RecyclerView)
*/ */
data class ItemMedia( data class ItemMedia(
val id: Int, val id: Int, // aod path id
val title: String, val title: String,
val posterUrl: String val posterUrl: String
) )
@ -101,9 +101,9 @@ data class Stream(
/** /**
* this class is used to represent the aod json API? * this class is used to represent the aod json API?
*/ */
data class AoDObject( data class AoDPlaylist(
val playlist: List<Playlist>, val list: List<Playlist>,
val extLanguage: String val language: String
) )
data class Playlist( data class Playlist(

View File

@ -12,9 +12,9 @@ import jp.wasabeef.glide.transformations.RoundedCornersTransformation
import org.mosad.teapod.R import org.mosad.teapod.R
import org.mosad.teapod.databinding.ItemEpisodeBinding import org.mosad.teapod.databinding.ItemEpisodeBinding
import org.mosad.teapod.util.Episode 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 var onImageClick: ((String, Int) -> Unit)? = null

View File

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

View File

@ -37,7 +37,7 @@ abstract class TMDBResult{
abstract val backdropPath: String? abstract val backdropPath: String?
} }
data class Movie( data class TMDBMovie(
override val id: Int, override val id: Int,
override val name: String, override val name: String,
override val overview: String?, override val overview: String?,
@ -52,7 +52,7 @@ data class Movie(
// TODO generes // TODO generes
): TMDBResult() ): TMDBResult()
data class TVShow( data class TMDBTVShow(
override val id: Int, override val id: Int,
override val name: String, override val name: String,
override val overview: String, override val overview: String,
@ -67,7 +67,7 @@ data class TVShow(
// TODO generes // TODO generes
): TMDBResult() ): TMDBResult()
data class TVSeason( data class TMDBTVSeason(
val id: Int, val id: Int,
val name: String, val name: String,
val overview: String, val overview: String,
@ -76,12 +76,12 @@ data class TVSeason(
@SerializedName("air_date") @SerializedName("air_date")
val airDate: String, val airDate: String,
@SerializedName("episodes") @SerializedName("episodes")
val episodes: List<TVEpisode>, val episodes: List<TMDBTVEpisode>,
@SerializedName("season_number") @SerializedName("season_number")
val seasonNumber: Int val seasonNumber: Int
) )
data class TVEpisode( data class TMDBTVEpisode(
val id: Int, val id: Int,
val name: String, val name: String,
val overview: 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. // Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript { buildscript {
ext.kotlin_version = "1.5.20" ext.kotlin_version = "1.5.21"
repositories { repositories {
google() google()
mavenCentral() mavenCentral()