diff --git a/src/all/wpmangastream/build.gradle b/src/all/wpmangastream/build.gradle index a5fce4064..5d83f6cd4 100644 --- a/src/all/wpmangastream/build.gradle +++ b/src/all/wpmangastream/build.gradle @@ -5,7 +5,7 @@ ext { extName = 'WP MangaStream (multiple sources)' pkgNameSuffix = 'all.wpmangastream' extClass = '.WPMangaStreamFactory' - extVersionCode = 40 + extVersionCode = 41 libVersion = '1.2' } diff --git a/src/all/wpmangastream/src/eu/kanade/tachiyomi/extension/all/wpmangastream/WPMangaStreamFactory.kt b/src/all/wpmangastream/src/eu/kanade/tachiyomi/extension/all/wpmangastream/WPMangaStreamFactory.kt index 64be2bde5..844ff9f69 100644 --- a/src/all/wpmangastream/src/eu/kanade/tachiyomi/extension/all/wpmangastream/WPMangaStreamFactory.kt +++ b/src/all/wpmangastream/src/eu/kanade/tachiyomi/extension/all/wpmangastream/WPMangaStreamFactory.kt @@ -57,10 +57,13 @@ class WPMangaStreamFactory : SourceFactory { Rawkuma(), KaisarKomik(), MasterKomik(), - KomikRu() + KomikRu(), + MangaShiro() ) } +class MangaShiro : WPMangaStream("MangaShiro", "https://mangashiro.co", "id") + class KomikRu : WPMangaStream("KomikRu", "https://komikru.com", "id", SimpleDateFormat("MMMM dd, yyyy", Locale.forLanguageTag("id"))) class MasterKomik : WPMangaStream("MasterKomik", "https://masterkomik.com", "id") diff --git a/src/id/mangashiro/build.gradle b/src/id/mangashiro/build.gradle deleted file mode 100644 index 4465bbe08..000000000 --- a/src/id/mangashiro/build.gradle +++ /dev/null @@ -1,12 +0,0 @@ -apply plugin: 'com.android.application' -apply plugin: 'kotlin-android' - -ext { - extName = 'Mangashiro' - pkgNameSuffix = 'id.mangashiro' - extClass = '.Mangashiro' - extVersionCode = 5 - libVersion = '1.2' -} - -apply from: "$rootDir/common.gradle" diff --git a/src/id/mangashiro/res/mipmap-hdpi/ic_launcher.png b/src/id/mangashiro/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index ff83c9a4e..000000000 Binary files a/src/id/mangashiro/res/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/src/id/mangashiro/res/mipmap-mdpi/ic_launcher.png b/src/id/mangashiro/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index e1da8fb2d..000000000 Binary files a/src/id/mangashiro/res/mipmap-mdpi/ic_launcher.png and /dev/null differ diff --git a/src/id/mangashiro/res/mipmap-xhdpi/ic_launcher.png b/src/id/mangashiro/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 1036ff42b..000000000 Binary files a/src/id/mangashiro/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/src/id/mangashiro/res/mipmap-xxhdpi/ic_launcher.png b/src/id/mangashiro/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index 34a85fb2c..000000000 Binary files a/src/id/mangashiro/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/src/id/mangashiro/res/mipmap-xxxhdpi/ic_launcher.png b/src/id/mangashiro/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 5d28d4ed6..000000000 Binary files a/src/id/mangashiro/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ diff --git a/src/id/mangashiro/res/web_hi_res_512.png b/src/id/mangashiro/res/web_hi_res_512.png deleted file mode 100644 index 3d6a5563c..000000000 Binary files a/src/id/mangashiro/res/web_hi_res_512.png and /dev/null differ diff --git a/src/id/mangashiro/src/eu/kanade/tachiyomi/extension/id/mangashiro/Mangashiro.kt b/src/id/mangashiro/src/eu/kanade/tachiyomi/extension/id/mangashiro/Mangashiro.kt deleted file mode 100644 index 98fae7cae..000000000 --- a/src/id/mangashiro/src/eu/kanade/tachiyomi/extension/id/mangashiro/Mangashiro.kt +++ /dev/null @@ -1,276 +0,0 @@ -package eu.kanade.tachiyomi.extension.id.mangashiro - -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.Headers -import okhttp3.HttpUrl -import okhttp3.OkHttpClient -import okhttp3.Request -import org.jsoup.nodes.Document -import org.jsoup.nodes.Element - -class Mangashiro : ParsedHttpSource() { - - override val name = "Mangashiro" - override val baseUrl = "https://mangashiro.co" - override val lang = "id" - override val supportsLatest = true - override val client: OkHttpClient = network.cloudflareClient - - override fun popularMangaRequest(page: Int): Request { - return GET("$baseUrl/manga/?order=popular&page=$page", headers) - } - - override fun latestUpdatesRequest(page: Int): Request { - return GET("$baseUrl/manga/?order=update&page=$page", headers) - } - - override fun popularMangaSelector() = "div.bs" - override fun latestUpdatesSelector() = popularMangaSelector() - override fun searchMangaSelector() = popularMangaSelector() - - override fun popularMangaFromElement(element: Element): SManga = searchMangaFromElement(element) - override fun latestUpdatesFromElement(element: Element): SManga = searchMangaFromElement(element) - - override fun popularMangaNextPageSelector() = "a.r" - override fun latestUpdatesNextPageSelector() = popularMangaNextPageSelector() - override fun searchMangaNextPageSelector() = popularMangaNextPageSelector() - - override fun searchMangaFromElement(element: Element): SManga { - val manga = SManga.create() - manga.thumbnail_url = element.select("div.limit img").attr("src") - element.select("div.bsx > a").first().let { - manga.setUrlWithoutDomain(it.attr("href")) - manga.title = it.attr("title") - } - return manga - } - - override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { - val builtUrl = if (page == 1) "$baseUrl/manga/" else "$baseUrl/manga/page/$page/" - val url = HttpUrl.parse(builtUrl)!!.newBuilder() - url.addQueryParameter("title", query) - url.addQueryParameter("page", page.toString()) - filters.forEach { filter -> - when (filter) { - is AuthorFilter -> { - url.addQueryParameter("author", filter.state) - } - is YearFilter -> { - url.addQueryParameter("yearx", filter.state) - } - is StatusFilter -> { - val status = when (filter.state) { - Filter.TriState.STATE_INCLUDE -> "completed" - Filter.TriState.STATE_EXCLUDE -> "ongoing" - else -> "" - } - url.addQueryParameter("status", status) - } - is TypeFilter -> { - url.addQueryParameter("type", filter.toUriPart()) - } - is SortByFilter -> { - url.addQueryParameter("order", filter.toUriPart()) - } - is GenreListFilter -> { - filter.state - .filter { it.state != Filter.TriState.STATE_IGNORE } - .forEach { url.addQueryParameter("genre[]", it.id) } - } - } - } - return GET(url.build().toString(), headers) - } - - override fun mangaDetailsParse(document: Document): SManga { - val infoElement = document.select("div.spe").first() - val descElement = document.select(".infox > div.desc").first() - val manga = SManga.create() - manga.author = document.select("div.spe span:contains(Author:)").firstOrNull()?.ownText() - manga.artist = manga.author - val genres = mutableListOf() - infoElement.select(".spe > span:nth-child(1) > a").forEach { element -> - val genre = element.text() - genres.add(genre) - } - manga.genre = genres.joinToString(", ") - manga.status = parseStatus(infoElement.select(".spe > span:nth-child(2)").text()) - manga.description = descElement.select("p").text() - manga.thumbnail_url = document.select(".thumb > img:nth-child(1)").attr("src") - return manga - } - - private fun parseStatus(element: String): Int = when { - element.toLowerCase().contains("ongoing") -> SManga.ONGOING - element.toLowerCase().contains("completed") -> SManga.COMPLETED - else -> SManga.UNKNOWN - } - - override fun chapterListSelector() = "div.bxcl ul li" - - override fun chapterFromElement(element: Element): SChapter { - val urlElement = element.select(".lchx > a").first() - val chapter = SChapter.create() - chapter.setUrlWithoutDomain(urlElement.attr("href")) - chapter.name = urlElement.text() - chapter.date_upload = 0 - return chapter - } - - override fun prepareNewChapter(chapter: SChapter, manga: SManga) { - val basic = Regex("""Chapter\s([0-9]+)""") - when { - basic.containsMatchIn(chapter.name) -> { - basic.find(chapter.name)?.let { - chapter.chapter_number = it.groups[1]?.value!!.toFloat() - } - } - } - } - - override fun pageListParse(document: Document): List { - val pages = mutableListOf() - var i = 0 - document.select("div#readerarea img").forEach { element -> - val url = element.attr("src") - i++ - if (url.isNotEmpty()) { - pages.add(Page(i, "", url)) - } - } - return pages - } - - override fun imageUrlParse(document: Document) = "" - - override fun imageRequest(page: Page): Request { - val imgHeader = Headers.Builder().apply { - add("User-Agent", "Mozilla/5.0 (Linux; U; Android 4.1.1; en-gb; Build/KLP) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30") - add("Referer", baseUrl) - }.build() - return GET(page.imageUrl!!, imgHeader) - } - - private class AuthorFilter : Filter.Text("Author") - - private class YearFilter : Filter.Text("Year") - - private class TypeFilter : UriPartFilter( - "Type", - arrayOf( - Pair("Default", ""), - Pair("Manga", "Manga"), - Pair("Manhwa", "Manhwa"), - Pair("Manhua", "Manhua"), - Pair("Comic", "Comic") - ) - ) - - private class SortByFilter : UriPartFilter( - "Sort By", - arrayOf( - Pair("Default", ""), - Pair("A-Z", "title"), - Pair("Z-A", "titlereverse"), - Pair("Latest Update", "update"), - Pair("Latest Added", "latest"), - Pair("Popular", "popular") - ) - ) - - private class StatusFilter : UriPartFilter( - "Status", - arrayOf( - Pair("All", ""), - Pair("Ongoing", "ongoing"), - Pair("Completed", "completed") - ) - ) - - private class Genre(name: String, val id: String = name) : Filter.TriState(name) - private class GenreListFilter(genres: List) : Filter.Group("Genre", genres) - - override fun getFilterList() = FilterList( - Filter.Header("NOTE: Ignored if using text search!"), - Filter.Separator(), - AuthorFilter(), - YearFilter(), - StatusFilter(), - TypeFilter(), - SortByFilter(), - GenreListFilter(getGenreList()) - ) - - private fun getGenreList() = listOf( - Genre("4-Koma", "4-koma"), - Genre("4-Koma. Comedy", "4-koma-comedy"), - Genre("Action", "action"), - Genre("Action. Adventure", "action-adventure"), - Genre("Adult", "adult"), - Genre("Adventure", "adventure"), - Genre("Comedy", "comedy"), - Genre("Cooking", "cooking"), - Genre("Demons", "demons"), - Genre("Doujinshi", "doujinshi"), - Genre("Drama", "drama"), - Genre("Ecchi", "ecchi"), - Genre("Echi", "echi"), - Genre("Fantasy", "fantasy"), - Genre("Game", "game"), - Genre("Gender Bender", "gender-bender"), - Genre("Gore", "gore"), - Genre("Harem", "harem"), - Genre("Historical", "historical"), - Genre("Horror", "horror"), - Genre("Isekai", "isekai"), - Genre("Josei", "josei"), - Genre("Magic", "magic"), - Genre("Manga", "manga"), - Genre("Manhua", "manhua"), - Genre("Manhwa", "manhwa"), - Genre("Martial Arts", "martial-arts"), - Genre("Mature", "mature"), - Genre("Mecha", "mecha"), - Genre("Medical", "medical"), - Genre("Military", "military"), - Genre("Music", "music"), - Genre("Mystery", "mystery"), - Genre("One Shot", "one-shot"), - Genre("Oneshot", "oneshot"), - Genre("Parody", "parody"), - Genre("Police", "police"), - Genre("Psychological", "psychological"), - Genre("Romance", "romance"), - Genre("Samurai", "samurai"), - Genre("School", "school"), - Genre("School Life", "school-life"), - Genre("Sci-fi", "sci-fi"), - Genre("Seinen", "seinen"), - Genre("Shoujo", "shoujo"), - Genre("Shoujo Ai", "shoujo-ai"), - Genre("Shounen", "shounen"), - Genre("Shounen Ai", "shounen-ai"), - Genre("Slice of Life", "slice-of-life"), - Genre("Smut", "smut"), - Genre("Sports", "sports"), - Genre("Super Power", "super-power"), - Genre("Supernatural", "supernatural"), - Genre("Thriller", "thriller"), - Genre("Tragedy", "tragedy"), - Genre("Vampire", "vampire"), - Genre("Webtoon", "webtoon"), - Genre("Webtoons", "webtoons"), - Genre("Yuri", "yuri") - ) - - private open class UriPartFilter(displayName: String, val vals: Array>) : - Filter.Select(displayName, vals.map { it.first }.toTypedArray()) { - fun toUriPart() = vals[state].second - } -}