diff --git a/lib-multisrc/readallcomics/build.gradle.kts b/lib-multisrc/readallcomics/build.gradle.kts deleted file mode 100644 index dc076cc37..000000000 --- a/lib-multisrc/readallcomics/build.gradle.kts +++ /dev/null @@ -1,5 +0,0 @@ -plugins { - id("lib-multisrc") -} - -baseVersionCode = 1 diff --git a/lib-multisrc/readallcomics/res/mipmap-hdpi/ic_launcher.png b/lib-multisrc/readallcomics/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index fd351bd91..000000000 Binary files a/lib-multisrc/readallcomics/res/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/lib-multisrc/readallcomics/res/mipmap-mdpi/ic_launcher.png b/lib-multisrc/readallcomics/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 510e4c827..000000000 Binary files a/lib-multisrc/readallcomics/res/mipmap-mdpi/ic_launcher.png and /dev/null differ diff --git a/lib-multisrc/readallcomics/res/mipmap-xhdpi/ic_launcher.png b/lib-multisrc/readallcomics/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 68107c649..000000000 Binary files a/lib-multisrc/readallcomics/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/lib-multisrc/readallcomics/res/mipmap-xxhdpi/ic_launcher.png b/lib-multisrc/readallcomics/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index db82daebe..000000000 Binary files a/lib-multisrc/readallcomics/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/lib-multisrc/readallcomics/res/mipmap-xxxhdpi/ic_launcher.png b/lib-multisrc/readallcomics/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index aa394ccc6..000000000 Binary files a/lib-multisrc/readallcomics/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/readallcomicscom/build.gradle b/src/en/readallcomicscom/build.gradle index f79ec0c18..a4158f6c5 100644 --- a/src/en/readallcomicscom/build.gradle +++ b/src/en/readallcomicscom/build.gradle @@ -1,9 +1,7 @@ ext { extName = 'ReadAllComics' - extClass = '.ReadAllComicsCom' - themePkg = 'readallcomics' - baseUrl = 'https://readallcomics.com' - overrideVersionCode = 1 + extClass = '.ReadAllComics' + extVersionCode = 3 } apply from: "$rootDir/common.gradle" diff --git a/lib-multisrc/readallcomics/src/eu/kanade/tachiyomi/multisrc/readallcomics/ReadAllComics.kt b/src/en/readallcomicscom/src/eu/kanade/tachiyomi/extension/en/readallcomicscom/ReadAllComics.kt similarity index 61% rename from lib-multisrc/readallcomics/src/eu/kanade/tachiyomi/multisrc/readallcomics/ReadAllComics.kt rename to src/en/readallcomicscom/src/eu/kanade/tachiyomi/extension/en/readallcomicscom/ReadAllComics.kt index 845d926b7..3b7e65985 100644 --- a/lib-multisrc/readallcomics/src/eu/kanade/tachiyomi/multisrc/readallcomics/ReadAllComics.kt +++ b/src/en/readallcomicscom/src/eu/kanade/tachiyomi/extension/en/readallcomicscom/ReadAllComics.kt @@ -1,4 +1,4 @@ -package eu.kanade.tachiyomi.multisrc.readallcomics +package eu.kanade.tachiyomi.extension.en.readallcomicscom import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.asObservableSuccess @@ -10,8 +10,10 @@ 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 okhttp3.HttpUrl.Companion.toHttpUrl import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.Interceptor +import okhttp3.Request import okhttp3.Response import org.jsoup.Jsoup import org.jsoup.nodes.Document @@ -19,11 +21,13 @@ import org.jsoup.nodes.Element import org.jsoup.select.Elements import rx.Observable -abstract class ReadAllComics( - override val name: String, - override val baseUrl: String, - override val lang: String, -) : ParsedHttpSource() { +class ReadAllComics : ParsedHttpSource() { + + override val name = "ReadAllComics" + + override val baseUrl = "https://readallcomics.com" + + override val lang = "en" override val supportsLatest = false @@ -34,7 +38,7 @@ abstract class ReadAllComics( .rateLimit(2) .build() - protected open fun archivedCategoryInterceptor(chain: Interceptor.Chain): Response { + private fun archivedCategoryInterceptor(chain: Interceptor.Chain): Response { val request = chain.request() val response = chain.proceed(request) @@ -43,7 +47,7 @@ abstract class ReadAllComics( request.url.toString(), ) - val newUrl = document.selectFirst(archivedCategorySelector()) + val newUrl = document.selectFirst(".description-archive > p > span > a") ?.attr("href")?.toHttpUrlOrNull() ?: return response @@ -60,33 +64,18 @@ abstract class ReadAllComics( return response } - protected open fun archivedCategorySelector() = ".description-archive > p > span > a" - override fun popularMangaRequest(page: Int) = GET("$baseUrl${if (page > 1)"/page/$page/" else ""}", headers) - override fun popularMangaParse(response: Response): MangasPage { - val document = response.asJsoup() - - val mangas = document.select(popularMangaSelector()).mapNotNull { - nullablePopularManga(it) - } - - val hasNextPage = document.select(popularMangaNextPageSelector()).first() != null - - return MangasPage(mangas, hasNextPage) - } - - protected open fun nullablePopularManga(element: Element): SManga? { + override fun popularMangaFromElement(element: Element): SManga { val manga = SManga.create().apply { val category = element.classNames() - .firstOrNull { it.startsWith("category-") } - ?.substringAfter("category-") - ?: return null + .firstOrNull { it.startsWith("category-") }!! + .substringAfter("category-") url = "/category/$category/" - title = element.select(popularMangaTitleSelector()).text() - thumbnail_url = element.select(popularMangaThumbnailSelector()).attr("abs:src") + title = category.replace("-", " ").capitalizeEachWord() + thumbnail_url = element.select("img").attr("abs:src") } return manga @@ -94,8 +83,6 @@ abstract class ReadAllComics( override fun popularMangaSelector() = "#post-area > div" override fun popularMangaNextPageSelector() = "div.pagenavi > a.next" - protected open fun popularMangaTitleSelector() = "h2" - protected open fun popularMangaThumbnailSelector() = "img" override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable<MangasPage> { return if (page == 1) { @@ -107,10 +94,15 @@ abstract class ReadAllComics( } } - override fun searchMangaRequest(page: Int, query: String, filters: FilterList) = - GET("$baseUrl/?story=${query.trim()}&s=&type=${searchType()}", headers) + override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { + val url = baseUrl.toHttpUrl().newBuilder().apply { + addQueryParameter("story", query) + addQueryParameter("s", "") + addQueryParameter("type", "comic") + }.build() - protected open fun searchType() = "comic" + return GET(url, headers) + } override fun searchMangaParse(response: Response): MangasPage { searchPageElements = response.asJsoup().select(searchMangaSelector()) @@ -133,27 +125,32 @@ abstract class ReadAllComics( override fun searchMangaFromElement(element: Element) = SManga.create().apply { setUrlWithoutDomain(element.attr("href")) - title = element.text().trim() - thumbnail_url = searchCover + title = element.text() + thumbnail_url = "https://fakeimg.pl/200x300/?text=No%20Cover%0AOn%20Search&font_size=62" } override fun searchMangaSelector() = ".categories a" override fun searchMangaNextPageSelector() = null override fun mangaDetailsParse(document: Document) = SManga.create().apply { - title = document.select(mangaDetailsTitleSelector()).text().trim() - genre = document.select(mangaDetailsGenreSelector()).joinToString { it.text().trim() } - author = document.select(mangaDetailsAuthorSelector()).last()?.text()?.trim() - description = document.select(mangaDetailsDescriptionSelector()).text().trim() - thumbnail_url = document.select(mangaDetailsThumbnailSelector()).attr("abs:src") + title = document.selectFirst("h1")!!.text() + genre = document.select("p strong").joinToString { it.text() } + author = document.select("p > strong").last()?.text() + description = buildString { + document.select(".b > strong").forEach { element -> + val vol = element.previousElementSibling() + if (isNotBlank()) { + append("\n\n") + } + if (vol?.tagName() == "span") { + append(vol.text(), "\n") + } + append(element.text()) + } + } + thumbnail_url = document.select("p img").attr("abs:src") } - protected open fun mangaDetailsTitleSelector() = "h1" - protected open fun mangaDetailsGenreSelector() = "p strong" - protected open fun mangaDetailsAuthorSelector() = "p > strong" - protected open fun mangaDetailsDescriptionSelector() = ".b > strong" - protected open fun mangaDetailsThumbnailSelector() = "p img" - override fun chapterListSelector() = ".list-story a" override fun chapterFromElement(element: Element) = SChapter.create().apply { @@ -162,15 +159,25 @@ abstract class ReadAllComics( } override fun pageListParse(document: Document): List<Page> { - return document.select(pageListSelector()).mapIndexed { idx, element -> + return document.select("body img:not(body div[id=\"logo\"] img)").mapIndexed { idx, element -> Page(idx, "", element.attr("abs:src")) } } - protected open fun pageListSelector() = "body > div img" - - companion object { - private const val searchCover = "https://fakeimg.pl/200x300/?text=No%20Cover%0AOn%20Search&font_size=62" + private fun String.capitalizeEachWord(): String { + val result = StringBuilder(length) + var capitalize = true + for (char in this) { + result.append( + if (capitalize) { + char.uppercase() + } else { + char.lowercase() + }, + ) + capitalize = char.isWhitespace() + } + return result.toString() } override fun imageUrlParse(document: Document) = @@ -183,6 +190,4 @@ abstract class ReadAllComics( throw UnsupportedOperationException() override fun latestUpdatesNextPageSelector() = throw UnsupportedOperationException() - override fun popularMangaFromElement(element: Element) = - throw UnsupportedOperationException() } diff --git a/src/en/readallcomicscom/src/eu/kanade/tachiyomi/extension/en/readallcomicscom/ReadAllComicsCom.kt b/src/en/readallcomicscom/src/eu/kanade/tachiyomi/extension/en/readallcomicscom/ReadAllComicsCom.kt deleted file mode 100644 index 967ab5a89..000000000 --- a/src/en/readallcomicscom/src/eu/kanade/tachiyomi/extension/en/readallcomicscom/ReadAllComicsCom.kt +++ /dev/null @@ -1,25 +0,0 @@ -package eu.kanade.tachiyomi.extension.en.readallcomicscom - -import eu.kanade.tachiyomi.multisrc.readallcomics.ReadAllComics -import eu.kanade.tachiyomi.source.model.SManga -import org.jsoup.nodes.Element - -class ReadAllComicsCom : ReadAllComics("ReadAllComics", "https://readallcomics.com", "en") { - - override fun nullablePopularManga(element: Element): SManga? { - return super.nullablePopularManga(element)?.apply { - title = title.let { - titleRegex.find(it)?.value?.trim() - ?.removeSuffix("v")?.trim() - ?.substringBeforeLast("vol") - ?: it - } - } - } - - override fun pageListSelector() = "body img:not(body div[id=\"logo\"] img)" - - companion object { - private val titleRegex = Regex("""^([a-zA-Z_.\s\-–:]*)""") - } -} diff --git a/src/en/readallmanga/build.gradle b/src/en/readallmanga/build.gradle deleted file mode 100644 index 44b1dd0e5..000000000 --- a/src/en/readallmanga/build.gradle +++ /dev/null @@ -1,9 +0,0 @@ -ext { - extName = 'ReadAllManga' - extClass = '.ReadAllManga' - themePkg = 'readallcomics' - baseUrl = 'https://readallmanga.com' - overrideVersionCode = 0 -} - -apply from: "$rootDir/common.gradle" diff --git a/src/en/readallmanga/res/mipmap-hdpi/ic_launcher.png b/src/en/readallmanga/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index d45a3817e..000000000 Binary files a/src/en/readallmanga/res/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/readallmanga/res/mipmap-mdpi/ic_launcher.png b/src/en/readallmanga/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 17c4a0a3f..000000000 Binary files a/src/en/readallmanga/res/mipmap-mdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/readallmanga/res/mipmap-xhdpi/ic_launcher.png b/src/en/readallmanga/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 16b08944a..000000000 Binary files a/src/en/readallmanga/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/readallmanga/res/mipmap-xxhdpi/ic_launcher.png b/src/en/readallmanga/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index 7e2c0ae34..000000000 Binary files a/src/en/readallmanga/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/readallmanga/res/mipmap-xxxhdpi/ic_launcher.png b/src/en/readallmanga/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 274fc4f44..000000000 Binary files a/src/en/readallmanga/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/readallmanga/src/eu/kanade/tachiyomi/extension/en/readallmanga/ReadAllManga.kt b/src/en/readallmanga/src/eu/kanade/tachiyomi/extension/en/readallmanga/ReadAllManga.kt deleted file mode 100644 index aa0f7598c..000000000 --- a/src/en/readallmanga/src/eu/kanade/tachiyomi/extension/en/readallmanga/ReadAllManga.kt +++ /dev/null @@ -1,23 +0,0 @@ -package eu.kanade.tachiyomi.extension.en.readallmanga - -import eu.kanade.tachiyomi.multisrc.readallcomics.ReadAllComics -import eu.kanade.tachiyomi.source.model.SManga -import org.jsoup.nodes.Document - -class ReadAllManga : ReadAllComics("ReadAllManga", "https://readallmanga.com", "en") { - - override fun searchType() = "manga" - - override fun popularMangaTitleSelector() = "div > center" - - override fun mangaDetailsParse(document: Document): SManga { - return super.mangaDetailsParse(document).apply { - genre = document.select(mangaDetailsGenreSelector()).text() - .split("–").joinToString { it.trim() } - } - } - - override fun mangaDetailsDescriptionSelector() = ".b > span" - override fun mangaDetailsGenreSelector() = ".b > p > strong:nth-child(8)" - override fun mangaDetailsAuthorSelector() = ".b > p > strong:nth-child(5)" -}