From 7b17628d08091bcc83e96e6773e650961ea850a1 Mon Sep 17 00:00:00 2001 From: imper1aldev Date: Thu, 16 Mar 2023 00:54:35 -0600 Subject: [PATCH] Doramasflix added (#1398) --- src/es/doramasflix/AndroidManifest.xml | 2 + src/es/doramasflix/build.gradle | 22 + .../res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3165 bytes .../res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1762 bytes .../res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4675 bytes .../res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 8350 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 12243 bytes .../es/doramasflix/Doramasflix.kt | 418 ++++++++++++++++++ .../doramasflix/extractor/MixDropExtractor.kt | 29 ++ .../doramasflix/extractor/UqloadExtractor.kt | 28 ++ 10 files changed, 499 insertions(+) create mode 100644 src/es/doramasflix/AndroidManifest.xml create mode 100644 src/es/doramasflix/build.gradle create mode 100644 src/es/doramasflix/res/mipmap-hdpi/ic_launcher.png create mode 100644 src/es/doramasflix/res/mipmap-mdpi/ic_launcher.png create mode 100644 src/es/doramasflix/res/mipmap-xhdpi/ic_launcher.png create mode 100644 src/es/doramasflix/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 src/es/doramasflix/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 src/es/doramasflix/src/eu/kanade/tachiyomi/animeextension/es/doramasflix/Doramasflix.kt create mode 100644 src/es/doramasflix/src/eu/kanade/tachiyomi/animeextension/es/doramasflix/extractor/MixDropExtractor.kt create mode 100644 src/es/doramasflix/src/eu/kanade/tachiyomi/animeextension/es/doramasflix/extractor/UqloadExtractor.kt diff --git a/src/es/doramasflix/AndroidManifest.xml b/src/es/doramasflix/AndroidManifest.xml new file mode 100644 index 000000000..acb4de356 --- /dev/null +++ b/src/es/doramasflix/AndroidManifest.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/src/es/doramasflix/build.gradle b/src/es/doramasflix/build.gradle new file mode 100644 index 000000000..f11c67f48 --- /dev/null +++ b/src/es/doramasflix/build.gradle @@ -0,0 +1,22 @@ +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' + +ext { + extName = 'Doramasflix' + pkgNameSuffix = 'es.doramasflix' + extClass = '.Doramasflix' + extVersionCode = 1 + libVersion = '13' +} + +dependencies { + implementation(project(':lib-fembed-extractor')) + implementation(project(':lib-streamtape-extractor')) + implementation(project(':lib-okru-extractor')) + implementation(project(':lib-streamsb-extractor')) + implementation(project(':lib-dood-extractor')) + implementation "dev.datlag.jsunpacker:jsunpacker:1.0.1" + implementation project(path: ':lib-voe-extractor') +} + +apply from: "$rootDir/common.gradle" diff --git a/src/es/doramasflix/res/mipmap-hdpi/ic_launcher.png b/src/es/doramasflix/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..5c869ad55ab7c29fae55a83a876eb82c4e6f70fc GIT binary patch literal 3165 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 Eg5nEgYXATM literal 0 HcmV?d00001 diff --git a/src/es/doramasflix/res/mipmap-xhdpi/ic_launcher.png b/src/es/doramasflix/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..63b84f62abab227c9fab1bf1d692a585885899f9 GIT binary patch literal 4675 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 Ll%=bsjKBW})9xqu literal 0 HcmV?d00001 diff --git a/src/es/doramasflix/res/mipmap-xxxhdpi/ic_launcher.png b/src/es/doramasflix/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..aa14d692bbaa1d6a15ef8dfe47805fa151e50a76 GIT binary patch literal 12243 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 CS+^em literal 0 HcmV?d00001 diff --git a/src/es/doramasflix/src/eu/kanade/tachiyomi/animeextension/es/doramasflix/Doramasflix.kt b/src/es/doramasflix/src/eu/kanade/tachiyomi/animeextension/es/doramasflix/Doramasflix.kt new file mode 100644 index 000000000..0e08e5a5d --- /dev/null +++ b/src/es/doramasflix/src/eu/kanade/tachiyomi/animeextension/es/doramasflix/Doramasflix.kt @@ -0,0 +1,418 @@ +package eu.kanade.tachiyomi.animeextension.es.doramasflix + +import android.app.Application +import android.content.SharedPreferences +import androidx.preference.ListPreference +import androidx.preference.PreferenceScreen +import eu.kanade.tachiyomi.animeextension.es.doramasflix.extractor.MixDropExtractor +import eu.kanade.tachiyomi.animeextension.es.doramasflix.extractor.UqloadExtractor +import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource +import eu.kanade.tachiyomi.animesource.model.AnimeFilterList +import eu.kanade.tachiyomi.animesource.model.AnimesPage +import eu.kanade.tachiyomi.animesource.model.SAnime +import eu.kanade.tachiyomi.animesource.model.SEpisode +import eu.kanade.tachiyomi.animesource.model.Video +import eu.kanade.tachiyomi.animesource.online.AnimeHttpSource +import eu.kanade.tachiyomi.lib.fembedextractor.FembedExtractor +import eu.kanade.tachiyomi.lib.okruextractor.OkruExtractor +import eu.kanade.tachiyomi.lib.streamsbextractor.StreamSBExtractor +import eu.kanade.tachiyomi.lib.streamtapeextractor.StreamTapeExtractor +import eu.kanade.tachiyomi.lib.voeextractor.VoeExtractor +import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.network.POST +import eu.kanade.tachiyomi.util.asJsoup +import kotlinx.serialization.decodeFromString +import kotlinx.serialization.json.Json +import kotlinx.serialization.json.JsonObject +import kotlinx.serialization.json.jsonArray +import kotlinx.serialization.json.jsonObject +import kotlinx.serialization.json.jsonPrimitive +import okhttp3.Headers +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.Request +import okhttp3.RequestBody.Companion.toRequestBody +import okhttp3.Response +import uy.kohesive.injekt.Injekt +import uy.kohesive.injekt.api.get +import uy.kohesive.injekt.injectLazy + +class Doramasflix : ConfigurableAnimeSource, AnimeHttpSource() { + + override val name = "Doramasflix" + + override val baseUrl = "https://doramasflix.in" + + private val apiUrl = "https://sv1.fluxcedene.net/api/gql" + + // The token is made through a type of milliseconds encryption in combination + // with other calculated strings, the milliseconds indicate the expiration date + // of the token, so it was calculated to expire in 100 years. + private val accessPlatform = "RxARncfg1S_MdpSrCvreoLu_SikCGMzE1NzQzODc3NjE2MQ==" + + private val mediaType = "application/json; charset=utf-8".toMediaType() + + override val lang = "es" + + override val supportsLatest = true + + private val json: Json by injectLazy() + + private val preferences: SharedPreferences by lazy { + Injekt.get().getSharedPreferences("source_$id", 0x0000) + } + + private val popularRequestHeaders = Headers.headersOf( + "authority", "sv1.fluxcedene.net", + "accept", "application/json, text/plain, */*", + "content-type", "application/json;charset=UTF-8", + "origin", "https://doramasflix.in", + "referer", "https://doramasflix.in/", + "platform", "doramasflix", + "authorization", "Bear", + "x-access-jwt-token", "", + "x-access-platform", accessPlatform, + ) + + private fun externalOrInternalImg(url: String, isThumb: Boolean = false): String { + return if (url.contains("https")) { + url + } else if (isThumb) { + "https://image.tmdb.org/t/p/w220_and_h330_face$url" + } else { + "https://image.tmdb.org/t/p/w500$url" + } + } + + override fun animeDetailsParse(response: Response): SAnime { + val document = response.asJsoup() + val anime = SAnime.create() + + document.select("script").map { el -> + if (el.data().contains("{\"props\":{\"pageProps\":{")) { + val apolloState = json.decodeFromString(el.data())!!.jsonObject["props"]!!.jsonObject["pageProps"]!!.jsonObject["apolloState"]!!.jsonObject + val dorama = apolloState!!.entries!!.firstOrNull()!!.value!!.jsonObject + val genres = try { apolloState.entries.filter { x -> x.key.contains("genres") }.joinToString { it.value.jsonObject["name"]!!.jsonPrimitive.content } } catch (_: Exception) { null } + val network = try { apolloState.entries.firstOrNull { x -> x.key.contains("networks") }?.value?.jsonObject?.get("name")!!.jsonPrimitive.content } catch (_: Exception) { null } + val artist = try { dorama["cast"]?.jsonObject?.get("json")?.jsonArray?.firstOrNull()?.jsonObject?.get("name")?.jsonPrimitive?.content } catch (_: Exception) { null } + val type = dorama["__typename"]!!.jsonPrimitive.content.lowercase() + val poster = dorama["poster_path"]!!.jsonPrimitive.content + val urlImg = poster.ifEmpty { dorama["poster"]!!.jsonPrimitive.content } + + val id = dorama["_id"]!!.jsonPrimitive!!.content + anime.title = "${dorama["name"]!!.jsonPrimitive!!.content} (${dorama["name_es"]!!.jsonPrimitive!!.content})" + anime.description = dorama["overview"]!!.jsonPrimitive!!.content.trim() + anime.genre = genres + anime.author = network + anime.artist = artist + anime.status = if (type == "movie") SAnime.COMPLETED else SAnime.UNKNOWN + anime.thumbnail_url = externalOrInternalImg(urlImg) + anime.setUrlWithoutDomain(urlSolverByType(dorama["__typename"]!!.jsonPrimitive!!.content, dorama["slug"]!!.jsonPrimitive!!.content, id)) + } + } + return anime + } + + override fun episodeListRequest(anime: SAnime): Request { + val id = anime.url.substringAfter("?id=") + return if (anime.url.contains("peliculas-online")) { + GET(baseUrl + anime.url) + } else { + val body = ( + "{\"operationName\":\"listSeasons\",\"variables\":{\"serie_id\":\"$id\"},\"query\":\"query listSeasons(\$serie_id: MongoID!) " + + "{\\n listSeasons(sort: NUMBER_ASC, filter: {serie_id: \$serie_id}) {\\n slug\\n season_number\\n poster_path\\n air_date\\n " + + "serie_name\\n poster\\n backdrop\\n __typename\\n }\\n}\\n\"}" + ).toRequestBody(mediaType) + POST("$apiUrl?id=$id", popularRequestHeaders, body) + } + } + + override fun episodeListParse(response: Response): List { + val episodes = mutableListOf() + if (response.request.url.toString().contains("peliculas-online")) { + val episode = SEpisode.create() + episode.episode_number = 1F + episode.name = "Película" + episode.setUrlWithoutDomain(response.request.url.toString()) + episodes.add(episode) + } else { + val jsonEpisodes = mutableListOf() + val id = response.request.url.toString().substringAfter("?id=") + val responseString = response.body.string() + val data = json.decodeFromString(responseString)!!.jsonObject["data"]!!.jsonObject + data["listSeasons"]!!.jsonArray.forEach { + val season = it.jsonObject["season_number"]!!.jsonPrimitive.content + val body = ( + "{\"operationName\":\"listEpisodes\",\"variables\":{\"serie_id\":\"$id\",\"season_number\":$season},\"query\":\"query " + + "listEpisodes(\$season_number: Float!, \$serie_id: MongoID!) {\\n listEpisodes(sort: NUMBER_ASC, filter: {type_serie: \\\"dorama\\\", " + + "serie_id: \$serie_id, season_number: \$season_number}) {\\n _id\\n name\\n slug\\n serie_name\\n serie_name_es\\n " + + "serie_id\\n still_path\\n air_date\\n season_number\\n episode_number\\n languages\\n poster\\n backdrop\\n __typename\\n }\\n}\\n\"}" + ).toRequestBody(mediaType) + client.newCall(POST(apiUrl, popularRequestHeaders, body)).execute().let { resp -> jsonEpisodes.add(resp.body.string()) } + } + jsonEpisodes.forEach { json -> episodes.addAll(parseEpisodeListJson(json)) } + } + return episodes.reversed() + } + + private fun parseEpisodeListJson(jsonLine: String?): List { + val jsonData = jsonLine ?: return emptyList() + val episodes = mutableListOf() + val data = json.decodeFromString(jsonData)!!.jsonObject["data"]!!.jsonObject + data["listEpisodes"]!!.jsonArray!!.map { + val noSeason = it.jsonObject["season_number"]!!.jsonPrimitive!!.content + val noEpisode = it.jsonObject["episode_number"]!!.jsonPrimitive!!.content + var nameEp = it.jsonObject["name"]!!.jsonPrimitive!!.content + nameEp = if (nameEp == "null") "- Capítulo $noEpisode" else "- $nameEp" + val slug = it.jsonObject["slug"]!!.jsonPrimitive!!.content + val episode = SEpisode.create() + episode.name = "T$noSeason - E$noEpisode $nameEp" + episode.episode_number = noEpisode.toFloat() + episode.setUrlWithoutDomain(urlSolverByType("episode", slug)) + episodes.add(episode) + } + return episodes + } + + override fun latestUpdatesParse(response: Response): AnimesPage { + val responseString = response.body.string() + return parsePopularAnimeJson(responseString) + } + + override fun latestUpdatesRequest(page: Int): Request { + val mediaType = "application/json; charset=utf-8".toMediaType() + val body = ( + "{\"operationName\":\"listDoramas\",\"variables\":{\"page\":$page,\"sort\":\"CREATEDAT_DESC\",\"perPage\":32,\"filter\":{\"isTVShow\":false}}," + + "\"query\":\"query listDoramas(\$page: Int, \$perPage: Int, \$sort: SortFindManyDoramaInput, \$filter: FilterFindManyDoramaInput) {\\n " + + "paginationDorama(page: \$page, perPage: \$perPage, sort: \$sort, filter: \$filter) {\\n count\\n pageInfo {\\n currentPage\\n " + + "hasNextPage\\n hasPreviousPage\\n __typename\\n }\\n items {\\n _id\\n name\\n name_es\\n slug\\n " + + "cast\\n names\\n overview\\n languages\\n created_by\\n popularity\\n poster_path\\n vote_average\\n " + + "backdrop_path\\n first_air_date\\n episode_run_time\\n isTVShow\\n poster\\n backdrop\\n genres {\\n " + + "name\\n slug\\n __typename\\n }\\n networks {\\n name\\n slug\\n __typename\\n }\\n " + + "__typename\\n }\\n __typename\\n }\\n}\\n\"}" + ).toRequestBody(mediaType) + return POST(apiUrl, popularRequestHeaders, body) + } + + override fun popularAnimeParse(response: Response): AnimesPage { + val responseString = response.body.string() + return parsePopularAnimeJson(responseString) + } + + private fun parsePopularAnimeJson(jsonLine: String?): AnimesPage { + val jsonData = jsonLine ?: return AnimesPage(emptyList(), false) + val animeList = mutableListOf() + val paginationDorama = json.decodeFromString(jsonData)!!.jsonObject["data"]!!.jsonObject!!["paginationDorama"]!!.jsonObject + val hasNextPage = paginationDorama["pageInfo"]!!.jsonObject["hasNextPage"]!!.jsonPrimitive!!.content!!.toBoolean() + paginationDorama["items"]!!.jsonArray.map { + val anime = SAnime.create() + val genres = it.jsonObject!!["genres"]!!.jsonArray!!.joinToString { it.jsonObject["name"]!!.jsonPrimitive!!.content } + val id = it.jsonObject!!["_id"]!!.jsonPrimitive!!.content + val poster = it.jsonObject["poster_path"]!!.jsonPrimitive.content + val urlImg = poster.ifEmpty { it.jsonObject!!["poster"]!!.jsonPrimitive.content } + + anime.title = "${it.jsonObject!!["name"]!!.jsonPrimitive!!.content} (${it.jsonObject!!["name_es"]!!.jsonPrimitive!!.content})" + anime.description = it.jsonObject!!["overview"]!!.jsonPrimitive!!.content + anime.genre = genres + anime.thumbnail_url = externalOrInternalImg(urlImg, true) + // "https://image.tmdb.org/t/p/w220_and_h330_face${it.jsonObject!!["poster_path"]!!.jsonPrimitive!!.content}" + anime.setUrlWithoutDomain(urlSolverByType(it.jsonObject!!["__typename"]!!.jsonPrimitive!!.content, it.jsonObject!!["slug"]!!.jsonPrimitive!!.content, id)) + animeList.add(anime) + } + return AnimesPage(animeList, hasNextPage) + } + + private fun urlSolverByType(type: String, slug: String, id: String? = ""): String { + return when (type.lowercase()) { + "dorama" -> "$baseUrl/doramas-online/$slug?id=$id" + "episode" -> "$baseUrl/episodios/$slug" + "movie" -> "$baseUrl/peliculas-online/$slug?id=$id" + else -> "" + } + } + + override fun popularAnimeRequest(page: Int): Request { + val mediaType = "application/json; charset=utf-8".toMediaType() + val body = ( + "{\"operationName\":\"listDoramas\",\"variables\":{\"page\":$page,\"sort\":\"POPULARITY_DESC\",\"perPage\":32,\"filter\":{\"isTVShow\":false}}," + + "\"query\":\"query listDoramas(\$page: Int, \$perPage: Int, \$sort: SortFindManyDoramaInput, \$filter: FilterFindManyDoramaInput) {\\n " + + "paginationDorama(page: \$page, perPage: \$perPage, sort: \$sort, filter: \$filter) {\\n count\\n pageInfo {\\n currentPage\\n " + + "hasNextPage\\n hasPreviousPage\\n __typename\\n }\\n items {\\n _id\\n name\\n name_es\\n slug\\n " + + "cast\\n names\\n overview\\n languages\\n created_by\\n popularity\\n poster_path\\n vote_average\\n " + + "backdrop_path\\n first_air_date\\n episode_run_time\\n isTVShow\\n poster\\n backdrop\\n genres {\\n " + + "name\\n slug\\n __typename\\n }\\n networks {\\n name\\n slug\\n __typename\\n }\\n " + + "__typename\\n }\\n __typename\\n }\\n}\\n\"}" + ).toRequestBody(mediaType) + return POST(apiUrl, popularRequestHeaders, body) + } + + override fun searchAnimeParse(response: Response): AnimesPage { + val responseString = response.body.string() + return if (responseString.contains("searchDorama")) { + parseSearchAnimeJson(responseString) + } else { + parsePopularAnimeJson(responseString) + } + } + + private fun parseSearchAnimeJson(jsonLine: String?): AnimesPage { + val jsonData = jsonLine ?: return AnimesPage(emptyList(), false) + val animeList = mutableListOf() + val paginationDorama = json.decodeFromString(jsonData)!!.jsonObject["data"]!!.jsonObject + paginationDorama["searchDorama"]!!.jsonArray.map { + val anime = SAnime.create() + val id = it.jsonObject!!["_id"]!!.jsonPrimitive!!.content + val poster = it.jsonObject!!["poster_path"]!!.jsonPrimitive!!.content + val urlImg = poster.ifEmpty { it.jsonObject!!["poster"]!!.jsonPrimitive!!.content } + + anime.title = "${it.jsonObject!!["name"]!!.jsonPrimitive!!.content} (${it.jsonObject!!["name_es"]!!.jsonPrimitive!!.content})" + anime.thumbnail_url = externalOrInternalImg(urlImg, true) + anime.setUrlWithoutDomain(urlSolverByType(it.jsonObject!!["__typename"]!!.jsonPrimitive!!.content, it.jsonObject!!["slug"]!!.jsonPrimitive!!.content, id)) + animeList.add(anime) + } + paginationDorama["searchMovie"]!!.jsonArray.map { + val anime = SAnime.create() + val id = it.jsonObject!!["_id"]!!.jsonPrimitive!!.content + val poster = it.jsonObject!!["poster_path"]!!.jsonPrimitive!!.content + val urlImg = poster.ifEmpty { it.jsonObject!!["poster"]!!.jsonPrimitive!!.content } + + anime.title = "${it.jsonObject!!["name"]!!.jsonPrimitive!!.content} (${it.jsonObject!!["name_es"]!!.jsonPrimitive!!.content})" + anime.thumbnail_url = externalOrInternalImg(urlImg, true) + anime.setUrlWithoutDomain(urlSolverByType(it.jsonObject!!["__typename"]!!.jsonPrimitive!!.content, it.jsonObject!!["slug"]!!.jsonPrimitive!!.content, id)) + animeList.add(anime) + } + return AnimesPage(animeList, false) + } + + override fun searchAnimeRequest(page: Int, query: String, filters: AnimeFilterList): Request { + return when { + query.isNotBlank() -> searchQueryRequest(query) + else -> popularAnimeRequest(page) + } + } + + private fun searchQueryRequest(query: String): Request { + val fxQuery = query.replace("+", " ") + val body = ( + "{\"operationName\":\"searchAll\",\"variables\":{\"input\":\"$fxQuery\"},\"query\":\"query searchAll(\$input: String!) {\\n " + + "searchDorama(input: \$input, limit: 32) {\\n _id\\n slug\\n name\\n name_es\\n poster_path\\n poster\\n " + + "__typename\\n }\\n searchMovie(input: \$input, limit: 32) {\\n _id\\n name\\n name_es\\n slug\\n poster_path\\n " + + "poster\\n __typename\\n }\\n}\\n\"}" + ).toRequestBody(mediaType) + return POST(apiUrl, popularRequestHeaders, body) + } + + private fun fetchUrls(text: String?): List { + if (text.isNullOrEmpty()) return listOf() + val linkRegex = "(https?://(www\\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9()@:%_+.~#?&/=]*))".toRegex() + return linkRegex.findAll(text).map { it.value.trim().removeSurrounding("\"") }.toList() + } + + override fun videoListParse(response: Response): List