From a3b9c284de33f28d9f430d6cb24f5b4494605eb5 Mon Sep 17 00:00:00 2001 From: Johannes Joens <34899572+jopejoe1@users.noreply.github.com> Date: Wed, 7 Apr 2021 23:52:58 +1200 Subject: [PATCH] Webtoons split (#6444) * Create Webtoons.kt * Added Webtoons Generator and translate * Updated Vesion numbers * Update WebtoonsTranslateGenerator.kt * Added Icons and ovverides * Removed non split files * Update WebtoonsGenerator.kt * Added id overrides for a few languages * Added ID Override for Indonesian * Fixed backwards compability * Fix backward compability --- .../default}/res/mipmap-hdpi/ic_launcher.png | Bin .../default}/res/mipmap-mdpi/ic_launcher.png | Bin .../default}/res/mipmap-xhdpi/ic_launcher.png | Bin .../res/mipmap-xxhdpi/ic_launcher.png | Bin .../res/mipmap-xxxhdpi/ic_launcher.png | Bin .../webtoons/default}/res/web_hi_res_512.png | Bin .../res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 2684 bytes .../res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1515 bytes .../res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 3378 bytes .../res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 5632 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 8514 bytes .../dongmanmanhua/res/web_hi_res_512.png | Bin 0 -> 42351 bytes .../dongmanmanhua/src}/DongmanManhua.kt | 8 +- .../webtoons/webtoons/src/WebtoonsFactory.kt | 56 +++++++++++ .../src/WebtoonsTranslateFactory.kt | 85 ++++++++++++++++ .../tachiyomi/multisrc}/webtoons/Webtoons.kt | 68 +++++++++++-- .../multisrc/webtoons/WebtoonsGenerator.kt | 26 +++++ .../multisrc}/webtoons/WebtoonsTranslate.kt | 10 +- .../webtoons/WebtoonsTranslateGenerator.kt | 24 +++++ src/all/webtoons/AndroidManifest.xml | 2 - src/all/webtoons/build.gradle | 12 --- .../extension/all/webtoons/WebtoonsDefault.kt | 66 ------------- .../extension/all/webtoons/WebtoonsFactory.kt | 93 ------------------ 23 files changed, 260 insertions(+), 190 deletions(-) rename {src/all/webtoons => multisrc/overrides/webtoons/default}/res/mipmap-hdpi/ic_launcher.png (100%) rename {src/all/webtoons => multisrc/overrides/webtoons/default}/res/mipmap-mdpi/ic_launcher.png (100%) rename {src/all/webtoons => multisrc/overrides/webtoons/default}/res/mipmap-xhdpi/ic_launcher.png (100%) rename {src/all/webtoons => multisrc/overrides/webtoons/default}/res/mipmap-xxhdpi/ic_launcher.png (100%) rename {src/all/webtoons => multisrc/overrides/webtoons/default}/res/mipmap-xxxhdpi/ic_launcher.png (100%) rename {src/all/webtoons => multisrc/overrides/webtoons/default}/res/web_hi_res_512.png (100%) create mode 100644 multisrc/overrides/webtoons/dongmanmanhua/res/mipmap-hdpi/ic_launcher.png create mode 100644 multisrc/overrides/webtoons/dongmanmanhua/res/mipmap-mdpi/ic_launcher.png create mode 100644 multisrc/overrides/webtoons/dongmanmanhua/res/mipmap-xhdpi/ic_launcher.png create mode 100644 multisrc/overrides/webtoons/dongmanmanhua/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 multisrc/overrides/webtoons/dongmanmanhua/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 multisrc/overrides/webtoons/dongmanmanhua/res/web_hi_res_512.png rename {src/all/webtoons/src/eu/kanade/tachiyomi/extension/all/webtoons => multisrc/overrides/webtoons/dongmanmanhua/src}/DongmanManhua.kt (89%) create mode 100644 multisrc/overrides/webtoons/webtoons/src/WebtoonsFactory.kt create mode 100644 multisrc/overrides/webtoons/webtoonstranslate/src/WebtoonsTranslateFactory.kt rename {src/all/webtoons/src/eu/kanade/tachiyomi/extension/all => multisrc/src/main/java/eu/kanade/tachiyomi/multisrc}/webtoons/Webtoons.kt (75%) create mode 100644 multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/webtoons/WebtoonsGenerator.kt rename {src/all/webtoons/src/eu/kanade/tachiyomi/extension/all => multisrc/src/main/java/eu/kanade/tachiyomi/multisrc}/webtoons/WebtoonsTranslate.kt (97%) create mode 100644 multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/webtoons/WebtoonsTranslateGenerator.kt delete mode 100644 src/all/webtoons/AndroidManifest.xml delete mode 100644 src/all/webtoons/build.gradle delete mode 100644 src/all/webtoons/src/eu/kanade/tachiyomi/extension/all/webtoons/WebtoonsDefault.kt delete mode 100644 src/all/webtoons/src/eu/kanade/tachiyomi/extension/all/webtoons/WebtoonsFactory.kt diff --git a/src/all/webtoons/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/webtoons/default/res/mipmap-hdpi/ic_launcher.png similarity index 100% rename from src/all/webtoons/res/mipmap-hdpi/ic_launcher.png rename to multisrc/overrides/webtoons/default/res/mipmap-hdpi/ic_launcher.png diff --git a/src/all/webtoons/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/webtoons/default/res/mipmap-mdpi/ic_launcher.png similarity index 100% rename from src/all/webtoons/res/mipmap-mdpi/ic_launcher.png rename to multisrc/overrides/webtoons/default/res/mipmap-mdpi/ic_launcher.png diff --git a/src/all/webtoons/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/webtoons/default/res/mipmap-xhdpi/ic_launcher.png similarity index 100% rename from src/all/webtoons/res/mipmap-xhdpi/ic_launcher.png rename to multisrc/overrides/webtoons/default/res/mipmap-xhdpi/ic_launcher.png diff --git a/src/all/webtoons/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/webtoons/default/res/mipmap-xxhdpi/ic_launcher.png similarity index 100% rename from src/all/webtoons/res/mipmap-xxhdpi/ic_launcher.png rename to multisrc/overrides/webtoons/default/res/mipmap-xxhdpi/ic_launcher.png diff --git a/src/all/webtoons/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/webtoons/default/res/mipmap-xxxhdpi/ic_launcher.png similarity index 100% rename from src/all/webtoons/res/mipmap-xxxhdpi/ic_launcher.png rename to multisrc/overrides/webtoons/default/res/mipmap-xxxhdpi/ic_launcher.png diff --git a/src/all/webtoons/res/web_hi_res_512.png b/multisrc/overrides/webtoons/default/res/web_hi_res_512.png similarity index 100% rename from src/all/webtoons/res/web_hi_res_512.png rename to multisrc/overrides/webtoons/default/res/web_hi_res_512.png diff --git a/multisrc/overrides/webtoons/dongmanmanhua/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/webtoons/dongmanmanhua/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..f1783975f6dfb921dc24bc85be0917fbbd02ee7c GIT binary patch literal 2684 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 R)U5yj002ovPDHLkV1oHl$Z!Av literal 0 HcmV?d00001 diff --git a/multisrc/overrides/webtoons/dongmanmanhua/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/webtoons/dongmanmanhua/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..3d25950db63f0f11f93451ead194e1ce433c2904 GIT binary patch literal 3378 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 literal 0 HcmV?d00001 diff --git a/multisrc/overrides/webtoons/dongmanmanhua/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/webtoons/dongmanmanhua/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..a5e52be3edd116515c0b66401805eda0d2c7dca9 GIT binary patch literal 5632 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 R_=oHQkJR(@~|SV59&5fLdKm*?{=OTwPF7 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 uw;g-TGEy|sg!@Neg-M = listOf( + WebtoonsEN(), + WebtoonsID(), + WebtoonsTH(), + WebtoonsES(), + WebtoonsFR(), + WebtoonsZH(), + ) + +} +class WebtoonsEN : Webtoons("Webtoons", "https://www.webtoons.com", "en") +class WebtoonsID : Webtoons("Webtoons", "https://www.webtoons.com", "id") { + // Override ID as part of the name was removed to be more consiten with other enteries + override val id: Long = 8749627068478740298 + + // Android seems to be unable to parse Indonesian dates; we'll use a short hard-coded table + // instead. + private val dateMap: Array = arrayOf( + "Jan", "Feb", "Mar", "Apr", "Mei", "Jun", "Jul", "Agu", "Sep", "Okt", "Nov", "Des" + ) + + override fun chapterParseDate(date: String): Long { + val expr = Regex("""(\d{4}) ([A-Z][a-z]{2}) (\d+)""").find(date) ?: return 0 + val (_, year, monthString, day) = expr.groupValues + val monthIndex = dateMap.indexOf(monthString) + return GregorianCalendar(year.toInt(), monthIndex, day.toInt()).time.time + } +} +class WebtoonsTH : Webtoons("Webtoons", "https://www.webtoons.com", "th", dateFormat = SimpleDateFormat("d MMM yyyy", Locale("th"))) +class WebtoonsES : Webtoons("Webtoons", "https://www.webtoons.com", "es") { + // Android seems to be unable to parse es dates like Indonesian; we'll use a short hard-coded table + // instead. + private val dateMap: Array = arrayOf( + "Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Sep", "Oct", "Nov", "Dic" + ) + + override fun chapterParseDate(date: String): Long { + val expr = Regex("""(\d+)-([a-z]{3})-(\d{4})""").find(date) ?: return 0 + val (_, day, monthString, year) = expr.groupValues + val monthIndex = dateMap.indexOf(monthString) + return GregorianCalendar(year.toInt(), monthIndex, day.toInt()).time.time + } +} +class WebtoonsFR : Webtoons("Webtoons", "https://www.webtoons.com", "fr", dateFormat = SimpleDateFormat("d MMM yyyy", Locale.FRENCH)) +class WebtoonsZH : Webtoons("Webtoons", "https://www.webtoons.com", "zh", "zh-hant", "zh_TW", SimpleDateFormat("yyyy/MM/dd", Locale.TRADITIONAL_CHINESE)) diff --git a/multisrc/overrides/webtoons/webtoonstranslate/src/WebtoonsTranslateFactory.kt b/multisrc/overrides/webtoons/webtoonstranslate/src/WebtoonsTranslateFactory.kt new file mode 100644 index 000000000..232ec920c --- /dev/null +++ b/multisrc/overrides/webtoons/webtoonstranslate/src/WebtoonsTranslateFactory.kt @@ -0,0 +1,85 @@ +package eu.kanade.tachiyomi.extension.all.webtoonstranslate + +import eu.kanade.tachiyomi.multisrc.webtoons.WebtoonsTranslate +import eu.kanade.tachiyomi.source.Source +import eu.kanade.tachiyomi.source.SourceFactory + +class WebtoonsTranslateFactory : SourceFactory { + override fun createSources(): List = listOf( + WebtoonsTranslateEN(), + WebtoonsTranslateZH_CMN(), + WebtoonsTranslateZH_CMY(), + WebtoonsTranslateTH(), + WebtoonsTranslateID(), + WebtoonsTranslateFR(), + WebtoonsTranslateVI(), + WebtoonsTranslateRU(), + WebtoonsTranslateAR(), + WebtoonsTranslateFIL(), + WebtoonsTranslateDE(), + WebtoonsTranslateHI(), + WebtoonsTranslateIT(), + WebtoonsTranslateJA(), + WebtoonsTranslatePT_POR(), + WebtoonsTranslateTR(), + WebtoonsTranslateMS(), + WebtoonsTranslatePL(), + WebtoonsTranslatePT_POT(), + WebtoonsTranslateBG(), + WebtoonsTranslateDA(), + WebtoonsTranslateNL(), + WebtoonsTranslateRO(), + WebtoonsTranslateMN(), + WebtoonsTranslateEL(), + WebtoonsTranslateLT(), + WebtoonsTranslateCS(), + WebtoonsTranslateSV(), + WebtoonsTranslateBN(), + WebtoonsTranslateFA(), + WebtoonsTranslateUK(), + WebtoonsTranslateES(), + ) +} +class WebtoonsTranslateEN : WebtoonsTranslate("Webtoons.com Translations", "https://translate.webtoons.com", "en", "ENG") +class WebtoonsTranslateZH_CMN : WebtoonsTranslate("Webtoons.com Translations", "https://translate.webtoons.com", "zh-hans", "CMN"){ + override val id: Long = 5196522547754842244 +} +class WebtoonsTranslateZH_CMY : WebtoonsTranslate("Webtoons.com Translations", "https://translate.webtoons.com", "zh-hant", "CMT"){ + override val id: Long = 1016181401146312893 +} +class WebtoonsTranslateTH : WebtoonsTranslate("Webtoons.com Translations", "https://translate.webtoons.com", "th", "THA") +class WebtoonsTranslateID : WebtoonsTranslate("Webtoons.com Translations", "https://translate.webtoons.com", "id", "IND") +class WebtoonsTranslateFR : WebtoonsTranslate("Webtoons.com Translations", "https://translate.webtoons.com", "fr", "FRA") +class WebtoonsTranslateVI : WebtoonsTranslate("Webtoons.com Translations", "https://translate.webtoons.com", "vi", "VIE") +class WebtoonsTranslateRU : WebtoonsTranslate("Webtoons.com Translations", "https://translate.webtoons.com", "ru", "RUS") +class WebtoonsTranslateAR : WebtoonsTranslate("Webtoons.com Translations", "https://translate.webtoons.com", "ar", "ARA") +class WebtoonsTranslateFIL : WebtoonsTranslate("Webtoons.com Translations", "https://translate.webtoons.com", "fil", "FIL") +class WebtoonsTranslateDE : WebtoonsTranslate("Webtoons.com Translations", "https://translate.webtoons.com", "de", "DEU") +class WebtoonsTranslateHI : WebtoonsTranslate("Webtoons.com Translations", "https://translate.webtoons.com", "hi", "HIN") +class WebtoonsTranslateIT : WebtoonsTranslate("Webtoons.com Translations", "https://translate.webtoons.com", "it", "ITA") +class WebtoonsTranslateJA : WebtoonsTranslate("Webtoons.com Translations", "https://translate.webtoons.com", "ja", "JPN") +class WebtoonsTranslatePT_POR : WebtoonsTranslate("Webtoons.com Translations", "https://translate.webtoons.com", "pt-br", "POR"){ + //Changed languge code from pt to pt-br + override val id: Long = 275670196689829558 +} +class WebtoonsTranslateTR : WebtoonsTranslate("Webtoons.com Translations", "https://translate.webtoons.com", "tr", "TUR") +class WebtoonsTranslateMS : WebtoonsTranslate("Webtoons.com Translations", "https://translate.webtoons.com", "ms", "MAY") +class WebtoonsTranslatePL : WebtoonsTranslate("Webtoons.com Translations", "https://translate.webtoons.com", "pl", "POL") +class WebtoonsTranslatePT_POT : WebtoonsTranslate("Webtoons.com Translations", "https://translate.webtoons.com", "pt", "POT") { + override val id: Long = 9219933036054791613 +} +class WebtoonsTranslateBG : WebtoonsTranslate("Webtoons.com Translations", "https://translate.webtoons.com", "bg", "BUL") +class WebtoonsTranslateDA : WebtoonsTranslate("Webtoons.com Translations", "https://translate.webtoons.com", "da", "DAN") +class WebtoonsTranslateNL : WebtoonsTranslate("Webtoons.com Translations", "https://translate.webtoons.com", "nl", "NLD") +class WebtoonsTranslateRO : WebtoonsTranslate("Webtoons.com Translations", "https://translate.webtoons.com", "ro", "RON") +class WebtoonsTranslateMN : WebtoonsTranslate("Webtoons.com Translations", "https://translate.webtoons.com", "mn", "MON") +class WebtoonsTranslateEL : WebtoonsTranslate("Webtoons.com Translations", "https://translate.webtoons.com", "el", "GRE") +class WebtoonsTranslateLT : WebtoonsTranslate("Webtoons.com Translations", "https://translate.webtoons.com", "lt", "LIT") +class WebtoonsTranslateCS : WebtoonsTranslate("Webtoons.com Translations", "https://translate.webtoons.com", "cs", "CES") +class WebtoonsTranslateSV : WebtoonsTranslate("Webtoons.com Translations", "https://translate.webtoons.com", "sv", "SWE") +class WebtoonsTranslateBN : WebtoonsTranslate("Webtoons.com Translations", "https://translate.webtoons.com", "bn", "BEN") +class WebtoonsTranslateFA : WebtoonsTranslate("Webtoons.com Translations", "https://translate.webtoons.com", "fa", "PER") +class WebtoonsTranslateUK : WebtoonsTranslate("Webtoons.com Translations", "https://translate.webtoons.com", "uk", "UKR") +class WebtoonsTranslateES : WebtoonsTranslate("Webtoons.com Translations", "https://translate.webtoons.com", "es", "SPA") + + diff --git a/src/all/webtoons/src/eu/kanade/tachiyomi/extension/all/webtoons/Webtoons.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/webtoons/Webtoons.kt similarity index 75% rename from src/all/webtoons/src/eu/kanade/tachiyomi/extension/all/webtoons/Webtoons.kt rename to multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/webtoons/Webtoons.kt index d6b9ee6bd..109c81048 100644 --- a/src/all/webtoons/src/eu/kanade/tachiyomi/extension/all/webtoons/Webtoons.kt +++ b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/webtoons/Webtoons.kt @@ -1,12 +1,10 @@ -package eu.kanade.tachiyomi.extension.all.webtoons +package eu.kanade.tachiyomi.multisrc.webtoons import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.source.model.Filter.Header import eu.kanade.tachiyomi.source.model.Filter.Select import eu.kanade.tachiyomi.source.model.Filter.Separator import eu.kanade.tachiyomi.source.model.FilterList -import eu.kanade.tachiyomi.source.model.MangasPage -import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.online.ParsedHttpSource import eu.kanade.tachiyomi.util.asJsoup import okhttp3.Cookie @@ -16,20 +14,26 @@ import okhttp3.HttpUrl import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.Response +import org.json.JSONObject import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.SimpleDateFormat +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.model.MangasPage +import java.util.Locale import java.util.Calendar -abstract class Webtoons( +open class Webtoons( + override val name: String, + override val baseUrl: String, override val lang: String, open val langCode: String = lang, - open val localeForCookie: String = lang + open val localeForCookie: String = lang, + private val dateFormat: SimpleDateFormat = SimpleDateFormat("MMM d, yyyy", Locale.ENGLISH) ) : ParsedHttpSource() { - override val name = "Webtoons.com" - - override val baseUrl = "https://www.webtoons.com" - override val supportsLatest = true override val client: OkHttpClient = super.client.newBuilder() @@ -178,6 +182,8 @@ abstract class Webtoons( ) } + override fun chapterListSelector() = "ul#_episodeList li[id*=episode]" + private class SearchType(vals: Array>) : UriPartFilter("Official or Challenge", vals) private fun getOfficialList() = arrayOf( @@ -190,4 +196,48 @@ abstract class Webtoons( Select(displayName, vals.map { it.first }.toTypedArray()) { fun toUriPart() = vals[state].second } + + override fun chapterFromElement(element: Element): SChapter { + val urlElement = element.select("a") + + val chapter = SChapter.create() + chapter.setUrlWithoutDomain(urlElement.attr("href")) + chapter.name = element.select("a > div.row > div.info > p.sub_title > span.ellipsis").text() + val select = element.select("a > div.row > div.num") + if (select.isNotEmpty()) { + chapter.name += " Ch. " + select.text().substringAfter("#") + } + if (element.select(".ico_bgm").isNotEmpty()) { + chapter.name += " ♫" + } + chapter.date_upload = element.select("a > div.row > div.info > p.date").text()?.let { chapterParseDate(it) } ?: 0 + return chapter + } + + open fun chapterParseDate(date: String): Long { + return dateFormat.parse(date)?.time ?: 0 + } + override fun chapterListRequest(manga: SManga) = GET("https://m.webtoons.com" + manga.url, mobileHeaders) + + override fun pageListParse(document: Document): List { + val pages = document.select("div#_imageList > img").mapIndexed { i, element -> Page(i, "", element.attr("data-url")) } + + if (pages.isNotEmpty()) { return pages } + + val docString = document.toString() + + val docUrlRegex = Regex("documentURL:.*?'(.*?)'") + val motiontoonPathRegex = Regex("jpg:.*?'(.*?)\\{") + + val docUrl = docUrlRegex.find(docString)!!.destructured.toList()[0] + val motiontoonPath = motiontoonPathRegex.find(docString)!!.destructured.toList()[0] + + val motiontoonJson = JSONObject(client.newCall(GET(docUrl, headers)).execute().body()!!.string()).getJSONObject("assets").getJSONObject("image") + + val keys = motiontoonJson.keys().asSequence().toList().filter { it.contains("layer") } + + return keys.mapIndexed { i, key -> + Page(i, "", motiontoonPath + motiontoonJson.getString(key)) + } + } } diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/webtoons/WebtoonsGenerator.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/webtoons/WebtoonsGenerator.kt new file mode 100644 index 000000000..07159bf77 --- /dev/null +++ b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/webtoons/WebtoonsGenerator.kt @@ -0,0 +1,26 @@ +package eu.kanade.tachiyomi.multisrc.webtoons + +import generator.ThemeSourceData.SingleLang +import generator.ThemeSourceData.MultiLang +import generator.ThemeSourceGenerator + +class WebtoonsGenerator : ThemeSourceGenerator { + + override val themePkg = "webtoons" + + override val themeClass = "Webtoons" + + override val baseVersionCode: Int = 1 + + override val sources = listOf( + MultiLang("Webtoons.com", "https://www.webtoons.com", listOf("en", "fr", "es", "id", "th", "zh"), className = "WebtoonsFactory", pkgName = "webtoons", overrideVersionCode = 26), + SingleLang("Dongman Manhua", "https://www.dongmanmanhua.cn", "zh") + ) + + companion object { + @JvmStatic + fun main(args: Array) { + WebtoonsGenerator().createAll() + } + } +} diff --git a/src/all/webtoons/src/eu/kanade/tachiyomi/extension/all/webtoons/WebtoonsTranslate.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/webtoons/WebtoonsTranslate.kt similarity index 97% rename from src/all/webtoons/src/eu/kanade/tachiyomi/extension/all/webtoons/WebtoonsTranslate.kt rename to multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/webtoons/WebtoonsTranslate.kt index 5aa474723..dfb7749e5 100644 --- a/src/all/webtoons/src/eu/kanade/tachiyomi/extension/all/webtoons/WebtoonsTranslate.kt +++ b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/webtoons/WebtoonsTranslate.kt @@ -1,4 +1,4 @@ -package eu.kanade.tachiyomi.extension.all.webtoons +package eu.kanade.tachiyomi.multisrc.webtoons import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.asObservableSuccess @@ -17,7 +17,12 @@ import org.jsoup.nodes.Element import rx.Observable import java.util.ArrayList -open class WebtoonsTranslate(override val lang: String, private val translateLangCode: String, languageNameExtra: String = "") : Webtoons(lang) { +open class WebtoonsTranslate ( + override val name: String, + override val baseUrl: String, + override val lang: String, + private val translateLangCode: String + ) : Webtoons(name, baseUrl, lang) { // popularMangaRequest already returns manga sorted by latest update override val supportsLatest = false @@ -29,7 +34,6 @@ open class WebtoonsTranslate(override val lang: String, private val translateLan private val pageSize = 24 - override val name = "Webtoons.com Translations$languageNameExtra" override fun headersBuilder(): Headers.Builder = super.headersBuilder() .removeAll("Referer") diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/webtoons/WebtoonsTranslateGenerator.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/webtoons/WebtoonsTranslateGenerator.kt new file mode 100644 index 000000000..0e6ae24de --- /dev/null +++ b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/webtoons/WebtoonsTranslateGenerator.kt @@ -0,0 +1,24 @@ +package eu.kanade.tachiyomi.multisrc.webtoons + +import generator.ThemeSourceData.SingleLang +import generator.ThemeSourceData.MultiLang +import generator.ThemeSourceGenerator + +class WebtoonsTranslateGenerator : ThemeSourceGenerator { + override val themePkg = "webtoons" + + override val themeClass = "WebtoonsTranslation" + + override val baseVersionCode: Int = 1 + + override val sources = listOf( + MultiLang("Webtoons.com Translations", "https://translate.webtoons.com", listOf("en", "zh-hans", "zh-hant", "th", "id", "fr", "vi", "ru", "ar", "fil", "de", "hi", "it", "ja", "pt-br", "tr", "ms", "pl", "pt", "bg", "da", "nl", "ro", "mn", "el", "lt", "cs", "sv", "bn", "fa", "uk", "es"), className = "WebtoonsTranslateFactory", pkgName = "webtoonstranslate"), + ) + + companion object { + @JvmStatic + fun main(args: Array) { + WebtoonsTranslateGenerator().createAll() + } + } +} diff --git a/src/all/webtoons/AndroidManifest.xml b/src/all/webtoons/AndroidManifest.xml deleted file mode 100644 index 30deb7f79..000000000 --- a/src/all/webtoons/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/src/all/webtoons/build.gradle b/src/all/webtoons/build.gradle deleted file mode 100644 index 465283baf..000000000 --- a/src/all/webtoons/build.gradle +++ /dev/null @@ -1,12 +0,0 @@ -apply plugin: 'com.android.application' -apply plugin: 'kotlin-android' - -ext { - extName = 'Webtoons' - pkgNameSuffix = 'all.webtoons' - extClass = '.WebtoonsFactory' - extVersionCode = 26 - libVersion = '1.2' -} - -apply from: "$rootDir/common.gradle" diff --git a/src/all/webtoons/src/eu/kanade/tachiyomi/extension/all/webtoons/WebtoonsDefault.kt b/src/all/webtoons/src/eu/kanade/tachiyomi/extension/all/webtoons/WebtoonsDefault.kt deleted file mode 100644 index 3811e7d74..000000000 --- a/src/all/webtoons/src/eu/kanade/tachiyomi/extension/all/webtoons/WebtoonsDefault.kt +++ /dev/null @@ -1,66 +0,0 @@ -package eu.kanade.tachiyomi.extension.all.webtoons - -import eu.kanade.tachiyomi.network.GET -import eu.kanade.tachiyomi.source.model.Page -import eu.kanade.tachiyomi.source.model.SChapter -import eu.kanade.tachiyomi.source.model.SManga -import org.json.JSONObject -import org.jsoup.nodes.Document -import org.jsoup.nodes.Element -import java.text.SimpleDateFormat -import java.util.Locale - -open class WebtoonsDefault( - override val lang: String, - override val langCode: String = lang, - override val localeForCookie: String = lang, - private val dateFormat: SimpleDateFormat = SimpleDateFormat("MMM d, yyyy", Locale.ENGLISH) -) : Webtoons(lang, langCode, lang) { - - override fun chapterListSelector() = "ul#_episodeList li[id*=episode]" - - override fun chapterFromElement(element: Element): SChapter { - val urlElement = element.select("a") - - val chapter = SChapter.create() - chapter.setUrlWithoutDomain(urlElement.attr("href")) - chapter.name = element.select("a > div.row > div.info > p.sub_title > span.ellipsis").text() - val select = element.select("a > div.row > div.num") - if (select.isNotEmpty()) { - chapter.name += " Ch. " + select.text().substringAfter("#") - } - if (element.select(".ico_bgm").isNotEmpty()) { - chapter.name += " ♫" - } - chapter.date_upload = element.select("a > div.row > div.info > p.date").text()?.let { chapterParseDate(it) } ?: 0 - return chapter - } - - open fun chapterParseDate(date: String): Long { - return dateFormat.parse(date)?.time ?: 0 - } - - override fun chapterListRequest(manga: SManga) = GET("https://m.webtoons.com" + manga.url, mobileHeaders) - - override fun pageListParse(document: Document): List { - val pages = document.select("div#_imageList > img").mapIndexed { i, element -> Page(i, "", element.attr("data-url")) } - - if (pages.isNotEmpty()) { return pages } - - val docString = document.toString() - - val docUrlRegex = Regex("documentURL:.*?'(.*?)'") - val motiontoonPathRegex = Regex("jpg:.*?'(.*?)\\{") - - val docUrl = docUrlRegex.find(docString)!!.destructured.toList()[0] - val motiontoonPath = motiontoonPathRegex.find(docString)!!.destructured.toList()[0] - - val motiontoonJson = JSONObject(client.newCall(GET(docUrl, headers)).execute().body()!!.string()).getJSONObject("assets").getJSONObject("image") - - val keys = motiontoonJson.keys().asSequence().toList().filter { it.contains("layer") } - - return keys.mapIndexed { i, key -> - Page(i, "", motiontoonPath + motiontoonJson.getString(key)) - } - } -} diff --git a/src/all/webtoons/src/eu/kanade/tachiyomi/extension/all/webtoons/WebtoonsFactory.kt b/src/all/webtoons/src/eu/kanade/tachiyomi/extension/all/webtoons/WebtoonsFactory.kt deleted file mode 100644 index 6c8a8abf0..000000000 --- a/src/all/webtoons/src/eu/kanade/tachiyomi/extension/all/webtoons/WebtoonsFactory.kt +++ /dev/null @@ -1,93 +0,0 @@ -package eu.kanade.tachiyomi.extension.all.webtoons - -import eu.kanade.tachiyomi.source.Source -import eu.kanade.tachiyomi.source.SourceFactory -import java.text.SimpleDateFormat -import java.util.GregorianCalendar -import java.util.Locale - -class WebtoonsFactory : SourceFactory { - override fun createSources(): List = listOf( - WebtoonsEnglish(), - WebtoonsChineseTraditional(), - WebtoonsIndonesian(), - WebtoonsThai(), - WebtoonsFr(), - WebtoonsEs(), - DongmanManhua(), - - // Fan translations - WebtoonsTranslate("en", "ENG"), - WebtoonsTranslate("zh", "CMN", " (Simplified)"), - WebtoonsTranslate("zh", "CMT", " (Traditional)"), - WebtoonsTranslate("th", "THA"), - WebtoonsTranslate("id", "IND"), - WebtoonsTranslate("fr", "FRA"), - WebtoonsTranslate("vi", "VIE"), - WebtoonsTranslate("ru", "RUS"), - WebtoonsTranslate("ar", "ARA"), - WebtoonsTranslate("fil", "FIL"), - WebtoonsTranslate("de", "DEU"), - WebtoonsTranslate("hi", "HIN"), - WebtoonsTranslate("it", "ITA"), - WebtoonsTranslate("ja", "JPN"), - WebtoonsTranslate("pt", "POR", " (Brazilian)"), - WebtoonsTranslate("tr", "TUR"), - WebtoonsTranslate("ms", "MAY"), - WebtoonsTranslate("pl", "POL"), - WebtoonsTranslate("pt", "POT", " (European)"), - WebtoonsTranslate("bg", "BUL"), - WebtoonsTranslate("da", "DAN"), - WebtoonsTranslate("nl", "NLD"), - WebtoonsTranslate("ro", "RON"), - WebtoonsTranslate("mn", "MON"), - WebtoonsTranslate("el", "GRE"), - WebtoonsTranslate("lt", "LIT"), - WebtoonsTranslate("cs", "CES"), - WebtoonsTranslate("sv", "SWE"), - WebtoonsTranslate("bn", "BEN"), - WebtoonsTranslate("fa", "PER"), - WebtoonsTranslate("uk", "UKR"), - WebtoonsTranslate("es", "SPA") - ) -} - -class WebtoonsEnglish : WebtoonsDefault("en") - -class WebtoonsIndonesian : WebtoonsDefault("id") { - override val name: String = "Webtoons.com (Indonesian)" - - // Android seems to be unable to parse Indonesian dates; we'll use a short hard-coded table - // instead. - private val dateMap: Array = arrayOf( - "Jan", "Feb", "Mar", "Apr", "Mei", "Jun", "Jul", "Agu", "Sep", "Okt", "Nov", "Des" - ) - - override fun chapterParseDate(date: String): Long { - val expr = Regex("""(\d{4}) ([A-Z][a-z]{2}) (\d+)""").find(date) ?: return 0 - val (_, year, monthString, day) = expr.groupValues - val monthIndex = dateMap.indexOf(monthString) - return GregorianCalendar(year.toInt(), monthIndex, day.toInt()).time.time - } -} - -class WebtoonsThai : WebtoonsDefault("th", dateFormat = SimpleDateFormat("d MMM yyyy", Locale("th"))) - -class WebtoonsChineseTraditional : WebtoonsDefault("zh", "zh-hant", "zh_TW", SimpleDateFormat("yyyy/MM/dd", Locale.TRADITIONAL_CHINESE)) - -class WebtoonsFr : WebtoonsDefault("fr", dateFormat = SimpleDateFormat("d MMM yyyy", Locale.FRENCH)) - -class WebtoonsEs : WebtoonsDefault("es") { - // Android seems to be unable to parse es dates like Indonesian; we'll use a short hard-coded table - // instead. - private val dateMap: Array = arrayOf( - "Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Sep", "Oct", "Nov", "Dic" - ) - - override fun chapterParseDate(date: String): Long { - val expr = Regex("""(\d+)-([a-z]{3})-(\d{4})""").find(date) ?: return 0 - val (_, day, monthString, year) = expr.groupValues - val monthIndex = dateMap.indexOf(monthString) - return GregorianCalendar(year.toInt(), monthIndex, day.toInt()).time.time - } -}