From 801742d6308465126d8eedb788660862c4abb9ef Mon Sep 17 00:00:00 2001 From: Jannik Date: Sun, 25 Jul 2021 19:15:31 +0200 Subject: [PATCH] clean up some AoDParser related code --- app/build.gradle | 2 +- .../java/org/mosad/teapod/parser/AoDParser.kt | 62 ++++++++++++------- .../activity/main/fragments/HomeFragment.kt | 22 +++---- .../main/fragments/LibraryFragment.kt | 2 +- .../activity/main/fragments/MediaFragment.kt | 6 +- .../activity/main/fragments/SearchFragment.kt | 2 +- .../main/viewmodel/MediaFragmentViewModel.kt | 22 +------ .../java/org/mosad/teapod/util/DataTypes.kt | 8 +-- .../teapod/util/adapter/EpisodeItemAdapter.kt | 4 +- .../teapod/util/tmdb/TMDBApiController.kt | 12 ++-- .../mosad/teapod/util/tmdb/TMDBDataTypes.kt | 10 +-- build.gradle | 2 +- 12 files changed, 77 insertions(+), 77 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index a195924..7caee7e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -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() diff --git a/app/src/main/java/org/mosad/teapod/parser/AoDParser.kt b/app/src/main/java/org/mosad/teapod/parser/AoDParser.kt index d68a8fb..4481800 100644 --- a/app/src/main/java/org/mosad/teapod/parser/AoDParser.kt +++ b/app/src/main/java/org/mosad/teapod/parser/AoDParser.kt @@ -49,7 +49,10 @@ object AoDParser { private var loginSuccess = false private val mediaList = arrayListOf() // actual media (data) - val itemMediaList = arrayListOf() // gui media + private val aodMediaList = arrayListOf() + + // gui media + val guiMediaList = arrayListOf() val highlightsList = arrayListOf() val newEpisodesList = arrayListOf() val newSimulcastsList = arrayListOf() @@ -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 { + private fun parsePlaylistAsync(playlistPath: String, language: String): Deferred { 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 -> diff --git a/app/src/main/java/org/mosad/teapod/ui/activity/main/fragments/HomeFragment.kt b/app/src/main/java/org/mosad/teapod/ui/activity/main/fragments/HomeFragment.kt index 1f45bcc..29fed64 100644 --- a/app/src/main/java/org/mosad/teapod/ui/activity/main/fragments/HomeFragment.kt +++ b/app/src/main/java/org/mosad/teapod/ui/activity/main/fragments/HomeFragment.kt @@ -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 { 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.") diff --git a/app/src/main/java/org/mosad/teapod/ui/activity/main/fragments/LibraryFragment.kt b/app/src/main/java/org/mosad/teapod/ui/activity/main/fragments/LibraryFragment.kt index f757b7a..b761490 100644 --- a/app/src/main/java/org/mosad/teapod/ui/activity/main/fragments/LibraryFragment.kt +++ b/app/src/main/java/org/mosad/teapod/ui/activity/main/fragments/LibraryFragment.kt @@ -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)) } diff --git a/app/src/main/java/org/mosad/teapod/ui/activity/main/fragments/MediaFragment.kt b/app/src/main/java/org/mosad/teapod/ui/activity/main/fragments/MediaFragment.kt index 6aa1742..026306f 100644 --- a/app/src/main/java/org/mosad/teapod/ui/activity/main/fragments/MediaFragment.kt +++ b/app/src/main/java/org/mosad/teapod/ui/activity/main/fragments/MediaFragment.kt @@ -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}") } } diff --git a/app/src/main/java/org/mosad/teapod/ui/activity/main/fragments/SearchFragment.kt b/app/src/main/java/org/mosad/teapod/ui/activity/main/fragments/SearchFragment.kt index b430092..a2943a9 100644 --- a/app/src/main/java/org/mosad/teapod/ui/activity/main/fragments/SearchFragment.kt +++ b/app/src/main/java/org/mosad/teapod/ui/activity/main/fragments/SearchFragment.kt @@ -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)) diff --git a/app/src/main/java/org/mosad/teapod/ui/activity/main/viewmodel/MediaFragmentViewModel.kt b/app/src/main/java/org/mosad/teapod/ui/activity/main/viewmodel/MediaFragmentViewModel.kt index 207218b..6e4c724 100644 --- a/app/src/main/java/org/mosad/teapod/ui/activity/main/viewmodel/MediaFragmentViewModel.kt +++ b/app/src/main/java/org/mosad/teapod/ui/activity/main/viewmodel/MediaFragmentViewModel.kt @@ -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() } diff --git a/app/src/main/java/org/mosad/teapod/util/DataTypes.kt b/app/src/main/java/org/mosad/teapod/util/DataTypes.kt index 8ea34dd..397e448 100644 --- a/app/src/main/java/org/mosad/teapod/util/DataTypes.kt +++ b/app/src/main/java/org/mosad/teapod/util/DataTypes.kt @@ -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, - val extLanguage: String +data class AoDPlaylist( + val list: List, + val language: String ) data class Playlist( diff --git a/app/src/main/java/org/mosad/teapod/util/adapter/EpisodeItemAdapter.kt b/app/src/main/java/org/mosad/teapod/util/adapter/EpisodeItemAdapter.kt index a131a3b..89b0bf5 100644 --- a/app/src/main/java/org/mosad/teapod/util/adapter/EpisodeItemAdapter.kt +++ b/app/src/main/java/org/mosad/teapod/util/adapter/EpisodeItemAdapter.kt @@ -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, private val tmdbEpisodes: List?) : RecyclerView.Adapter() { +class EpisodeItemAdapter(private val episodes: List, private val tmdbEpisodes: List?) : RecyclerView.Adapter() { var onImageClick: ((String, Int) -> Unit)? = null diff --git a/app/src/main/java/org/mosad/teapod/util/tmdb/TMDBApiController.kt b/app/src/main/java/org/mosad/teapod/util/tmdb/TMDBApiController.kt index 067a496..db74e8b 100644 --- a/app/src/main/java/org/mosad/teapod/util/tmdb/TMDBApiController.kt +++ b/app/src/main/java/org/mosad/teapod/util/tmdb/TMDBApiController.kt @@ -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 diff --git a/app/src/main/java/org/mosad/teapod/util/tmdb/TMDBDataTypes.kt b/app/src/main/java/org/mosad/teapod/util/tmdb/TMDBDataTypes.kt index 5a474c7..a3f5106 100644 --- a/app/src/main/java/org/mosad/teapod/util/tmdb/TMDBDataTypes.kt +++ b/app/src/main/java/org/mosad/teapod/util/tmdb/TMDBDataTypes.kt @@ -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, + val episodes: List, @SerializedName("season_number") val seasonNumber: Int ) -data class TVEpisode( +data class TMDBTVEpisode( val id: Int, val name: String, val overview: String, diff --git a/build.gradle b/build.gradle index 0492e3b..1583120 100644 --- a/build.gradle +++ b/build.gradle @@ -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()