diff --git a/src/all/eromanhwa/build.gradle b/src/all/eromanhwa/build.gradle deleted file mode 100644 index 68953640ba..0000000000 --- a/src/all/eromanhwa/build.gradle +++ /dev/null @@ -1,10 +0,0 @@ -ext { - extName = 'Eromanhwa' - extClass = '.Eromanhwa' - themePkg = 'madara' - baseUrl = 'https://eromanhwa.org' - overrideVersionCode = 1 - isNsfw = true -} - -apply from: "$rootDir/common.gradle" diff --git a/src/all/eromanhwa/res/mipmap-hdpi/ic_launcher.png b/src/all/eromanhwa/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index 1f0bbe69f1..0000000000 Binary files a/src/all/eromanhwa/res/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/src/all/eromanhwa/res/mipmap-mdpi/ic_launcher.png b/src/all/eromanhwa/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 149664b36a..0000000000 Binary files a/src/all/eromanhwa/res/mipmap-mdpi/ic_launcher.png and /dev/null differ diff --git a/src/all/eromanhwa/res/mipmap-xhdpi/ic_launcher.png b/src/all/eromanhwa/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index a10dadab08..0000000000 Binary files a/src/all/eromanhwa/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/src/all/eromanhwa/res/mipmap-xxhdpi/ic_launcher.png b/src/all/eromanhwa/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index 6c6cfb4dfb..0000000000 Binary files a/src/all/eromanhwa/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/src/all/eromanhwa/res/mipmap-xxxhdpi/ic_launcher.png b/src/all/eromanhwa/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 76cc009d90..0000000000 Binary files a/src/all/eromanhwa/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ diff --git a/src/all/eromanhwa/src/eu/kanade/tachiyomi/extension/all/eromanhwa/Eromanhwa.kt b/src/all/eromanhwa/src/eu/kanade/tachiyomi/extension/all/eromanhwa/Eromanhwa.kt deleted file mode 100644 index f2b1b1a81c..0000000000 --- a/src/all/eromanhwa/src/eu/kanade/tachiyomi/extension/all/eromanhwa/Eromanhwa.kt +++ /dev/null @@ -1,12 +0,0 @@ -package eu.kanade.tachiyomi.extension.all.eromanhwa - -import eu.kanade.tachiyomi.multisrc.madara.Madara - -class Eromanhwa : Madara( - "Eromanhwa", - "https://eromanhwa.org", - "all", -) { - override val id = 3597355706480775153 // accidently set lang to en... - override val useNewChapterEndpoint = true -} diff --git a/src/all/freleinbooks/build.gradle b/src/all/freleinbooks/build.gradle deleted file mode 100644 index 0edde750a6..0000000000 --- a/src/all/freleinbooks/build.gradle +++ /dev/null @@ -1,8 +0,0 @@ -ext { - extName = 'Frelein Books' - extClass = '.FreleinBooks' - extVersionCode = 1 - isNsfw = false -} - -apply from: "$rootDir/common.gradle" diff --git a/src/all/freleinbooks/res/mipmap-hdpi/ic_launcher.png b/src/all/freleinbooks/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index ba71baf351..0000000000 Binary files a/src/all/freleinbooks/res/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/src/all/freleinbooks/res/mipmap-mdpi/ic_launcher.png b/src/all/freleinbooks/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 87f734066d..0000000000 Binary files a/src/all/freleinbooks/res/mipmap-mdpi/ic_launcher.png and /dev/null differ diff --git a/src/all/freleinbooks/res/mipmap-xhdpi/ic_launcher.png b/src/all/freleinbooks/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index f0c2ab9969..0000000000 Binary files a/src/all/freleinbooks/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/src/all/freleinbooks/res/mipmap-xxhdpi/ic_launcher.png b/src/all/freleinbooks/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index ca781e6e66..0000000000 Binary files a/src/all/freleinbooks/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/src/all/freleinbooks/res/mipmap-xxxhdpi/ic_launcher.png b/src/all/freleinbooks/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 770228b15c..0000000000 Binary files a/src/all/freleinbooks/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ diff --git a/src/all/freleinbooks/src/eu/kanade/tachiyomi/extension/all/freleinbooks/FreleinBooks.kt b/src/all/freleinbooks/src/eu/kanade/tachiyomi/extension/all/freleinbooks/FreleinBooks.kt deleted file mode 100644 index b6eb97780d..0000000000 --- a/src/all/freleinbooks/src/eu/kanade/tachiyomi/extension/all/freleinbooks/FreleinBooks.kt +++ /dev/null @@ -1,271 +0,0 @@ -package eu.kanade.tachiyomi.extension.all.freleinbooks - -import eu.kanade.tachiyomi.network.GET -import eu.kanade.tachiyomi.source.model.Filter -import eu.kanade.tachiyomi.source.model.FilterList -import eu.kanade.tachiyomi.source.model.Page -import eu.kanade.tachiyomi.source.model.SChapter -import eu.kanade.tachiyomi.source.model.SManga -import eu.kanade.tachiyomi.source.online.ParsedHttpSource -import okhttp3.Request -import org.jsoup.nodes.Document -import org.jsoup.nodes.Element -import java.text.SimpleDateFormat -import java.util.Calendar -import java.util.Locale - -class FreleinBooks() : ParsedHttpSource() { - override val baseUrl = "https://books.frelein.my.id" - override val lang = "all" - override val name = "Frelein Books" - override val supportsLatest = true - - override fun headersBuilder() = super.headersBuilder() - .add("Referer", "$baseUrl/") - - private val Element.imgSrc: String - get() = attr("data-lazy-src") - .ifEmpty { attr("data-src") } - .ifEmpty { attr("src") } - - // Latest - override fun latestUpdatesFromElement(element: Element): SManga { - val manga = SManga.create() - manga.thumbnail_url = element.selectFirst("img")!!.imgSrc - manga.title = element.select(".postTitle").text() - manga.setUrlWithoutDomain(element.select(".postTitle > a").attr("abs:href")) - return manga - } - - override fun latestUpdatesNextPageSelector() = ".olderLink" - override fun latestUpdatesRequest(page: Int): Request { - return if (page == 1) { - GET(baseUrl) - } else { - val dateParam = page * 7 * 2 - // Calendar set to the current date - val calendar: Calendar = Calendar.getInstance() - // rollback 14 days - calendar.add(Calendar.DAY_OF_YEAR, -dateParam) - val formatter = SimpleDateFormat("yyyy-MM-dd", Locale.US) - // now the date is 14 days back - GET("$baseUrl/search?updated-max=${formatter.format(calendar.time)}T12:38:00%2B07:00&max-results=12&start=12&by-date=false") - } - } - - override fun latestUpdatesSelector() = ".blogPosts > article" - - // Popular - override fun popularMangaFromElement(element: Element): SManga { - val manga = SManga.create() - manga.thumbnail_url = element.selectFirst("img")!!.imgSrc - manga.title = element.select("h3").text() - manga.setUrlWithoutDomain(element.select("h3 > a").attr("abs:href")) - return manga - } - - override fun popularMangaNextPageSelector(): String? = null - override fun popularMangaRequest(page: Int) = latestUpdatesRequest(page) - override fun popularMangaSelector() = ".itemPopulars article" - - // Search - override fun searchMangaFromElement(element: Element) = latestUpdatesFromElement(element) - override fun searchMangaNextPageSelector() = latestUpdatesNextPageSelector() - override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { - val filterList = if (filters.isEmpty()) getFilterList() else filters - val tagFilter = filterList.findInstance()!! - val groupFilter = filterList.findInstance()!! - val magazineFilter = filterList.findInstance()!! - val fashionMagazineFilter = filterList.findInstance()!! - return when { - query.isEmpty() && groupFilter.state != 0 -> GET("$baseUrl/search/label/${groupFilter.toUriPart()}") - query.isEmpty() && magazineFilter.state != 0 -> GET("$baseUrl/search/label/${magazineFilter.toUriPart()}") - query.isEmpty() && fashionMagazineFilter.state != 0 -> GET("$baseUrl/search/label/${fashionMagazineFilter.toUriPart()}") - query.isEmpty() && tagFilter.state.isNotEmpty() -> GET("$baseUrl/search/label/${tagFilter.state}") - query.isNotEmpty() -> GET("$baseUrl/search?q=$query") - else -> latestUpdatesRequest(page) - } - } - - override fun searchMangaSelector() = latestUpdatesSelector() - - // Details - override fun mangaDetailsParse(document: Document): SManga { - val manga = SManga.create() - manga.title = document.select(".postTitle").text() - manga.description = "Read ${document.select(".postTitle").text()} \n \nNote: If you encounters error when opening the magazine, please press the WebView button then leave a comment on our web so we can update it soon." - manga.genre = document.select(".labelLink > a") - .joinToString(", ") { it.text() } - manga.status = SManga.COMPLETED - return manga - } - - override fun chapterFromElement(element: Element): SChapter { - val chapter = SChapter.create() - chapter.setUrlWithoutDomain(element.select("link[rel=\"canonical\"]").attr("href")) - chapter.name = "Gallery" - chapter.date_upload = getDate(element.select("link[rel=\"canonical\"]").attr("href")) - return chapter - } - - override fun chapterListSelector() = "html" - - // Pages - override fun pageListParse(document: Document): List { - val pages = mutableListOf() - document.select("noscript").remove() - document.select(".gallerybox a > img").forEachIndexed { i, it -> - // format new img/b/ - if (it.imgSrc.contains("img/b/")) { - if (it.imgSrc.contains("/w768-rw/")) { - val itUrl = it.imgSrc.replace("/w768-rw/", "/s0/") - pages.add(Page(i, itUrl, itUrl)) - } - if (it.imgSrc.contains("/w480-rw/")) { - val itUrl = it.imgSrc.replace("/w480-rw/", "/s0/") - pages.add(Page(i, itUrl, itUrl)) - } - } - // format new img/b/ - else { - if (it.imgSrc.contains("=w768-rw")) { - val itUrl = it.imgSrc.replace("=w768-rw", "") - pages.add(Page(i, itUrl, itUrl)) - } else if (it.imgSrc.contains("=w480-rw")) { - val itUrl = it.imgSrc.replace("=w480-rw", "") - pages.add(Page(i, itUrl, itUrl)) - } else { - val itUrl = it.imgSrc - pages.add(Page(i, itUrl, itUrl)) - } - } - } - return pages - } - - override fun imageUrlParse(document: Document): String = - throw UnsupportedOperationException() - - // Filters - - override fun getFilterList(): FilterList = FilterList( - Filter.Header("NOTE: Only one filter will be applied!"), - Filter.Separator(), - GroupFilter(), - MagazineFilter(), - FashionMagazineFilter(), - TagFilter(), - ) - - open class UriPartFilter( - displayName: String, - private val valuePair: Array>, - ) : Filter.Select(displayName, valuePair.map { it.first }.toTypedArray()) { - fun toUriPart() = valuePair[state].second - } - - class MagazineFilter : UriPartFilter( - "Magazine", - arrayOf( - Pair("Any", ""), - Pair("B.L.T.", "B.L.T."), - Pair("BIG ONE GIRLS", "BIG ONE GIRLS"), - Pair("BOMB!", "BOMB!"), - Pair("BRODY", "BRODY"), - Pair("BUBKA", "BUBKA"), - Pair("ENTAME", "ENTAME"), - Pair("EX Taishu", "EX Taishu"), - Pair("FINEBOYS", "FINEBOYS"), - Pair("FLASH", "FLASH"), - Pair("Fine", "Fine"), - Pair("Friday", "Friday"), - Pair("HINA_SATSU", "HINA_SATSU"), - Pair("IDOL AND READ", "IDOL AND READ"), - Pair("Kadokawa Scene 07", "Kadokawa Scene 07"), - Pair("Monthly Basketball", "Monthly Basketball"), - Pair("Monthly Young Magazine", "Monthly Young Magazine"), - Pair("NOGI_SATSU", "NOGI_SATSU"), - Pair("Nylon Japan", "Nylon Japan"), - Pair("Platinum FLASH", "Platinum FLASH"), - Pair("Shonen Magazine", "Shonen Magazine"), - Pair("Shukan Post", "Shukan Post"), - Pair("TOKYO NEWS MOOK", "TOKYO NEWS MOOK"), - Pair("TV LIFE,Tarzan", "TV LIFE,Tarzan"), - Pair("Tokyo Calendar", "Tokyo Calendar"), - Pair("Top Yell NEO", "Top Yell NEO"), - Pair("UTB", "UTB"), - Pair("Weekly Playboy", "Weekly Playboy"), - Pair("Weekly SPA", "Weekly SPA"), - Pair("Weekly SPA!", "Weekly SPA!"), - Pair("Weekly Shonen Champion", "Weekly Shonen Champion"), - Pair("Weekly Shonen Magazine", "Weekly Shonen Magazine"), - Pair("Weekly Shonen Sunday", "Weekly Shonen Sunday"), - Pair("Weekly Shounen Magazine", "Weekly Shounen Magazine"), - Pair("Weekly The Television Plus", "Weekly The Television Plus"), - Pair("Weekly Zero Jump", "Weekly Zero Jump"), - Pair("Yanmaga Web", "Yanmaga Web"), - Pair("Young Animal", "Young Animal"), - Pair("Young Champion", "Young Champion"), - Pair("Young Gangan", "Young Gangan"), - Pair("Young Jump", "Young Jump"), - Pair("Young Magazine", "Young Magazine"), - Pair("blt graph.", "blt graph."), - Pair("mini", "mini"), - ), - ) - - class FashionMagazineFilter : UriPartFilter( - "Fashion Magazine", - arrayOf( - Pair("Any", ""), - Pair("BAILA", "BAILA"), - Pair("Biteki", "Biteki"), - Pair("CLASSY", "CLASSY"), - Pair("CanCam", "CanCam"), - Pair("JJ", "JJ"), - Pair("LARME", "LARME"), - Pair("MARQUEE", "MARQUEE"), - Pair("Maquia", "Maquia"), - Pair("Men's non-no", "Men's non-no"), - Pair("More", "More"), - Pair("Oggi", "Oggi"), - Pair("Ray", "Ray"), - Pair("Seventeen", "Seventeen"), - Pair("Sweet", "Sweet"), - Pair("VOCE", "VOCE"), - Pair("ViVi", "ViVi"), - Pair("With", "With"), - Pair("aR", "aR"), - Pair("anan", "anan"), - Pair("bis", "bis"), - Pair("non-no", "non-no"), - ), - ) - - class GroupFilter : UriPartFilter( - "Group", - arrayOf( - Pair("Any", ""), - Pair("Hinatazaka46", "Hinatazaka46"), - Pair("Nogizaka46", "Nogizaka46"), - Pair("Sakurazaka46", "Sakurazaka46"), - Pair("Keyakizaka46", "Keyakizaka46"), - ), - ) - - class TagFilter : Filter.Text("Tag") - - private inline fun Iterable<*>.findInstance() = find { it is T } as? T - - private fun getDate(str: String): Long { - val regex = "[0-9]{4}\\/[0-9]{2}\\/[0-9]{2}".toRegex() - val match = regex.find(str) - return runCatching { DATE_FORMAT.parse(match!!.value)?.time }.getOrNull() ?: 0L - } - - companion object { - private val DATE_FORMAT by lazy { - SimpleDateFormat("yyyy/MM/dd", Locale.US) - } - } -} diff --git a/src/ar/comicarab/build.gradle b/src/ar/comicarab/build.gradle deleted file mode 100644 index 0ad65ad962..0000000000 --- a/src/ar/comicarab/build.gradle +++ /dev/null @@ -1,10 +0,0 @@ -ext { - extName = 'Comic Arab' - extClass = '.ComicArab' - themePkg = 'madara' - baseUrl = 'https://comicarab.com' - overrideVersionCode = 0 - isNsfw = true -} - -apply from: "$rootDir/common.gradle" diff --git a/src/ar/comicarab/res/mipmap-hdpi/ic_launcher.png b/src/ar/comicarab/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index e9f3b50c33..0000000000 Binary files a/src/ar/comicarab/res/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/src/ar/comicarab/res/mipmap-mdpi/ic_launcher.png b/src/ar/comicarab/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index cf530cf62f..0000000000 Binary files a/src/ar/comicarab/res/mipmap-mdpi/ic_launcher.png and /dev/null differ diff --git a/src/ar/comicarab/res/mipmap-xhdpi/ic_launcher.png b/src/ar/comicarab/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index b8be692b5c..0000000000 Binary files a/src/ar/comicarab/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/src/ar/comicarab/res/mipmap-xxhdpi/ic_launcher.png b/src/ar/comicarab/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index 3bca922d90..0000000000 Binary files a/src/ar/comicarab/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/src/ar/comicarab/res/mipmap-xxxhdpi/ic_launcher.png b/src/ar/comicarab/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 2382dc7e93..0000000000 Binary files a/src/ar/comicarab/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ diff --git a/src/ar/comicarab/src/eu/kanade/tachiyomi/extension/ar/comicarab/ComicArab.kt b/src/ar/comicarab/src/eu/kanade/tachiyomi/extension/ar/comicarab/ComicArab.kt deleted file mode 100644 index ef6cab20e0..0000000000 --- a/src/ar/comicarab/src/eu/kanade/tachiyomi/extension/ar/comicarab/ComicArab.kt +++ /dev/null @@ -1,12 +0,0 @@ -package eu.kanade.tachiyomi.extension.ar.comicarab - -import eu.kanade.tachiyomi.multisrc.madara.Madara -import java.text.SimpleDateFormat -import java.util.Locale - -class ComicArab : Madara( - "كوميك العرب", - "https://comicarab.com", - "ar", - dateFormat = SimpleDateFormat("dd MMMM، yyyy", Locale("ar")), -) diff --git a/src/ar/mangaae/build.gradle b/src/ar/mangaae/build.gradle deleted file mode 100644 index 7cb63a477b..0000000000 --- a/src/ar/mangaae/build.gradle +++ /dev/null @@ -1,7 +0,0 @@ -ext { - extName = 'Manga.ae' - extClass = '.MangaAe' - extVersionCode = 13 -} - -apply from: "$rootDir/common.gradle" diff --git a/src/ar/mangaae/res/mipmap-hdpi/ic_launcher.png b/src/ar/mangaae/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index b3b1d6bb9a..0000000000 Binary files a/src/ar/mangaae/res/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/src/ar/mangaae/res/mipmap-mdpi/ic_launcher.png b/src/ar/mangaae/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index e80c5a043c..0000000000 Binary files a/src/ar/mangaae/res/mipmap-mdpi/ic_launcher.png and /dev/null differ diff --git a/src/ar/mangaae/res/mipmap-xhdpi/ic_launcher.png b/src/ar/mangaae/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 6c37b95695..0000000000 Binary files a/src/ar/mangaae/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/src/ar/mangaae/res/mipmap-xxhdpi/ic_launcher.png b/src/ar/mangaae/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index c4a273f243..0000000000 Binary files a/src/ar/mangaae/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/src/ar/mangaae/res/mipmap-xxxhdpi/ic_launcher.png b/src/ar/mangaae/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 7512d72555..0000000000 Binary files a/src/ar/mangaae/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ diff --git a/src/ar/mangaae/src/eu/kanade/tachiyomi/extension/ar/mangaae/MangaAe.kt b/src/ar/mangaae/src/eu/kanade/tachiyomi/extension/ar/mangaae/MangaAe.kt deleted file mode 100644 index eb1201a70f..0000000000 --- a/src/ar/mangaae/src/eu/kanade/tachiyomi/extension/ar/mangaae/MangaAe.kt +++ /dev/null @@ -1,193 +0,0 @@ -package eu.kanade.tachiyomi.extension.ar.mangaae - -import android.app.Application -import android.widget.Toast -import androidx.preference.ListPreference -import androidx.preference.PreferenceScreen -import eu.kanade.tachiyomi.network.GET -import eu.kanade.tachiyomi.network.interceptor.rateLimit -import eu.kanade.tachiyomi.source.ConfigurableSource -import eu.kanade.tachiyomi.source.model.Filter -import eu.kanade.tachiyomi.source.model.FilterList -import eu.kanade.tachiyomi.source.model.Page -import eu.kanade.tachiyomi.source.model.SChapter -import eu.kanade.tachiyomi.source.model.SManga -import eu.kanade.tachiyomi.source.online.ParsedHttpSource -import okhttp3.HttpUrl.Companion.toHttpUrl -import okhttp3.Request -import org.jsoup.nodes.Document -import org.jsoup.nodes.Element -import uy.kohesive.injekt.Injekt -import uy.kohesive.injekt.api.get - -class MangaAe : ParsedHttpSource(), ConfigurableSource { - - override val name = "مانجا العرب" - - override val baseUrl by lazy { - when { - System.getenv("CI") == "true" -> MIRROR_PREF_ENTRY_VALUES.joinToString("#, ") - else -> preferences.getString(MIRROR_PREF_KEY, MIRROR_PREF_DEFAULT_VALUE)!! - } - } - - private val preferences by lazy { - Injekt.get().getSharedPreferences("source_$id", 0x0000) - } - - override val lang = "ar" - - override val supportsLatest = true - - override val client = network.cloudflareClient.newBuilder() - .rateLimit(2) - .build() - - override fun headersBuilder() = super.headersBuilder() - .set("Referer", "$baseUrl/") - .set("Origin", baseUrl) - - // ============================== Popular =============================== - override fun popularMangaRequest(page: Int) = GET("$baseUrl/manga/page:$page", headers) - - override fun popularMangaSelector() = "div.mangacontainer" - - override fun popularMangaFromElement(element: Element) = SManga.create().apply { - thumbnail_url = element.selectFirst("img")?.run { - attr("data-pagespeed-lazy-src").ifEmpty { attr("src") } - } - element.selectFirst("div.mangacontainer a.manga")!!.run { - title = text() - setUrlWithoutDomain(absUrl("href")) - } - } - - override fun popularMangaNextPageSelector() = "div.pagination a:last-child:not(.active)" - - // =============================== Latest =============================== - override fun latestUpdatesRequest(page: Int) = GET(baseUrl, headers) - - override fun latestUpdatesSelector() = "div.popular-manga-container" - - override fun latestUpdatesFromElement(element: Element) = SManga.create().apply { - thumbnail_url = element.selectFirst("img")?.run { - attr("data-pagespeed-lazy-src").ifEmpty { attr("src") } - } - setUrlWithoutDomain(element.selectFirst("a:has(img)")!!.attr("href")) - title = element.selectFirst("a:last-child")!!.text() - } - - override fun latestUpdatesNextPageSelector() = null - - // =============================== Search =============================== - override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { - val url = buildString { - append("$baseUrl/manga/search:$query|page:$page") - filters.firstOrNull { it is OrderByFilter } - ?.takeUnless { it.state == 0 } - ?.also { - val filter = it as OrderByFilter - append("|order:${filter.toUriPart()}") - } - append("|arrange:minus") - } - return GET(url.toHttpUrl(), headers) - } - - override fun searchMangaSelector() = popularMangaSelector() - - override fun searchMangaFromElement(element: Element) = popularMangaFromElement(element) - - override fun searchMangaNextPageSelector() = popularMangaNextPageSelector() - - // =========================== Manga Details ============================ - override fun mangaDetailsParse(document: Document) = SManga.create().apply { - val infoElement = document.selectFirst("div.indexcontainer")!! - // Essential info, a NPE may be understandable - with(infoElement) { - title = selectFirst("h1.EnglishName")!!.text().removeSurrounding("(", ")") - author = selectFirst("div.manga-details-author h4")?.text() - artist = author - thumbnail_url = selectFirst("img.manga-cover")?.attr("src") - } - - // Additional info - infoElement.selectFirst("div.manga-details-extended")?.run { - status = parseStatus(selectFirst("td h4")?.text().orEmpty()) - genre = select("a[href*=tag]").eachText().joinToString() - description = selectFirst("h4[style*=overflow-y]")?.text() - } - } - - private fun parseStatus(status: String) = when { - status.contains("مستمرة") -> SManga.ONGOING - status.contains("مكتملة") -> SManga.COMPLETED - else -> SManga.UNKNOWN - } - - // ============================== Chapters ============================== - override fun chapterListSelector() = "ul.new-manga-chapters > li a" - - override fun chapterFromElement(element: Element) = SChapter.create().apply { - setUrlWithoutDomain(element.attr("href").removeSuffix("/1/") + "/0/allpages") - name = "\u061C" + element.text() // Add unicode ARABIC LETTER MARK to ensure all titles are right to left - } - - // =============================== Pages ================================ - override fun pageListParse(document: Document): List { - return document.select("div#showchaptercontainer img").mapIndexed { index, item -> - Page(index, "", item.attr("src")) - } - } - - override fun imageUrlParse(document: Document): String = throw UnsupportedOperationException() - - // ============================== Filters =============================== - private open class UriPartFilter(displayName: String, val vals: Array>) : - Filter.Select(displayName, vals.map { it.first }.toTypedArray()) { - fun toUriPart() = vals[state].second - } - - private class OrderByFilter : UriPartFilter( - "الترتيب حسب", - arrayOf( - Pair("اختيار", ""), - Pair("اسم المانجا", "english_name"), - Pair("تاريخ النشر", "release_date"), - Pair("عدد الفصول", "chapter_count"), - Pair("الحالة", "status"), - ), - ) - - override fun getFilterList() = FilterList(OrderByFilter()) - - // ============================== Settings ============================== - companion object { - private const val RESTART_TACHIYOMI = "أعد تشغيل التطبيق لتمكين الإعدادات الجديدة." - private const val MIRROR_PREF_KEY = "MIRROR" - private const val MIRROR_PREF_TITLE = "تعديل الرابط" - internal val MIRROR_PREF_ENTRY_VALUES = arrayOf( - "https://mangaae.com", - "https://mangaat.com", - "https://mngaar.com", - ) - private val MIRROR_PREF_DEFAULT_VALUE = MIRROR_PREF_ENTRY_VALUES[0] - } - - override fun setupPreferenceScreen(screen: PreferenceScreen) { - val mirrorPref = ListPreference(screen.context).apply { - key = MIRROR_PREF_KEY - title = MIRROR_PREF_TITLE - entries = MIRROR_PREF_ENTRY_VALUES - entryValues = MIRROR_PREF_ENTRY_VALUES - setDefaultValue(MIRROR_PREF_DEFAULT_VALUE) - summary = "%s" - - setOnPreferenceChangeListener { _, _ -> - Toast.makeText(screen.context, RESTART_TACHIYOMI, Toast.LENGTH_LONG).show() - true - } - } - screen.addPreference(mirrorPref) - } -} diff --git a/src/en/kumascans/build.gradle b/src/en/kumascans/build.gradle deleted file mode 100644 index 1a15a135c3..0000000000 --- a/src/en/kumascans/build.gradle +++ /dev/null @@ -1,9 +0,0 @@ -ext { - extName = 'Kuma Scans (Kuma Translation)' - extClass = '.KumaScans' - themePkg = 'mangathemesia' - baseUrl = 'https://kumascans.com' - overrideVersionCode = 1 -} - -apply from: "$rootDir/common.gradle" diff --git a/src/en/kumascans/res/mipmap-hdpi/ic_launcher.png b/src/en/kumascans/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index 610fd03f91..0000000000 Binary files a/src/en/kumascans/res/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/kumascans/res/mipmap-mdpi/ic_launcher.png b/src/en/kumascans/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 020ad43684..0000000000 Binary files a/src/en/kumascans/res/mipmap-mdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/kumascans/res/mipmap-xhdpi/ic_launcher.png b/src/en/kumascans/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index bf167bf818..0000000000 Binary files a/src/en/kumascans/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/kumascans/res/mipmap-xxhdpi/ic_launcher.png b/src/en/kumascans/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index cbbcdd73d4..0000000000 Binary files a/src/en/kumascans/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/kumascans/res/mipmap-xxxhdpi/ic_launcher.png b/src/en/kumascans/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 6a6899cc77..0000000000 Binary files a/src/en/kumascans/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/kumascans/src/eu/kanade/tachiyomi/extension/en/kumascans/KumaScans.kt b/src/en/kumascans/src/eu/kanade/tachiyomi/extension/en/kumascans/KumaScans.kt deleted file mode 100644 index 2c2bdf41ce..0000000000 --- a/src/en/kumascans/src/eu/kanade/tachiyomi/extension/en/kumascans/KumaScans.kt +++ /dev/null @@ -1,14 +0,0 @@ -package eu.kanade.tachiyomi.extension.en.kumascans - -import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia -import eu.kanade.tachiyomi.network.interceptor.rateLimit -import okhttp3.OkHttpClient - -class KumaScans : MangaThemesia("Kuma Scans (Kuma Translation)", "https://kumascans.com", "en") { - - override val client: OkHttpClient = super.client.newBuilder() - .rateLimit(4) - .build() - - override val hasProjectPage = true -} diff --git a/src/en/luxmanga/build.gradle b/src/en/luxmanga/build.gradle deleted file mode 100644 index cc2f3c6f99..0000000000 --- a/src/en/luxmanga/build.gradle +++ /dev/null @@ -1,10 +0,0 @@ -ext { - extName = 'LuxManga' - extClass = '.LuxManga' - themePkg = 'madara' - baseUrl = 'https://luxmanga.net' - overrideVersionCode = 1 - isNsfw = true -} - -apply from: "$rootDir/common.gradle" diff --git a/src/en/luxmanga/src/eu/kanade/tachiyomi/extension/en/luxmanga/LuxManga.kt b/src/en/luxmanga/src/eu/kanade/tachiyomi/extension/en/luxmanga/LuxManga.kt deleted file mode 100644 index acf7a37272..0000000000 --- a/src/en/luxmanga/src/eu/kanade/tachiyomi/extension/en/luxmanga/LuxManga.kt +++ /dev/null @@ -1,7 +0,0 @@ -package eu.kanade.tachiyomi.extension.en.luxmanga - -import eu.kanade.tachiyomi.multisrc.madara.Madara - -class LuxManga : Madara("LuxManga", "https://luxmanga.net", "en") { - override val useNewChapterEndpoint = false -} diff --git a/src/en/manga1k/build.gradle b/src/en/manga1k/build.gradle deleted file mode 100644 index cdd170a5ba..0000000000 --- a/src/en/manga1k/build.gradle +++ /dev/null @@ -1,10 +0,0 @@ -ext { - extName = 'Manga1k' - extClass = '.Manga1k' - themePkg = 'madara' - baseUrl = 'https://manga1k.com' - overrideVersionCode = 0 - isNsfw = true -} - -apply from: "$rootDir/common.gradle" diff --git a/src/en/manga1k/res/mipmap-hdpi/ic_launcher.png b/src/en/manga1k/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index c1e755c21a..0000000000 Binary files a/src/en/manga1k/res/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/manga1k/res/mipmap-mdpi/ic_launcher.png b/src/en/manga1k/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 558cd09879..0000000000 Binary files a/src/en/manga1k/res/mipmap-mdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/manga1k/res/mipmap-xhdpi/ic_launcher.png b/src/en/manga1k/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index ef063f3003..0000000000 Binary files a/src/en/manga1k/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/manga1k/res/mipmap-xxhdpi/ic_launcher.png b/src/en/manga1k/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index e517b52c64..0000000000 Binary files a/src/en/manga1k/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/manga1k/res/mipmap-xxxhdpi/ic_launcher.png b/src/en/manga1k/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index bfecd5fae0..0000000000 Binary files a/src/en/manga1k/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/manga1k/src/eu/kanade/tachiyomi/extension/en/manga1k/Manga1k.kt b/src/en/manga1k/src/eu/kanade/tachiyomi/extension/en/manga1k/Manga1k.kt deleted file mode 100644 index b73fb7fdec..0000000000 --- a/src/en/manga1k/src/eu/kanade/tachiyomi/extension/en/manga1k/Manga1k.kt +++ /dev/null @@ -1,12 +0,0 @@ -package eu.kanade.tachiyomi.extension.en.manga1k - -import eu.kanade.tachiyomi.multisrc.madara.Madara - -class Manga1k : Madara( - "Manga1k", - "https://manga1k.com", - "en", -) { - override val useLoadMoreRequest = LoadMoreStrategy.Never - override val useNewChapterEndpoint = false -} diff --git a/src/en/mangafun/AndroidManifest.xml b/src/en/mangafun/AndroidManifest.xml deleted file mode 100644 index 5085f67514..0000000000 --- a/src/en/mangafun/AndroidManifest.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/src/en/mangafun/build.gradle b/src/en/mangafun/build.gradle deleted file mode 100644 index a2ed1f9458..0000000000 --- a/src/en/mangafun/build.gradle +++ /dev/null @@ -1,13 +0,0 @@ -ext { - extName = "Manga Fun" - extClass = ".MangaFun" - extVersionCode = 1 - isNsfw = true -} - -apply from: "$rootDir/common.gradle" - -dependencies { - implementation("net.pearx.kasechange:kasechange:1.4.1") - implementation(project(':lib:lzstring')) -} diff --git a/src/en/mangafun/res/mipmap-hdpi/ic_launcher.png b/src/en/mangafun/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index db3a210268..0000000000 Binary files a/src/en/mangafun/res/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/mangafun/res/mipmap-mdpi/ic_launcher.png b/src/en/mangafun/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 5ac08223dd..0000000000 Binary files a/src/en/mangafun/res/mipmap-mdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/mangafun/res/mipmap-xhdpi/ic_launcher.png b/src/en/mangafun/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 64f1d04b50..0000000000 Binary files a/src/en/mangafun/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/mangafun/res/mipmap-xxhdpi/ic_launcher.png b/src/en/mangafun/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index faa20eef2a..0000000000 Binary files a/src/en/mangafun/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/mangafun/res/mipmap-xxxhdpi/ic_launcher.png b/src/en/mangafun/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index ae1476139e..0000000000 Binary files a/src/en/mangafun/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/mangafun/src/eu/kanade/tachiyomi/extension/en/mangafun/DecompressJson.kt b/src/en/mangafun/src/eu/kanade/tachiyomi/extension/en/mangafun/DecompressJson.kt deleted file mode 100644 index d1786b193a..0000000000 --- a/src/en/mangafun/src/eu/kanade/tachiyomi/extension/en/mangafun/DecompressJson.kt +++ /dev/null @@ -1,134 +0,0 @@ -package eu.kanade.tachiyomi.extension.en.mangafun - -import kotlinx.serialization.json.JsonArray -import kotlinx.serialization.json.JsonElement -import kotlinx.serialization.json.JsonObject -import kotlinx.serialization.json.JsonPrimitive -import kotlinx.serialization.json.buildJsonArray -import kotlinx.serialization.json.buildJsonObject -import kotlinx.serialization.json.intOrNull -import kotlinx.serialization.json.jsonArray -import kotlinx.serialization.json.jsonNull -import kotlinx.serialization.json.jsonPrimitive - -/** - * A somewhat direct port of the decoding parts of - * [compress-json](https://github.com/beenotung/compress-json). - */ -object DecompressJson { - fun decompress(c: JsonArray): JsonElement { - val values = c[0].jsonArray - val key = c[1].jsonPrimitive.content - - return decode(values, key) - } - - private fun decode(values: JsonArray, key: String): JsonElement { - if (key.isEmpty() || key == "_") { - return JsonPrimitive(null) - } - - val id = sToInt(key) - val v = values[id] - - try { - v.jsonNull - return v - } catch (_: IllegalArgumentException) { - // v is not null, we continue on. - } - - val vNum = v.jsonPrimitive.intOrNull - - if (vNum != null) { - return v - } - - if (v.jsonPrimitive.isString) { - val content = v.jsonPrimitive.content - - if (content.length < 2) { - return v - } - - return when (content.substring(0..1)) { - "b|" -> decodeBool(content) - "n|" -> decodeNum(content) - "o|" -> decodeObject(values, content) - "a|" -> decodeArray(values, content) - else -> v - } - } - - throw IllegalArgumentException("Unknown data type") - } - - private fun decodeObject(values: JsonArray, s: String): JsonObject { - if (s == "o|") { - return JsonObject(emptyMap()) - } - - val vs = s.split("|") - val keyId = vs[1] - val keys = decode(values, keyId) - val n = vs.size - - val keyArray = try { - keys.jsonArray.map { it.jsonPrimitive.content } - } catch (_: IllegalArgumentException) { - // single-key object using existing value as key - listOf(keys.jsonPrimitive.content) - } - - return buildJsonObject { - for (i in 2 until n) { - val k = keyArray[i - 2] - val v = decode(values, vs[i]) - put(k, v) - } - } - } - - private fun decodeArray(values: JsonArray, s: String): JsonArray { - if (s == "a|") { - return JsonArray(emptyList()) - } - - val vs = s.split("|") - val n = vs.size - 1 - return buildJsonArray { - for (i in 0 until n) { - add(decode(values, vs[i + 1])) - } - } - } - - private fun decodeBool(s: String): JsonPrimitive { - return when (s) { - "b|T" -> JsonPrimitive(true) - "b|F" -> JsonPrimitive(false) - else -> JsonPrimitive(s.isNotEmpty()) - } - } - - private fun decodeNum(s: String): JsonPrimitive = - JsonPrimitive(sToInt(s.substringAfter("n|"))) - - private fun sToInt(s: String): Int { - var acc = 0 - var pow = 1 - - s.reversed().forEach { - acc += stoi[it]!! * pow - pow *= 62 - } - - return acc - } - - private val itos = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" - - private val stoi = itos.associate { - it to itos.indexOf(it) - } -} diff --git a/src/en/mangafun/src/eu/kanade/tachiyomi/extension/en/mangafun/MangaFun.kt b/src/en/mangafun/src/eu/kanade/tachiyomi/extension/en/mangafun/MangaFun.kt deleted file mode 100644 index bfe19fe49f..0000000000 --- a/src/en/mangafun/src/eu/kanade/tachiyomi/extension/en/mangafun/MangaFun.kt +++ /dev/null @@ -1,296 +0,0 @@ -package eu.kanade.tachiyomi.extension.en.mangafun - -import android.util.Base64 -import android.util.Log -import eu.kanade.tachiyomi.extension.en.mangafun.MangaFunUtils.toSChapter -import eu.kanade.tachiyomi.extension.en.mangafun.MangaFunUtils.toSManga -import eu.kanade.tachiyomi.lib.lzstring.LZString -import eu.kanade.tachiyomi.network.GET -import eu.kanade.tachiyomi.network.asObservableSuccess -import eu.kanade.tachiyomi.source.model.Filter -import eu.kanade.tachiyomi.source.model.FilterList -import eu.kanade.tachiyomi.source.model.MangasPage -import eu.kanade.tachiyomi.source.model.Page -import eu.kanade.tachiyomi.source.model.SChapter -import eu.kanade.tachiyomi.source.model.SManga -import eu.kanade.tachiyomi.source.online.HttpSource -import eu.kanade.tachiyomi.util.asJsoup -import kotlinx.serialization.decodeFromString -import kotlinx.serialization.encodeToString -import kotlinx.serialization.json.Json -import kotlinx.serialization.json.decodeFromJsonElement -import kotlinx.serialization.json.jsonArray -import kotlinx.serialization.json.jsonObject -import kotlinx.serialization.json.jsonPrimitive -import okhttp3.Request -import okhttp3.Response -import rx.Observable -import uy.kohesive.injekt.injectLazy -import kotlin.math.min - -class MangaFun : HttpSource() { - - override val name = "Manga Fun" - - override val baseUrl = "https://mangafun.me" - - private val apiUrl = "https://a.mangafun.me/v0" - - override val lang = "en" - - override val supportsLatest = true - - override val client = network.cloudflareClient - - override fun headersBuilder() = super.headersBuilder() - .add("Referer", "$baseUrl/") - .add("Origin", baseUrl) - - private val json: Json by injectLazy() - - private val nextBuildId by lazy { - val document = client.newCall(GET(baseUrl, headers)).execute().asJsoup() - - json.parseToJsonElement( - document.selectFirst("#__NEXT_DATA__")!!.data(), - ) - .jsonObject["buildId"]!! - .jsonPrimitive - .content - } - - private lateinit var directory: List - - override fun fetchPopularManga(page: Int): Observable { - return if (page == 1) { - client.newCall(popularMangaRequest(page)) - .asObservableSuccess() - .map { popularMangaParse(it) } - } else { - Observable.just(parseDirectory(page)) - } - } - - override fun popularMangaRequest(page: Int) = GET("$apiUrl/title/all", headers) - - override fun popularMangaParse(response: Response): MangasPage { - directory = response.parseAs>() - .sortedBy { it.rank } - return parseDirectory(1) - } - - override fun fetchLatestUpdates(page: Int): Observable { - return if (page == 1) { - client.newCall(latestUpdatesRequest(page)) - .asObservableSuccess() - .map { latestUpdatesParse(it) } - } else { - Observable.just(parseDirectory(page)) - } - } - - override fun latestUpdatesRequest(page: Int) = popularMangaRequest(page) - - override fun latestUpdatesParse(response: Response): MangasPage { - directory = response.parseAs>() - .sortedByDescending { MangaFunUtils.convertShortTime(it.updatedAt) } - return parseDirectory(1) - } - - override fun fetchSearchManga( - page: Int, - query: String, - filters: FilterList, - ): Observable { - return if (query.startsWith(PREFIX_ID_SEARCH)) { - val slug = query.removePrefix(PREFIX_ID_SEARCH) - return fetchMangaDetails(SManga.create().apply { url = "/title/$slug" }) - .map { MangasPage(listOf(it), false) } - } else if (page == 1) { - client.newCall(searchMangaRequest(page, query, filters)) - .asObservableSuccess() - .map { searchMangaParse(it, query, filters) } - } else { - Observable.just(parseDirectory(page)) - } - } - - override fun searchMangaRequest(page: Int, query: String, filters: FilterList) = - popularMangaRequest(page) - - override fun searchMangaParse(response: Response) = throw UnsupportedOperationException() - - private fun searchMangaParse(response: Response, query: String, filters: FilterList): MangasPage { - directory = response.parseAs>() - .filter { - it.name.contains(query, false) || - it.alias.any { a -> a.contains(query, false) } - } - - filters.ifEmpty { getFilterList() }.forEach { filter -> - when (filter) { - is GenreFilter -> { - val included = mutableListOf() - val excluded = mutableListOf() - - filter.state.forEach { g -> - when (g.state) { - Filter.TriState.STATE_INCLUDE -> included.add(g.id) - Filter.TriState.STATE_EXCLUDE -> excluded.add(g.id) - } - } - - if (included.isNotEmpty()) { - directory = directory - .filter { it.genres.any { g -> included.contains(g) } } - } - - if (excluded.isNotEmpty()) { - directory = directory - .filterNot { it.genres.any { g -> excluded.contains(g) } } - } - } - is TypeFilter -> { - val included = mutableListOf() - val excluded = mutableListOf() - - filter.state.forEach { g -> - when (g.state) { - Filter.TriState.STATE_INCLUDE -> included.add(g.id) - Filter.TriState.STATE_EXCLUDE -> excluded.add(g.id) - } - } - - if (included.isNotEmpty()) { - directory = directory - .filter { included.any { t -> it.titleType == t } } - } - - if (excluded.isNotEmpty()) { - directory = directory - .filterNot { excluded.any { t -> it.titleType == t } } - } - } - is StatusFilter -> { - val included = mutableListOf() - val excluded = mutableListOf() - - filter.state.forEach { g -> - when (g.state) { - Filter.TriState.STATE_INCLUDE -> included.add(g.id) - Filter.TriState.STATE_EXCLUDE -> excluded.add(g.id) - } - } - - if (included.isNotEmpty()) { - directory = directory - .filter { included.any { t -> it.publishedStatus == t } } - } - - if (excluded.isNotEmpty()) { - directory = directory - .filterNot { excluded.any { t -> it.publishedStatus == t } } - } - } - is SortFilter -> { - directory = when (filter.state?.index) { - 0 -> directory.sortedBy { it.name } - 1 -> directory.sortedBy { it.rank } - 2 -> directory.sortedBy { MangaFunUtils.convertShortTime(it.createdAt) } - 3 -> directory.sortedBy { MangaFunUtils.convertShortTime(it.updatedAt) } - else -> throw IllegalStateException("Unhandled sort option") - } - - if (filter.state?.ascending != true) { - directory = directory.reversed() - } - } - else -> {} - } - } - - return parseDirectory(1) - } - - override fun getMangaUrl(manga: SManga) = "$baseUrl${manga.url}" - - override fun mangaDetailsRequest(manga: SManga): Request { - val slug = manga.url.substringAfterLast("/") - val nextDataUrl = "$baseUrl/_next/data/$nextBuildId/title/$slug.json" - - return GET(nextDataUrl, headers) - } - - override fun mangaDetailsParse(response: Response): SManga { - val data = response.parseAs() - .pageProps - .dehydratedState - .queries - .first() - .state - .data - - return json.decodeFromJsonElement(data).toSManga() - } - - override fun chapterListRequest(manga: SManga) = mangaDetailsRequest(manga) - - override fun chapterListParse(response: Response): List { - val data = response.parseAs() - .pageProps - .dehydratedState - .queries - .first() - .state - .data - - val mangaData = json.decodeFromJsonElement(data) - return mangaData.chapters.map { it.toSChapter(mangaData.id, mangaData.name) }.reversed() - } - - override fun getChapterUrl(chapter: SChapter) = "$baseUrl${chapter.url}" - - override fun pageListRequest(chapter: SChapter): Request { - val chapterId = chapter.url.substringAfterLast("/").substringBefore("-") - - return GET("$apiUrl/chapter/$chapterId", headers) - } - - override fun pageListParse(response: Response): List { - val encoded = Base64.encode(response.body.bytes(), Base64.DEFAULT or Base64.NO_WRAP).toString(Charsets.UTF_8) - val decoded = LZString.decompressFromBase64(encoded) - val compressedJson = json.parseToJsonElement(decoded).jsonArray - val decompressedJson = DecompressJson.decompress(compressedJson).jsonObject - - Log.d("MangaFun", Json.encodeToString(decompressedJson)) - - return decompressedJson.jsonObject["p"]!!.jsonArray.mapIndexed { i, it -> - Page(i, imageUrl = MangaFunUtils.getImageUrlFromHash(it.jsonArray[0].jsonPrimitive.content)) - } - } - - override fun imageUrlParse(response: Response) = throw UnsupportedOperationException() - - override fun getFilterList() = FilterList( - GenreFilter(), - TypeFilter(), - StatusFilter(), - SortFilter(), - ) - - private fun parseDirectory(page: Int): MangasPage { - val endRange = min((page * 24), directory.size) - val manga = directory.subList(((page - 1) * 24), endRange).map { it.toSManga() } - val hasNextPage = endRange < directory.lastIndex - - return MangasPage(manga, hasNextPage) - } - - private inline fun Response.parseAs(): T = - json.decodeFromString(body.string()) - - companion object { - internal const val PREFIX_ID_SEARCH = "id:" - internal const val MANGAFUN_EPOCH = 1693473000 - } -} diff --git a/src/en/mangafun/src/eu/kanade/tachiyomi/extension/en/mangafun/MangaFunDto.kt b/src/en/mangafun/src/eu/kanade/tachiyomi/extension/en/mangafun/MangaFunDto.kt deleted file mode 100644 index c4bcbc31e7..0000000000 --- a/src/en/mangafun/src/eu/kanade/tachiyomi/extension/en/mangafun/MangaFunDto.kt +++ /dev/null @@ -1,70 +0,0 @@ -package eu.kanade.tachiyomi.extension.en.mangafun - -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable -import kotlinx.serialization.json.JsonElement - -@Serializable -data class MinifiedMangaDto( - @SerialName("i") val id: Int, - @SerialName("n") val name: String, - @SerialName("t") val thumbnailUrl: String? = null, - @SerialName("s") val publishedStatus: Int = 0, - @SerialName("tt") val titleType: Int = 0, - @SerialName("a") val alias: List = emptyList(), - @SerialName("g") val genres: List = emptyList(), - @SerialName("au") val author: List = emptyList(), - @SerialName("r") val rank: Int = 999999999, - @SerialName("ca") val createdAt: Int = 0, - @SerialName("ua") val updatedAt: Int = 0, -) - -@Serializable -data class MangaDto( - val id: Int, - val name: String, - val thumbnailURL: String? = null, - val publishedStatus: Int = 0, - val titleType: Int = 0, - val alias: List, - val description: String, - val genres: List, - val artist: List, - val author: List, - val chapters: List, -) - -@Serializable -data class ChapterDto( - val id: Int, - val name: String, - val publishedAt: String, -) - -@Serializable -data class GenreDto(val id: Int, val name: String) - -@Serializable -data class NextPagePropsWrapperDto( - val pageProps: NextPagePropsDto, -) - -@Serializable -data class NextPagePropsDto( - val dehydratedState: DehydratedStateDto, -) - -@Serializable -data class DehydratedStateDto( - val queries: List, -) - -@Serializable -data class QueriesDto( - val state: StateDto, -) - -@Serializable -data class StateDto( - val data: JsonElement, -) diff --git a/src/en/mangafun/src/eu/kanade/tachiyomi/extension/en/mangafun/MangaFunFilters.kt b/src/en/mangafun/src/eu/kanade/tachiyomi/extension/en/mangafun/MangaFunFilters.kt deleted file mode 100644 index 02f1c5be4b..0000000000 --- a/src/en/mangafun/src/eu/kanade/tachiyomi/extension/en/mangafun/MangaFunFilters.kt +++ /dev/null @@ -1,149 +0,0 @@ -package eu.kanade.tachiyomi.extension.en.mangafun - -import eu.kanade.tachiyomi.source.model.Filter - -class GenreFilter : Filter.Group("Genre", genreList) - -class TypeFilter : Filter.Group("Type", titleTypeList) - -class StatusFilter : Filter.Group( - "Status", - listOf("Ongoing", "Completed", "Hiatus", "Cancelled").mapIndexed { i, it -> Genre(it, i) }, -) - -class SortFilter : Filter.Sort( - "Order by", - arrayOf("Name", "Rank", "Newest", "Update"), - Selection(1, false), -) - -class Genre(name: String, val id: Int) : Filter.TriState(name) - -val genresMap by lazy { - genreList.associate { it.id to it.name } -} - -val titleTypeMap by lazy { - titleTypeList.associate { it.id to it.name } -} - -val titleTypeList by lazy { - listOf( - Genre("Manga", 0), - Genre("Manhwa", 1), - Genre("Manhua", 2), - Genre("Comic", 3), - Genre("Webtoon", 4), - Genre("One Shot", 6), - Genre("Doujinshi", 7), - Genre("Other", 8), - ) -} - -val genreList by lazy { - listOf( - Genre("Supernatural", 1), - Genre("Action", 2), - Genre("Comedy", 3), - Genre("Josei", 4), - Genre("Martial Arts", 5), - Genre("Romance", 6), - Genre("Ecchi", 7), - Genre("Harem", 8), - Genre("School Life", 9), - Genre("Seinen", 10), - Genre("Adventure", 11), - Genre("Fantasy", 12), - Genre("Demons", 13), - Genre("Magic", 14), - Genre("Military", 15), - Genre("Shounen", 16), - Genre("Shoujo", 17), - Genre("Psychological", 18), - Genre("Drama", 19), - Genre("Mystery", 20), - Genre("Sci-Fi", 21), - Genre("Slice of Life", 22), - Genre("Doujinshi", 23), - Genre("Police", 24), - Genre("Mecha", 25), - Genre("Yaoi", 26), - Genre("Horror", 27), - Genre("Historical", 28), - Genre("Thriller", 29), - Genre("Shounen Ai", 30), - Genre("Game", 31), - Genre("Gender Bender", 32), - Genre("Sports", 33), - Genre("Yuri", 34), - Genre("Music", 35), - Genre("Shoujo Ai", 36), - Genre("Vampires", 37), - Genre("Parody", 38), - Genre("Kids", 40), - Genre("Super Power", 41), - Genre("Space", 43), - Genre("Adult", 46), - Genre("Webtoons", 47), - Genre("Mature", 48), - Genre("Smut", 49), - Genre("Tragedy", 51), - Genre("One Shot", 53), - Genre("4-koma", 56), - Genre("Isekai", 58), - Genre("Food", 60), - Genre("Crime", 63), - Genre("Superhero", 67), - Genre("Animals", 69), - Genre("Manhwa", 74), - Genre("Manhua", 75), - Genre("Cooking", 78), - Genre("Medical", 79), - Genre("Magical Girls", 88), - Genre("Monsters", 89), - Genre("Shotacon", 90), - Genre("Philosophical", 91), - Genre("Wuxia", 92), - Genre("Adaptation", 95), - Genre("Full Color", 96), - Genre("Korean", 97), - Genre("Chinese", 98), - Genre("Reincarnation", 100), - Genre("Manga", 102), - Genre("Comic", 104), - Genre("Japanese", 105), - Genre("Time Travel", 108), - Genre("Erotica", 111), - Genre("Survival", 114), - Genre("Gore", 118), - Genre("Monster Girls", 120), - Genre("Dungeons", 123), - Genre("System", 124), - Genre("Cultivation", 125), - Genre("Murim", 128), - Genre("Suggestive", 131), - Genre("Fighting", 134), - Genre("Blood", 140), - Genre("Op-Mc", 142), - Genre("Revenge", 144), - Genre("Overpowered", 146), - Genre("Returner", 150), - Genre("Office", 152), - Genre("Loli", 163), - Genre("Video Games", 173), - Genre("Monster", 199), - Genre("Mafia", 203), - Genre("Anthology", 206), - Genre("Villainess", 207), - Genre("Aliens", 213), - Genre("Zombies", 216), - Genre("Violence", 217), - Genre("Delinquents", 219), - Genre("Post apocalyptic", 255), - Genre("Ghost", 260), - Genre("Virtual Reality", 263), - Genre("Cheat", 324), - Genre("Girls", 374), - Genre("Gender Swap", 384), - ) -} diff --git a/src/en/mangafun/src/eu/kanade/tachiyomi/extension/en/mangafun/MangaFunUrlActivity.kt b/src/en/mangafun/src/eu/kanade/tachiyomi/extension/en/mangafun/MangaFunUrlActivity.kt deleted file mode 100644 index ffbdad2140..0000000000 --- a/src/en/mangafun/src/eu/kanade/tachiyomi/extension/en/mangafun/MangaFunUrlActivity.kt +++ /dev/null @@ -1,33 +0,0 @@ -package eu.kanade.tachiyomi.extension.en.mangafun - -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 MangaFunUrlActivity : Activity() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - val pathSegments = intent?.data?.pathSegments - if (pathSegments != null && pathSegments.size > 1) { - try { - startActivity( - Intent().apply { - action = "eu.kanade.tachiyomi.SEARCH" - putExtra("query", "${MangaFun.PREFIX_ID_SEARCH}${pathSegments[1]}") - putExtra("filter", packageName) - }, - ) - } catch (e: ActivityNotFoundException) { - Log.e("MangaFunUrlActivity", "Could not start activity", e) - } - } else { - Log.e("MangaFunUrlActivity", "Could not parse URI from intent $intent") - } - - finish() - exitProcess(0) - } -} diff --git a/src/en/mangafun/src/eu/kanade/tachiyomi/extension/en/mangafun/MangaFunUtils.kt b/src/en/mangafun/src/eu/kanade/tachiyomi/extension/en/mangafun/MangaFunUtils.kt deleted file mode 100644 index 5ede3d2c6f..0000000000 --- a/src/en/mangafun/src/eu/kanade/tachiyomi/extension/en/mangafun/MangaFunUtils.kt +++ /dev/null @@ -1,77 +0,0 @@ -package eu.kanade.tachiyomi.extension.en.mangafun - -import eu.kanade.tachiyomi.source.model.SChapter -import eu.kanade.tachiyomi.source.model.SManga -import net.pearx.kasechange.toKebabCase -import java.text.SimpleDateFormat -import java.util.Locale - -object MangaFunUtils { - private const val cdnUrl = "https://mimg.bid" - - private val notAlnumRegex = Regex("""[^0-9A-Za-z\s]""") - - private val dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.ROOT) - - private fun String.slugify(): String = - this.replace(notAlnumRegex, "").toKebabCase() - - private fun publishedStatusToStatus(ps: Int) = when (ps) { - 0 -> SManga.ONGOING - 1 -> SManga.COMPLETED - 2 -> SManga.ON_HIATUS - 3 -> SManga.CANCELLED - else -> SManga.UNKNOWN - } - - fun convertShortTime(value: Int): Int { - return if (value < MangaFun.MANGAFUN_EPOCH) { - value + MangaFun.MANGAFUN_EPOCH - } else { - value - } - } - - fun getImageUrlFromHash(hash: String?): String? { - if (hash == null) { - return null - } - - return "$cdnUrl/${hash.substring(0, 2)}/${hash.substring(2, 5)}/${hash.substring(5)}.webp" - } - - fun MinifiedMangaDto.toSManga() = SManga.create().apply { - url = "/title/$id-${name.slugify()}" - title = name - author = this@toSManga.author.joinToString() - thumbnail_url = getImageUrlFromHash(thumbnailUrl) - status = publishedStatusToStatus(publishedStatus) - genre = buildList { - titleTypeMap[titleType]?.let { add(it) } - addAll(genres.mapNotNull { genresMap[it] }) - }.joinToString() - } - - fun MangaDto.toSManga() = SManga.create().apply { - url = "/title/$id-${name.slugify()}" - title = name - author = this@toSManga.author.filterNotNull().joinToString() - artist = this@toSManga.artist.filterNotNull().joinToString() - description = this@toSManga.description - genre = genres.mapNotNull { genresMap[it.id] }.joinToString() - status = publishedStatusToStatus(publishedStatus) - thumbnail_url = thumbnailURL - genre = buildList { - titleTypeMap[titleType]?.let { add(it) } - addAll(genres.mapNotNull { genresMap[it.id] }) - }.joinToString() - } - - fun ChapterDto.toSChapter(mangaId: Int, mangaName: String) = SChapter.create().apply { - url = "/title/$mangaId-${mangaName.slugify()}/$id-${this@toSChapter.name.slugify()}" - name = this@toSChapter.name - date_upload = runCatching { - dateFormat.parse(publishedAt)!!.time - }.getOrDefault(0L) - } -} diff --git a/src/en/mangatxgg/build.gradle b/src/en/mangatxgg/build.gradle deleted file mode 100644 index 9aedd5b598..0000000000 --- a/src/en/mangatxgg/build.gradle +++ /dev/null @@ -1,9 +0,0 @@ -ext { - extName = 'Manga Tx.gg (unoriginal)' - extClass = '.MangaTxGg' - themePkg = 'madara' - baseUrl = 'https://mangatx.gg' - overrideVersionCode = 0 -} - -apply from: "$rootDir/common.gradle" diff --git a/src/en/mangatxgg/src/eu/kanade/tachiyomi/extension/en/mangatxgg/MangaTxGg.kt b/src/en/mangatxgg/src/eu/kanade/tachiyomi/extension/en/mangatxgg/MangaTxGg.kt deleted file mode 100644 index b004db2934..0000000000 --- a/src/en/mangatxgg/src/eu/kanade/tachiyomi/extension/en/mangatxgg/MangaTxGg.kt +++ /dev/null @@ -1,7 +0,0 @@ -package eu.kanade.tachiyomi.extension.en.mangatxgg - -import eu.kanade.tachiyomi.multisrc.madara.Madara - -class MangaTxGg : Madara("Manga Tx.gg (unoriginal)", "https://mangatx.gg", "en") { - override val useNewChapterEndpoint = false -} diff --git a/src/en/meowmeowcomics/build.gradle b/src/en/meowmeowcomics/build.gradle deleted file mode 100644 index 1a4b710c2e..0000000000 --- a/src/en/meowmeowcomics/build.gradle +++ /dev/null @@ -1,9 +0,0 @@ -ext { - extName = 'Meow Meow Comics' - extClass = '.MeowMeowComics' - themePkg = 'madara' - baseUrl = 'https://meowmeowcomics.com' - overrideVersionCode = 0 -} - -apply from: "$rootDir/common.gradle" diff --git a/src/en/meowmeowcomics/res/mipmap-hdpi/ic_launcher.png b/src/en/meowmeowcomics/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index 3a320b66ef..0000000000 Binary files a/src/en/meowmeowcomics/res/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/meowmeowcomics/res/mipmap-mdpi/ic_launcher.png b/src/en/meowmeowcomics/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index aad77e4efd..0000000000 Binary files a/src/en/meowmeowcomics/res/mipmap-mdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/meowmeowcomics/res/mipmap-xhdpi/ic_launcher.png b/src/en/meowmeowcomics/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index cd86523b9a..0000000000 Binary files a/src/en/meowmeowcomics/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/meowmeowcomics/res/mipmap-xxhdpi/ic_launcher.png b/src/en/meowmeowcomics/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index add490c7de..0000000000 Binary files a/src/en/meowmeowcomics/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/meowmeowcomics/res/mipmap-xxxhdpi/ic_launcher.png b/src/en/meowmeowcomics/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 8b77e3c92c..0000000000 Binary files a/src/en/meowmeowcomics/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/meowmeowcomics/src/eu/kanade/tachiyomi/extension/en/meowmeowcomics/MeowMeowComics.kt b/src/en/meowmeowcomics/src/eu/kanade/tachiyomi/extension/en/meowmeowcomics/MeowMeowComics.kt deleted file mode 100644 index fa01ac8a82..0000000000 --- a/src/en/meowmeowcomics/src/eu/kanade/tachiyomi/extension/en/meowmeowcomics/MeowMeowComics.kt +++ /dev/null @@ -1,34 +0,0 @@ -package eu.kanade.tachiyomi.extension.en.meowmeowcomics - -import eu.kanade.tachiyomi.multisrc.madara.Madara -import eu.kanade.tachiyomi.network.interceptor.rateLimit -import eu.kanade.tachiyomi.source.model.SChapter -import eu.kanade.tachiyomi.source.model.SManga -import eu.kanade.tachiyomi.util.asJsoup -import okhttp3.Request -import okhttp3.Response - -class MeowMeowComics : Madara( - "Meow Meow Comics", - "https://meowmeowcomics.com", - "en", -) { - override val client = super.client.newBuilder() - .rateLimit(2) - .build() - - // ============================== Chapters ============================== - - override fun chapterListRequest(manga: SManga): Request { - return xhrChaptersRequest(baseUrl + manga.url.removeSuffix("/")) - } - - override fun chapterListParse(response: Response): List { - return response.asJsoup() - .select("ul.main > li.parent,ul.main:not(:has(>li.parent))") - .sortedByDescending { it.selectFirst("a.has-child")?.text()?.toIntOrNull() ?: 0 } - .flatMap { season -> - season.select(chapterListSelector()).map(::chapterFromElement) - } - } -} diff --git a/src/en/nightcomic/build.gradle b/src/en/nightcomic/build.gradle deleted file mode 100644 index 9b82ed6766..0000000000 --- a/src/en/nightcomic/build.gradle +++ /dev/null @@ -1,9 +0,0 @@ -ext { - extName = 'Night Comic' - extClass = '.NightComic' - themePkg = 'madara' - baseUrl = 'https://nightcomic.com' - overrideVersionCode = 2 -} - -apply from: "$rootDir/common.gradle" diff --git a/src/en/nightcomic/res/mipmap-hdpi/ic_launcher.png b/src/en/nightcomic/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index 0cc90b7bad..0000000000 Binary files a/src/en/nightcomic/res/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/nightcomic/res/mipmap-mdpi/ic_launcher.png b/src/en/nightcomic/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index b11ddcb296..0000000000 Binary files a/src/en/nightcomic/res/mipmap-mdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/nightcomic/res/mipmap-xhdpi/ic_launcher.png b/src/en/nightcomic/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index bb15645296..0000000000 Binary files a/src/en/nightcomic/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/nightcomic/res/mipmap-xxhdpi/ic_launcher.png b/src/en/nightcomic/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index 03bef40e76..0000000000 Binary files a/src/en/nightcomic/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/nightcomic/res/mipmap-xxxhdpi/ic_launcher.png b/src/en/nightcomic/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 85e39872c5..0000000000 Binary files a/src/en/nightcomic/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/nightcomic/src/eu/kanade/tachiyomi/extension/en/nightcomic/NightComic.kt b/src/en/nightcomic/src/eu/kanade/tachiyomi/extension/en/nightcomic/NightComic.kt deleted file mode 100644 index 3ab6d04a4f..0000000000 --- a/src/en/nightcomic/src/eu/kanade/tachiyomi/extension/en/nightcomic/NightComic.kt +++ /dev/null @@ -1,8 +0,0 @@ -package eu.kanade.tachiyomi.extension.en.nightcomic - -import eu.kanade.tachiyomi.multisrc.madara.Madara - -class NightComic : Madara("Night Comic", "https://nightcomic.com", "en") { - override val useNewChapterEndpoint = true - override val mangaDetailsSelectorAuthor = "div.manga-authors > a" -} diff --git a/src/en/rmanga/build.gradle b/src/en/rmanga/build.gradle deleted file mode 100644 index 0c5508fb9d..0000000000 --- a/src/en/rmanga/build.gradle +++ /dev/null @@ -1,7 +0,0 @@ -ext { - extName = 'Rmanga.app' - extClass = '.Rmanga' - extVersionCode = 2 -} - -apply from: "$rootDir/common.gradle" diff --git a/src/en/rmanga/res/mipmap-hdpi/ic_launcher.png b/src/en/rmanga/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index 43728840da..0000000000 Binary files a/src/en/rmanga/res/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/rmanga/res/mipmap-mdpi/ic_launcher.png b/src/en/rmanga/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 8dfafc91bd..0000000000 Binary files a/src/en/rmanga/res/mipmap-mdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/rmanga/res/mipmap-xhdpi/ic_launcher.png b/src/en/rmanga/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 7ce4b85737..0000000000 Binary files a/src/en/rmanga/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/rmanga/res/mipmap-xxhdpi/ic_launcher.png b/src/en/rmanga/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index 627b017c71..0000000000 Binary files a/src/en/rmanga/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/rmanga/res/mipmap-xxxhdpi/ic_launcher.png b/src/en/rmanga/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index aa11560c5c..0000000000 Binary files a/src/en/rmanga/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/rmanga/src/eu/kanade/tachiyomi/extension/en/rmanga/Rmanga.kt b/src/en/rmanga/src/eu/kanade/tachiyomi/extension/en/rmanga/Rmanga.kt deleted file mode 100644 index d933c80a8c..0000000000 --- a/src/en/rmanga/src/eu/kanade/tachiyomi/extension/en/rmanga/Rmanga.kt +++ /dev/null @@ -1,186 +0,0 @@ -package eu.kanade.tachiyomi.extension.en.rmanga - -import android.app.Application -import android.content.SharedPreferences -import androidx.preference.ListPreference -import androidx.preference.PreferenceScreen -import eu.kanade.tachiyomi.network.GET -import eu.kanade.tachiyomi.network.POST -import eu.kanade.tachiyomi.network.interceptor.rateLimit -import eu.kanade.tachiyomi.source.ConfigurableSource -import eu.kanade.tachiyomi.source.model.Filter -import eu.kanade.tachiyomi.source.model.FilterList -import eu.kanade.tachiyomi.source.model.MangasPage -import eu.kanade.tachiyomi.source.model.Page -import eu.kanade.tachiyomi.source.model.SChapter -import eu.kanade.tachiyomi.source.model.SManga -import eu.kanade.tachiyomi.source.online.ParsedHttpSource -import okhttp3.FormBody -import okhttp3.OkHttpClient -import okhttp3.Request -import okhttp3.Response -import org.jsoup.nodes.Document -import org.jsoup.nodes.Element -import uy.kohesive.injekt.Injekt -import uy.kohesive.injekt.api.get - -class Rmanga : ConfigurableSource, ParsedHttpSource() { - - override val name = "Rmanga.app" - - override val lang = "en" - - override val supportsLatest = true - - override val client: OkHttpClient = network.cloudflareClient.newBuilder() - .rateLimit(4) - .build() - - private val preferences: SharedPreferences = - Injekt.get().getSharedPreferences("source_$id", 0x0000) - - override val baseUrl = preferences.getString(DOMAIN_PREF, "https://rmanga.app")!! - - override fun headersBuilder() = super.headersBuilder() - .add("Referer", baseUrl) - - override fun popularMangaRequest(page: Int): Request { - return GET("$baseUrl/ranking/most-viewed/$page", headers) - } - - override fun popularMangaSelector() = "div.category-items > ul > li" - - override fun popularMangaFromElement(element: Element): SManga { - return SManga.create().apply { - element.select("div.category-name a").let { - setUrlWithoutDomain(it.attr("href")) - title = it.text() - } - thumbnail_url = element.select("img").attr("abs:src") - } - } - - override fun popularMangaNextPageSelector() = "a.pagination__item:contains(»)" - - override fun latestUpdatesRequest(page: Int): Request { - return GET("$baseUrl/latest-updates/$page", headers) - } - - override fun latestUpdatesParse(response: Response): MangasPage { - return super.latestUpdatesParse(response).apply { - this.mangas.distinctBy { it.url } - } - } - - override fun latestUpdatesSelector() = "div.latest-updates > ul > li" - - override fun latestUpdatesFromElement(element: Element): SManga { - return SManga.create().apply { - element.select("div.latest-updates-name a").let { - setUrlWithoutDomain(it.attr("href")) - title = it.text() - } - thumbnail_url = element.select("img").attr("abs:src") - } - } - - override fun latestUpdatesNextPageSelector() = popularMangaNextPageSelector() - - override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { - val payload = FormBody.Builder().apply { - add("manga-name", query.trim()) - filters.forEach { filter -> - when (filter) { - is TypeFilter -> { - add("type", filter.getValue()) - } - is AuthorFilter -> { - add("author-name", filter.state.trim()) - } - is ArtistFilter -> { - add("artist-name", filter.state.trim()) - } - is StatusFilter -> { - add("status", filter.getValue()) - } - is GenreFilter -> { - filter.state.forEach { genreState -> - when (genreState.state) { - Filter.TriState.STATE_INCLUDE -> add("include[]", genreState.id) - Filter.TriState.STATE_EXCLUDE -> add("exclude[]", genreState.id) - } - } - } - else -> {} - } - } - }.build() - - return POST("$baseUrl/detailed-search", headers, payload) - } - - override fun getFilterList() = getFilters() - - override fun searchMangaFromElement(element: Element) = popularMangaFromElement(element) - - override fun searchMangaSelector() = popularMangaSelector() - - override fun searchMangaNextPageSelector() = popularMangaNextPageSelector() - - override fun mangaDetailsParse(document: Document): SManga { - return SManga.create().apply { - title = document.select("div.section-header-title").first()!!.text() - description = document.select("div.empty-box").eachText().joinToString("\n\n", postfix = "\n\n") - thumbnail_url = document.select("div.novels-detail-left img").attr("abs:src") - document.select("div.novels-detail-right > ul").let { element -> - author = element.select("li:contains(author)").text().substringAfter(":").trim().takeUnless { it == "N/A" } - artist = element.select("li:contains(artist)").text().substringAfter(":").trim().takeUnless { it == "N/A" } - genre = element.select("li:contains(genres) a").joinToString { it.text() } - status = element.select("li:contains(status)").text().parseStatus() - description += element.select("li:contains(alternative)").text() - } - } - } - - private fun String.parseStatus(): Int { - return when { - this.contains("ongoing", true) -> SManga.ONGOING - this.contains("completed", true) -> SManga.COMPLETED - else -> SManga.UNKNOWN - } - } - - override fun chapterListSelector() = "div.novels-detail-chapters a" - - override fun chapterFromElement(element: Element): SChapter { - return SChapter.create().apply { - setUrlWithoutDomain(element.attr("href")) - name = element.ownText() - } - } - - override fun pageListParse(document: Document): List { - return document.select("div.chapter-detail-novel-big-image img").mapIndexed { index, img -> - Page(index = index, imageUrl = img.attr("abs:src")) - } - } - - override fun imageUrlParse(document: Document): String { - throw UnsupportedOperationException() - } - - override fun setupPreferenceScreen(screen: PreferenceScreen) { - ListPreference(screen.context).apply { - key = DOMAIN_PREF - title = "Preferred domain" - entries = arrayOf("rmanga.app", "readmanga.app") - entryValues = arrayOf("https://rmanga.app", "https://readmanga.app") - setDefaultValue("https://rmanga.app") - summary = "Requires App Restart" - }.let { screen.addPreference(it) } - } - - companion object { - private const val DOMAIN_PREF = "pref_domain" - } -} diff --git a/src/en/rmanga/src/eu/kanade/tachiyomi/extension/en/rmanga/RmangaFilters.kt b/src/en/rmanga/src/eu/kanade/tachiyomi/extension/en/rmanga/RmangaFilters.kt deleted file mode 100644 index 7511f17bf8..0000000000 --- a/src/en/rmanga/src/eu/kanade/tachiyomi/extension/en/rmanga/RmangaFilters.kt +++ /dev/null @@ -1,95 +0,0 @@ -package eu.kanade.tachiyomi.extension.en.rmanga - -import eu.kanade.tachiyomi.source.model.Filter -import eu.kanade.tachiyomi.source.model.FilterList - -class Genre( - name: String, - val id: String, -) : Filter.TriState(name) - -internal class GenreFilter(name: String, genres: List) : - Filter.Group(name, genres) - -private val genreList = listOf( - Genre("Action", "1"), - Genre("Adventure", "23"), - Genre("All Categories", "42"), - Genre("Comedy", "12"), - Genre("Cooking", "51"), - Genre("Doujinshi", "26"), - Genre("Drama", "9"), - Genre("Ecchi", "2"), - Genre("Fantasy", "3"), - Genre("Gender Bender", "30"), - Genre("Harem", "4"), - Genre("Historical", "36"), - Genre("Horror", "34"), - Genre("Isekai", "44"), - Genre("Josei", "17"), - Genre("Lolicon", "39"), - Genre("Magic", "48"), - Genre("Manga", "5"), - Genre("Manhua", "31"), - Genre("Manhwa", "32"), - Genre("Martial Arts", "22"), - Genre("Mature", "50"), - Genre("Mecha", "33"), - Genre("Mind Game", "52"), - Genre("Mystery", "13"), - Genre("None", "41"), - Genre("One shot", "16"), - Genre("Psychological", "14"), - Genre("Recarnation", "49"), - Genre("Romance", "6"), - Genre("School Life", "10"), - Genre("Sci fi", "19"), - Genre("Seinen", "24"), - Genre("Shotacon", "38"), - Genre("Shoujo", "8"), - Genre("Shoujo Ai", "37"), - Genre("Shounen", "7"), - Genre("Shounen Ai", "35"), - Genre("Slice of Life", "21"), - Genre("Sports", "29"), - Genre("Supernatural", "11"), - Genre("Time Travel", "45"), - Genre("Tragedy", "15"), - Genre("Uncategorized", "43"), - Genre("Yaoi", "28"), - Genre("Yuri", "20"), -) - -internal class TypeFilter(name: String, private val types: Array) : - Filter.Select(name, types) { - fun getValue() = types[state] -} - -private val typeFilter: Array = arrayOf( - "All", - "Japanese", - "Korean", - "Chinese", -) - -internal class AuthorFilter(title: String) : Filter.Text(title) -internal class ArtistFilter(title: String) : Filter.Text(title) - -internal class StatusFilter(name: String, private val status: Array) : - Filter.Select(name, status) { - fun getValue() = status[state] -} - -private val statusFilter: Array = arrayOf( - "Both", - "Ongoing", - "Completed", -) - -fun getFilters() = FilterList( - TypeFilter("Type", typeFilter), - AuthorFilter("Author"), - ArtistFilter("Artist"), - StatusFilter("Status", statusFilter), - GenreFilter("Genres", genreList), -) diff --git a/src/en/silentmangaaudition/build.gradle b/src/en/silentmangaaudition/build.gradle deleted file mode 100644 index e2a9837c8b..0000000000 --- a/src/en/silentmangaaudition/build.gradle +++ /dev/null @@ -1,7 +0,0 @@ -ext { - extName = 'Silent Manga Audition' - extClass = '.SilentMangaAudition' - extVersionCode = 5 -} - -apply from: "$rootDir/common.gradle" diff --git a/src/en/silentmangaaudition/res/mipmap-hdpi/ic_launcher.png b/src/en/silentmangaaudition/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index bf019004ec..0000000000 Binary files a/src/en/silentmangaaudition/res/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/silentmangaaudition/res/mipmap-mdpi/ic_launcher.png b/src/en/silentmangaaudition/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 7d9e1638d2..0000000000 Binary files a/src/en/silentmangaaudition/res/mipmap-mdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/silentmangaaudition/res/mipmap-xhdpi/ic_launcher.png b/src/en/silentmangaaudition/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index c766152812..0000000000 Binary files a/src/en/silentmangaaudition/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/silentmangaaudition/res/mipmap-xxhdpi/ic_launcher.png b/src/en/silentmangaaudition/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index 95d03405d8..0000000000 Binary files a/src/en/silentmangaaudition/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/silentmangaaudition/res/mipmap-xxxhdpi/ic_launcher.png b/src/en/silentmangaaudition/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index e2c66b1a09..0000000000 Binary files a/src/en/silentmangaaudition/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/silentmangaaudition/src/eu/kanade/tachiyomi/extension/en/silentmangaaudition/ExtensionData.kt b/src/en/silentmangaaudition/src/eu/kanade/tachiyomi/extension/en/silentmangaaudition/ExtensionData.kt deleted file mode 100644 index d2b5b2d7dd..0000000000 --- a/src/en/silentmangaaudition/src/eu/kanade/tachiyomi/extension/en/silentmangaaudition/ExtensionData.kt +++ /dev/null @@ -1,156 +0,0 @@ -package eu.kanade.tachiyomi.extension.en.silentmangaaudition - -import eu.kanade.tachiyomi.source.model.SManga - -data class SmaEntry( - val name: String, - val url: String, - val chapterListUrl: String, - val thumbnailUrl: String, -) { - - fun toSManga(index: Int): SManga = SManga.create().apply { - title = name - author = "Various artists" - status = SManga.COMPLETED - description = "The theme is… " + name.substringAfter(" ") + "." - thumbnail_url = thumbnailUrl - url = "${this@SmaEntry.url},$chapterListUrl,$index" - initialized = true - } -} - -val SMA_ENTRIES = listOf( - SmaEntry( - "SMA-17 “MOMENTS of HASTE, RAGE or SMILES”", - "/sma17-silent-manga-audition-2022-results-announcement", - "/v/sma17/bones-by-rimui/?lang=en", - "https://www.manga-audition.com/wp/wp-content/themes/gridlove-child/assets/img/award-result/sma17/header_sp.png", - ), - SmaEntry( - "SMA-16 “MOMENTS of FEAR, JOY, or LOVE”", - "/sma16-silent-manga-audition-2021-results-announcement", - "/v/sma16/lacrimosa-by-laica-chrose/?lang=en", - "https://www.manga-audition.com/wp/wp-content/uploads/2021/11/hero_sp_new.jpg", - ), - SmaEntry( - "SMA-15 “Moments of CRYING, SMILING or LOVE”", - "/sma15-silent-manga-audition-2021-award-winners", - "/v/sma15/blossom-by-enewald/?lang=en", - "https://www.manga-audition.com/wp/wp-content/themes/gridlove-child/assets/img/award-result/sma15/header_sp.png", - ), - SmaEntry( - "SMA-14 “Creature, Spirits & Monsters”", - "/sma14-silent-manga-audition-2020-award-winners", - "/v/sma14/blooming-flower-by-blackwink/", - "https://www.manga-audition.com/wp/wp-content/themes/gridlove-child/assets/img/award-result/sma14/header_sp.png", - ), - SmaEntry( - "SMA-13 “Together for peace”", - "/sma13-silent-manga-audition-2020-award-winners/", - "/v/sma13/homeless-by-simone-sanseverino/?lang=en", - "https://www.manga-audition.com/wp/wp-content/themes/gridlove-child/assets/img/award-result/sma13/header_sp.png", - ), - SmaEntry( - "SMA-12 “New beginning”", - "/sma12-silent-manga-audition-2019-award-winners/", - "/v/sma12/never-late-by-lucas-marques-and-priscilla-miranda/?lang=en", - "https://www.manga-audition.com/wp/wp-content/themes/gridlove-child/assets/img/award-result/sma12/header_sp.png", - ), - SmaEntry( - "SMA-EX5 “Kumamoto + Do Your Best!”", - "/smaex5-silent-manga-audition-2019-award-winners/", - "/v/smaex5/fish-by-youngman/", - "https://www.manga-audition.com/wp/wp-content/themes/gridlove-child/assets/img/award-result/smaex5/top_banner_sp.jpg", - ), - SmaEntry( - "SMA11 “Promise”", - "/sma11-silent-manga-audition-2019-award-winners/", - "/v/sma11/reborn-by-riza-al-assami/?lang=en", - "https://www.manga-audition.com/wp/wp-content/themes/gridlove-child/assets/img/award-result/sma11/top_banner_sp.jpg", - ), - SmaEntry( - "SMA-EX4 “Kit Kat ROUND”", - "/smaex4-2018award/", - "/v/smaex4/lucky-charm-by-harihtaroon/", - "https://s3-ap-northeast-1.amazonaws.com/data.smacmag.net/_images/sma_page/pc/smaex4/smaex4_main01.png", - ), - SmaEntry( - "SMA10 “Effort / Friendship / Victory”", - "/sma10-2018award-2/", - "/v/sma10/run-by-riza-al-assami/?lang=en", - "https://s3-ap-northeast-1.amazonaws.com/data.smacmag.net/_images/sma_page/sma10/sma10main_3.png", - ), - SmaEntry( - "SMA-EX3 “Kumamoto + Wasamon”", - "/smaex3-2018award/", - "/v/smaex3/to-the-sky-by-zevania-and-nattorin/", - "https://s3-ap-northeast-1.amazonaws.com/data.smacmag.net/_images/sma_page/pc/smaex3/smaex3_main01.png", - ), - SmaEntry( - "SMA9 “Fairness / Respect / Teamwork”", - "/sma9-2018award/", - "/v/sma9/fisherman-tales-by-joao-eddie/", - "https://s3-ap-northeast-1.amazonaws.com/data.smacmag.net/_images/sma_page/pc/sma9/sma9_theme.png", - ), - SmaEntry( - "SMA8 “Fair Play”", - "/sma8-2017award/", - "/v/sma8/checkmate-by-sideburn004/", - "https://s3-ap-northeast-1.amazonaws.com/data.smacmag.net/_images/sma_page/pc/sma8/sma8_theme.png", - ), - SmaEntry( - "SMA7 “Unforgettable Taste”", - "/sma7-2017award/", - "/v/sma7/our-promised-land-by-nattorin-and-zevania/", - "https://s3-ap-northeast-1.amazonaws.com/data.smacmag.net/_images/sma_page/pc/sma7/sma7_theme.png", - ), - SmaEntry( - "SMA-EX2 “Kumamoto + Smile”", - "http://data.smacmag.net/sma/smaex2-2017award/", - "https://smacmag.net/v/sma2/drawing-a-smile-out-by-dee-juusan/", - "http://data.smacmag.net/sma/smaex2-2017award/images/smaex2_title.png", - ), - SmaEntry( - "SMA6 “Childhood”", - "/sma6-2016award/", - "/v/sma6/forbidden-by-yos/13828", - "https://s3-ap-northeast-1.amazonaws.com/data.smacmag.net/_images/sma_page/pc/sma6/SMA06_themes.png", - ), - SmaEntry( - "SMA5 “Friend-ship + Communication Tool”", - "/sma05-2016award/", - "/v/sma5/im-happy-by-ds-studio/11915", - "https://s3-ap-northeast-1.amazonaws.com/data.smacmag.net/_images/sma_page/pc/sma5/sma5_theme.png", - ), - SmaEntry( - "SMA-EX1 “Fukushima Sakuramori”", - "/smaex1-2016award/", - "/v/smaex1/seeds-by-jim/9574", - "https://s3-ap-northeast-1.amazonaws.com/data.smacmag.net/_images/sma_page/pc/smaex1/smaex1_theme.png", - ), - SmaEntry( - "SMA4 “A Charming Gift”", - "/sma04-2015award/", - "/v/sma4/birdy-by-kalongzz/", - "https://s3-ap-northeast-1.amazonaws.com/data.smacmag.net/_images/sma_page/pc/sma4/sma4_theme.png", - ), - SmaEntry( - "SMA3 “Mother”", - "/sma03-2015award/", - "/v/sma3/homesick-alien-by-ichirou/4390", - "https://s3-ap-northeast-1.amazonaws.com/data.smacmag.net/_images/sma_page/pc/sma3/sma3_theme.png", - ), - SmaEntry( - "SMA2 “The Finest Smile”", - "/sma02-2014award/", - "/v/sma2/fathers-gift-by-ichirou/1775", - "https://s3-ap-northeast-1.amazonaws.com/data.smacmag.net/_images/sma_page/pc/sma2/sma2_theme.png", - ), - SmaEntry( - "SMA1 “Love Letter”", - "/sma01-2013award/", - "/v/sma1/excuse-me-by-alex-irzaqi/", - "https://s3-ap-northeast-1.amazonaws.com/data.smacmag.net/_images/sma_page/pc/sma1/sma1_theme.png", - ), -) diff --git a/src/en/silentmangaaudition/src/eu/kanade/tachiyomi/extension/en/silentmangaaudition/SilentMangaAudition.kt b/src/en/silentmangaaudition/src/eu/kanade/tachiyomi/extension/en/silentmangaaudition/SilentMangaAudition.kt deleted file mode 100644 index e1d63dbc6d..0000000000 --- a/src/en/silentmangaaudition/src/eu/kanade/tachiyomi/extension/en/silentmangaaudition/SilentMangaAudition.kt +++ /dev/null @@ -1,125 +0,0 @@ -package eu.kanade.tachiyomi.extension.en.silentmangaaudition - -import eu.kanade.tachiyomi.network.GET -import eu.kanade.tachiyomi.source.model.FilterList -import eu.kanade.tachiyomi.source.model.MangasPage -import eu.kanade.tachiyomi.source.model.Page -import eu.kanade.tachiyomi.source.model.SChapter -import eu.kanade.tachiyomi.source.model.SManga -import eu.kanade.tachiyomi.source.online.HttpSource -import eu.kanade.tachiyomi.util.asJsoup -import okhttp3.Headers -import okhttp3.Request -import okhttp3.Response -import org.jsoup.nodes.Element -import rx.Observable - -class SilentMangaAudition : HttpSource() { - - override val name = "Silent Manga Audition" - - override val baseUrl = "https://manga-audition.com" - - override val lang = "en" - - override val supportsLatest = false - - override fun headersBuilder(): Headers.Builder = Headers.Builder() - .add("User-Agent", USER_AGENT) - .add("Referer", baseUrl) - - override fun fetchPopularManga(page: Int): Observable { - val entries = SMA_ENTRIES.mapIndexed { i, entry -> entry.toSManga(i) } - return Observable.just(MangasPage(entries, false)) - } - - override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable { - val filteredEntries = SMA_ENTRIES - .mapIndexed { i, entry -> entry.toSManga(i) } - .filter { - it.title.contains(query, true) || - it.description!!.contains(query, true) - } - - return Observable.just(MangasPage(filteredEntries, false)) - } - - override fun fetchMangaDetails(manga: SManga): Observable { - val index = manga.url.substringAfterLast(",").toInt() - val entry = SMA_ENTRIES[index] - - return Observable.just(entry.toSManga(index)) - } - - override fun mangaDetailsRequest(manga: SManga): Request { - val url = manga.url.substringBefore(",") - return GET(if (url.startsWith("/")) baseUrl + url else url, headers) - } - - override fun chapterListRequest(manga: SManga): Request { - val url = manga.url - .substringAfter(",") - .substringBefore(",") - - return GET(SMACMAG_URL + url, headers) - } - - override fun chapterListParse(response: Response): List { - return response.asJsoup() - .select(chapterListSelector()) - .map { chapterFromElement(it) } - } - - private fun chapterListSelector(): String = "ol.playlist li a" - - private fun chapterFromElement(element: Element): SChapter = SChapter.create().apply { - name = element.select("span.ttl").text() - scanlator = element.select("span.name").text() - url = element.attr("abs:href") - } - - override fun pageListRequest(chapter: SChapter): Request { - return GET(chapter.url, headers) - } - - override fun pageListParse(response: Response): List { - val chapterUrl = response.request.url.toString() - - return response.asJsoup() - .select("div.swiper-wrapper div.swiper-slide img.swiper-lazy") - .mapIndexed { i, element -> Page(i, chapterUrl, element.attr("data-src")) } - } - - override fun fetchImageUrl(page: Page): Observable = Observable.just(page.imageUrl!!) - - override fun imageUrlParse(response: Response): String = "" - - override fun imageRequest(page: Page): Request { - val newHeaders = headersBuilder() - .set("Referer", page.url) - .build() - - return GET(page.imageUrl!!, newHeaders) - } - - override fun popularMangaRequest(page: Int): Request = throw UnsupportedOperationException() - - override fun popularMangaParse(response: Response): MangasPage = throw UnsupportedOperationException() - - override fun latestUpdatesRequest(page: Int): Request = throw UnsupportedOperationException() - - override fun latestUpdatesParse(response: Response): MangasPage = throw UnsupportedOperationException() - - override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request = throw UnsupportedOperationException() - - override fun searchMangaParse(response: Response): MangasPage = throw UnsupportedOperationException() - - override fun mangaDetailsParse(response: Response): SManga = throw UnsupportedOperationException() - - companion object { - private const val SMACMAG_URL = "https://smacmag.net" - - private const val USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " + - "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36" - } -} diff --git a/src/en/silentsky/build.gradle b/src/en/silentsky/build.gradle deleted file mode 100644 index 3c55909806..0000000000 --- a/src/en/silentsky/build.gradle +++ /dev/null @@ -1,9 +0,0 @@ -ext { - extName = 'Silent Sky' - extClass = '.SilentSky' - themePkg = 'foolslide' - baseUrl = 'https://reader.silentsky-scans.net' - overrideVersionCode = 0 -} - -apply from: "$rootDir/common.gradle" diff --git a/src/en/silentsky/res/mipmap-hdpi/ic_launcher.png b/src/en/silentsky/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index e7e1874b91..0000000000 Binary files a/src/en/silentsky/res/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/silentsky/res/mipmap-mdpi/ic_launcher.png b/src/en/silentsky/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 924ba38c1f..0000000000 Binary files a/src/en/silentsky/res/mipmap-mdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/silentsky/res/mipmap-xhdpi/ic_launcher.png b/src/en/silentsky/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index cf6b71cfda..0000000000 Binary files a/src/en/silentsky/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/silentsky/res/mipmap-xxhdpi/ic_launcher.png b/src/en/silentsky/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index b6279e3d6b..0000000000 Binary files a/src/en/silentsky/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/silentsky/res/mipmap-xxxhdpi/ic_launcher.png b/src/en/silentsky/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 3e1363c06e..0000000000 Binary files a/src/en/silentsky/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/silentsky/src/eu/kanade/tachiyomi/extension/en/silentsky/SilentSky.kt b/src/en/silentsky/src/eu/kanade/tachiyomi/extension/en/silentsky/SilentSky.kt deleted file mode 100644 index a5262759fc..0000000000 --- a/src/en/silentsky/src/eu/kanade/tachiyomi/extension/en/silentsky/SilentSky.kt +++ /dev/null @@ -1,5 +0,0 @@ -package eu.kanade.tachiyomi.extension.en.silentsky - -import eu.kanade.tachiyomi.multisrc.foolslide.FoolSlide - -class SilentSky : FoolSlide("Silent Sky", "https://reader.silentsky-scans.net", "en") diff --git a/src/en/sololeveling/build.gradle b/src/en/sololeveling/build.gradle deleted file mode 100644 index cfea72b265..0000000000 --- a/src/en/sololeveling/build.gradle +++ /dev/null @@ -1,9 +0,0 @@ -ext { - extName = 'Solo Leveling' - extClass = '.SoloLeveling' - themePkg = 'madara' - baseUrl = 'https://readsololeveling.online' - overrideVersionCode = 0 -} - -apply from: "$rootDir/common.gradle" diff --git a/src/en/sololeveling/res/mipmap-hdpi/ic_launcher.png b/src/en/sololeveling/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index e2d2edd06e..0000000000 Binary files a/src/en/sololeveling/res/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/sololeveling/res/mipmap-mdpi/ic_launcher.png b/src/en/sololeveling/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index a3648ccad4..0000000000 Binary files a/src/en/sololeveling/res/mipmap-mdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/sololeveling/res/mipmap-xhdpi/ic_launcher.png b/src/en/sololeveling/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 8f100a8f98..0000000000 Binary files a/src/en/sololeveling/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/sololeveling/res/mipmap-xxhdpi/ic_launcher.png b/src/en/sololeveling/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index 39c8e3654c..0000000000 Binary files a/src/en/sololeveling/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/sololeveling/res/mipmap-xxxhdpi/ic_launcher.png b/src/en/sololeveling/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index c7b40599c4..0000000000 Binary files a/src/en/sololeveling/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/sololeveling/src/eu/kanade/tachiyomi/extension/en/sololeveling/SoloLeveling.kt b/src/en/sololeveling/src/eu/kanade/tachiyomi/extension/en/sololeveling/SoloLeveling.kt deleted file mode 100644 index 715dbce9b1..0000000000 --- a/src/en/sololeveling/src/eu/kanade/tachiyomi/extension/en/sololeveling/SoloLeveling.kt +++ /dev/null @@ -1,5 +0,0 @@ -package eu.kanade.tachiyomi.extension.en.sololeveling - -import eu.kanade.tachiyomi.multisrc.madara.Madara - -class SoloLeveling : Madara("Solo Leveling", "https://readsololeveling.online", "en") diff --git a/src/en/zinmangams/build.gradle b/src/en/zinmangams/build.gradle deleted file mode 100644 index a8da0bc3da..0000000000 --- a/src/en/zinmangams/build.gradle +++ /dev/null @@ -1,10 +0,0 @@ -ext { - extName = 'Zinmanga.ms' - extClass = '.ZinmangaMs' - themePkg = 'madara' - baseUrl = 'https://zinmanga.ms' - overrideVersionCode = 0 - isNsfw = true -} - -apply from: "$rootDir/common.gradle" diff --git a/src/en/zinmangams/res/mipmap-hdpi/ic_launcher.png b/src/en/zinmangams/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index 8de2101c86..0000000000 Binary files a/src/en/zinmangams/res/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/zinmangams/res/mipmap-mdpi/ic_launcher.png b/src/en/zinmangams/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 86744ec856..0000000000 Binary files a/src/en/zinmangams/res/mipmap-mdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/zinmangams/res/mipmap-xhdpi/ic_launcher.png b/src/en/zinmangams/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 5e3c4146df..0000000000 Binary files a/src/en/zinmangams/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/zinmangams/res/mipmap-xxhdpi/ic_launcher.png b/src/en/zinmangams/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index 218ed58d5a..0000000000 Binary files a/src/en/zinmangams/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/zinmangams/res/mipmap-xxxhdpi/ic_launcher.png b/src/en/zinmangams/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 94fc92db57..0000000000 Binary files a/src/en/zinmangams/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/zinmangams/src/eu/kanade/tachiyomi/extension/en/zinmangams/ZinmangaMs.kt b/src/en/zinmangams/src/eu/kanade/tachiyomi/extension/en/zinmangams/ZinmangaMs.kt deleted file mode 100644 index ce07fdcc81..0000000000 --- a/src/en/zinmangams/src/eu/kanade/tachiyomi/extension/en/zinmangams/ZinmangaMs.kt +++ /dev/null @@ -1,14 +0,0 @@ -package eu.kanade.tachiyomi.extension.en.zinmangams - -import eu.kanade.tachiyomi.multisrc.madara.Madara - -class ZinmangaMs : Madara( - "Zinmanga.ms", - "https://zinmanga.ms", - "en", -) { - override val useLoadMoreRequest = LoadMoreStrategy.Always - override val useNewChapterEndpoint = false - - override val mangaSubString = "manga-1" -} diff --git a/src/es/ragnaroknochikara/build.gradle b/src/es/ragnaroknochikara/build.gradle deleted file mode 100644 index 29643f623e..0000000000 --- a/src/es/ragnaroknochikara/build.gradle +++ /dev/null @@ -1,10 +0,0 @@ -ext { - extName = 'Ragnarok No Chikara' - extClass = '.RagnarokNoChikara' - themePkg = 'madara' - baseUrl = 'https://ragnarokscan.com' - overrideVersionCode = 0 - isNsfw = false -} - -apply from: "$rootDir/common.gradle" diff --git a/src/es/ragnaroknochikara/res/mipmap-hdpi/ic_launcher.png b/src/es/ragnaroknochikara/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index 870433c836..0000000000 Binary files a/src/es/ragnaroknochikara/res/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/src/es/ragnaroknochikara/res/mipmap-mdpi/ic_launcher.png b/src/es/ragnaroknochikara/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 966b85be24..0000000000 Binary files a/src/es/ragnaroknochikara/res/mipmap-mdpi/ic_launcher.png and /dev/null differ diff --git a/src/es/ragnaroknochikara/res/mipmap-xhdpi/ic_launcher.png b/src/es/ragnaroknochikara/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 58a278aa2c..0000000000 Binary files a/src/es/ragnaroknochikara/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/src/es/ragnaroknochikara/res/mipmap-xxhdpi/ic_launcher.png b/src/es/ragnaroknochikara/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index 5f58c8b0c3..0000000000 Binary files a/src/es/ragnaroknochikara/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/src/es/ragnaroknochikara/res/mipmap-xxxhdpi/ic_launcher.png b/src/es/ragnaroknochikara/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 759f385317..0000000000 Binary files a/src/es/ragnaroknochikara/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ diff --git a/src/es/ragnaroknochikara/src/eu/kanade/tachiyomi/extension/es/ragnaroknochikara/RagnarokNoChikara.kt b/src/es/ragnaroknochikara/src/eu/kanade/tachiyomi/extension/es/ragnaroknochikara/RagnarokNoChikara.kt deleted file mode 100644 index 51c862a350..0000000000 --- a/src/es/ragnaroknochikara/src/eu/kanade/tachiyomi/extension/es/ragnaroknochikara/RagnarokNoChikara.kt +++ /dev/null @@ -1,21 +0,0 @@ -package eu.kanade.tachiyomi.extension.es.ragnaroknochikara - -import eu.kanade.tachiyomi.multisrc.madara.Madara -import eu.kanade.tachiyomi.network.interceptor.rateLimitHost -import okhttp3.HttpUrl.Companion.toHttpUrl -import java.text.SimpleDateFormat -import java.util.Locale - -class RagnarokNoChikara : Madara( - "Ragnarok No Chikara", - "https://ragnarokscan.com", - "es", - SimpleDateFormat("MMMM d, yyy", Locale("es")), -) { - override val client = super.client.newBuilder() - .rateLimitHost(baseUrl.toHttpUrl(), 3, 1) - .build() - - override val useLoadMoreRequest = LoadMoreStrategy.Never - override val useNewChapterEndpoint = true -} diff --git a/src/id/alceascan/build.gradle b/src/id/alceascan/build.gradle deleted file mode 100644 index 10ae35d528..0000000000 --- a/src/id/alceascan/build.gradle +++ /dev/null @@ -1,9 +0,0 @@ -ext { - extName = 'Alceascan' - extClass = '.Alceascan' - themePkg = 'mangathemesia' - baseUrl = 'https://alceacomic.my.id' - overrideVersionCode = 1 -} - -apply from: "$rootDir/common.gradle" diff --git a/src/id/alceascan/res/mipmap-hdpi/ic_launcher.png b/src/id/alceascan/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index dc4ade72cf..0000000000 Binary files a/src/id/alceascan/res/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/src/id/alceascan/res/mipmap-mdpi/ic_launcher.png b/src/id/alceascan/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 1df5b7a1ff..0000000000 Binary files a/src/id/alceascan/res/mipmap-mdpi/ic_launcher.png and /dev/null differ diff --git a/src/id/alceascan/res/mipmap-xhdpi/ic_launcher.png b/src/id/alceascan/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 2f539dbd78..0000000000 Binary files a/src/id/alceascan/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/src/id/alceascan/res/mipmap-xxhdpi/ic_launcher.png b/src/id/alceascan/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index 8354ada108..0000000000 Binary files a/src/id/alceascan/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/src/id/alceascan/res/mipmap-xxxhdpi/ic_launcher.png b/src/id/alceascan/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 959dee2fbe..0000000000 Binary files a/src/id/alceascan/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ diff --git a/src/id/alceascan/src/eu/kanade/tachiyomi/extension/id/alceascan/Alceascan.kt b/src/id/alceascan/src/eu/kanade/tachiyomi/extension/id/alceascan/Alceascan.kt deleted file mode 100644 index 5cc722746c..0000000000 --- a/src/id/alceascan/src/eu/kanade/tachiyomi/extension/id/alceascan/Alceascan.kt +++ /dev/null @@ -1,17 +0,0 @@ -package eu.kanade.tachiyomi.extension.id.alceascan - -import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia -import eu.kanade.tachiyomi.network.interceptor.rateLimit -import okhttp3.OkHttpClient - -class Alceascan : MangaThemesia("Alceascan", "https://alceacomic.my.id", "id") { - - // Website theme changed from zManga to WPMangaThemesia. - override val versionId = 2 - - override val client: OkHttpClient = super.client.newBuilder() - .rateLimit(20, 4) - .build() - - override val hasProjectPage = true -} diff --git a/src/id/comicfx/build.gradle b/src/id/comicfx/build.gradle deleted file mode 100644 index e5928782dc..0000000000 --- a/src/id/comicfx/build.gradle +++ /dev/null @@ -1,7 +0,0 @@ -ext { - extName = 'Comic Fx' - extClass = '.ComicFx' - extVersionCode = 6 -} - -apply from: "$rootDir/common.gradle" diff --git a/src/id/comicfx/res/mipmap-hdpi/ic_launcher.png b/src/id/comicfx/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index 7074e8c9aa..0000000000 Binary files a/src/id/comicfx/res/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/src/id/comicfx/res/mipmap-mdpi/ic_launcher.png b/src/id/comicfx/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 9603b993ff..0000000000 Binary files a/src/id/comicfx/res/mipmap-mdpi/ic_launcher.png and /dev/null differ diff --git a/src/id/comicfx/res/mipmap-xhdpi/ic_launcher.png b/src/id/comicfx/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index e0d190c897..0000000000 Binary files a/src/id/comicfx/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/src/id/comicfx/res/mipmap-xxhdpi/ic_launcher.png b/src/id/comicfx/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index 01974ade88..0000000000 Binary files a/src/id/comicfx/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/src/id/comicfx/res/mipmap-xxxhdpi/ic_launcher.png b/src/id/comicfx/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index a1be89151a..0000000000 Binary files a/src/id/comicfx/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ diff --git a/src/id/comicfx/src/eu/kanade/tachiyomi/extension/id/comicfx/ComicFx.kt b/src/id/comicfx/src/eu/kanade/tachiyomi/extension/id/comicfx/ComicFx.kt deleted file mode 100644 index c2dae76db7..0000000000 --- a/src/id/comicfx/src/eu/kanade/tachiyomi/extension/id/comicfx/ComicFx.kt +++ /dev/null @@ -1,313 +0,0 @@ -package eu.kanade.tachiyomi.extension.id.comicfx - -import eu.kanade.tachiyomi.network.GET -import eu.kanade.tachiyomi.network.asObservableSuccess -import eu.kanade.tachiyomi.source.model.Filter -import eu.kanade.tachiyomi.source.model.FilterList -import eu.kanade.tachiyomi.source.model.MangasPage -import eu.kanade.tachiyomi.source.model.Page -import eu.kanade.tachiyomi.source.model.SChapter -import eu.kanade.tachiyomi.source.model.SManga -import eu.kanade.tachiyomi.source.online.ParsedHttpSource -import eu.kanade.tachiyomi.util.asJsoup -import kotlinx.serialization.json.Json -import kotlinx.serialization.json.jsonArray -import kotlinx.serialization.json.jsonObject -import kotlinx.serialization.json.jsonPrimitive -import okhttp3.Headers -import okhttp3.HttpUrl.Companion.toHttpUrl -import okhttp3.Request -import okhttp3.Response -import org.jsoup.nodes.Document -import org.jsoup.nodes.Element -import rx.Observable -import uy.kohesive.injekt.injectLazy -import java.text.ParseException -import java.text.SimpleDateFormat -import java.util.Locale - -class ComicFx : ParsedHttpSource() { - - override val name = "Comic Fx" - override val baseUrl = "https://comicfx.net" - override val lang = "id" - override val supportsLatest = true - - override fun headersBuilder(): Headers.Builder = super.headersBuilder() - .add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36") - - // Popular - override fun popularMangaRequest(page: Int): Request { - return GET("$baseUrl/filterList?page=$page&sortBy=name&asc=true", headers) - } - - // combining selector for "popular" and "latest" to be used for "search" selector as it need both selector - override fun popularMangaSelector() = "div.media, div.daftar-komik .komika" - - override fun popularMangaFromElement(element: Element): SManga { - val manga = SManga.create() - manga.thumbnail_url = element.select(".media-left a img, .komik-img a .batas img").attr("abs:data-src") - manga.title = element.select(".media-body .media-heading a strong, .komik-des a h3").text() - val item = element.select(".media-left a, div.komik-img a") - manga.setUrlWithoutDomain(item.attr("href")) - - return manga - } - - override fun popularMangaNextPageSelector() = ".pagination li a[rel=next]" - - // Latest - override fun latestUpdatesRequest(page: Int): Request { - return GET("$baseUrl/latest-release?page=$page", headers) - } - - override fun latestUpdatesSelector() = popularMangaSelector() - - override fun latestUpdatesFromElement(element: Element): SManga = popularMangaFromElement(element) - - override fun latestUpdatesNextPageSelector() = popularMangaNextPageSelector() - - // Search - - override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable { - // Text search cannot use filters - if (query.isNotEmpty()) { - return client.newCall(GET("$baseUrl/search?query=$query")) - .asObservableSuccess() - .map { response -> - parseSearchApiResponse(response) - } - } - return super.fetchSearchManga(page, query, filters) - } - - private val json: Json by injectLazy() - - private fun parseSearchApiResponse(response: Response): MangasPage { - val results = json.parseToJsonElement(response.body.string()).jsonObject["suggestions"]!!.jsonArray - val manga = results.map { - SManga.create().apply { - title = it.jsonObject["value"]!!.jsonPrimitive.content - url = "/komik/${it.jsonObject["data"]!!.jsonPrimitive.content}" - } - } - return MangasPage(manga, false) - } - - override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { - val filterList = if (filters.isEmpty()) getFilterList() else filters - - val url = "$baseUrl/filterList".toHttpUrl().newBuilder() - - for (filter in filterList) { - when (filter) { - is GenreFilter -> url.addQueryParameter("cat", filter.toUriPart()) - is SortFilter -> { - url.addQueryParameter("sortBy", filter.toUriPart()) - url.addQueryParameter("asc", filter.state!!.ascending.toString()) - } - is StatusFilter -> url.addQueryParameter("cstatus", filter.toUriPart()) - is TypeFilter -> url.addQueryParameter("ctype", filter.toUriPart()) - is AuthorFilter -> url.addQueryParameter("author", filter.state) - is ArtistFilter -> url.addQueryParameter("artist", filter.state) - - // if site has project page, default value "hasProjectPage" = false - is ProjectFilter -> { - if (filter.toUriPart() == "project-filter-on") { - url.setPathSegment(0, "/latest-project".substring(1)) - } - } - else -> { /* Do Nothing */ } - } - } - - url.addQueryParameter("page", page.toString()) - // Unimplemented parameters: "alpha" (For filtering by alphabet) and "tag" (idk) - return GET(url.build()) - } - - override fun searchMangaSelector() = popularMangaSelector() - - override fun searchMangaFromElement(element: Element): SManga = popularMangaFromElement(element) - - override fun searchMangaNextPageSelector() = popularMangaNextPageSelector() - - // Details - override fun mangaDetailsParse(document: Document) = SManga.create().apply { - author = document.select("#author").text() - artist = document.select(".infolengkap span:contains(Artist) a, #artist").text() - status = parseStatus(document.select(".infolengkap span:contains(status) i").text()) - description = document.select("div.sinopsis p").text() - - // Add series type (manga/manhwa/manhua/other) to genre - val genres = document.select(".genre-komik a").map { it.text() }.toMutableList() - document.selectFirst(".infokomik .type")?.ownText().takeIf { it.isNullOrBlank().not() }?.let { genres.add(it) } - genre = genres.map { genre -> - genre.lowercase(Locale.forLanguageTag(lang)).replaceFirstChar { char -> - if (char.isLowerCase()) { - char.titlecase(Locale.forLanguageTag(lang)) - } else { - char.toString() - } - } - } - .joinToString { it.trim() } - - thumbnail_url = document.select(".thumb img").attr("abs:src") - } - - private fun parseStatus(element: String?): Int = when { - element == null -> SManga.UNKNOWN - listOf("ongoing", "publishing").any { it.contains(element, ignoreCase = true) } -> SManga.ONGOING - listOf("completed").any { it.contains(element, ignoreCase = true) } -> SManga.COMPLETED - else -> SManga.UNKNOWN - } - - // Chapters - override fun chapterListSelector() = "div.chaplist li .pull-left a" - - override fun chapterListParse(response: Response): List { - val document = response.asJsoup() - val chapters = document.select(chapterListSelector()).map { chapterFromElement(it) } - - // Add timestamp to latest chapter, taken from "Updated On". so source which not provide chapter timestamp will have atleast one - val updateOn = document.select(".infokomik .infolengkap span:contains(update) b").text() - val date = document.select(".infokomik .infolengkap span:contains(update)").text().substringAfter(updateOn) - val checkChapter = document.select(chapterListSelector()).firstOrNull() - if (date != "" && checkChapter != null && chapters[0].date_upload == 0L) { - chapters[0].date_upload = SimpleDateFormat("dd mmm yyyy", Locale.ENGLISH).parse(date)?.time ?: 0L - } - - return chapters - } - - private fun parseDate(date: String): Long { - return when (date) { - "hari ini" -> System.currentTimeMillis() - "kemarin" -> System.currentTimeMillis() - (1000 * 60 * 60 * 24) // yesterday - else -> { - try { - SimpleDateFormat("dd-mm-yyyy", Locale.ENGLISH).parse(date)?.time ?: 0L - } catch (_: ParseException) { - 0L - } - } - } - } - - override fun chapterFromElement(element: Element) = SChapter.create().apply { - setUrlWithoutDomain(element.attr("href")) - name = element.selectFirst("span.chapternum")!!.text() - date_upload = parseDate(element.selectFirst("span.chapterdate")!!.text()) - } - - // Pages - override fun imageUrlParse(document: Document) = "" - - override fun pageListParse(document: Document): List { - val pages = document.toString().substringAfter("var pages = ").substringBefore(";") - - return json.parseToJsonElement(pages).jsonArray.mapIndexed { i, it -> - Page(i, imageUrl = it.jsonObject["page_image"]!!.jsonPrimitive.content) - } - } - - // filters - override fun getFilterList() = FilterList( - SortFilter(sortList), - GenreFilter(), - StatusFilter(), - TypeFilter(), - ArtistFilter("Artist"), - AuthorFilter("Author"), - Filter.Separator(), - Filter.Header("NOTE: Can't be used with other filter!"), - Filter.Header("$name Project List page"), - ProjectFilter(), - ) - - private class ArtistFilter(name: String) : Filter.Text(name) - private class AuthorFilter(name: String) : Filter.Text(name) - - private class SortFilter(val sortables: List>) : Filter.Sort("Sort", sortables.map { it.second }.toTypedArray(), Selection(1, false)) { - fun toUriPart(): String { - return sortables[this.state!!.index].first - } - } - - private val sortList = listOf( - Pair("name", "Alphabetical"), - Pair("views", "Popular"), - ) - - private class GenreFilter : UriPartFilter( - "Select Genre", - arrayOf( - Pair("", "