diff --git a/src/sr/animesrbija/AndroidManifest.xml b/src/sr/animesrbija/AndroidManifest.xml
index 3307882a7..b82c0687d 100644
--- a/src/sr/animesrbija/AndroidManifest.xml
+++ b/src/sr/animesrbija/AndroidManifest.xml
@@ -1,2 +1,23 @@
-
-
\ No newline at end of file
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/sr/animesrbija/build.gradle b/src/sr/animesrbija/build.gradle
index 285f646b2..e1c834f64 100644
--- a/src/sr/animesrbija/build.gradle
+++ b/src/sr/animesrbija/build.gradle
@@ -1,13 +1,18 @@
-apply plugin: 'com.android.application'
-apply plugin: 'kotlin-android'
-
-ext {
- extName = 'Anime Srbija'
- pkgNameSuffix = 'sr.animesrbija'
- extClass = '.AnimeSrbija'
- extVersionCode = 3
- isNsfw = false
- libVersion = '13'
-}
-
-apply from: "$rootDir/common.gradle"
+plugins {
+ alias(libs.plugins.android.application)
+ alias(libs.plugins.kotlin.android)
+ alias(libs.plugins.kotlin.serialization)
+}
+
+ext {
+ extName = 'Anime Srbija'
+ pkgNameSuffix = 'sr.animesrbija'
+ extClass = '.AnimeSrbija'
+ extVersionCode = 4
+}
+
+dependencies {
+ implementation("dev.datlag.jsunpacker:jsunpacker:1.0.1")
+}
+
+apply from: "$rootDir/common.gradle"
diff --git a/src/sr/animesrbija/res/mipmap-hdpi/ic_launcher.png b/src/sr/animesrbija/res/mipmap-hdpi/ic_launcher.png
index 8f59e2dac..0de568f3f 100644
Binary files a/src/sr/animesrbija/res/mipmap-hdpi/ic_launcher.png and b/src/sr/animesrbija/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/src/sr/animesrbija/res/mipmap-mdpi/ic_launcher.png b/src/sr/animesrbija/res/mipmap-mdpi/ic_launcher.png
index 8f59e2dac..91221f2bb 100644
Binary files a/src/sr/animesrbija/res/mipmap-mdpi/ic_launcher.png and b/src/sr/animesrbija/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/src/sr/animesrbija/res/mipmap-xhdpi/ic_launcher.png b/src/sr/animesrbija/res/mipmap-xhdpi/ic_launcher.png
index 8f59e2dac..c389bc192 100644
Binary files a/src/sr/animesrbija/res/mipmap-xhdpi/ic_launcher.png and b/src/sr/animesrbija/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/src/sr/animesrbija/res/mipmap-xxhdpi/ic_launcher.png b/src/sr/animesrbija/res/mipmap-xxhdpi/ic_launcher.png
index 8f59e2dac..4ba909269 100644
Binary files a/src/sr/animesrbija/res/mipmap-xxhdpi/ic_launcher.png and b/src/sr/animesrbija/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/src/sr/animesrbija/res/mipmap-xxxhdpi/ic_launcher.png b/src/sr/animesrbija/res/mipmap-xxxhdpi/ic_launcher.png
index 8f59e2dac..c5988eeb6 100644
Binary files a/src/sr/animesrbija/res/mipmap-xxxhdpi/ic_launcher.png and b/src/sr/animesrbija/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/src/sr/animesrbija/res/web_hi_res_512.png b/src/sr/animesrbija/res/web_hi_res_512.png
deleted file mode 100644
index 8f59e2dac..000000000
Binary files a/src/sr/animesrbija/res/web_hi_res_512.png and /dev/null differ
diff --git a/src/sr/animesrbija/src/eu/kanade/tachiyomi/animeextension/sr/animesrbija/AnimeSrbija.kt b/src/sr/animesrbija/src/eu/kanade/tachiyomi/animeextension/sr/animesrbija/AnimeSrbija.kt
index f44adf80f..f3a049ff9 100644
--- a/src/sr/animesrbija/src/eu/kanade/tachiyomi/animeextension/sr/animesrbija/AnimeSrbija.kt
+++ b/src/sr/animesrbija/src/eu/kanade/tachiyomi/animeextension/sr/animesrbija/AnimeSrbija.kt
@@ -1,23 +1,31 @@
package eu.kanade.tachiyomi.animeextension.sr.animesrbija
+import eu.kanade.tachiyomi.animeextension.sr.animesrbija.dto.AnimeDetailsDto
+import eu.kanade.tachiyomi.animeextension.sr.animesrbija.dto.EpisodeVideo
+import eu.kanade.tachiyomi.animeextension.sr.animesrbija.dto.EpisodesDto
+import eu.kanade.tachiyomi.animeextension.sr.animesrbija.dto.LatestUpdatesDto
+import eu.kanade.tachiyomi.animeextension.sr.animesrbija.dto.PagePropsDto
+import eu.kanade.tachiyomi.animeextension.sr.animesrbija.dto.SearchAnimeDto
+import eu.kanade.tachiyomi.animeextension.sr.animesrbija.dto.SearchPageDto
+import eu.kanade.tachiyomi.animeextension.sr.animesrbija.extractors.FilemoonExtractor
import eu.kanade.tachiyomi.animesource.model.AnimeFilterList
+import eu.kanade.tachiyomi.animesource.model.AnimesPage
import eu.kanade.tachiyomi.animesource.model.SAnime
import eu.kanade.tachiyomi.animesource.model.SEpisode
import eu.kanade.tachiyomi.animesource.model.Video
-import eu.kanade.tachiyomi.animesource.online.ParsedAnimeHttpSource
+import eu.kanade.tachiyomi.animesource.online.AnimeHttpSource
import eu.kanade.tachiyomi.network.GET
-import eu.kanade.tachiyomi.network.POST
+import eu.kanade.tachiyomi.network.asObservableSuccess
import eu.kanade.tachiyomi.util.asJsoup
-import okhttp3.Headers.Companion.toHeaders
-import okhttp3.MediaType.Companion.toMediaType
-import okhttp3.OkHttpClient
+import kotlinx.serialization.decodeFromString
+import kotlinx.serialization.json.Json
import okhttp3.Request
-import okhttp3.RequestBody.Companion.toRequestBody
import okhttp3.Response
import org.jsoup.nodes.Document
-import org.jsoup.nodes.Element
+import rx.Observable
+import uy.kohesive.injekt.injectLazy
-class AnimeSrbija : ParsedAnimeHttpSource() {
+class AnimeSrbija : AnimeHttpSource() {
override val name = "Anime Srbija"
@@ -27,130 +35,137 @@ class AnimeSrbija : ParsedAnimeHttpSource() {
override val supportsLatest = true
- override val client: OkHttpClient = network.cloudflareClient
+ private val json: Json by injectLazy()
- // Popular Anime
- override fun popularAnimeFromElement(element: Element): SAnime {
- val anime = SAnime.create()
- anime.setUrlWithoutDomain(element.select("a").last()!!.attr("href"))
- anime.thumbnail_url = element.select("img").attr("src")
- anime.title = element.select("img").attr("title")
+ // ============================== Popular ===============================
+ override fun popularAnimeParse(response: Response): AnimesPage {
+ val doc = response.asJsoup()
+ val animes = doc.parseAs().anime.map(::parseAnime)
- return anime
+ val hasNextPage = doc.selectFirst("ul.pagination span.next-page:not(.disabled)") != null
+ return AnimesPage(animes, hasNextPage)
}
- override fun popularAnimeNextPageSelector(): String? {
- return ".next"
+ override fun popularAnimeRequest(page: Int) = GET("$baseUrl/filter?sort=popular&page=$page")
+
+ // ============================== Episodes ==============================
+ override fun episodeListParse(response: Response): List {
+ val data = response.asJsoup().parseAs()
+ return data.episodes.map {
+ SEpisode.create().apply {
+ setUrlWithoutDomain("/epizoda/${it.slug}")
+ name = "Epizoda ${it.number}"
+ episode_number = it.number.toFloat()
+ if (it.filler) scanlator = "filler"
+ }
+ }
}
- override fun popularAnimeRequest(page: Int): Request {
- return GET("$baseUrl/anime-lista/page/$page/?order=popular")
+ // ============================ Video Links =============================
+ override fun videoListParse(response: Response): List