diff --git a/app/build.gradle b/app/build.gradle index f6b2660..07a76bc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -41,14 +41,14 @@ android { dependencies { implementation fileTree(dir: "libs", include: ["*.jar"]) implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.2' implementation 'androidx.core:core-ktx:1.3.2' implementation 'androidx.appcompat:appcompat:1.2.0' implementation 'androidx.constraintlayout:constraintlayout:2.0.4' - implementation 'androidx.navigation:navigation-fragment-ktx:2.3.1' - implementation 'androidx.navigation:navigation-ui-ktx:2.3.1' - implementation 'androidx.security:security-crypto:1.1.0-alpha02' + implementation 'androidx.navigation:navigation-fragment-ktx:2.3.2' + implementation 'androidx.navigation:navigation-ui-ktx:2.3.2' + implementation 'androidx.security:security-crypto:1.1.0-alpha03' implementation 'androidx.legacy:legacy-support-v4:1.0.0' implementation 'com.google.android.material:material:1.3.0-alpha04' 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 ea52a86..867829f 100644 --- a/app/src/main/java/org/mosad/teapod/parser/AoDParser.kt +++ b/app/src/main/java/org/mosad/teapod/parser/AoDParser.kt @@ -45,10 +45,12 @@ object AoDParser { private var csrfToken: String = "" private var loginSuccess = false - private val mediaList = arrayListOf() - val itemMediaList = arrayListOf() + private val mediaList = arrayListOf() // actual media (data) + val itemMediaList = arrayListOf() // gui media val highlightsList = arrayListOf() val newEpisodesList = arrayListOf() + val newSimulcastsList = arrayListOf() + val newTitlesList = arrayListOf() fun login(): Boolean = runBlocking { @@ -95,7 +97,7 @@ object AoDParser { * -> blocking */ fun initialLoading() = runBlocking { - val newEPJob = GlobalScope.async { + val loadHomeJob = GlobalScope.async { loadHome() } @@ -103,7 +105,7 @@ object AoDParser { listAnimes() } - newEPJob.await() + loadHomeJob.await() listJob.await() } @@ -183,7 +185,7 @@ object AoDParser { } /** - * load new episodes and highlights + * load new episodes, titles and highlights */ private fun loadHome() = runBlocking { if (sessionCookies.isEmpty()) login() @@ -193,19 +195,6 @@ object AoDParser { .cookies(sessionCookies) .get() - // get all new episodes from AoD - newEpisodesList.clear() - resHome.select("div.jcarousel-container-new").select("li").forEach { - if (it.select("span").hasClass("neweps")) { - val mediaId = it.select("a.thumbs").attr("href") - .substringAfterLast("/").toInt() - val mediaImage = it.select("a.thumbs > img").attr("src") - val mediaTitle = "${it.select("a").text()} - ${it.select("span.neweps").text()}" - - newEpisodesList.add(ItemMedia(mediaId, mediaTitle, mediaImage)) - } - } - // get highlights from AoD highlightsList.clear() resHome.select("#aod-highlights").select("div.news-item").forEach { @@ -219,6 +208,45 @@ object AoDParser { } } + // get all new episodes from AoD + newEpisodesList.clear() + resHome.select("h2:contains(Neue Episoden)").next().select("li").forEach { + val mediaId = it.select("a.thumbs").attr("href") + .substringAfterLast("/").toIntOrNull() + val mediaImage = it.select("a.thumbs > img").attr("src") + val mediaTitle = "${it.select("a").text()} - ${it.select("span.neweps").text()}" + + if (mediaId != null) { + newEpisodesList.add(ItemMedia(mediaId, mediaTitle, mediaImage)) + } + } + + // get new simulcasts from AoD + newSimulcastsList.clear() + resHome.select("h2:contains(Neue Simulcasts)").next().select("li").forEach { + val mediaId = it.select("a.thumbs").attr("href") + .substringAfterLast("/").toIntOrNull() + val mediaImage = it.select("a.thumbs > img").attr("src") + val mediaTitle = it.select("a").text() + + if (mediaId != null) { + newSimulcastsList.add(ItemMedia(mediaId, mediaTitle, mediaImage)) + } + } + + // get new titles from AoD + newTitlesList.clear() + resHome.select("h2:contains(Neue Anime-Titel)").next().select("li").forEach { + val mediaId = it.select("a.thumbs").attr("href") + .substringAfterLast("/").toIntOrNull() + val mediaImage = it.select("a.thumbs > img").attr("src") + val mediaTitle = it.select("a").text() + + if (mediaId != null) { + newTitlesList.add(ItemMedia(mediaId, mediaTitle, mediaImage)) + } + } + } } diff --git a/app/src/main/java/org/mosad/teapod/ui/fragments/HomeFragment.kt b/app/src/main/java/org/mosad/teapod/ui/fragments/HomeFragment.kt index b3f74ea..b8bc8c1 100644 --- a/app/src/main/java/org/mosad/teapod/ui/fragments/HomeFragment.kt +++ b/app/src/main/java/org/mosad/teapod/ui/fragments/HomeFragment.kt @@ -28,6 +28,8 @@ class HomeFragment : Fragment() { private lateinit var binding: FragmentHomeBinding private lateinit var adapterMyList: MediaItemAdapter private lateinit var adapterNewEpisodes: MediaItemAdapter + private lateinit var adapterNewSimulcasts: MediaItemAdapter + private lateinit var adapterNewTitles: MediaItemAdapter private lateinit var highlightMedia: ItemMedia @@ -65,6 +67,8 @@ class HomeFragment : Fragment() { private fun initRecyclerViews() { binding.recyclerMyList.addItemDecoration(MediaItemDecoration(9)) binding.recyclerNewEpisodes.addItemDecoration(MediaItemDecoration(9)) + binding.recyclerNewSimulcasts.addItemDecoration(MediaItemDecoration(9)) + binding.recyclerNewTitles.addItemDecoration(MediaItemDecoration(9)) // my list val myListMedia = StorageController.myList.map { elementId -> @@ -81,6 +85,14 @@ class HomeFragment : Fragment() { // new episodes adapterNewEpisodes = MediaItemAdapter(AoDParser.newEpisodesList) binding.recyclerNewEpisodes.adapter = adapterNewEpisodes + + // new simulcasts + adapterNewSimulcasts = MediaItemAdapter(AoDParser.newSimulcastsList) + binding.recyclerNewSimulcasts.adapter = adapterNewSimulcasts + + // new titles + adapterNewTitles = MediaItemAdapter(AoDParser.newTitlesList) + binding.recyclerNewTitles.adapter = adapterNewTitles } private fun initActions() { @@ -114,6 +126,14 @@ class HomeFragment : Fragment() { adapterNewEpisodes.onItemClick = { mediaId, _ -> (activity as MainActivity).showFragment(MediaFragment(mediaId)) } + + adapterNewSimulcasts.onItemClick = { mediaId, _ -> + (activity as MainActivity).showFragment(MediaFragment(mediaId)) + } + + adapterNewTitles.onItemClick = { mediaId, _ -> + (activity as MainActivity).showFragment(MediaFragment(mediaId)) + } } /** diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index 3fb893f..93918c1 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -163,6 +163,62 @@ tools:listitem="@layout/item_media" /> + + + + + + + + + + + + + + diff --git a/app/src/main/res/values-de-rDE/strings.xml b/app/src/main/res/values-de-rDE/strings.xml index baf5c11..b47ef38 100644 --- a/app/src/main/res/values-de-rDE/strings.xml +++ b/app/src/main/res/values-de-rDE/strings.xml @@ -9,6 +9,8 @@ Highlight Meine Liste Neue Episoden + Neue Simulcasts + Neue Titel Suche nach Filmen und Serien diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ed21368..7b0cc6b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -9,6 +9,8 @@ Highlight My list New episodes + New simulcasts + New titles Search for movies and series diff --git a/build.gradle b/build.gradle index 0bc70d2..59f630a 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.4.20" + ext.kotlin_version = "1.4.21" repositories { google() jcenter()