From c063dda9f0331fc1ca6d3bdab4da4e7693b4d3c0 Mon Sep 17 00:00:00 2001 From: Chopper <156493704+choppeh@users.noreply.github.com> Date: Mon, 20 Jan 2025 03:06:44 -0300 Subject: [PATCH] Add MangaHosted (#7259) * Add MangaHosted * Fix search request --- src/all/mangahosted/AndroidManifest.xml | 22 ++ src/all/mangahosted/build.gradle | 8 + .../res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3813 bytes .../res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2128 bytes .../res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4895 bytes .../res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 8691 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 12421 bytes .../extension/all/mangahosted/MangaHosted.kt | 202 ++++++++++++++++++ .../all/mangahosted/MangaHostedDto.kt | 68 ++++++ .../all/mangahosted/MangaHostedFactory.kt | 30 +++ .../all/mangahosted/MangaHostedUrlActivity.kt | 36 ++++ 11 files changed, 366 insertions(+) create mode 100644 src/all/mangahosted/AndroidManifest.xml create mode 100644 src/all/mangahosted/build.gradle create mode 100644 src/all/mangahosted/res/mipmap-hdpi/ic_launcher.png create mode 100644 src/all/mangahosted/res/mipmap-mdpi/ic_launcher.png create mode 100644 src/all/mangahosted/res/mipmap-xhdpi/ic_launcher.png create mode 100644 src/all/mangahosted/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 src/all/mangahosted/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 src/all/mangahosted/src/eu/kanade/tachiyomi/extension/all/mangahosted/MangaHosted.kt create mode 100644 src/all/mangahosted/src/eu/kanade/tachiyomi/extension/all/mangahosted/MangaHostedDto.kt create mode 100644 src/all/mangahosted/src/eu/kanade/tachiyomi/extension/all/mangahosted/MangaHostedFactory.kt create mode 100644 src/all/mangahosted/src/eu/kanade/tachiyomi/extension/all/mangahosted/MangaHostedUrlActivity.kt diff --git a/src/all/mangahosted/AndroidManifest.xml b/src/all/mangahosted/AndroidManifest.xml new file mode 100644 index 000000000..89ee9a464 --- /dev/null +++ b/src/all/mangahosted/AndroidManifest.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + diff --git a/src/all/mangahosted/build.gradle b/src/all/mangahosted/build.gradle new file mode 100644 index 000000000..f2fb40324 --- /dev/null +++ b/src/all/mangahosted/build.gradle @@ -0,0 +1,8 @@ +ext { + extName = 'Manga Hosted' + extClass = '.MangaHostedFactory' + extVersionCode = 1 + isNsfw = true +} + +apply from: "$rootDir/common.gradle" diff --git a/src/all/mangahosted/res/mipmap-hdpi/ic_launcher.png b/src/all/mangahosted/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..c67ab461b20b291280532b804b845a3b40a68db5 GIT binary patch literal 3813 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μ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 RQLO*~002ovPDHLkV1kWhBai?9 literal 0 HcmV?d00001 diff --git a/src/all/mangahosted/res/mipmap-xxhdpi/ic_launcher.png b/src/all/mangahosted/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..16718149575ffdb24ec77186ff3052fc01c35534 GIT binary patch literal 8691 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 RcQ^n5002ovPDHLkV1klbr1Jm( literal 0 HcmV?d00001 diff --git a/src/all/mangahosted/res/mipmap-xxxhdpi/ic_launcher.png b/src/all/mangahosted/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..fe00773e6864096f5054794d779f41bfa0cafcd3 GIT binary patch literal 12421 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 + val mangas = dto.data.map(::mangaParse) + return MangasPage( + mangas = mangas, + hasNextPage = dto.hasNextPage(), + ) + } + + // ================================= Latest =========================================== + + override fun latestUpdatesRequest(page: Int): Request { + val maxResult = 24 + val url = "$apiUrl/${langOption.infix}/HomeLastUpdate".toHttpUrl().newBuilder() + .addPathSegment("$maxResult") + .addPathSegment("${page - 1}") + .build() + return GET(url, headers) + } + + override fun latestUpdatesParse(response: Response) = popularMangaParse(response) + + // ================================= Search =========================================== + + override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { + val maxResult = 20 + val url = "$apiUrl/${langOption.infix}/SeachPage/$maxResult/${page - 1}".toHttpUrl().newBuilder() + .addPathSegment(query) + .build() + return GET(url, headers) + } + + override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable { + if (query.startsWith(SEARCH_PREFIX)) { + val url = "$baseUrl/${langOption.infix}/${query.substringAfter(SEARCH_PREFIX)}" + return client.newCall(GET(url, headers)) + .asObservableSuccess().map { response -> + val mangas = try { listOf(mangaDetailsParse(response)) } catch (_: Exception) { emptyList() } + MangasPage(mangas, false) + } + } + return super.fetchSearchManga(page, query, filters) + } + + override fun searchMangaParse(response: Response): MangasPage { + val dto = response.parseAs() + return MangasPage( + dto.mangas.map(::mangaParse), + false, + ) + } + + // ================================= Details ========================================== + + override fun mangaDetailsRequest(manga: SManga): Request { + val url = "$apiUrl/${langOption.infix}/getInfoManga".toHttpUrl().newBuilder() + .addPathSegment(manga.slug()) + .build() + return GET(url, headers) + } + + override fun mangaDetailsParse(response: Response): SManga { + val dto = response.parseAs() + return mangaParse(dto.details) + } + + override fun getMangaUrl(manga: SManga): String { + return baseUrl + manga.url.replace(langOption.infix, langOption.mangaSubstring) + } + + // ================================= Chapter ========================================== + + override fun fetchChapterList(manga: SManga): Observable> { + val chapters = mutableListOf() + var currentPage = 0 + do { + val chaptersDto = fetchChapterListPageable(manga, currentPage++) + chapters += chaptersDto.data.map { chapter -> + SChapter.create().apply { + name = chapter.name + date_upload = chapter.date.toDate() + url = chapter.toChapterUrl(langOption.infix) + } + } + } while (chaptersDto.hasNextPage()) + return Observable.just(chapters) + } + + private fun fetchChapterListPageable(manga: SManga, page: Int): Pageable { + val maxResult = 100 + val url = "$apiUrl/${langOption.infix}/GetChapterListFilter/${manga.slug()}/$maxResult/$page/all/${langOption.orderBy}" + return client.newCall(GET(url, headers)).execute() + .parseAs>() + } + + override fun chapterListParse(response: Response) = throw UnsupportedOperationException() + + // ================================= Pages ============================================ + + override fun pageListRequest(chapter: SChapter): Request { + val chapterSlug = chapter.url.substringAfter(langOption.infix) + val url = "$apiUrl/${langOption.infix}/GetImageChapter$chapterSlug" + return GET(url, headers) + } + + override fun imageRequest(page: Page): Request { + val imageHeaders = headers.newBuilder() + .set("Accept", "image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8") + .removeAll("Referer") + .build() + return super.imageRequest(page).newBuilder() + .headers(imageHeaders) + .build() + } + + override fun pageListParse(response: Response): List { + val location = response.request.url.toString() + val dto = response.parseAs() + return dto.pages.mapIndexed { index, url -> + Page(index, location, imageUrl = url) + } + } + + override fun imageUrlParse(response: Response): String = "" + + // ================================= Utilities ======================================= + + private inline fun Response.parseAs(): T { + return json.decodeFromString(body.string()) + } + + private fun SManga.slug() = this.url.split("/").last() + + private fun mangaParse(dto: MangaDto): SManga { + return SManga.create().apply { + title = dto.title + thumbnail_url = dto.thumbnailUrl + status = dto.status + url = "/${langOption.infix}/${dto.slug}" + genre = dto.genres + initialized = true + } + } + + private fun String.toDate(): Long = + try { dateFormat.parse(trim())!!.time } catch (_: Exception) { 0L } + + companion object { + const val SEARCH_PREFIX = "slug:" + val baseApiUrl = "https://api.novelfull.us" + val apiUrl = "$baseApiUrl/api" + val dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSS", Locale.ENGLISH) + } +} diff --git a/src/all/mangahosted/src/eu/kanade/tachiyomi/extension/all/mangahosted/MangaHostedDto.kt b/src/all/mangahosted/src/eu/kanade/tachiyomi/extension/all/mangahosted/MangaHostedDto.kt new file mode 100644 index 000000000..4ef2d8c42 --- /dev/null +++ b/src/all/mangahosted/src/eu/kanade/tachiyomi/extension/all/mangahosted/MangaHostedDto.kt @@ -0,0 +1,68 @@ +package eu.kanade.tachiyomi.extension.all.mangahosted + +import eu.kanade.tachiyomi.source.model.SManga +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +class MangaDetailsDto(private val data: Props) { + val details: MangaDto get() = data.details + + @Serializable + class Props( + @SerialName("infoDoc") val details: MangaDto, + ) +} + +@Serializable +open class Pageable( + var currentPage: Int, + var totalPage: Int, + val data: List, +) { + fun hasNextPage() = (currentPage + 1) <= totalPage +} + +@Serializable +class ChapterDto( + val date: String, + @SerialName("idDoc") val slugManga: String, + @SerialName("idDetail") val id: String, + @SerialName("nameChapter") val name: String, +) { + fun toChapterUrl(lang: String) = "/$lang/${this.slugManga}/$id" +} + +@Serializable +class MangaDto( + @SerialName("name") val title: String, + @SerialName("image") private val _thumbnailUrl: String, + @SerialName("idDoc") val slug: String, + @SerialName("genresName") val genres: String, + @SerialName("status") val _status: String, +) { + val thumbnailUrl get() = "${MangaHosted.baseApiUrl}$_thumbnailUrl" + + val status get() = when (_status) { + "ongoing" -> SManga.ONGOING + "completed" -> SManga.COMPLETED + else -> SManga.UNKNOWN + } +} + +@Serializable +class SearchDto( + @SerialName("data") + val mangas: List, +) + +@Serializable +class PageDto(val `data`: Data) { + val pages: List get() = `data`.detailDocuments.source.split("#") + + @Serializable + class Data(@SerialName("detail_documents") val detailDocuments: DetailDocuments) + + @Serializable + class DetailDocuments(val source: String) +} diff --git a/src/all/mangahosted/src/eu/kanade/tachiyomi/extension/all/mangahosted/MangaHostedFactory.kt b/src/all/mangahosted/src/eu/kanade/tachiyomi/extension/all/mangahosted/MangaHostedFactory.kt new file mode 100644 index 000000000..5cd1d05b2 --- /dev/null +++ b/src/all/mangahosted/src/eu/kanade/tachiyomi/extension/all/mangahosted/MangaHostedFactory.kt @@ -0,0 +1,30 @@ +package eu.kanade.tachiyomi.extension.all.mangahosted + +import eu.kanade.tachiyomi.source.Source +import eu.kanade.tachiyomi.source.SourceFactory + +class MangaHostedFactory : SourceFactory { + override fun createSources(): List = languages.map { MangaHosted(it) } +} + +class LanguageOption( + val lang: String, + val infix: String = lang, + val mangaSubstring: String = infix, + val nameSuffix: String = "", + val orderBy: String = "DESC", +) + +val languages = listOf( + LanguageOption("en", "manga", "scan"), + LanguageOption("en", "manga-v2", "kaka", " v2"), + LanguageOption("en", "comic", "comic-dc", " Comics"), + LanguageOption("es", "manga-spanish", "manga-es"), + LanguageOption("id", "manga-indo", "id"), + LanguageOption("it", "manga-italia", "manga-it"), + LanguageOption("ja", "mangaraw", "raw"), + LanguageOption("pt-BR", "manga-br", orderBy = "ASC"), + LanguageOption("ru", "manga-ru", "mangaru"), + LanguageOption("ru", "manga-ru-hentai", "hentai", " +18"), + LanguageOption("ru", "manga-ru-yaoi", "yaoi", " +18 Yaoi"), +) diff --git a/src/all/mangahosted/src/eu/kanade/tachiyomi/extension/all/mangahosted/MangaHostedUrlActivity.kt b/src/all/mangahosted/src/eu/kanade/tachiyomi/extension/all/mangahosted/MangaHostedUrlActivity.kt new file mode 100644 index 000000000..98c94933e --- /dev/null +++ b/src/all/mangahosted/src/eu/kanade/tachiyomi/extension/all/mangahosted/MangaHostedUrlActivity.kt @@ -0,0 +1,36 @@ +package eu.kanade.tachiyomi.extension.all.mangahosted + +import android.app.Activity +import android.content.ActivityNotFoundException +import android.content.Intent +import android.os.Bundle +import android.util.Log +import kotlin.system.exitProcess + +class MangaHostedUrlActivity : Activity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + val pathSegments = intent?.data?.pathSegments + + if (pathSegments != null && pathSegments.size > 1) { + val intent = Intent().apply { + action = "eu.kanade.tachiyomi.SEARCH" + putExtra("query", slug(pathSegments)) + putExtra("filter", packageName) + } + + try { + startActivity(intent) + } catch (e: ActivityNotFoundException) { + Log.e("UnionMangasUrlActivity", e.toString()) + } + } + + finish() + exitProcess(0) + } + + private fun slug(pathSegments: List) = + "${MangaHosted.SEARCH_PREFIX}${pathSegments[1]}" +}