From 8dd884535b0447fc24ebd438d2fa1caf9389bad2 Mon Sep 17 00:00:00 2001 From: Mike <51273546+SnakeDoc83@users.noreply.github.com> Date: Thu, 8 Feb 2024 01:30:57 -0500 Subject: [PATCH] AsmHentai - new source (#1106) * AsmHentai - new source * cleanup --- src/all/asmhentai/AndroidManifest.xml | 20 ++ src/all/asmhentai/build.gradle | 8 + .../asmhentai/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 4183 bytes .../asmhentai/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2273 bytes .../res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 6336 bytes .../res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 12084 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 18931 bytes .../extension/all/asmhentai/ASMHFactory.kt | 13 + .../all/asmhentai/ASMHUrlActivity.kt | 37 +++ .../extension/all/asmhentai/AsmHentai.kt | 274 ++++++++++++++++++ 10 files changed, 352 insertions(+) create mode 100644 src/all/asmhentai/AndroidManifest.xml create mode 100644 src/all/asmhentai/build.gradle create mode 100644 src/all/asmhentai/res/mipmap-hdpi/ic_launcher.png create mode 100644 src/all/asmhentai/res/mipmap-mdpi/ic_launcher.png create mode 100644 src/all/asmhentai/res/mipmap-xhdpi/ic_launcher.png create mode 100644 src/all/asmhentai/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 src/all/asmhentai/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 src/all/asmhentai/src/eu/kanade/tachiyomi/extension/all/asmhentai/ASMHFactory.kt create mode 100644 src/all/asmhentai/src/eu/kanade/tachiyomi/extension/all/asmhentai/ASMHUrlActivity.kt create mode 100644 src/all/asmhentai/src/eu/kanade/tachiyomi/extension/all/asmhentai/AsmHentai.kt diff --git a/src/all/asmhentai/AndroidManifest.xml b/src/all/asmhentai/AndroidManifest.xml new file mode 100644 index 000000000..9de41aa38 --- /dev/null +++ b/src/all/asmhentai/AndroidManifest.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + diff --git a/src/all/asmhentai/build.gradle b/src/all/asmhentai/build.gradle new file mode 100644 index 000000000..e73783778 --- /dev/null +++ b/src/all/asmhentai/build.gradle @@ -0,0 +1,8 @@ +ext { + extName = 'AsmHentai' + extClass = '.ASMHFactory' + extVersionCode = 1 + isNsfw = true +} + +apply from: "$rootDir/common.gradle" diff --git a/src/all/asmhentai/res/mipmap-hdpi/ic_launcher.png b/src/all/asmhentai/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..727c9de39cef67bade2ff15a98d08922ad7171cb GIT binary patch literal 4183 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 literal 0 HcmV?d00001 diff --git a/src/all/asmhentai/res/mipmap-xhdpi/ic_launcher.png b/src/all/asmhentai/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..93451c687341d3652cc0a08f3b3eea5ba493b0eb GIT binary patch literal 6336 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 F{{o?o?%DtV literal 0 HcmV?d00001 diff --git a/src/all/asmhentai/src/eu/kanade/tachiyomi/extension/all/asmhentai/ASMHFactory.kt b/src/all/asmhentai/src/eu/kanade/tachiyomi/extension/all/asmhentai/ASMHFactory.kt new file mode 100644 index 000000000..41a2563d5 --- /dev/null +++ b/src/all/asmhentai/src/eu/kanade/tachiyomi/extension/all/asmhentai/ASMHFactory.kt @@ -0,0 +1,13 @@ +package eu.kanade.tachiyomi.extension.all.asmhentai + +import eu.kanade.tachiyomi.source.Source +import eu.kanade.tachiyomi.source.SourceFactory + +class ASMHFactory : SourceFactory { + override fun createSources(): List = listOf( + AsmHentai("en", "english"), + AsmHentai("ja", "japanese"), + AsmHentai("zh", "chinese"), + AsmHentai("all", ""), + ) +} diff --git a/src/all/asmhentai/src/eu/kanade/tachiyomi/extension/all/asmhentai/ASMHUrlActivity.kt b/src/all/asmhentai/src/eu/kanade/tachiyomi/extension/all/asmhentai/ASMHUrlActivity.kt new file mode 100644 index 000000000..c984eae77 --- /dev/null +++ b/src/all/asmhentai/src/eu/kanade/tachiyomi/extension/all/asmhentai/ASMHUrlActivity.kt @@ -0,0 +1,37 @@ +package eu.kanade.tachiyomi.extension.all.asmhentai + +import android.app.Activity +import android.content.ActivityNotFoundException +import android.content.Intent +import android.os.Bundle +import android.util.Log +import kotlin.system.exitProcess + +/** + * Springboard that accepts https://asmhentai.com/g/xxxxxx intents and redirects them to + * the main Tachiyomi process. + */ +class ASMHUrlActivity : Activity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + val pathSegments = intent?.data?.pathSegments + if (pathSegments != null && pathSegments.size > 1) { + val mainIntent = Intent().apply { + action = "eu.kanade.tachiyomi.SEARCH" + putExtra("query", "${AsmHentai.PREFIX_ID_SEARCH}${pathSegments[1]}") + putExtra("filter", packageName) + } + + try { + startActivity(mainIntent) + } catch (e: ActivityNotFoundException) { + Log.e("ASMHUrlActivity", e.toString()) + } + } else { + Log.e("ASMHUrlActivity", "could not parse uri from intent $intent") + } + + finish() + exitProcess(0) + } +} diff --git a/src/all/asmhentai/src/eu/kanade/tachiyomi/extension/all/asmhentai/AsmHentai.kt b/src/all/asmhentai/src/eu/kanade/tachiyomi/extension/all/asmhentai/AsmHentai.kt new file mode 100644 index 000000000..f470fca67 --- /dev/null +++ b/src/all/asmhentai/src/eu/kanade/tachiyomi/extension/all/asmhentai/AsmHentai.kt @@ -0,0 +1,274 @@ +package eu.kanade.tachiyomi.extension.all.asmhentai + +import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.network.POST +import eu.kanade.tachiyomi.network.asObservableSuccess +import eu.kanade.tachiyomi.source.model.Filter +import eu.kanade.tachiyomi.source.model.FilterList +import eu.kanade.tachiyomi.source.model.MangasPage +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.UpdateStrategy +import eu.kanade.tachiyomi.source.online.ParsedHttpSource +import eu.kanade.tachiyomi.util.asJsoup +import okhttp3.FormBody +import okhttp3.HttpUrl.Companion.toHttpUrl +import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.Response +import org.jsoup.nodes.Document +import org.jsoup.nodes.Element +import rx.Observable + +open class AsmHentai(override val lang: String, private val tlTag: String) : ParsedHttpSource() { + + override val client: OkHttpClient = network.cloudflareClient + + override val baseUrl = "https://asmhentai.com" + + override val name = "AsmHentai" + + override val supportsLatest = false + + // Popular + + override fun popularMangaRequest(page: Int): Request { + val url = baseUrl.toHttpUrl().newBuilder().apply { + if (tlTag.isNotEmpty()) addPathSegments("language/$tlTag/") + if (page > 1) addQueryParameter("page", page.toString()) + } + return GET(url.build(), headers) + } + + override fun popularMangaSelector(): String = ".preview_item" + + private fun Element.mangaTitle() = select("h2").text() + + private fun Element.mangaUrl() = select(".image a").attr("abs:href") + + private fun Element.mangaThumbnail() = select(".image img").attr("abs:src") + + override fun popularMangaFromElement(element: Element): SManga { + return SManga.create().apply { + title = element.mangaTitle() + setUrlWithoutDomain(element.mangaUrl()) + thumbnail_url = element.mangaThumbnail() + } + } + + override fun popularMangaNextPageSelector(): String = "li.active + li:not(.disabled)" + + // Latest + + override fun latestUpdatesNextPageSelector(): String? { + throw UnsupportedOperationException() + } + + override fun latestUpdatesRequest(page: Int): Request { + throw UnsupportedOperationException() + } + + override fun latestUpdatesFromElement(element: Element): SManga { + throw UnsupportedOperationException() + } + + override fun latestUpdatesSelector(): String { + throw UnsupportedOperationException() + } + + // Search + + override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable { + return when { + query.startsWith(PREFIX_ID_SEARCH) -> { + val id = query.removePrefix(PREFIX_ID_SEARCH) + client.newCall(searchMangaByIdRequest(id)) + .asObservableSuccess() + .map { response -> searchMangaByIdParse(response, id) } + } + query.toIntOrNull() != null -> { + client.newCall(searchMangaByIdRequest(query)) + .asObservableSuccess() + .map { response -> searchMangaByIdParse(response, query) } + } + else -> super.fetchSearchManga(page, query, filters) + } + } + + // any space except after a comma (we're going to replace spaces only between words) + private val spaceRegex = Regex("""(? query + query.isBlank() -> tags + else -> "$query,$tags" + }.replace(spaceRegex, "+") + + val url = baseUrl.toHttpUrl().newBuilder().apply { + addPathSegments("search/") + addEncodedQueryParameter("q", q) + if (page > 1) addQueryParameter("page", page.toString()) + } + + return GET(url.build(), headers) + } + + private class SMangaDto( + val title: String, + val url: String, + val thumbnail: String, + val lang: String, + ) + + override fun searchMangaParse(response: Response): MangasPage { + val doc = response.asJsoup() + + val mangas = doc.select(searchMangaSelector()) + .map { + SMangaDto( + title = it.mangaTitle(), + url = it.mangaUrl(), + thumbnail = it.mangaThumbnail(), + lang = it.select("a:has(.flag)").attr("href").removeSuffix("/").substringAfterLast("/"), + ) + } + .let { unfiltered -> + if (tlTag.isNotEmpty()) unfiltered.filter { it.lang == tlTag } else unfiltered + } + .map { + SManga.create().apply { + title = it.title + setUrlWithoutDomain(it.url) + thumbnail_url = it.thumbnail + } + } + + return MangasPage(mangas, doc.select(searchMangaNextPageSelector()).isNotEmpty()) + } + + private fun searchMangaByIdRequest(id: String) = GET("$baseUrl/g/$id/", headers) + + private fun searchMangaByIdParse(response: Response, id: String): MangasPage { + val details = mangaDetailsParse(response) + details.url = "/g/$id/" + return MangasPage(listOf(details), false) + } + + override fun searchMangaFromElement(element: Element) = popularMangaFromElement(element) + + override fun searchMangaSelector() = popularMangaSelector() + + override fun searchMangaNextPageSelector() = popularMangaNextPageSelector() + + // Details + + private fun Element.get(tag: String): String { + return select(".tags:contains($tag) .tag").joinToString { it.ownText() } + } + + override fun mangaDetailsParse(document: Document): SManga { + return SManga.create().apply { + update_strategy = UpdateStrategy.ONLY_FETCH_ONCE + document.select(".book_page").first()!!.let { element -> + thumbnail_url = element.select(".cover img").attr("abs:src") + title = element.select("h1").text() + genre = element.get("Tags") + artist = element.get("Artists") + author = artist + description = listOf("Parodies", "Groups", "Languages", "Category") + .mapNotNull { tag -> + element.get(tag).let { if (it.isNotEmpty()) "$tag: $it" else null } + } + .joinToString("\n", postfix = "\n") + + element.select(".pages h3").text() + + element.select("h1 + h2").text() + .let { altTitle -> if (altTitle.isNotEmpty()) "\nAlternate Title: $altTitle" else "" } + } + } + } + + // Chapters + + override fun fetchChapterList(manga: SManga): Observable> { + return Observable.just( + listOf( + SChapter.create().apply { + name = "Chapter" + url = manga.url + }, + ), + ) + } + + override fun chapterListSelector(): String { + throw UnsupportedOperationException() + } + + override fun chapterFromElement(element: Element): SChapter { + throw UnsupportedOperationException() + } + + // Pages + + // convert thumbnail URLs to full image URLs + private fun String.full(): String { + val fType = substringAfterLast("t") + return replace("t$fType", fType) + } + + private fun Document.inputIdValueOf(string: String): String { + return select("input[id=$string]").attr("value") + } + + override fun pageListParse(document: Document): List { + val thumbUrls = document.select(".preview_thumb img") + .map { it.attr("abs:data-src") } + .toMutableList() + + // input only exists if pages > 10 and have to make a request to get the other thumbnails + val totalPages = document.inputIdValueOf("t_pages") + + if (totalPages.isNotEmpty()) { + val token = document.select("[name=csrf-token]").attr("content") + + val form = FormBody.Builder() + .add("_token", token) + .add("id", document.inputIdValueOf("load_id")) + .add("dir", document.inputIdValueOf("load_dir")) + .add("visible_pages", "10") + .add("t_pages", totalPages) + .add("type", "2") // 1 would be "more", 2 is "all remaining" + .build() + + val xhrHeaders = headers.newBuilder() + .add("X-Requested-With", "XMLHttpRequest") + .build() + + client.newCall(POST("$baseUrl/inc/thumbs_loader.php", xhrHeaders, form)) + .execute() + .asJsoup() + .select("img") + .mapTo(thumbUrls) { it.attr("abs:data-src") } + } + return thumbUrls.mapIndexed { i, url -> Page(i, "", url.full()) } + } + + override fun imageUrlParse(document: Document) = throw UnsupportedOperationException() + + // Filters + + override fun getFilterList(): FilterList = FilterList( + Filter.Header("Separate tags with commas (,)"), + TagFilter(), + ) + + class TagFilter : Filter.Text("Tags") + + companion object { + const val PREFIX_ID_SEARCH = "id:" + } +}