XnLN^Cg-c_j~9YH!G{*N18tj++Vg#zR>&&!mepA
zdnKM@Lh+o5tvuz)hu_v{WB4IlHAa;R?anLAqO6*tvUz2xaSc06U%dcBKEi_QiDErq
z=H%_WLlE;KK6dn2BKZ3Ln;MQVrUg+SJl(1~onL&%q
z@i#9xVP?0v+tZ2AX$KJ*)`_saMZYmjPCCQgdlpwA7W6ZQsj%^Y)AUjFy(xPB$q6cYT~1@u7JJs}
zQzv3f@oppRoV}#+HZGz<4>FWgo*qoL+kaN
zlCy9D_CUf{kGBd*;$t0z#0aoyp7rQPGs?ky10xwwUtf=ZdP;S0r1_XmVd;8s=addT
zR)e@!D6afcaIL2TMixt8mTulUYPzYPi&lBMvdjIn8^^)bw>Q1I*C8+DAe1#cwq?C|
z8M?<6sE2bGGXeGvdY+-m>{65Q-rN7as|RuNbM-Yw6;H2K02nj>aWk%BM{E8)O&EPd
zJ5;||oSIU03ScWCBzrVk~;JA>JVTFUre!Oc@P*|#I?J+bEj(VtkI>~c-0WO_H`ia)Jf{P1~n)&GGAFjrsFoVxq*Pz>M=
zFKgV8BUq)Kr%ItVg&7I{t3{q8eX+IKNVtfz*ZZXSji2A!V!h2x>1a+ofQc3h1<<2z
zv2t|0O77_BK#;q7Wpb7cds#_kz>Skn@6is-x~Qk-mC&QZV&rues9|4GX2VmZ
zc7=r6<39sUe2KSS1?b+w8kR?I=^jkAN}X>vBag7;RRW~Pq~h86;L0fNIa4z+*-`
z@W%e1O8eC_d4T5b^8l;gzwFN2Le@7n0KnSTL;-3DUTpv{sT4Hl&u!!%OV_j6@3$W5
z+*bSpj5?lnitpxY&Tn|7p9SVa5$)5fhl>()0k+f&KaC(}>BFOw@@D&~mVvjzKSKo*
zKVReWO{ZCmftpi7B-?L6sg8K)mZtXk)fgCd;8|wh4Ab9Lzh240Jd!e
z%n(4zsJ++?d#G_lxA>xGT^mhyy1Mh{ZC%?D%K^kZ_K`CAkE}l+&x;WL{O9hcC*Hea
zLv##u?Z|TQB|iX*Y*K-YCgonO86F@2RE
zSi>HFB?3K{0t{e3>`2t_y^EpQiu^4mYaSV-s*yrFr6teq-I$ej=Lt`sIp3`dG(e;m
z9lPsPvBnrclnuzyTkxQSk^nCF|
z!B+}?l!F3a@%33NE*T)o=1>=^Ogju`=j;i@AjAId?(3FLxQcIrsyo-@-a&KmQM#om
zt}kl^E#=3bZ-xuY^C7aWa`kpG4gI9<^m-4LI0vzC(Z0U)&t>}RwUrcyKbk2WVe(j`
ze%4eCM87Pj8|IR?dY_JW3wnOL6;O5)*rEZ=cX0Uk$y|JBq~qF;CpA8vK`Fack8L`}
zeONJj_RlUF>mQq+)YqAAcrx}rEb7+ucRh{fkKIxl4> {
- val chapters = mutableListOf()
- var currentPage = 0
- do {
- val chaptersDto = fetchChapterListPageable(manga, currentPage)
- chapters += chaptersDto.data.map { chapter ->
- SChapter.create().apply {
- name = chapter.name
- date_upload = chapter.date.toDate()
- url = chapter.toChapterUrl(langOption.infix)
- }
- }
- currentPage++
- } while (chaptersDto.hasNextPage())
- return Observable.just(chapters)
- }
-
- private fun fetchChapterListPageable(manga: SManga, page: Int): Pageable {
- manga.apply {
- url = getURLCompatibility(url)
- }
-
- val maxResult = 16
- val url = "$apiUrl/${langOption.infix}/GetChapterListFilter/${manga.slug()}/$maxResult/$page/all/ASC"
- return client.newCall(GET(url, headers)).execute()
- .parseAs>()
- }
-
- override fun latestUpdatesParse(response: Response) = popularMangaParse(response)
-
- override fun latestUpdatesRequest(page: Int): Request {
- val maxResult = 24
- val url = "$apiUrl/${langOption.infix}/HomeLastUpdate".toHttpUrl().newBuilder()
- .addPathSegment("$maxResult")
- .addPathSegment("${page - 1}")
- .build()
- return GET(url, headers)
- }
-
- override fun getMangaUrl(manga: SManga): String {
- manga.apply {
- url = getURLCompatibility(url)
- }
-
- return baseUrl + manga.url.replace(langOption.infix, langOption.mangaSubstring)
- }
-
- override fun mangaDetailsRequest(manga: SManga): Request {
- manga.apply {
- url = getURLCompatibility(url)
- }
-
- val url = "$apiUrl/${langOption.infix}/getInfoManga".toHttpUrl().newBuilder()
- .addPathSegment(manga.slug())
- .build()
- return GET(url, headers)
- }
-
- override fun mangaDetailsParse(response: Response): SManga {
- val dto = response.parseAs()
- return mangaParse(dto.details)
- }
-
- override fun pageListRequest(chapter: SChapter): Request {
- val chapterSlug = getURLCompatibility(chapter.url)
- .substringAfter(langOption.infix)
-
- val url = "$apiUrl/${langOption.infix}/GetImageChapter$chapterSlug"
- return GET(url, headers)
- }
-
- override fun pageListParse(response: Response): List {
- val location = response.request.url.toString()
- val dto = response.parseAs()
- return dto.pages.mapIndexed { index, url ->
- Page(index, location, imageUrl = url)
- }
- }
-
- override fun popularMangaParse(response: Response): MangasPage {
- val dto = response.parseAs>()
- val mangas = dto.data.map(::mangaParse)
- return MangasPage(
- mangas = mangas,
- hasNextPage = dto.hasNextPage(),
- )
- }
-
- override fun popularMangaRequest(page: Int): Request {
- val maxResult = 24
- return GET("$apiUrl/${langOption.infix}/HomeTopFllow/$maxResult/${page - 1}")
- }
-
- override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
- val maxResult = 20
- val url = "$apiUrl/${langOption.infix}/QuickSearch/".toHttpUrl().newBuilder()
- .addPathSegment(query)
- .addPathSegment("$maxResult")
- .build()
- return GET(url, headers)
- }
-
- override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable {
- if (query.startsWith(SEARCH_PREFIX)) {
- val url = "$baseUrl/${langOption.infix}/${query.substringAfter(SEARCH_PREFIX)}"
- return client.newCall(GET(url, headers))
- .asObservableSuccess().map { response ->
- val mangas = try { listOf(mangaDetailsParse(response)) } catch (_: Exception) { emptyList() }
- MangasPage(mangas, false)
- }
- }
- return super.fetchSearchManga(page, query, filters)
- }
-
- override fun imageUrlParse(response: Response): String = ""
-
- override fun searchMangaParse(response: Response): MangasPage {
- val dto = response.parseAs()
- return MangasPage(
- dto.mangas.map(::mangaParse),
- false,
- )
- }
-
- /*
- * Keeps compatibility with pt-BR previous version
- * */
- private fun getURLCompatibility(url: String): String {
- val slugSuffix = "-br"
- val mangaSubString = "manga-br"
-
- val oldSlug = url.substringAfter(mangaSubString)
- .substring(1)
- .split("/")
- .first()
-
- val newSlug = oldSlug.substringBeforeLast(slugSuffix)
-
- return url.replace(oldSlug, newSlug)
- }
-
- private inline fun Response.parseAs(): T {
- return json.decodeFromString(body.string())
- }
-
- private fun SManga.slug() = this.url.split("/").last()
-
- private fun mangaParse(dto: MangaDto): SManga {
- return SManga.create().apply {
- title = dto.title
- thumbnail_url = dto.thumbnailUrl
- status = dto.status
- url = "/${langOption.infix}/${dto.slug}"
- genre = dto.genres
- initialized = true
- }
- }
-
- private fun String.toDate(): Long =
- try { dateFormat.parse(trim())!!.time } catch (_: Exception) { 0L }
-
- companion object {
- const val SEARCH_PREFIX = "slug:"
- val apiUrl = "https://api.novelfull.us/api"
- val oldApiUrl = "https://api.unionmanga.xyz"
- val dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSS", Locale.ENGLISH)
- }
-}
diff --git a/src/all/unionmangas/src/eu/kanade/tachiyomi/extension/all/unionmangas/UnionMangasDto.kt b/src/all/unionmangas/src/eu/kanade/tachiyomi/extension/all/unionmangas/UnionMangasDto.kt
deleted file mode 100644
index 55a77cc7a..000000000
--- a/src/all/unionmangas/src/eu/kanade/tachiyomi/extension/all/unionmangas/UnionMangasDto.kt
+++ /dev/null
@@ -1,68 +0,0 @@
-package eu.kanade.tachiyomi.extension.all.unionmangas
-
-import eu.kanade.tachiyomi.source.model.SManga
-import kotlinx.serialization.SerialName
-import kotlinx.serialization.Serializable
-
-@Serializable
-class MangaDetailsDto(private val data: Props) {
- val details: MangaDto get() = data.details
-
- @Serializable
- class Props(
- @SerialName("infoDoc") val details: MangaDto,
- )
-}
-
-@Serializable
-open class Pageable(
- var currentPage: Int,
- var totalPage: Int,
- val data: List,
-) {
- fun hasNextPage() = (currentPage + 1) <= totalPage
-}
-
-@Serializable
-class ChapterDto(
- val date: String,
- @SerialName("idDoc") val slugManga: String,
- @SerialName("idDetail") val id: String,
- @SerialName("nameChapter") val name: String,
-) {
- fun toChapterUrl(lang: String) = "/$lang/${this.slugManga}/$id"
-}
-
-@Serializable
-class MangaDto(
- @SerialName("name") val title: String,
- @SerialName("image") private val _thumbnailUrl: String,
- @SerialName("idDoc") val slug: String,
- @SerialName("genresName") val genres: String,
- @SerialName("status") val _status: String,
-) {
- val thumbnailUrl get() = "${UnionMangas.oldApiUrl}$_thumbnailUrl"
-
- val status get() = when (_status) {
- "ongoing" -> SManga.ONGOING
- "completed" -> SManga.COMPLETED
- else -> SManga.UNKNOWN
- }
-}
-
-@Serializable
-class SearchDto(
- @SerialName("data")
- val mangas: List,
-)
-
-@Serializable
-class PageDto(val `data`: Data) {
- val pages: List get() = `data`.detailDocuments.source.split("#")
-
- @Serializable
- class Data(@SerialName("detail_documents") val detailDocuments: DetailDocuments)
-
- @Serializable
- class DetailDocuments(val source: String)
-}
diff --git a/src/all/unionmangas/src/eu/kanade/tachiyomi/extension/all/unionmangas/UnionMangasFactory.kt b/src/all/unionmangas/src/eu/kanade/tachiyomi/extension/all/unionmangas/UnionMangasFactory.kt
deleted file mode 100644
index cd2e01ba4..000000000
--- a/src/all/unionmangas/src/eu/kanade/tachiyomi/extension/all/unionmangas/UnionMangasFactory.kt
+++ /dev/null
@@ -1,15 +0,0 @@
-package eu.kanade.tachiyomi.extension.all.unionmangas
-
-import eu.kanade.tachiyomi.source.Source
-import eu.kanade.tachiyomi.source.SourceFactory
-
-class UnionMangasFactory : SourceFactory {
- override fun createSources(): List = languages.map { UnionMangas(it) }
-}
-
-class LanguageOption(val lang: String, val infix: String = lang, val mangaSubstring: String = infix)
-
-val languages = listOf(
- LanguageOption("pt-BR", "manga-br"),
- LanguageOption("ru", "manga-ru", "mangas"),
-)
diff --git a/src/all/unionmangas/src/eu/kanade/tachiyomi/extension/all/unionmangas/UnionMangasUrlActivity.kt b/src/all/unionmangas/src/eu/kanade/tachiyomi/extension/all/unionmangas/UnionMangasUrlActivity.kt
deleted file mode 100644
index 29db77a01..000000000
--- a/src/all/unionmangas/src/eu/kanade/tachiyomi/extension/all/unionmangas/UnionMangasUrlActivity.kt
+++ /dev/null
@@ -1,36 +0,0 @@
-package eu.kanade.tachiyomi.extension.all.unionmangas
-
-import android.app.Activity
-import android.content.ActivityNotFoundException
-import android.content.Intent
-import android.os.Bundle
-import android.util.Log
-import kotlin.system.exitProcess
-
-class UnionMangasUrlActivity : Activity() {
-
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- val pathSegments = intent?.data?.pathSegments
-
- if (pathSegments != null && pathSegments.size > 1) {
- val intent = Intent().apply {
- action = "eu.kanade.tachiyomi.SEARCH"
- putExtra("query", slug(pathSegments))
- putExtra("filter", packageName)
- }
-
- try {
- startActivity(intent)
- } catch (e: ActivityNotFoundException) {
- Log.e("UnionMangasUrlActivity", e.toString())
- }
- }
-
- finish()
- exitProcess(0)
- }
-
- private fun slug(pathSegments: List) =
- "${UnionMangas.SEARCH_PREFIX}${pathSegments[1]}"
-}