From a5e314f149e021a019a08f996363427b10dc1bc6 Mon Sep 17 00:00:00 2001 From: beerpsi <92439990+beerpiss@users.noreply.github.com> Date: Sat, 17 Feb 2024 15:51:19 +0700 Subject: [PATCH] Add Gaugau Monster Plus (#1321) --- src/ja/gaugaumonsterplus/build.gradle | 11 + .../res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 1662 bytes .../res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 911 bytes .../res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 2178 bytes .../res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 3644 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 4778 bytes .../ja/gaugaumonsterplus/GaugauMonsterPlus.kt | 282 ++++++++++++++++++ 7 files changed, 293 insertions(+) create mode 100644 src/ja/gaugaumonsterplus/build.gradle create mode 100644 src/ja/gaugaumonsterplus/res/mipmap-hdpi/ic_launcher.png create mode 100644 src/ja/gaugaumonsterplus/res/mipmap-mdpi/ic_launcher.png create mode 100644 src/ja/gaugaumonsterplus/res/mipmap-xhdpi/ic_launcher.png create mode 100644 src/ja/gaugaumonsterplus/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 src/ja/gaugaumonsterplus/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 src/ja/gaugaumonsterplus/src/eu/kanade/tachiyomi/extension/ja/gaugaumonsterplus/GaugauMonsterPlus.kt diff --git a/src/ja/gaugaumonsterplus/build.gradle b/src/ja/gaugaumonsterplus/build.gradle new file mode 100644 index 000000000..031e3a0b5 --- /dev/null +++ b/src/ja/gaugaumonsterplus/build.gradle @@ -0,0 +1,11 @@ +ext { + extName = "Gaugau Monster Plus" + extClass = ".GaugauMonsterPlus" + extVersionCode = 1 +} + +apply from: "$rootDir/common.gradle" + +dependencies { + implementation(project(":lib:speedbinb")) +} diff --git a/src/ja/gaugaumonsterplus/res/mipmap-hdpi/ic_launcher.png b/src/ja/gaugaumonsterplus/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..f87535a6e8367b966e8f174429e03caa89582db8 GIT binary patch literal 1662 zcmV-^27&pBP)NklP~VwlQ*ks#oAwX@9y5g zKeA-Wk|j%)+v{KEI9A7%xZ}WlOutBRjvP6XGB`N6MRauZB!j^)SIR~VES6U1&Yerm zgZfFuJ$v?SR*vJ&SuBC+CzK4fLTeI05L~be;TZpf(Z$}nu0++LgIk85gnaPHhiQH5yHnUEro5NyF z;%YsL%bc9uc^SF65F=tm%&r1T!7^w$xw#M{V*L?7DgQ%&Qp$iFN(LkYk^#wpWI!^Y z(E0NzuumVdL`T!#mL)2Rf`$#Fpi!g514vi5E~#?nq^Of8vBCL!a5#=4cI_f%x^$!| zSyDWJv=u9oB2_BV)visPLP38^`bUpQl`kLp#*a_h8a2cN$gg#4Qlw1D+plqB;=X+& z;>+2rL#`UejveA_k(nLV3y)vJ>#TQ>4doETtiR^`tRc;W$s!2KFE`ahuL$z#|T zW|#Y>OldRDtBV#T!;2T>Nalb5(v&DczDbh6JOti}67d=0n;?PB_Hb}r*wUrqTLpdNav2UDD}2iq3}11sq|G5A6gXf2)*;Tou{oeyH?kOww(LQT zQ83UB00D|aKnnIaL4yXN_K16{VF?eXu$3!GRk(00Fpl8Bsyunf@boD`=HOuRZ`;gM7a(za%xZ>*4@sFJgCHDxKv)!-R4NH=R?TJ# zUAh#2gyC4Ntz4OmA3suHuU;+_hYxoO4y?+Ri#QJt@d846 z2M!zNRILfKTi9Xt2^ukiZ*l1A)Ir0`_IP3I*JDL40EhYCf3fAj5<|3r@aY0JolX^D z!}I54FOyD3k%tbE$;XH66@B$8DKcghf&*i!M=wddfUsdy<;^Pu2j`uw704#^iv;1o zxISdY3=CcI0m5*I*u5LW#32}a>nc@p<)dU2UqLul<8wJQ{KW?d*@I739Ycw^w!!CS z#&_??8JVtT{tWE?c>)~%A7e#U8D#e0~y6XmzHHBYM!P-1yUC;PO99wQK)e{CmLw- z*I#5nKP(xL3`hnf1CjyBfMh^wwOR)B9Y85Qefl)dY&N^~59++UycYh*&!OTlC%j$j;UI;YB?5LX6B^A!%G+vC}(HR$6SE9phR838bc1mWQ7w? zID3TaQ35NdP%9dZIv~wLoZRRpIx61x4IoW}Zla@NfktUuppjnSAEFn~3;0i-1lOWP zpjKQ97lL=^PW1}7moEpdabpO*cmc^y;Otpos#U}HP_KaR;6Y&P)&;&}M-Xn^O4bSm zo-JE|tyK${%9SB_^{RRWB5&W)0&JZ+z}Bx1wsGU=$VDv{+_Zcbl1n@gfSAKUi7*Tu z0MF*lU>rOc#S!|NF^@;R0w`%NEG#QfyY_b&g!~LYBhI;VrGw1#z%^+CO!eyYHlb9l z3QUzM$oB&FY17o7g+foCQW+{+W zU%-FnOj6_#OG%0L1zZajBt;(K+P2lcfOX_ZC2=KrX@QCr;S2d57cfl=7`k^)jyzJK z0tmNnYgPbfAY5@}#f<|8f@#DEi9GIeETyIL@?rt+wr$!K2t9g~aMW>QhPQ)h*f5l* zKl2?u3XzW=6Urm@Nt3iI;N7!FDlUS;!o7QdiJHw|%FYHK`CFP;47iRRW#kFv%j2d_ zy8`y{;}hNMxOGr^@MYx@TvOtai24OkkZavqDlTH|)eDs3TCzk|o>HzH1TS7xzkqZ4 zbTIVn3Ff>!Fc%ktIX@qa{rdyorVVh78sYgM;a1#~nF(y;#y9|U?&sUL$2}8%PtO8; zr%pIP`k`Jg@ShjZ3+M$J3WDH-G)pKH@}k?X3X~_*ef8?q0Z6mFe*O9=x`~d8sn)S$ z$4-wPJv!!aIJ_Q@2T}<-Jb(WDRNuaRyPz9EIby?_gqDPEgx)EpJE0Xi$=p7QB`OoD l6KbZI>gYn9^yo=`z5*B-1U#s%xRL+>002ovPDHLkV1gFgu9W}) literal 0 HcmV?d00001 diff --git a/src/ja/gaugaumonsterplus/res/mipmap-xhdpi/ic_launcher.png b/src/ja/gaugaumonsterplus/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..8d1356e0aa23924cdccec412c82b8049bde418d4 GIT binary patch literal 2178 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 K)v8pi!~O?Q+{?BA literal 0 HcmV?d00001 diff --git a/src/ja/gaugaumonsterplus/res/mipmap-xxxhdpi/ic_launcher.png b/src/ja/gaugaumonsterplus/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..2340573a6b0f958f6e0b00e0983a2d12cb3c1e40 GIT binary patch literal 4778 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 WiIkhQ^Iq@IoaH5y*=v)l(f() + + override val client = network.client.newBuilder() + .addInterceptor(SpeedBinbInterceptor(json)) + .build() + + override fun headersBuilder() = super.headersBuilder() + .add("Referer", "$baseUrl/") + + override fun popularMangaRequest(page: Int) = GET("$baseUrl/list/works?page=$page", headers) + + override fun popularMangaSelector() = ".works__grid .list__box" + + override fun popularMangaFromElement(element: Element) = SManga.create().apply { + element.selectFirst("h4 a")!!.let { + setUrlWithoutDomain(it.attr("href")) + title = it.text() + } + author = element.select(".list__text span a").joinToString { it.text() } + genre = element.select(".tag__item").joinToString { it.text() } + thumbnail_url = element.selectFirst(".thumbnail .img-books")?.absUrl("src") + } + + override fun popularMangaNextPageSelector() = "ol.pagination li.next a:not([href='#'])" + + override fun latestUpdatesRequest(page: Int) = throw UnsupportedOperationException() + + override fun latestUpdatesSelector() = throw UnsupportedOperationException() + + override fun latestUpdatesFromElement(element: Element) = throw UnsupportedOperationException() + + override fun latestUpdatesNextPageSelector() = throw UnsupportedOperationException() + + override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { + val tagFilter = filters.ifEmpty { getFilterList() }.filterIsInstance().first() + val url = baseUrl.toHttpUrl().newBuilder().apply { + if (query.isNotEmpty()) { + addPathSegments("list/search-result") + addQueryParameter("word", query) + } else if (tagFilter.state != 0) { + addPathSegments("list/tag") + addPathSegment(tagFilter.values[tagFilter.state]) + } else { + addPathSegment("list/works") + } + + if (page > 1) { + addQueryParameter("page", page.toString()) + } + }.build() + + return GET(url, headers) + } + + override fun searchMangaSelector() = popularMangaSelector() + + override fun searchMangaFromElement(element: Element) = popularMangaFromElement(element) + + override fun searchMangaNextPageSelector() = popularMangaNextPageSelector() + + override fun mangaDetailsParse(document: Document) = SManga.create().apply { + title = document.selectFirst(".mbOff h1")!!.text() + author = document.select(".list__text span a").joinToString { it.text() } + description = document.selectFirst("p.mbOff")?.text() + genre = document.select(".tag__item").joinToString { it.text() } + thumbnail_url = document.selectFirst(".list__box .thumbnail .img-books")?.absUrl("src") + } + + override fun chapterListRequest(manga: SManga) = GET("$baseUrl${manga.url}/episodes", headers) + + override fun chapterListSelector() = + "#episodes .episode__grid:not(:has(.episode__button-app, .episode__button-complete)) a" + + override fun chapterFromElement(element: Element) = SChapter.create().apply { + val episodeNum = element.selectFirst(".episode__num")!!.text() + val episodeTitle = element.selectFirst(".episode__title")?.text() + ?.takeIf { t -> t.isNotBlank() } + + setUrlWithoutDomain(element.attr("href")) + name = buildString(episodeNum.length + 2 + (episodeTitle?.length ?: 0)) { + append(episodeNum) + + if (episodeTitle != null) { + append("「") + append(episodeTitle) + append("」") + } + } + // There is actually a consistent chapter number format on this site, which we + // take advantage of because the built-in chapter number parser doesn't properly + // parse the fractions. + chapter_number = CHAPTER_NUMBER_REGEX.matchEntire(episodeNum)?.let { m -> + val major = m.groupValues[1].toFloat() + val minor = m.groupValues[2].toFloat() + + major + minor / 10 + } ?: -1F + } + + private val reader by lazy { SpeedBinbReader(client, headers, json) } + + override fun pageListParse(document: Document) = reader.pageListParse(document) + + override fun imageUrlParse(document: Document) = throw UnsupportedOperationException() + + override fun getFilterList() = FilterList( + Filter.Header("フリーワード検索はジャンル検索では機能しません"), + TagFilter(), + ) +} + +private val CHAPTER_NUMBER_REGEX = Regex("""^第(\d+)話\((\d+)\)$""") + +// https://gaugau.futabanet.jp/list/search +// copy([...document.querySelectorAll(".tagSearch__item")].map((e) => `"${e.textContent.trim()}",`).join("\n")) +private class TagFilter : Filter.Select( + "ジャンル", + arrayOf( + "なし", + "転生・召喚", + "少年向け", + "青年向け", + "大人向け", + "少女向け", + "追放", + "女性向け", + "チート", + "もふもふ", + "小説", + "スローライフ", + "時代物", + "異世界転生", + "官能", + "歴史", + "ライトノベル", + "婚約破棄", + "暮らし", + "料理", + "結婚", + "医療", + "恋", + "溺愛", + "教養", + "ミリタリー", + "逆ハーレム", + "戦争", + "寝取られ", + "おっぱい", + "趣味", + "巨乳", + "ファッション", + "グルメ", + "TS", + "最強", + "天才", + "勇者", + "癒し", + "魔王", + "雑学", + "女主人公", + "成り上がり", + "探偵", + "引きこもり", + "社畜", + "ツンデレ", + "子育て", + "ヤンデレ", + "絵本", + "青年", + "女性", + "少女", + "少年", + "アウトドア", + "おっさん", + "スポーツ", + "トレーニング", + "幼馴染", + "同級生", + "ダイエット", + "高校生", + "令嬢", + "美少女", + "エッセイ", + "美人", + "妹", + "貴族", + "イケメン", + "ヒューマンドラマ", + "双子", + "冒険", + "魔法", + "4コマ", + "魔女", + "ショートショート", + "サキュバス", + "スライム", + "エルフ", + "ヤンキー", + "ギャンブル", + "獣人", + "サブカル", + "ミステリー", + "乙女ゲーム", + "サスペンス", + "シリアス", + "ホラー", + "ラブコメ", + "恋愛", + "胸キュン", + "いじめ", + "アクション", + "サバイバル", + "バトル", + "絶望", + "アニメ", + "ギャグ", + "動物", + "猫", + "非異世界", + "百合", + "内政", + "BL", + "ダンジョン", + "幼なじみ", + "田舎", + "学園", + "悪役令嬢", + "なろう", + "異世界", + "メディアミックス", + "ファンタジー", + "お仕事もの", + "人外", + "オフィスラブ", + "日常", + "夫婦", + "家族", + "アラサー", + "アラフォー", + "中高年", + "老後", + "話題", + "重版", + "音楽", + "幕末", + "お金", + "長期連載", + "読み切り", + "1話完結", + "ゲーム", + "人情", + "ハーレム", + ), +)