From 5cb0af3b2d88393e65a722f962160f34203e6e0d Mon Sep 17 00:00:00 2001 From: Secozzi <49240133+Secozzi@users.noreply.github.com> Date: Thu, 29 Feb 2024 13:27:58 +0000 Subject: [PATCH] add alandal (#1600) * add alandal * clarify --- src/en/alandal/build.gradle | 7 + .../alandal/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3401 bytes .../alandal/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1893 bytes .../alandal/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4799 bytes .../alandal/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 8502 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 11696 bytes .../tachiyomi/extension/en/alandal/Alandal.kt | 189 ++++++++++++++++++ .../tachiyomi/extension/en/alandal/Dto.kt | 118 +++++++++++ .../tachiyomi/extension/en/alandal/Filters.kt | 89 +++++++++ 9 files changed, 403 insertions(+) create mode 100644 src/en/alandal/build.gradle create mode 100644 src/en/alandal/res/mipmap-hdpi/ic_launcher.png create mode 100644 src/en/alandal/res/mipmap-mdpi/ic_launcher.png create mode 100644 src/en/alandal/res/mipmap-xhdpi/ic_launcher.png create mode 100644 src/en/alandal/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 src/en/alandal/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 src/en/alandal/src/eu/kanade/tachiyomi/extension/en/alandal/Alandal.kt create mode 100644 src/en/alandal/src/eu/kanade/tachiyomi/extension/en/alandal/Dto.kt create mode 100644 src/en/alandal/src/eu/kanade/tachiyomi/extension/en/alandal/Filters.kt diff --git a/src/en/alandal/build.gradle b/src/en/alandal/build.gradle new file mode 100644 index 000000000..be0d9f2ca --- /dev/null +++ b/src/en/alandal/build.gradle @@ -0,0 +1,7 @@ +ext { + extName = 'Alandal' + extClass = '.Alandal' + extVersionCode = 1 +} + +apply from: "$rootDir/common.gradle" diff --git a/src/en/alandal/res/mipmap-hdpi/ic_launcher.png b/src/en/alandal/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..490be2cc20f7a659d1e90ce7a7d19454f350de38 GIT binary patch literal 3401 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 literal 0 HcmV?d00001 diff --git a/src/en/alandal/res/mipmap-mdpi/ic_launcher.png b/src/en/alandal/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..b8944407b59c724c4456c0c58db58777b392a5dc GIT binary patch literal 1893 zcmV-r2b%baP)CALGeaw_Trqd@a#il$$M2oZmj3h3M5RBr22$2{TB)D)PG0})IVPiDG zl`(PQhJ`G2p)ny5U8oC{5Q;{^qX9~x)9JLdotAlD|8pNRckZ0~nvfV0ZgMj-_ndpq z_x<1hIOpCG@R%RMV~!tB2>jm)S}DNVMCE*%J}y>bJw`vjG=b0QUL#RSy{|~0?5sMt z1V%?kLv(zc&881ak`OW8B}o$4$qwsJf!dXMo%Juzr1hsOi$0(4?83sr$#^`zYQ(}L z;N7-u+o!9mt8bS(+XE>QAvTyDQ0f5Iw?vBgNrGl*Wk%i@p-|%&ho^3yI0fYOB#Z>u z@8HPD$aJAl2x}d6*02SrpWKd&vE4YIzFic><=NTU81-Q)lo;~}golTRlX{l505Q6m zJfn@<=?RqQly8)q=H}*FnM+v_U_l!p0tvm8rSC*nDwgGTON`fF9#3aRvoV?5%_kCV zgk^!wQa~FOC=rkcVpthy)pBP3$s_BQ9M^qx@xjJRI3=)Q!vj0=&t1*N%mHasFWfQ#mDl*J6GBeU1qX z4i1(GR7lH0hoZ!Z3q?gge(KzT-!lt1nz*bIU<0t4QdtD$MmBE2x;WNEKo8c=h4g*T zv~0ruhIYa$;f=&4{IaHGW;eOt*nfV0-dPq}zka={fLvQmgV~JG_PS=ATlWlA*djzC zaJ{gC7ia!Jj>f7YV90dFc7auHm3R#VD&55lu>QJ8fWB+pfi3^I6>} z%2yevu1J~%yJH3P1oVE*s+=Y#PmPe^#m}v~(eCjo1XS?sQ$PV_xD#R;KY4SHa>;pfq^RU%!LFZR3svM?_R{!OnFu8reY_PNoPT9Bw$w5^rU*l zATEUWppN;x&hlvr-K+T(jQE2HcqIImUc|wfD{^YE18|Yr^aKjd(R0LR$m55K~1g$We5=u!cRiE+I|3H8(0aCeYj4Ynz44 zVj?Kj;XrmHc1bae$BJkUD8VeK;1%~O;B@jfK2IuXm6u9+1QzK^z=AZKrN(rKG%-Ii-1ZBT~e5V_2=g)X+r z!C=UPt*um2OGQipsw^qgK-MY1uK$@?#>-Rxm=?%N0)DCk_w2WnjDVT-HEG#0?@)F# z#_}=QheKWgFGTC$k+V&uLDUwlT0TH;lbG zs=Dg#a(tZ+9rZMg9H=S*+4AKjg`7%NHDtG9>d@!?dJYvSZ z1h1cE0Jy0GMgmR>nl`zerFs4AfNSlJW1zFMlN$q8R&%mvsKx4fay1dKD`@7yTkURE zV>wa5F@cVb4p$2BfLSTx1Z=H^jHT>Idwcs0K@eK(B(DI@d6Hdmzdp)qV~`>R`sr5o ze!%qcIwQ~&iA2tLz1}0nd1?t}ZMj_==JH+neE#gx($aCdvdj{l*1~&7Mw?f3hr{8I zJRZ+J`c6-%_=lbA)B?KvEU&N90VAt5PjJ+dkq_eITAdm2# z9F3JyUFV_Reb^jk?}^!UdO9VatOh;uqk~3_Yol(VFO#NIFn?#InVsb~D{A*Ae>HgI f(zqP(u~*yM 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.forEach { + it.addToUri(this) + } + + addQueryParameter("page", page.toString()) + }.build() + + return GET(url, apiHeaders) + } + + override fun searchMangaParse(response: Response): MangasPage { + val data = response.parseAs>().data.series + val mangaList = data.data.map { it.toSManga() } + val hasNextPage = data.currentPage < data.lastPage + return MangasPage(mangaList, hasNextPage) + } + + // =============================== Filters ============================== + + override fun getFilterList(): FilterList = FilterList( + GenreFilter(), + SortFilter(), + StatusFilter(), + ) + + // =========================== Manga Details ============================ + + override fun getMangaUrl(manga: SManga): String = + baseUrl + manga.url.replace("series/", "series/comic-") + + override fun mangaDetailsRequest(manga: SManga): Request { + val url = apiUrl.toHttpUrl().newBuilder().apply { + addPathSegments(manga.url.substringAfter("/")) + addQueryParameter("type", "comic") + }.build() + + return GET(url, apiHeaders) + } + + override fun mangaDetailsParse(response: Response): SManga = + response.parseAs>().data.series.toSManga() + + // ============================== Chapters ============================== + + override fun getChapterUrl(chapter: SChapter): String { + return baseUrl + chapter.url + .replace("series/", "chapter/comic-") + .replace("chapters/", "") + } + + override fun chapterListRequest(manga: SManga): Request { + val url = "$apiUrl${manga.url}".toHttpUrl().newBuilder().apply { + addPathSegment("chapters") + addQueryParameter("type", "comic") + addQueryParameter("from", "0") + addQueryParameter("to", "999") + }.build() + + return GET(url, apiHeaders) + } + + override fun chapterListParse(response: Response): List { + val slug = response.request.url.newBuilder() + .query(null) + .removePathSegment(0) // Remove /api + .build() + .encodedPath + + return response.parseAs().data.map { + it.toSChapter(slug) + }.reversed() + } + + // =============================== Pages ================================ + + override fun pageListRequest(chapter: SChapter): Request { + if (chapter.name.startsWith("[LOCKED]")) { + throw Exception("Log in and unlock chapter in webview, then refresh chapter list") + } + + val url = "$apiUrl${chapter.url}".toHttpUrl().newBuilder().apply { + addQueryParameter("type", "comic") + addQueryParameter("traveler", "0") + }.build() + + return GET(url, apiHeaders) + } + + override fun pageListParse(response: Response): List { + val data = response.parseAs().data.chapter.chapter + + return data.pages.mapIndexed { index, s -> + Page(index, imageUrl = s) + } + } + + override fun imageUrlParse(response: Response): String = throw UnsupportedOperationException() + + override fun imageRequest(page: Page): Request { + val pageHeaders = headersBuilder().apply { + add("Accept", "image/avif,image/webp,*/*") + add("Host", page.imageUrl!!.toHttpUrl().host) + }.build() + + return GET(page.imageUrl!!, pageHeaders) + } + + // ============================= Utilities ============================== + + private inline fun Response.parseAs(): T = use { + json.decodeFromStream(it.body.byteStream()) + } +} diff --git a/src/en/alandal/src/eu/kanade/tachiyomi/extension/en/alandal/Dto.kt b/src/en/alandal/src/eu/kanade/tachiyomi/extension/en/alandal/Dto.kt new file mode 100644 index 000000000..3fb0eecd7 --- /dev/null +++ b/src/en/alandal/src/eu/kanade/tachiyomi/extension/en/alandal/Dto.kt @@ -0,0 +1,118 @@ +package eu.kanade.tachiyomi.extension.en.alandal + +import eu.kanade.tachiyomi.source.model.SChapter +import eu.kanade.tachiyomi.source.model.SManga +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import org.jsoup.Jsoup +import java.text.ParseException +import java.text.SimpleDateFormat +import java.util.Locale + +@Serializable +class ResponseDto( + val data: ResultDto, +) { + @Serializable + class ResultDto( + val series: T, + ) +} + +@Serializable +class SearchSeriesDto( + @SerialName("current_page") val currentPage: Int, + @SerialName("last_page") val lastPage: Int, + val data: List, +) { + @Serializable + class SearchEntryDto( + val name: String, + val slug: String, + val cover: String, + ) { + fun toSManga(): SManga = SManga.create().apply { + title = name + url = "/series/$slug" + thumbnail_url = cover + } + } +} + +@Serializable +class MangaDetailsDto( + val name: String, + val summary: String, + val status: NamedObject, + val genres: List, + val creators: List, + val cover: String, +) { + @Serializable + class NamedObject( + val name: String, + val type: String? = null, + ) + + fun toSManga(): SManga = SManga.create().apply { + title = name + thumbnail_url = cover + description = Jsoup.parseBodyFragment(summary).text() + genre = genres.joinToString { it.name } + author = creators.filter { it.type!! == "author" }.joinToString { it.name } + status = this@MangaDetailsDto.status.name.parseStatus() + } + + private fun String.parseStatus(): Int = when (this.lowercase()) { + "ongoing" -> SManga.ONGOING + "completed" -> SManga.COMPLETED + else -> SManga.UNKNOWN + } +} + +@Serializable +class ChapterResponseDto( + val data: List, +) { + @Serializable + class ChapterDto( + val name: String, + @SerialName("published_at") val published: String, + val access: Boolean, + ) { + fun toSChapter(slug: String): SChapter = SChapter.create().apply { + val prefix = if (access) "" else "[LOCKED] " + name = "${prefix}Chapter ${this@ChapterDto.name}" + date_upload = try { + dateFormat.parse(published)!!.time + } catch (_: ParseException) { + 0L + } + url = "$slug/${this@ChapterDto.name}" + } + + companion object { + val dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSS'Z'", Locale.ENGLISH) + } + } +} + +@Serializable +class PagesResponseDto( + val data: PagesDataDto, +) { + @Serializable + class PagesDataDto( + val chapter: PagesChapterDto, + ) { + @Serializable + class PagesChapterDto( + val chapter: PagesChapterImagesDto, + ) { + @Serializable + class PagesChapterImagesDto( + val pages: List, + ) + } + } +} diff --git a/src/en/alandal/src/eu/kanade/tachiyomi/extension/en/alandal/Filters.kt b/src/en/alandal/src/eu/kanade/tachiyomi/extension/en/alandal/Filters.kt new file mode 100644 index 000000000..fc499936b --- /dev/null +++ b/src/en/alandal/src/eu/kanade/tachiyomi/extension/en/alandal/Filters.kt @@ -0,0 +1,89 @@ +package eu.kanade.tachiyomi.extension.en.alandal + +import eu.kanade.tachiyomi.source.model.Filter +import okhttp3.HttpUrl + +interface UriFilter { + fun addToUri(builder: HttpUrl.Builder) +} + +open class UriPartFilter( + name: String, + private val param: String, + private val vals: Array>, + defaultValue: String? = null, +) : Filter.Select( + name, + vals.map { it.first }.toTypedArray(), + vals.indexOfFirst { it.second == defaultValue }.takeIf { it != -1 } ?: 0, +), + UriFilter { + override fun addToUri(builder: HttpUrl.Builder) { + builder.addQueryParameter(param, vals[state].second) + } +} + +open class UriMultiSelectOption(name: String, val value: String) : Filter.CheckBox(name) + +open class UriMultiSelectFilter( + name: String, + private val param: String, + private val vals: Array>, +) : Filter.Group(name, vals.map { UriMultiSelectOption(it.first, it.second) }), UriFilter { + override fun addToUri(builder: HttpUrl.Builder) { + val checked = state.filter { it.state } + + if (checked.isEmpty()) { + builder.addQueryParameter(param, "-1") + } else { + checked.forEach { + builder.addQueryParameter(param, it.value) + } + } + } +} + +class GenreFilter : UriMultiSelectFilter( + "Genre", + "genres", + arrayOf( + Pair("Action", "1"), + Pair("Fantasy", "2"), + Pair("Regression", "3"), + Pair("Overpowered", "4"), + Pair("Ascension", "5"), + Pair("Revenge", "6"), + Pair("Martial Arts", "7"), + Pair("Magic", "8"), + Pair("Necromancer", "9"), + Pair("Adventure", "10"), + Pair("Tower", "11"), + Pair("Dungeons", "12"), + Pair("Psychological", "13"), + Pair("Isekai", "14"), + ), +) + +class SortFilter(defaultSort: String? = null) : UriPartFilter( + "Sort By", + "sort", + arrayOf( + Pair("Popularity", "popular"), + Pair("Name", "name"), + Pair("Chapters", "chapters"), + Pair("Rating", "Rating"), + Pair("New", "new"), + ), + defaultSort, +) + +class StatusFilter : UriPartFilter( + "Status", + "status", + arrayOf( + Pair("Any", "-1"), + Pair("Ongoing", "1"), + Pair("Coming Soon", "5"), + Pair("Completed", "6"), + ), +)