From ab391bff6c7146fe8f267b136e1be1590b6a6f82 Mon Sep 17 00:00:00 2001 From: Alessandro Jean Date: Mon, 23 Aug 2021 08:19:54 -0300 Subject: [PATCH] Add MV source (closes #8758). (#8762) --- src/pt/mangavibe/AndroidManifest.xml | 2 + src/pt/mangavibe/build.gradle | 18 + .../mangavibe/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 2368 bytes .../mangavibe/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1382 bytes .../res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 3200 bytes .../res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 5622 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 8564 bytes src/pt/mangavibe/res/web_hi_res_512.png | Bin 0 -> 38553 bytes .../extension/pt/mangavibe/MangaVibe.kt | 350 ++++++++++++++++++ .../extension/pt/mangavibe/MangaVibeDto.kt | 37 ++ 10 files changed, 407 insertions(+) create mode 100644 src/pt/mangavibe/AndroidManifest.xml create mode 100644 src/pt/mangavibe/build.gradle create mode 100644 src/pt/mangavibe/res/mipmap-hdpi/ic_launcher.png create mode 100644 src/pt/mangavibe/res/mipmap-mdpi/ic_launcher.png create mode 100644 src/pt/mangavibe/res/mipmap-xhdpi/ic_launcher.png create mode 100644 src/pt/mangavibe/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 src/pt/mangavibe/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 src/pt/mangavibe/res/web_hi_res_512.png create mode 100644 src/pt/mangavibe/src/eu/kanade/tachiyomi/extension/pt/mangavibe/MangaVibe.kt create mode 100644 src/pt/mangavibe/src/eu/kanade/tachiyomi/extension/pt/mangavibe/MangaVibeDto.kt diff --git a/src/pt/mangavibe/AndroidManifest.xml b/src/pt/mangavibe/AndroidManifest.xml new file mode 100644 index 000000000..30deb7f79 --- /dev/null +++ b/src/pt/mangavibe/AndroidManifest.xml @@ -0,0 +1,2 @@ + + diff --git a/src/pt/mangavibe/build.gradle b/src/pt/mangavibe/build.gradle new file mode 100644 index 000000000..3be4dab1b --- /dev/null +++ b/src/pt/mangavibe/build.gradle @@ -0,0 +1,18 @@ +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply plugin: 'kotlinx-serialization' + +ext { + extName = 'MangaVibe' + pkgNameSuffix = 'pt.mangavibe' + extClass = '.MangaVibe' + extVersionCode = 1 + libVersion = '1.2' + containsNsfw = true +} + +dependencies { + implementation project(':lib-ratelimit') +} + +apply from: "$rootDir/common.gradle" diff --git a/src/pt/mangavibe/res/mipmap-hdpi/ic_launcher.png b/src/pt/mangavibe/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..f938f17d4d0a4d26861765beacb0603a1986cf68 GIT binary patch literal 2368 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 I=AOU)7kGy!r~m)} literal 0 HcmV?d00001 diff --git a/src/pt/mangavibe/src/eu/kanade/tachiyomi/extension/pt/mangavibe/MangaVibe.kt b/src/pt/mangavibe/src/eu/kanade/tachiyomi/extension/pt/mangavibe/MangaVibe.kt new file mode 100644 index 000000000..3cb7bb1df --- /dev/null +++ b/src/pt/mangavibe/src/eu/kanade/tachiyomi/extension/pt/mangavibe/MangaVibe.kt @@ -0,0 +1,350 @@ +package eu.kanade.tachiyomi.extension.pt.mangavibe + +import eu.kanade.tachiyomi.annotations.Nsfw +import eu.kanade.tachiyomi.lib.ratelimit.RateLimitInterceptor +import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.network.asObservableSuccess +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.online.HttpSource +import kotlinx.serialization.decodeFromString +import kotlinx.serialization.json.Json +import okhttp3.Headers +import okhttp3.HttpUrl.Companion.toHttpUrl +import okhttp3.Interceptor +import okhttp3.MediaType.Companion.toMediaTypeOrNull +import okhttp3.OkHttpClient +import okhttp3.Protocol +import okhttp3.Request +import okhttp3.Response +import okhttp3.ResponseBody.Companion.toResponseBody +import rx.Observable +import uy.kohesive.injekt.injectLazy +import java.text.Normalizer +import java.text.SimpleDateFormat +import java.util.Locale +import java.util.concurrent.TimeUnit +import kotlin.math.ceil + +@Nsfw +class MangaVibe : HttpSource() { + + override val name = "MangaVibe" + + override val baseUrl = "https://mangavibe.top" + + override val lang = "pt-BR" + + override val supportsLatest = true + + override val client: OkHttpClient = network.cloudflareClient.newBuilder() + .addInterceptor(RateLimitInterceptor(1, 2, TimeUnit.SECONDS)) + .addInterceptor(::directoryCacheIntercept) + .build() + + override fun headersBuilder(): Headers.Builder = Headers.Builder() + .add("Referer", "$baseUrl/") + + private val json: Json by injectLazy() + + private val directoryCache: MutableMap = mutableMapOf() + + override fun popularMangaRequest(page: Int): Request { + val newHeaders = headersBuilder() + .add("Accept", ACCEPT_JSON) + .set("Referer", "$baseUrl/mangas?Ordem=Populares") + .add("X-Page", page.toString()) + .build() + + return GET("$baseUrl/$API_PATH/data?page=medias", newHeaders) + } + + override fun popularMangaParse(response: Response): MangasPage { + val result = json.decodeFromString(response.body!!.string()) + + if (result.data.isNullOrEmpty()) { + return MangasPage(emptyList(), hasNextPage = false) + } + + val totalPages = ceil(result.data.size.toDouble() / ITEMS_PER_PAGE) + val currentPage = response.request.header("X-Page")!!.toInt() + + val mangaList = result.data + .sortedByDescending { it.views } + .drop(ITEMS_PER_PAGE * (currentPage - 1)) + .take(ITEMS_PER_PAGE) + .map(::popularMangaFromObject) + + return MangasPage(mangaList, hasNextPage = currentPage < totalPages) + } + + private fun popularMangaFromObject(comic: MangaVibeComicDto): SManga = SManga.create().apply { + title = comic.title["romaji"] ?: comic.title["english"] ?: comic.title["native"]!! + thumbnail_url = comic.id.toThumbnailUrl() + url = "/manga/${comic.id}/${title.toSlug()}" + } + + override fun latestUpdatesRequest(page: Int): Request { + val newHeaders = headersBuilder() + .add("Accept", ACCEPT_JSON) + .set("Referer", "$baseUrl/mangas?Ordem=Atualizados") + .add("X-Page", page.toString()) + .build() + + return GET("$baseUrl/$API_PATH/data?page=medias&Ordem=Atualizados", newHeaders) + } + + override fun latestUpdatesParse(response: Response): MangasPage { + val result = json.decodeFromString(response.body!!.string()) + + if (result.data.isNullOrEmpty()) { + return MangasPage(emptyList(), hasNextPage = false) + } + + val totalPages = ceil(result.data.size.toDouble() / ITEMS_PER_PAGE) + val currentPage = response.request.header("X-Page")!!.toInt() + + val mangaList = result.data + .asSequence() + .distinctBy { it.title } + .filter { it.mediaID.isNullOrBlank().not() } + .drop(ITEMS_PER_PAGE * (currentPage - 1)) + .take(ITEMS_PER_PAGE) + .map(::latestMangaFromObject) + .toList() + + return MangasPage(mangaList, hasNextPage = currentPage < totalPages) + } + + private fun latestMangaFromObject(chapter: MangaVibeLatestChapterDto): SManga = SManga.create().apply { + title = chapter.title!! + thumbnail_url = chapter.mediaID!!.toInt().toThumbnailUrl() + url = "/manga/${chapter.mediaID}/${chapter.title.toSlug()}" + } + + override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { + val newHeaders = headersBuilder() + .add("Accept", ACCEPT_JSON) + .add("X-Page", page.toString()) + .build() + + val apiUrl = "$baseUrl/$API_PATH/data".toHttpUrl().newBuilder() + .addQueryParameter("page", "medias") + .addQueryParameter("st", query) + .toString() + + return GET(apiUrl, newHeaders) + } + + override fun searchMangaParse(response: Response): MangasPage { + val result = json.decodeFromString(response.body!!.string()) + + if (result.data.isNullOrEmpty()) { + return MangasPage(emptyList(), hasNextPage = false) + } + + val searchTerm = response.request.url.queryParameter("st")!! + + val mangaList = result.data + .filter { + it.title.values.any { title -> + title?.contains(searchTerm, ignoreCase = true) ?: false + } + } + .sortedByDescending { it.views } + .map(::searchMangaFromObject) + + return MangasPage(mangaList, hasNextPage = false) + } + + private fun searchMangaFromObject(comic: MangaVibeComicDto): SManga = popularMangaFromObject(comic) + + // Workaround to allow "Open in browser" use the real URL. + override fun fetchMangaDetails(manga: SManga): Observable { + return client.newCall(mangaDetailsApiRequest(manga)) + .asObservableSuccess() + .map { response -> + mangaDetailsParse(response).apply { initialized = true } + } + } + + private fun mangaDetailsApiRequest(manga: SManga): Request { + val comicId = manga.url.substringAfter("/manga/") + .substringBefore("/") + + val newHeaders = headersBuilder() + .add("Accept", ACCEPT_JSON) + .set("Referer", "$baseUrl/mangas?Ordem=Populares") + .add("X-Id", comicId) + .build() + + return GET("$baseUrl/$API_PATH/data?page=medias", newHeaders) + } + + override fun mangaDetailsParse(response: Response): SManga { + val result = json.decodeFromString(response.body!!.string()) + + if (result.data.isNullOrEmpty()) { + throw Exception(COULD_NOT_PARSE_THE_MANGA) + } + + val comicId = response.request.header("X-Id")!!.toInt() + val comic = result.data.find { it.id == comicId } + ?: throw Exception(COULD_NOT_PARSE_THE_MANGA) + + return SManga.create().apply { + title = comic.title["romaji"] ?: comic.title["english"] ?: comic.title["native"]!! + description = comic.description.orEmpty() + genre = comic.genres?.joinToString(", ") + status = comic.status?.toStatus() ?: SManga.UNKNOWN + thumbnail_url = comic.id.toThumbnailUrl() + } + } + + // Chapters are available in the same url of the manga details. + override fun chapterListRequest(manga: SManga): Request { + val comicId = manga.url.substringAfter("/manga/") + .substringBefore("/") + + val newHeaders = headersBuilder() + .add("Accept", ACCEPT_JSON) + .set("Referer", baseUrl + manga.url) + .build() + + return GET("$baseUrl/$API_PATH/data?page=chapter&mediaID=$comicId", newHeaders) + } + + override fun chapterListParse(response: Response): List { + val result = json.decodeFromString(response.body!!.string()) + + if (result.data.isNullOrEmpty()) { + return emptyList() + } + + return result.data + .map(::chapterFromObject) + .reversed() + } + + private fun chapterFromObject(chapter: MangaVibeChapterDto): SChapter = SChapter.create().apply { + name = "Capítulo #" + chapter.number.toString().replace(".0", "") + chapter_number = chapter.number + date_upload = chapter.datePublished?.toDate() ?: 0L + + val chapterUrl = "$baseUrl/chapter".toHttpUrl().newBuilder() + .addPathSegment(chapter.mediaID.toString()) + .addPathSegment(chapter.title?.toSlug() ?: "null") + .addPathSegment(chapter.number.toString().replace(".0", "")) + .addQueryParameter("pgn", chapter.pages.toString()) + .toString() + setUrlWithoutDomain(chapterUrl) + } + + override fun fetchPageList(chapter: SChapter): Observable> { + val chapterUrlPaths = chapter.url + .removePrefix("/") + .split("/") + + val comicId = chapterUrlPaths[1] + val chapterNumber = chapterUrlPaths[3].substringBefore("?") + val pageCount = chapter.url.substringAfterLast("?pgn=").toInt() + + val pages = List(pageCount) { i -> + val pageUrl = "$CDN_URL/img/media/$comicId/chapter/$chapterNumber/${i + 1}.jpg" + Page(i, baseUrl, pageUrl) + } + + return Observable.just(pages) + } + + override fun pageListParse(response: Response): List = + throw Exception("This method should not be called!") + + override fun fetchImageUrl(page: Page): Observable = Observable.just(page.imageUrl!!) + + override fun imageUrlParse(response: Response): String = "" + + override fun imageRequest(page: Page): Request { + val newHeaders = headersBuilder() + .add("Accept", ACCEPT_IMAGE) + .set("Referer", page.url) + .build() + + return GET(page.imageUrl!!, newHeaders) + } + + private fun directoryCacheIntercept(chain: Interceptor.Chain): Response { + if (!chain.request().url.toString().contains("data?page=medias")) { + return chain.proceed(chain.request()) + } + + val directoryType = if (chain.request().url.queryParameter("Ordem") == null) + POPULAR_KEY else LATEST_KEY + val page = chain.request().header("X-Page")?.toInt() + + if (directoryCache.containsKey(directoryType) && page != null && page > 1) { + val jsonContentType = "application/json; charset=UTF-8".toMediaTypeOrNull() + val responseBody = directoryCache[directoryType]!!.toResponseBody(jsonContentType) + + return Response.Builder() + .code(200) + .protocol(Protocol.HTTP_1_1) + .request(chain.request()) + .message("OK") + .body(responseBody) + .build() + } + + val response = chain.proceed(chain.request()) + val responseContentType = response.body!!.contentType() + val responseString = response.body!!.string() + + directoryCache[directoryType] = responseString + + return response.newBuilder() + .body(responseString.toResponseBody(responseContentType)) + .build() + } + + private fun Int.toThumbnailUrl(): String = "$CDN_URL/img/media/$this/cover/l.jpg" + + private fun String.toDate(): Long { + return runCatching { DATE_FORMATTER.parse(substringBefore("T"))?.time } + .getOrNull() ?: 0L + } + + private fun String.toStatus(): Int = when (this) { + "Em lançamento" -> SManga.ONGOING + "Completo" -> SManga.COMPLETED + else -> SManga.UNKNOWN + } + + private fun String.toSlug(): String { + return Normalizer + .normalize(this, Normalizer.Form.NFD) + .replace("[^\\p{ASCII}]".toRegex(), "") + .replace("[^a-zA-Z0-9\\s]+".toRegex(), "").trim() + .replace("\\s+".toRegex(), "-") + .toLowerCase(Locale("pt", "BR")) + } + + companion object { + private const val API_PATH = "mangavibe/api/v1" + private const val CDN_URL = "https://cdn.mangavibe.top" + + private const val ACCEPT_JSON = "application/json, text/plain, */*" + private const val ACCEPT_IMAGE = "image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8" + + private const val ITEMS_PER_PAGE = 24 + + private const val COULD_NOT_PARSE_THE_MANGA = "Ocorreu um erro ao obter as informações." + + private const val POPULAR_KEY = "popular" + private const val LATEST_KEY = "latest" + + private val DATE_FORMATTER by lazy { SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH) } + } +} diff --git a/src/pt/mangavibe/src/eu/kanade/tachiyomi/extension/pt/mangavibe/MangaVibeDto.kt b/src/pt/mangavibe/src/eu/kanade/tachiyomi/extension/pt/mangavibe/MangaVibeDto.kt new file mode 100644 index 000000000..5228e41be --- /dev/null +++ b/src/pt/mangavibe/src/eu/kanade/tachiyomi/extension/pt/mangavibe/MangaVibeDto.kt @@ -0,0 +1,37 @@ +package eu.kanade.tachiyomi.extension.pt.mangavibe + +import kotlinx.serialization.Serializable + +typealias MangaVibePopularDto = MangaVibeResultDto> +typealias MangaVibeLatestDto = MangaVibeResultDto> +typealias MangaVibeChapterListDto = MangaVibeResultDto> + +@Serializable +data class MangaVibeResultDto( + val data: T? = null +) + +@Serializable +data class MangaVibeComicDto( + val description: String? = "", + val genres: List? = emptyList(), + val id: Int, + val status: String? = "", + val title: Map = emptyMap(), + val views: Int = -1 +) + +@Serializable +data class MangaVibeLatestChapterDto( + val mediaID: String? = "", + val title: String? = "" +) + +@Serializable +data class MangaVibeChapterDto( + val datePublished: String? = "", + val mediaID: Int = -1, + val number: Float = -1f, + val pages: Int = -1, + val title: String? = "" +)