From 8f608229d0082a6d94ffe7b0f719ed9b04f7e35b Mon Sep 17 00:00:00 2001 From: Alessandro Jean Date: Sat, 7 Aug 2021 09:48:35 -0300 Subject: [PATCH] Add Voyce.Me source. (#8427) --- src/en/voyceme/AndroidManifest.xml | 2 + src/en/voyceme/build.gradle | 17 + .../voyceme/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3030 bytes .../voyceme/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1655 bytes .../voyceme/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4032 bytes .../voyceme/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 7524 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 10474 bytes src/en/voyceme/res/web_hi_res_512.png | Bin 0 -> 41339 bytes .../tachiyomi/extension/en/voyceme/VoyceMe.kt | 335 ++++++++++++++++++ .../extension/en/voyceme/VoyceMeDto.kt | 45 +++ .../extension/en/voyceme/VoyceMeQueries.kt | 115 ++++++ 11 files changed, 514 insertions(+) create mode 100644 src/en/voyceme/AndroidManifest.xml create mode 100644 src/en/voyceme/build.gradle create mode 100644 src/en/voyceme/res/mipmap-hdpi/ic_launcher.png create mode 100644 src/en/voyceme/res/mipmap-mdpi/ic_launcher.png create mode 100644 src/en/voyceme/res/mipmap-xhdpi/ic_launcher.png create mode 100644 src/en/voyceme/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 src/en/voyceme/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 src/en/voyceme/res/web_hi_res_512.png create mode 100644 src/en/voyceme/src/eu/kanade/tachiyomi/extension/en/voyceme/VoyceMe.kt create mode 100644 src/en/voyceme/src/eu/kanade/tachiyomi/extension/en/voyceme/VoyceMeDto.kt create mode 100644 src/en/voyceme/src/eu/kanade/tachiyomi/extension/en/voyceme/VoyceMeQueries.kt diff --git a/src/en/voyceme/AndroidManifest.xml b/src/en/voyceme/AndroidManifest.xml new file mode 100644 index 000000000..30deb7f79 --- /dev/null +++ b/src/en/voyceme/AndroidManifest.xml @@ -0,0 +1,2 @@ + + diff --git a/src/en/voyceme/build.gradle b/src/en/voyceme/build.gradle new file mode 100644 index 000000000..20dbec0f1 --- /dev/null +++ b/src/en/voyceme/build.gradle @@ -0,0 +1,17 @@ +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply plugin: 'kotlinx-serialization' + +ext { + extName = 'Voyce.Me' + pkgNameSuffix = 'en.voyceme' + extClass = '.VoyceMe' + extVersionCode = 1 + libVersion = '1.2' +} + +dependencies { + implementation project(':lib-ratelimit') +} + +apply from: "$rootDir/common.gradle" diff --git a/src/en/voyceme/res/mipmap-hdpi/ic_launcher.png b/src/en/voyceme/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..a4998303cbdfff5e1b15824489c0768c53b023c0 GIT binary patch literal 3030 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 literal 0 HcmV?d00001 diff --git a/src/en/voyceme/res/mipmap-xxxhdpi/ic_launcher.png b/src/en/voyceme/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..c145376c2360287354d01c87effa5f1b5669aa28 GIT binary patch literal 10474 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 literal 0 HcmV?d00001 diff --git a/src/en/voyceme/res/web_hi_res_512.png b/src/en/voyceme/res/web_hi_res_512.png new file mode 100644 index 0000000000000000000000000000000000000000..50e47f168e71c338d48122c7ff97ab43a893cfd0 GIT binary patch literal 41339 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 D@6g?f literal 0 HcmV?d00001 diff --git a/src/en/voyceme/src/eu/kanade/tachiyomi/extension/en/voyceme/VoyceMe.kt b/src/en/voyceme/src/eu/kanade/tachiyomi/extension/en/voyceme/VoyceMe.kt new file mode 100644 index 000000000..6a14d3bb8 --- /dev/null +++ b/src/en/voyceme/src/eu/kanade/tachiyomi/extension/en/voyceme/VoyceMe.kt @@ -0,0 +1,335 @@ +package eu.kanade.tachiyomi.extension.en.voyceme + +import eu.kanade.tachiyomi.lib.ratelimit.RateLimitInterceptor +import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.network.POST +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 eu.kanade.tachiyomi.util.asJsoup +import kotlinx.serialization.json.Json +import kotlinx.serialization.json.buildJsonObject +import kotlinx.serialization.json.decodeFromJsonElement +import kotlinx.serialization.json.jsonArray +import kotlinx.serialization.json.jsonObject +import kotlinx.serialization.json.jsonPrimitive +import kotlinx.serialization.json.put +import kotlinx.serialization.json.putJsonObject +import okhttp3.Headers +import okhttp3.MediaType.Companion.toMediaTypeOrNull +import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.RequestBody.Companion.toRequestBody +import okhttp3.Response +import org.jsoup.Jsoup +import org.jsoup.parser.Parser +import rx.Observable +import uy.kohesive.injekt.injectLazy +import java.lang.Exception +import java.text.ParseException +import java.text.SimpleDateFormat +import java.util.Locale +import java.util.concurrent.TimeUnit + +class VoyceMe : HttpSource() { + + override val name = "Voyce.Me" + + override val baseUrl = "http://voyce.me" + + override val lang = "en" + + override val supportsLatest = true + + override val client: OkHttpClient = network.cloudflareClient.newBuilder() + .addInterceptor(RateLimitInterceptor(2, 1, TimeUnit.SECONDS)) + .build() + + private val json: Json by injectLazy() + + override fun headersBuilder(): Headers.Builder = super.headersBuilder() + .add("Accept", ACCEPT_ALL) + .add("Origin", baseUrl) + .add("Referer", "$baseUrl/") + + private fun genericComicBookFromObject(comic: VoyceMeComic): SManga = + SManga.create().apply { + title = comic.title + url = "/series/${comic.slug}" + thumbnail_url = STATIC_URL + comic.thumbnail + } + + override fun popularMangaRequest(page: Int): Request { + val payload = buildJsonObject { + put("query", POPULAR_QUERY) + putJsonObject("variables") { + put("offset", (page - 1) * POPULAR_PER_PAGE) + put("limit", POPULAR_PER_PAGE) + } + } + + val body = payload.toString().toRequestBody(JSON_MEDIA_TYPE) + + val newHeaders = headersBuilder() + .add("Content-Length", body.contentLength().toString()) + .add("Content-Type", body.contentType().toString()) + .build() + + return POST(GRAPHQL_URL, newHeaders, body) + } + + override fun popularMangaParse(response: Response): MangasPage { + val result = json.parseToJsonElement(response.body!!.string()).jsonObject + + val comicList = result["data"]!!.jsonObject["voyce_series"]!! + .let { json.decodeFromJsonElement>(it) } + .map(::genericComicBookFromObject) + val hasNextPage = comicList.size == POPULAR_PER_PAGE + + return MangasPage(comicList, hasNextPage) + } + + override fun latestUpdatesRequest(page: Int): Request { + val payload = buildJsonObject { + put("query", LATEST_QUERY) + putJsonObject("variables") { + put("offset", (page - 1) * POPULAR_PER_PAGE) + put("limit", POPULAR_PER_PAGE) + } + } + + val body = payload.toString().toRequestBody(JSON_MEDIA_TYPE) + + val newHeaders = headersBuilder() + .add("Content-Length", body.contentLength().toString()) + .add("Content-Type", body.contentType().toString()) + .build() + + return POST(GRAPHQL_URL, newHeaders, body) + } + + override fun latestUpdatesParse(response: Response): MangasPage { + val result = json.parseToJsonElement(response.body!!.string()).jsonObject + + val comicList = result["data"]!!.jsonObject["voyce_series"]!! + .let { json.decodeFromJsonElement>(it) } + .map(::genericComicBookFromObject) + val hasNextPage = comicList.size == POPULAR_PER_PAGE + + return MangasPage(comicList, hasNextPage) + } + + override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { + val payload = buildJsonObject { + put("query", SEARCH_QUERY) + putJsonObject("variables") { + put("searchTerm", "%$query%") + put("offset", (page - 1) * POPULAR_PER_PAGE) + put("limit", POPULAR_PER_PAGE) + } + } + + val body = payload.toString().toRequestBody(JSON_MEDIA_TYPE) + + val newHeaders = headersBuilder() + .add("Content-Length", body.contentLength().toString()) + .add("Content-Type", body.contentType().toString()) + .build() + + return POST(GRAPHQL_URL, newHeaders, body) + } + + override fun searchMangaParse(response: Response): MangasPage { + val result = json.parseToJsonElement(response.body!!.string()).jsonObject + + val comicList = result["data"]!!.jsonObject["voyce_series"]!! + .let { json.decodeFromJsonElement>(it) } + .map(::genericComicBookFromObject) + val hasNextPage = comicList.size == POPULAR_PER_PAGE + + return MangasPage(comicList, hasNextPage) + } + + // 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 comicSlug = manga.url + .substringAfter("/series/") + .substringBefore("/") + + val payload = buildJsonObject { + put("query", DETAILS_QUERY) + putJsonObject("variables") { + put("slug", comicSlug) + } + } + + val body = payload.toString().toRequestBody(JSON_MEDIA_TYPE) + + val newHeaders = headersBuilder() + .add("Content-Length", body.contentLength().toString()) + .add("Content-Type", body.contentType().toString()) + .set("Referer", baseUrl + manga.url) + .build() + + return POST(GRAPHQL_URL, newHeaders, body) + } + + override fun mangaDetailsParse(response: Response): SManga = SManga.create().apply { + val result = json.parseToJsonElement(response.body!!.string()).jsonObject + val comic = result["data"]!!.jsonObject["voyce_series"]!!.jsonArray[0].jsonObject + .let { json.decodeFromJsonElement(it) } + + title = comic.title + author = comic.author?.username.orEmpty() + description = Parser.unescapeEntities(comic.description.orEmpty(), true) + .let { Jsoup.parse(it).text() } + status = comic.status.orEmpty().toStatus() + genre = comic.genres.mapNotNull { it.genre?.title }.joinToString(", ") + thumbnail_url = STATIC_URL + comic.thumbnail + } + + override fun chapterListRequest(manga: SManga): Request { + val comicSlug = manga.url + .substringAfter("/series/") + .substringBefore("/") + + val payload = buildJsonObject { + put("query", CHAPTERS_QUERY) + putJsonObject("variables") { + put("slug", comicSlug) + } + } + + val body = payload.toString().toRequestBody(JSON_MEDIA_TYPE) + + val newHeaders = headersBuilder() + .add("Content-Length", body.contentLength().toString()) + .add("Content-Type", body.contentType().toString()) + .set("Referer", baseUrl + manga.url) + .build() + + return POST(GRAPHQL_URL, newHeaders, body) + } + + override fun chapterListParse(response: Response): List { + val result = json.parseToJsonElement(response.body!!.string()).jsonObject + val comicBook = result["data"]!!.jsonObject["voyce_series"]!!.jsonArray[0].jsonObject + .let { json.decodeFromJsonElement(it) } + + return comicBook.chapters + .map { chapter -> chapterFromObject(chapter, comicBook) } + .distinctBy { chapter -> chapter.name } + } + + private fun chapterFromObject(chapter: VoyceMeChapter, comic: VoyceMeComic): SChapter = + SChapter.create().apply { + name = chapter.title + date_upload = chapter.createdAt.toDate() + url = "/series/${comic.slug}/${chapter.id}#comic" + } + + override fun pageListRequest(chapter: SChapter): Request { + val newHeaders = headersBuilder() + .set("Referer", baseUrl + chapter.url.substringBeforeLast("/")) + .build() + + return GET(baseUrl + chapter.url, newHeaders) + } + + private fun pageListApiRequest(buildId: String, chapterUrl: String): Request { + val newHeaders = headersBuilder() + .set("Referer", baseUrl + chapterUrl) + .build() + + val comicSlug = chapterUrl + .substringAfter("/series/") + .substringBefore("/") + val chapterId = chapterUrl + .substringAfterLast("/") + .substringBefore("#") + + return GET("$baseUrl/_next/data/$buildId/series/$comicSlug/$chapterId.json", newHeaders) + } + + override fun pageListParse(response: Response): List { + // GraphQL endpoints do not have the chapter images, so we need + // to get the buildId to fetch the chapter from NextJS static data. + val document = response.asJsoup() + val nextData = document.selectFirst("script#__NEXT_DATA__").data() + val nextJson = json.parseToJsonElement(nextData).jsonObject + + val buildId = nextJson["buildId"]!!.jsonPrimitive.content + val chapterUrl = response.request.url.toString().substringAfter(baseUrl) + + val dataRequest = pageListApiRequest(buildId, chapterUrl) + val dataResponse = client.newCall(dataRequest).execute() + val dataJson = json.parseToJsonElement(dataResponse.body!!.string()).jsonObject + + val comic = dataJson["pageProps"]!!.jsonObject["series"]!! + .let { json.decodeFromJsonElement(it) } + + val chapterId = response.request.url.toString() + .substringAfterLast("/") + .substringBefore("#") + .toInt() + val chapter = comic.chapters.firstOrNull { it.id == chapterId } + ?: throw Exception(CHAPTER_DATA_NOT_FOUND) + + return chapter.images.mapIndexed { i, page -> + Page(i, baseUrl, STATIC_URL + page.image) + } + } + + 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 String.toDate(): Long { + return try { + DATE_FORMATTER.parse(this)?.time ?: 0L + } catch (e: ParseException) { + 0L + } + } + + private fun String.toStatus(): Int = when (this) { + "completed" -> SManga.COMPLETED + "ongoing" -> SManga.ONGOING + else -> SManga.UNKNOWN + } + + companion object { + private const val ACCEPT_ALL = "*/*" + private const val ACCEPT_IMAGE = "image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8" + + private const val STATIC_URL = "https://dlkfxmdtxtzpb.cloudfront.net/" + private const val GRAPHQL_URL = "https://graphql.voyce.me/v1/graphql" + + private const val POPULAR_PER_PAGE = 10 + + private val JSON_MEDIA_TYPE = "application/json; charset=utf-8".toMediaTypeOrNull() + + private val DATE_FORMATTER by lazy { SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH) } + + private const val CHAPTER_DATA_NOT_FOUND = "Chapter data not found in website." + } +} diff --git a/src/en/voyceme/src/eu/kanade/tachiyomi/extension/en/voyceme/VoyceMeDto.kt b/src/en/voyceme/src/eu/kanade/tachiyomi/extension/en/voyceme/VoyceMeDto.kt new file mode 100644 index 000000000..a68b5f1a2 --- /dev/null +++ b/src/en/voyceme/src/eu/kanade/tachiyomi/extension/en/voyceme/VoyceMeDto.kt @@ -0,0 +1,45 @@ +package eu.kanade.tachiyomi.extension.en.voyceme + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class VoyceMeComic( + val author: VoyceMeAuthor? = null, + val chapters: List = emptyList(), + val description: String? = "", + val genres: List = emptyList(), + val id: Int = -1, + val slug: String = "", + val status: String? = "", + val thumbnail: String = "", + val title: String = "" +) + +@Serializable +data class VoyceMeAuthor( + val username: String? = "" +) + +@Serializable +data class VoyceMeGenreAggregation( + val genre: VoyceMeGenre? = null +) + +@Serializable +data class VoyceMeGenre( + val title: String? = "" +) + +@Serializable +data class VoyceMeChapter( + @SerialName("created_at") val createdAt: String = "", + val id: Int = -1, + val images: List = emptyList(), + val title: String = "" +) + +@Serializable +data class VoyceMePage( + val image: String = "" +) diff --git a/src/en/voyceme/src/eu/kanade/tachiyomi/extension/en/voyceme/VoyceMeQueries.kt b/src/en/voyceme/src/eu/kanade/tachiyomi/extension/en/voyceme/VoyceMeQueries.kt new file mode 100644 index 000000000..2a0326cfd --- /dev/null +++ b/src/en/voyceme/src/eu/kanade/tachiyomi/extension/en/voyceme/VoyceMeQueries.kt @@ -0,0 +1,115 @@ +package eu.kanade.tachiyomi.extension.en.voyceme + +fun buildQuery(queryAction: () -> String) = queryAction().replace("%", "$") + +val POPULAR_QUERY: String = buildQuery { + """ + query(%limit: Int, %offset: Int) { + voyce_series( + where: { + publish: { _eq: 1 }, + type: { id: { _in: [2, 4] } } + }, + order_by: [{ views_counts: { count: desc_nulls_last } }], + limit: %limit, + offset: %offset + ) { + id + slug + thumbnail + title + } + } + """.trimIndent() +} + +val LATEST_QUERY: String = buildQuery { + """ + query(%limit: Int, %offset: Int) { + voyce_series( + where: { + publish: { _eq: 1 }, + type: { id: { _in: [2, 4] } } + }, + order_by: [{ updated_at: desc }], + limit: %limit, + offset: %offset + ) { + id + slug + thumbnail + title + } + } + """.trimIndent() +} + +val SEARCH_QUERY: String = buildQuery { + """ + query(%searchTerm: String!, %limit: Int, %offset: Int) { + voyce_series( + where: { + publish: { _eq: 1 }, + type: { id: { _in: [2, 4] } }, + title: { _ilike: %searchTerm } + }, + order_by: [{ views_counts: { count: desc_nulls_last } }], + limit: %limit, + offset: %offset + ) { + id + slug + thumbnail + title + } + } + """.trimIndent() +} + +val DETAILS_QUERY: String = buildQuery { + """ + query(%slug: String!) { + voyce_series( + where: { + publish: { _eq: 1 }, + type: { id: { _in: [2, 4] } }, + slug: { _eq: %slug } + }, + limit: 1, + ) { + id + slug + thumbnail + title + description + status + author { username } + genres(order_by: [{ genre: { title: asc } }]) { + genre { title } + } + } + } + """.trimIndent() +} + +val CHAPTERS_QUERY: String = buildQuery { + """ + query(%slug: String!) { + voyce_series( + where: { + publish: { _eq: 1 }, + type: { id: { _in: [2, 4] } }, + slug: { _eq: %slug } + }, + limit: 1, + ) { + slug + chapters(order_by: [{ created_at: desc }]) { + id + title + created_at + } + } + } + """.trimIndent() +}