From e17d796fc1c377e671f48b47b9aee33d7e236c9c Mon Sep 17 00:00:00 2001 From: novenary <1155030+9ary@users.noreply.github.com> Date: Sat, 22 Nov 2025 00:25:48 +0200 Subject: [PATCH] Drop fakeimg (#11743) * xkcd: drop fakeimg * smbc: drop fakeimg * mehgazone: drop fakeimg * swordscomic: drop fakeimg * buttsmithy: drop fakeimg * xkcd: better thumbnail It's unclear what the original source for it is but it's all over the web. Link: https://libguides.davenportlibrary.com/comicsforallages/xkcd * smbc, xkcd: implement fetchMangaDetails properly * Update src/en/saturdaymorningbreakfastcomics/build.gradle * Update src/all/xkcd/build.gradle --------- Co-authored-by: Vetle Ledaal --- src/all/xkcd/assets/thumbnail.png | Bin 0 -> 21165 bytes src/all/xkcd/build.gradle | 6 +- .../tachiyomi/extension/all/xkcd/Xkcd.kt | 77 ++++++++---------- .../extension/all/xkcd/translations/XkcdFR.kt | 5 +- .../extension/all/xkcd/translations/XkcdRU.kt | 7 +- .../extension/all/xkcd/translations/XkcdZH.kt | 7 +- src/en/buttsmithy/build.gradle | 6 +- .../extension/en/buttsmithy/Buttsmithy.kt | 6 +- src/en/mehgazone/build.gradle | 6 +- .../extension/en/mehgazone/Mehgazone.kt | 22 +---- .../assets/thumbnail.png | Bin 0 -> 15659 bytes .../build.gradle | 6 +- .../SaturdayMorningBreakfastComics.kt | 53 +++++++----- src/en/swordscomic/build.gradle | 6 +- .../extension/en/swordscomic/SwordsComic.kt | 21 ++--- 15 files changed, 114 insertions(+), 114 deletions(-) create mode 100644 src/all/xkcd/assets/thumbnail.png create mode 100644 src/en/saturdaymorningbreakfastcomics/assets/thumbnail.png diff --git a/src/all/xkcd/assets/thumbnail.png b/src/all/xkcd/assets/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..3489167ca9234e091f3b668b8da937195f5b8caf GIT binary patch literal 21165 zcmeFZRZv|~w{SWTX1*x-ueFeZ&!6y--r9$ z4{SK6_B>~=wWf|aCJ~AXl8A7)a3Bx}QCdn&83Y2O2Y$+7J^}B%>MnHwzrdW7B}KrN zf6@B^FCf1O%L{`*4RP?VMo_?OViPH4c@W5x5(M%O27#V|xBL%5AeS#7(6J#1#FGvJ zVSmr=RN@0}1xbqutGch8=9sCf>0pO$syMr)gtUC?m$_j}=h8m@l`o~xK8{uHlhyH&T z&3c?rqyK&BHwIq**99ud2q*NvF8?L-AL;)s^Pj)|OXfe)|0VMu>HnMH|3v10{AK^0 z;Q#Fb|2vugc4hx#!T+}<|EFHk{0Z-X!wG#tr2$ibi3%5$k>Pm_8u86G1G0xfA~81~=3A5J$h=d0)a(|vA~gMcUa2gCbD zeqvIK@+w2I4-TA}F3f1emIBjvf-0JAv_Qeoo$gis>P-ivuenbkP-)y*gkRY!B1KXv zz2<}l`C35U109!Mdx(ibE(}skpeDH(C2DdChSIPmd7`Hth`afd&g+_~Ds&3n zx03sI>o*KE7)VI}d)rKfWWqcqEwg^wG1JoN7s;1$zc@+{w92}V6^<%leZs8p!u58A zC>?Y-w~}{$9W+qm7uI}U>_xO8uUF5Xuo{+s=6oUjZ||Cq)(3s)HHR`E>70+2j9I2; zpD7xiZ>iAWEZ5@ilX3q3bkT{{>~lr{%Wo{HIUL-1dtwZ|vr3@?IiLRx^o~g4jKvZ+ zW;D65`__EKj#scX{e)&FVNSVV!yi+cQ%bV^Te^0~Sg3pRbM>+}IH=xoPcuF3gV#^v z);TL*>1_<;ANJMfnnD4qnsl_E%0N+V6hgF?fEz`}h?cGBV0w zSMYaMRyhEwip$~bSw**RFXi9`Uv@R$EsgSUy@Vv%b__%tYoNQxu+06knMC*SBOI)T z*<{PEdesvgEdny;L~VQQLzJ0y0Rj{}rc}R;1_aVf+%Z4}LT=;X(;EyqSy;?C*AZ`< z8_fG*oUL^5;D#AYyQGOjE5)rj9mk@%>+0vn}(77v@M zA$--+U(Y>MyETu@GB24FHpw^=Cy?+4(Nz@oMSgj?{}bzrFm>5H+5Urx4RuTX_BPsH z>Tp(D01$`ON?t!3Uz^aq;=6UG9(a9nwtiJHh5|9^`w4kS>fo661Y`)JCrH5*D29)w zLw1y0tvm$XLRne=2~^WnRQa{~*yrfMdwaU_ST-Yb?>4}C;byVgO_{$MO!t8-L60S@ zC5)LD*gyU00$c=@AnQYYL6pgW&+{094&G$0N-q|ws{QW+iP(NU&&sidV%h80 zvJ~my+gk*3ijwa`A4iAmA)=Pnbh%0AP{YGQ&6ay4p#NHh)wlrS1{gU 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 O&M`5vG_2NlkN+>qYp?bI literal 0 HcmV?d00001 diff --git a/src/all/xkcd/build.gradle b/src/all/xkcd/build.gradle index 058d7cb36..77914d674 100644 --- a/src/all/xkcd/build.gradle +++ b/src/all/xkcd/build.gradle @@ -1,7 +1,11 @@ ext { extName = 'xkcd' extClass = '.XkcdFactory' - extVersionCode = 14 + extVersionCode = 15 } apply from: "$rootDir/common.gradle" + +dependencies { + implementation(project(':lib:textinterceptor')) +} diff --git a/src/all/xkcd/src/eu/kanade/tachiyomi/extension/all/xkcd/Xkcd.kt b/src/all/xkcd/src/eu/kanade/tachiyomi/extension/all/xkcd/Xkcd.kt index fb11c2c32..98c218145 100644 --- a/src/all/xkcd/src/eu/kanade/tachiyomi/extension/all/xkcd/Xkcd.kt +++ b/src/all/xkcd/src/eu/kanade/tachiyomi/extension/all/xkcd/Xkcd.kt @@ -1,6 +1,7 @@ package eu.kanade.tachiyomi.extension.all.xkcd -import android.net.Uri.encode +import eu.kanade.tachiyomi.lib.textinterceptor.TextInterceptor +import eu.kanade.tachiyomi.lib.textinterceptor.TextInterceptorHelper import eu.kanade.tachiyomi.source.model.FilterList import eu.kanade.tachiyomi.source.model.MangasPage import eu.kanade.tachiyomi.source.model.Page @@ -8,7 +9,11 @@ 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.MediaType.Companion.toMediaType +import okhttp3.OkHttpClient +import okhttp3.Protocol import okhttp3.Response +import okhttp3.ResponseBody.Companion.toResponseBody import rx.Observable import java.text.SimpleDateFormat import java.util.Locale @@ -21,6 +26,26 @@ open class Xkcd( final override val name = "xkcd" final override val supportsLatest = false + override val client: OkHttpClient = network.client.newBuilder() + .addInterceptor(TextInterceptor()) + .addInterceptor { chain -> + val request = chain.request() + val url = request.url + if (url.host != "thumbnail") return@addInterceptor chain.proceed(request) + + val image = this::class.java + .getResourceAsStream("/assets/thumbnail.png")!! + .readBytes() + val responseBody = image.toResponseBody("image/png".toMediaType()) + Response.Builder() + .request(request) + .protocol(Protocol.HTTP_1_1) + .code(200) + .message("OK") + .body(responseBody) + .build() + } + .build() protected open val archive = "/archive" @@ -32,8 +57,6 @@ open class Xkcd( protected open val interactiveText = "To experience the interactive version of this comic, open it in WebView/browser." - protected open val altTextUrl = LATIN_ALT_TEXT_URL - protected open val chapterListSelector = "#middleContainer > a" protected open val imageSelector = "#comic > img" @@ -42,45 +65,27 @@ open class Xkcd( protected fun String.timestamp() = dateFormat.parse(this)?.time ?: 0L - protected fun String.image() = altTextUrl + "&text=" + encode(this) - protected open fun String.numbered(number: Any) = "$number - $this" - // TODO: maybe use BreakIterator - protected fun wordWrap(title: String, altText: String) = buildString { - title.split(' ').forEachIndexed { i, w -> - if (i != 0 && i % 7 == 0) append("\n") - append(w).append(' ') - } - append("\n\n") - - var charCount = 0 - altText.replace("\r\n", " ").split(' ').forEach { w -> - if (charCount > 25) { - append("\n") - charCount = 0 - } - append(w).append(' ') - charCount += w.length + 1 - } - } - - final override fun fetchPopularManga(page: Int) = + private fun makeSManga(): SManga = SManga.create().apply { title = name artist = creator author = creator description = synopsis status = SManga.ONGOING - thumbnail_url = THUMBNAIL_URL + thumbnail_url = "https://thumbnail/xkcd.png" setUrlWithoutDomain(archive) - }.let { Observable.just(MangasPage(listOf(it), false))!! } + } + + final override fun fetchPopularManga(page: Int) = + Observable.just(MangasPage(listOf(makeSManga()), false)) final override fun fetchSearchManga(page: Int, query: String, filters: FilterList) = Observable.just(MangasPage(emptyList(), false))!! final override fun fetchMangaDetails(manga: SManga) = - Observable.just(manga.apply { initialized = true })!! + Observable.just(makeSManga())!! override fun chapterListParse(response: Response) = response.asJsoup().select(chapterListSelector).map { @@ -106,9 +111,9 @@ open class Xkcd( } // create a text image for the alt text - val text = wordWrap(img.attr("alt"), img.attr("title")) + val text = TextInterceptorHelper.createUrl(img.attr("alt"), img.attr("title")) - return listOf(Page(0, "", image), Page(1, "", text.image())) + return listOf(Page(0, "", image), Page(1, "", text)) } final override fun imageUrlParse(response: Response) = @@ -134,16 +139,4 @@ open class Xkcd( final override fun searchMangaRequest(page: Int, query: String, filters: FilterList) = throw UnsupportedOperationException() - - companion object { - private const val THUMBNAIL_URL = - "https://fakeimg.ryd.tools/550x780/ffffff/6e7b91/?font=museo&text=xkcd" - - const val LATIN_ALT_TEXT_URL = - "https://fakeimg.ryd.tools/1500x2126/ffffff/000000/?font=museo&font_size=42" - - const val CJK_ALT_TEXT_URL = - "https://placehold.jp/42/ffffff/000000/1500x2126.png?css=" + - "%7B%22padding%22%3A%22300px%22%2C%22text-align%22%3A%22left%22%7D" - } } diff --git a/src/all/xkcd/src/eu/kanade/tachiyomi/extension/all/xkcd/translations/XkcdFR.kt b/src/all/xkcd/src/eu/kanade/tachiyomi/extension/all/xkcd/translations/XkcdFR.kt index 3f89df09e..1de599ffd 100644 --- a/src/all/xkcd/src/eu/kanade/tachiyomi/extension/all/xkcd/translations/XkcdFR.kt +++ b/src/all/xkcd/src/eu/kanade/tachiyomi/extension/all/xkcd/translations/XkcdFR.kt @@ -1,6 +1,7 @@ package eu.kanade.tachiyomi.extension.all.xkcd.translations import eu.kanade.tachiyomi.extension.all.xkcd.Xkcd +import eu.kanade.tachiyomi.lib.textinterceptor.TextInterceptorHelper import eu.kanade.tachiyomi.source.model.Page import eu.kanade.tachiyomi.source.model.SChapter import eu.kanade.tachiyomi.util.asJsoup @@ -36,9 +37,9 @@ class XkcdFR : Xkcd("https://xkcd.lapin.org", "fr") { val img = it.child(2).child(0).child(0) // create a text image for the alt text - val text = wordWrap(it.child(0).text(), img.attr("alt")) + val text = TextInterceptorHelper.createUrl(it.child(0).text(), img.attr("alt")) - listOf(Page(0, "", img.attr("abs:src")), Page(1, "", text.image())) + listOf(Page(0, "", img.attr("abs:src")), Page(1, "", text)) } override val interactiveText: String diff --git a/src/all/xkcd/src/eu/kanade/tachiyomi/extension/all/xkcd/translations/XkcdRU.kt b/src/all/xkcd/src/eu/kanade/tachiyomi/extension/all/xkcd/translations/XkcdRU.kt index cc2546ede..3b80dbe62 100644 --- a/src/all/xkcd/src/eu/kanade/tachiyomi/extension/all/xkcd/translations/XkcdRU.kt +++ b/src/all/xkcd/src/eu/kanade/tachiyomi/extension/all/xkcd/translations/XkcdRU.kt @@ -1,6 +1,7 @@ package eu.kanade.tachiyomi.extension.all.xkcd.translations import eu.kanade.tachiyomi.extension.all.xkcd.Xkcd +import eu.kanade.tachiyomi.lib.textinterceptor.TextInterceptorHelper import eu.kanade.tachiyomi.source.model.Page import eu.kanade.tachiyomi.source.model.SChapter import eu.kanade.tachiyomi.util.asJsoup @@ -13,8 +14,6 @@ class XkcdRU : Xkcd("https://xkcd.ru", "ru") { override val synopsis = "о романтике, сарказме, математике и языке" - override val altTextUrl = super.altTextUrl.replace("museo", "noto") - override val chapterListSelector = ".main > a" override val imageSelector = ".main" @@ -38,9 +37,9 @@ class XkcdRU : Xkcd("https://xkcd.ru", "ru") { val img = it.child(5).child(0) // create a text image for the alt text - val text = wordWrap(img.attr("alt"), it.child(7).text()) + val text = TextInterceptorHelper.createUrl(img.attr("alt"), it.child(7).text()) - listOf(Page(0, "", img.attr("abs:src")), Page(1, "", text.image())) + listOf(Page(0, "", img.attr("abs:src")), Page(1, "", text)) } override val interactiveText: String diff --git a/src/all/xkcd/src/eu/kanade/tachiyomi/extension/all/xkcd/translations/XkcdZH.kt b/src/all/xkcd/src/eu/kanade/tachiyomi/extension/all/xkcd/translations/XkcdZH.kt index 9f0ff82e2..4fd3607b1 100644 --- a/src/all/xkcd/src/eu/kanade/tachiyomi/extension/all/xkcd/translations/XkcdZH.kt +++ b/src/all/xkcd/src/eu/kanade/tachiyomi/extension/all/xkcd/translations/XkcdZH.kt @@ -1,6 +1,7 @@ package eu.kanade.tachiyomi.extension.all.xkcd.translations import eu.kanade.tachiyomi.extension.all.xkcd.Xkcd +import eu.kanade.tachiyomi.lib.textinterceptor.TextInterceptorHelper import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.source.model.Page import eu.kanade.tachiyomi.source.model.SChapter @@ -23,8 +24,6 @@ class XkcdZH : Xkcd("https://xkcd.tw", "zh", "yyyy-MM-dd HH:mm:ss") { override val interactiveText = "要體驗本漫畫的互動版請在WebView/瀏覽器中打開。" - override val altTextUrl = CJK_ALT_TEXT_URL - override val imageSelector = "#content > img:not([id])" private val json by injectLazy() @@ -54,9 +53,9 @@ class XkcdZH : Xkcd("https://xkcd.tw", "zh", "yyyy-MM-dd HH:mm:ss") { val image = img.attr("abs:src") // create a text image for the alt text - val text = img.attr("alt") + "\n\n" + img.attr("title") + val text = TextInterceptorHelper.createUrl(img.attr("alt"), img.attr("title")) - return listOf(Page(0, "", image), Page(1, "", text.image())) + return listOf(Page(0, "", image), Page(1, "", text)) } override val chapterListSelector: String diff --git a/src/en/buttsmithy/build.gradle b/src/en/buttsmithy/build.gradle index 6b9f6a5ab..658110158 100644 --- a/src/en/buttsmithy/build.gradle +++ b/src/en/buttsmithy/build.gradle @@ -1,8 +1,12 @@ ext { extName = 'buttsmithy' extClass = '.Buttsmithy' - extVersionCode = 3 + extVersionCode = 4 isNsfw = true } apply from: "$rootDir/common.gradle" + +dependencies { + implementation(project(':lib:textinterceptor')) +} diff --git a/src/en/buttsmithy/src/eu/kanade/tachiyomi/extension/en/buttsmithy/Buttsmithy.kt b/src/en/buttsmithy/src/eu/kanade/tachiyomi/extension/en/buttsmithy/Buttsmithy.kt index 3b8dc6d22..60cbeea67 100644 --- a/src/en/buttsmithy/src/eu/kanade/tachiyomi/extension/en/buttsmithy/Buttsmithy.kt +++ b/src/en/buttsmithy/src/eu/kanade/tachiyomi/extension/en/buttsmithy/Buttsmithy.kt @@ -1,6 +1,8 @@ package eu.kanade.tachiyomi.extension.en.buttsmithy import android.app.Application +import eu.kanade.tachiyomi.lib.textinterceptor.TextInterceptor +import eu.kanade.tachiyomi.lib.textinterceptor.TextInterceptorHelper import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.source.model.FilterList import eu.kanade.tachiyomi.source.model.MangasPage @@ -9,6 +11,7 @@ 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.OkHttpClient import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Document @@ -36,6 +39,7 @@ class Buttsmithy : HttpSource() { private val alfieDateParser = SimpleDateFormat("HH:mm MMMM dd, yyyy", Locale.US) override val supportsLatest: Boolean = false + override val client: OkHttpClient = network.client.newBuilder().addInterceptor(TextInterceptor()).build() override fun fetchChapterList(manga: SManga): Observable> { val chapters: List = @@ -255,7 +259,7 @@ class Buttsmithy : HttpSource() { } private fun generateImageUrlWithText(text: String): String { - return "https://fakeimg.ryd.tools/800x1236/?text=$text&font=lobster" + return TextInterceptorHelper.createUrl(text, "") } private fun generateMangasPage(): MangasPage { diff --git a/src/en/mehgazone/build.gradle b/src/en/mehgazone/build.gradle index 572f02dea..30ec11ca2 100644 --- a/src/en/mehgazone/build.gradle +++ b/src/en/mehgazone/build.gradle @@ -1,8 +1,12 @@ ext { extName = 'Mehgazone' extClass = '.Mehgazone' - extVersionCode = 1 + extVersionCode = 2 isNsfw = true } apply from: "$rootDir/common.gradle" + +dependencies { + implementation(project(':lib:textinterceptor')) +} diff --git a/src/en/mehgazone/src/eu/kanade/tachiyomi/extension/en/mehgazone/Mehgazone.kt b/src/en/mehgazone/src/eu/kanade/tachiyomi/extension/en/mehgazone/Mehgazone.kt index 84e9add7e..27fdac82f 100644 --- a/src/en/mehgazone/src/eu/kanade/tachiyomi/extension/en/mehgazone/Mehgazone.kt +++ b/src/en/mehgazone/src/eu/kanade/tachiyomi/extension/en/mehgazone/Mehgazone.kt @@ -14,6 +14,8 @@ import androidx.preference.PreferenceScreen import eu.kanade.tachiyomi.extension.en.mehgazone.interceptors.BasicAuthInterceptor import eu.kanade.tachiyomi.extension.en.mehgazone.serialization.ChapterListDto import eu.kanade.tachiyomi.extension.en.mehgazone.serialization.PageListDto +import eu.kanade.tachiyomi.lib.textinterceptor.TextInterceptor +import eu.kanade.tachiyomi.lib.textinterceptor.TextInterceptorHelper import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.source.ConfigurableSource import eu.kanade.tachiyomi.source.model.FilterList @@ -55,6 +57,7 @@ class Mehgazone : ConfigurableSource, HttpSource() { override val client: OkHttpClient by lazy { network.cloudflareClient .newBuilder() + .addInterceptor(TextInterceptor()) .addInterceptor(authInterceptor) .build() } @@ -63,10 +66,6 @@ class Mehgazone : ConfigurableSource, HttpSource() { SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.US) } - private val textToImageURL = "https://fakeimg.ryd.tools/1500x2126/ffffff/000000/?font=museo&font_size=42".toHttpUrl() - - private fun String.image() = textToImageURL.newBuilder().setQueryParameter("text", this).build().toString() - private fun String.unescape() = unescapeEntities(this, false) private fun String.linkify() = SpannableString(this).apply { Linkify.addLinks(this, Linkify.WEB_URLS) } @@ -172,19 +171,6 @@ class Mehgazone : ConfigurableSource, HttpSource() { }.reversed() } - // Adapted from the xkcd source's wordWrap function - private fun wordWrap(text: String) = buildString { - var charCount = 0 - text.replace('\n', ' ').split(' ').forEach { w -> - if (charCount > 25) { - append("\n") - charCount = 0 - } - append(w).append(' ') - charCount += w.length + 1 - } - } - override fun pageListRequest(chapter: SChapter): Request { val chapterUrl = chapter.url.toHttpUrl() val pageListUrl = chapterUrl @@ -208,7 +194,7 @@ class Mehgazone : ConfigurableSource, HttpSource() { Page( images.size, "", - wordWrap(Jsoup.parseBodyFragment(apiResponse.excerpt.rendered.unescape()).text()).image(), + TextInterceptorHelper.createUrl("", Jsoup.parseBodyFragment(apiResponse.excerpt.rendered.unescape()).text()), ), ) } diff --git a/src/en/saturdaymorningbreakfastcomics/assets/thumbnail.png b/src/en/saturdaymorningbreakfastcomics/assets/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..281455da3033564984bfa49fbffe92f9cc35677f GIT binary patch literal 15659 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 y`<=J($EwF&!-fP1J+G-uxer>^Wut literal 0 HcmV?d00001 diff --git a/src/en/saturdaymorningbreakfastcomics/build.gradle b/src/en/saturdaymorningbreakfastcomics/build.gradle index 1576d4402..920adfdd8 100644 --- a/src/en/saturdaymorningbreakfastcomics/build.gradle +++ b/src/en/saturdaymorningbreakfastcomics/build.gradle @@ -1,8 +1,12 @@ ext { extName = 'Saturday Morning Breakfast Comics' extClass = '.SaturdayMorningBreakfastComics' - extVersionCode = 1 + extVersionCode = 2 isNsfw = false } apply from: "$rootDir/common.gradle" + +dependencies { + implementation(project(':lib:textinterceptor')) +} diff --git a/src/en/saturdaymorningbreakfastcomics/src/eu/kanade/tachiyomi/extension/en/saturdaymorningbreakfastcomics/SaturdayMorningBreakfastComics.kt b/src/en/saturdaymorningbreakfastcomics/src/eu/kanade/tachiyomi/extension/en/saturdaymorningbreakfastcomics/SaturdayMorningBreakfastComics.kt index b50a9ba34..ca23af22c 100644 --- a/src/en/saturdaymorningbreakfastcomics/src/eu/kanade/tachiyomi/extension/en/saturdaymorningbreakfastcomics/SaturdayMorningBreakfastComics.kt +++ b/src/en/saturdaymorningbreakfastcomics/src/eu/kanade/tachiyomi/extension/en/saturdaymorningbreakfastcomics/SaturdayMorningBreakfastComics.kt @@ -1,6 +1,7 @@ package eu.kanade.tachiyomi.extension.en.saturdaymorningbreakfastcomics -import android.net.Uri.encode +import eu.kanade.tachiyomi.lib.textinterceptor.TextInterceptor +import eu.kanade.tachiyomi.lib.textinterceptor.TextInterceptorHelper import eu.kanade.tachiyomi.network.asObservable import eu.kanade.tachiyomi.source.model.FilterList import eu.kanade.tachiyomi.source.model.MangasPage @@ -10,8 +11,12 @@ import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.online.HttpSource import eu.kanade.tachiyomi.util.asJsoup import keiyoushi.utils.tryParse +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.OkHttpClient +import okhttp3.Protocol import okhttp3.Request import okhttp3.Response +import okhttp3.ResponseBody.Companion.toResponseBody import rx.Observable import java.text.SimpleDateFormat import java.util.Locale @@ -28,27 +33,29 @@ class SaturdayMorningBreakfastComics : HttpSource() { override val lang = "en" override val supportsLatest = false + override val client: OkHttpClient = network.client.newBuilder() + .addInterceptor(TextInterceptor()) + .addInterceptor { chain -> + val request = chain.request() + val url = request.url + if (url.host != "thumbnail") return@addInterceptor chain.proceed(request) - private fun String.image() = - "https://fakeimg.ryd.tools/1500x2126/ffffff/000000/?font=museo&font_size=42&text=" + encode( - this, - ) - - // Taken from XKCD - private fun wordWrap(text: String) = buildString { - var charCount = 0 - text.replace("\r\n", " ").split(' ').forEach { w -> - if (charCount > 25) { - append("\n") - charCount = 0 - } - append(w).append(' ') - charCount += w.length + 1 + val image = this::class.java + .getResourceAsStream("/assets/thumbnail.png")!! + .readBytes() + val responseBody = image.toResponseBody("image/png".toMediaType()) + Response.Builder() + .request(request) + .protocol(Protocol.HTTP_1_1) + .code(200) + .message("OK") + .body(responseBody) + .build() } - } + .build() - override fun fetchPopularManga(page: Int): Observable { - val manga = SManga.create().apply { + private fun makeSManga(): SManga = + SManga.create().apply { title = "Saturday Morning Breakfast Comics" artist = "Zach Weinersmith" author = "Zach Weinersmith" @@ -56,9 +63,11 @@ class SaturdayMorningBreakfastComics : HttpSource() { url = "/comic/archive" description = "SMBC is a daily comic strip about life, philosophy, science, mathematics, and dirty jokes." - thumbnail_url = "https://fakeimg.ryd.tools/550x780/ffffff/6e7b91/?font=museo&text=SMBC" + thumbnail_url = "https://thumbnail/smbc.png" } + override fun fetchPopularManga(page: Int): Observable { + val manga = makeSManga() return Observable.just(MangasPage(listOf(manga), false)) } @@ -68,7 +77,7 @@ class SaturdayMorningBreakfastComics : HttpSource() { filters: FilterList, ): Observable = Observable.just(MangasPage(emptyList(), false)) - override fun fetchMangaDetails(manga: SManga): Observable = Observable.just(manga) + override fun fetchMangaDetails(manga: SManga): Observable = Observable.just(makeSManga()) override fun fetchChapterList(manga: SManga): Observable> { return client.newCall(chapterListRequest(manga)) @@ -98,7 +107,7 @@ class SaturdayMorningBreakfastComics : HttpSource() { val image = document.select("img#cc-comic") pages.add(Page(0, "", image.attr("abs:src"))) if (image.hasAttr("title")) { - pages.add(Page(1, "", wordWrap(image.attr("title")).image())) + pages.add(Page(1, "", TextInterceptorHelper.createUrl("", image.attr("title")))) } pages.add(Page(2, "", document.select("#aftercomic > img").attr("abs:src"))) return pages diff --git a/src/en/swordscomic/build.gradle b/src/en/swordscomic/build.gradle index 6bf8e72e3..8a0f1ac6a 100644 --- a/src/en/swordscomic/build.gradle +++ b/src/en/swordscomic/build.gradle @@ -1,7 +1,11 @@ ext { extName = 'Swords Comic' extClass = '.SwordsComic' - extVersionCode = 4 + extVersionCode = 5 } apply from: "$rootDir/common.gradle" + +dependencies { + implementation(project(':lib:textinterceptor')) +} diff --git a/src/en/swordscomic/src/eu/kanade/tachiyomi/extension/en/swordscomic/SwordsComic.kt b/src/en/swordscomic/src/eu/kanade/tachiyomi/extension/en/swordscomic/SwordsComic.kt index 87eee677a..cbed6e760 100644 --- a/src/en/swordscomic/src/eu/kanade/tachiyomi/extension/en/swordscomic/SwordsComic.kt +++ b/src/en/swordscomic/src/eu/kanade/tachiyomi/extension/en/swordscomic/SwordsComic.kt @@ -1,6 +1,7 @@ package eu.kanade.tachiyomi.extension.en.swordscomic -import android.net.Uri +import eu.kanade.tachiyomi.lib.textinterceptor.TextInterceptor +import eu.kanade.tachiyomi.lib.textinterceptor.TextInterceptorHelper import eu.kanade.tachiyomi.source.model.FilterList import eu.kanade.tachiyomi.source.model.MangasPage import eu.kanade.tachiyomi.source.model.Page @@ -25,7 +26,7 @@ class SwordsComic : HttpSource() { override val supportsLatest = false - override val client: OkHttpClient = network.cloudflareClient + override val client: OkHttpClient = network.cloudflareClient.newBuilder().addInterceptor(TextInterceptor()).build() private fun createManga(): SManga { return SManga.create().apply { @@ -92,21 +93,9 @@ class SwordsComic : HttpSource() { if (!imageElement.hasAttr("title")) { return listOf(Page(0, "", imageElement.attr("abs:src"))) } + val titleText = TextInterceptorHelper.createUrl("", imageElement.attr("title")) - val builder = StringBuilder() - var charCount = 0 - - for (word in imageElement.attr("title").splitToSequence(" ")) { - if (charCount + word.length > 45) { - builder.append("%0A") - charCount = 0 - } - charCount += word.length + 1 - builder.append(Uri.encode(word.uppercase())) - builder.append("+") - } - - return listOf(Page(0, "", imageElement.attr("abs:src")), Page(1, "", "https://fakeimg.ryd.tools/1800x2252/978B65/000000/?text=$builder&font_size=60&font=comic+sans")) + return listOf(Page(0, "", imageElement.attr("abs:src")), Page(1, "", titleText)) } override fun imageUrlParse(response: Response): String = throw UnsupportedOperationException()