From 725454b8d5efc31283224b299579df0f5142f418 Mon Sep 17 00:00:00 2001 From: Claudemirovsky <63046606+Claudemirovsky@users.noreply.github.com> Date: Mon, 5 Feb 2024 19:24:03 -0300 Subject: [PATCH 1/5] fix(it/aniplay): Rewrite extension for the new structure (#2871) --- src/it/aniplay/AndroidManifest.xml | 22 +- src/it/aniplay/build.gradle | 6 +- src/it/aniplay/res/web_hi_res_512.png | Bin 36487 -> 0 bytes .../animeextension/it/aniplay/AniPlay.kt | 362 ++++----- .../animeextension/it/aniplay/AniPlayDto.kt | 55 -- .../it/aniplay/AniPlayFilters.kt | 769 ++++++------------ .../it/aniplay/AniPlayUrlActivity.kt | 41 + .../it/aniplay/dto/AniPlayDto.kt | 68 ++ 8 files changed, 519 insertions(+), 804 deletions(-) delete mode 100644 src/it/aniplay/res/web_hi_res_512.png delete mode 100644 src/it/aniplay/src/eu/kanade/tachiyomi/animeextension/it/aniplay/AniPlayDto.kt create mode 100644 src/it/aniplay/src/eu/kanade/tachiyomi/animeextension/it/aniplay/AniPlayUrlActivity.kt create mode 100644 src/it/aniplay/src/eu/kanade/tachiyomi/animeextension/it/aniplay/dto/AniPlayDto.kt diff --git a/src/it/aniplay/AndroidManifest.xml b/src/it/aniplay/AndroidManifest.xml index 568741e54f..c8c0aac737 100644 --- a/src/it/aniplay/AndroidManifest.xml +++ b/src/it/aniplay/AndroidManifest.xml @@ -1,2 +1,22 @@ - \ No newline at end of file + + + + + + + + + + + + + + diff --git a/src/it/aniplay/build.gradle b/src/it/aniplay/build.gradle index f65a7e4dab..ad3b4122d6 100644 --- a/src/it/aniplay/build.gradle +++ b/src/it/aniplay/build.gradle @@ -1,7 +1,11 @@ ext { extName = 'AniPlay' extClass = '.AniPlay' - extVersionCode = 6 + extVersionCode = 7 } apply from: "$rootDir/common.gradle" + +dependencies { + implementation(project(":lib:playlist-utils")) +} diff --git a/src/it/aniplay/res/web_hi_res_512.png b/src/it/aniplay/res/web_hi_res_512.png deleted file mode 100644 index 46c3a588e419a362c4ba66dcbfd3bf9a6d0f2b74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36487 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
Nc%Y#o&^i!*Z*zf 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.getSharedPreferences("source_$id", 0x0000) } // ============================== Popular =============================== + override fun popularAnimeRequest(page: Int) = + GET("$API_URL/advancedSearch?sort=7&page=$page&origin=,,,,,,", headers) - override fun popularAnimeParse(response: Response): AnimesPage = searchAnimeParse(response) - - override fun popularAnimeRequest(page: Int): Request = - GET("$baseUrl/api/anime/advanced-similar-search?page=${page - 1}&size=36&sort=views,desc&sort=id") + override fun popularAnimeParse(response: Response): AnimesPage { + val parsed = response.parseAs() + val animes = parsed.data.map(PopularAnimeDto::toSAnime) + return AnimesPage(animes, parsed.pagination.hasNextPage) + } // =============================== Latest =============================== + override fun latestUpdatesRequest(page: Int) = GET("$API_URL/latest-episodes?page=$page&type=All") - override fun latestUpdatesRequest(page: Int): Request = throw UnsupportedOperationException() - - override fun latestUpdatesParse(response: Response): AnimesPage = throw UnsupportedOperationException() + override fun latestUpdatesParse(response: Response): AnimesPage { + val items = response.parseAs>() + val animes = items.mapNotNull { it.serie.firstOrNull()?.toSAnime() } + return AnimesPage(animes, items.size == 20) + } // =============================== Search =============================== + override fun getFilterList() = AniPlayFilters.FILTER_LIST override suspend fun getSearchAnime(page: Int, query: String, filters: AnimeFilterList): AnimesPage { - val params = AniPlayFilters.getSearchParameters(filters) - return client.newCall(searchAnimeRequest(page, query, params)) - .awaitSuccess() - .use(::searchAnimeParse) - } - - override fun searchAnimeRequest(page: Int, query: String, filters: AnimeFilterList): Request = throw UnsupportedOperationException() - - private fun searchAnimeRequest(page: Int, query: String, filters: AniPlayFilters.FilterSearchParams): Request { - if ((filters.year.isNotEmpty() && filters.season.isEmpty()) || - (filters.year.isEmpty() && filters.season.isNotEmpty()) - ) { - error("Per gli anime stagionali, seleziona sia l'anno che la stagione") - } - - val url = if (filters.year.isNotEmpty()) { - "$baseUrl/api/seasonal-view".toHttpUrlOrNull()!!.newBuilder() - .addPathSegment("${filters.season}-${filters.year}") - .addQueryParameter("page", (page - 1).toString()) - .addQueryParameter("size", "36") - .addQueryParameter("sort", filters.order) - .addQueryParameter("sort", "id") + return if (query.startsWith(PREFIX_SEARCH)) { // URL intent handler + val id = query.removePrefix(PREFIX_SEARCH) + client.newCall(GET("$baseUrl/series/$id")) + .awaitSuccess() + .use(::searchAnimeByIdParse) } else { - "$baseUrl/api/anime/advanced-similar-search".toHttpUrlOrNull()!!.newBuilder() - .addQueryParameter("page", (page - 1).toString()) - .addQueryParameter("size", "36") - .addQueryParameter("sort", filters.order) - .addQueryParameter("sort", "id") - .addIfNotBlank("query", query) - .addIfNotBlank("genreIds", filters.genre) - .addIfNotBlank("typeIds", filters.type) - .addIfNotBlank("statusIds", filters.status) - .addIfNotBlank("originIds", filters.origin) - .addIfNotBlank("studioIds", filters.studio) - .addIfNotBlank("startYear", filters.start) - .addIfNotBlank("endYear", filters.end) + super.getSearchAnime(page, query, filters) } - - return GET(url.build().toString()) } - override fun searchAnimeParse(response: Response): AnimesPage { - val parsed = json.decodeFromString>(response.body.string()) - - val animeList = parsed.map { ani -> - SAnime.create().apply { - title = ani.title - if (ani.verticalImages.isNotEmpty()) { - thumbnail_url = ani.verticalImages.first().imageFull - } - url = ani.id.toString() - description = ani.storyline - } - } - - return AnimesPage(animeList, animeList.size == 36) + private fun searchAnimeByIdParse(response: Response): AnimesPage { + val details = animeDetailsParse(response) + .apply { setUrlWithoutDomain(response.request.url.toString()) } + return AnimesPage(listOf(details), false) } - // ============================== Filters =============================== + override fun searchAnimeRequest(page: Int, query: String, filters: AnimeFilterList): Request { + val params = AniPlayFilters.getSearchParameters(filters) + val url = "$API_URL/advancedSearch".toHttpUrl().newBuilder() + .addQueryParameter("page", page.toString()) + .addQueryParameter("origin", ",,,,,,") + .addQueryParameter("sort", params.order) + .addIfNotBlank("_q", query) + .addIfNotBlank("genres", params.genres) + .addIfNotBlank("country", params.countries) + .addIfNotBlank("types", params.types) + .addIfNotBlank("studios", params.studios) + .addIfNotBlank("status", params.status) + .addIfNotBlank("subbed", params.languages) + .build() + + return GET(url, headers) + } - override fun getFilterList(): AnimeFilterList = AniPlayFilters.FILTER_LIST + override fun searchAnimeParse(response: Response) = popularAnimeParse(response) // =========================== Anime Details ============================ - override fun getAnimeUrl(anime: SAnime) = "$baseUrl/anime/${anime.url}" - - override fun animeDetailsRequest(anime: SAnime) = GET("$baseUrl/api/anime/${anime.url}") - - override fun animeDetailsParse(response: Response): SAnime { - val detailsJson = json.decodeFromString(response.body.string()) - - return SAnime.create().apply { - title = detailsJson.title - author = detailsJson.studio - status = parseStatus(detailsJson.status) - description = buildString { - append(detailsJson.storyline) - append("\n\nTipologia: ${detailsJson.type}") - append("\nOrigine: ${detailsJson.origin}") - if (detailsJson.startDate != null) append("\nData di inizio: ${detailsJson.startDate}") - append("\nStato: ${detailsJson.status}") + override fun animeDetailsParse(response: Response) = SAnime.create().apply { + val script = response.getPageScript() + val jsonString = script.substringAfter("{serie:").substringBefore(",tags") + "}" + val parsed = jsonString.fixJsonString().parseAs() + + title = parsed.title + genre = parsed.genres.joinToString { it.name } + artist = parsed.studios.joinToString { it.name } + thumbnail_url = parsed.thumbnailUrl + status = when (parsed.status) { + "Completato" -> SAnime.COMPLETED + "In corso" -> SAnime.ONGOING + "Sospeso" -> SAnime.ON_HIATUS + else -> SAnime.UNKNOWN + } + + description = buildString { + parsed.description?.also { + append(it, "\n\n") + } + + listOf( + "Titolo Alternativo" to parsed.alternative, + "Origine" to parsed.origin, + "Giorno di lancio" to parsed.release_day, + ).forEach { (title, value) -> + if (value != null) append(title, ": ", value, "\n") } } } // ============================== Episodes ============================== - - override fun episodeListRequest(anime: SAnime): Request = GET("$baseUrl/api/anime/${anime.url}") - override fun episodeListParse(response: Response): List { - val animeJson = json.decodeFromString(response.body.string()) - val episodeList = mutableListOf() - - if (animeJson.seasons.isNotEmpty()) { - for (season in animeJson.seasons) { - val episodesResponse = client.newCall( - GET("$baseUrl/api/anime/${animeJson.id}/season/${season.id}"), - ).execute() - val episodesJson = json.decodeFromString>(episodesResponse.body.string()) - - episodeList.addAll( - episodesJson.map { ep -> - SEpisode.create().apply { - name = "Episode ${ep.episodeNumber.toIntOrNull() ?: (ep.episodeNumber.toFloatOrNull() ?: 1)} ${ep.title ?: ""}" - episode_number = ep.episodeNumber.toFloatOrNull() ?: 0F - if (ep.airingDate != null) date_upload = SimpleDateFormat("yyyy-MM-dd", Locale.ITALY).parse(ep.airingDate)!!.time - url = ep.id.toString() - } - }, - ) + val script = response.getPageScript() + val jsonString = script.substringAfter(",episodes:").substringBefore("]},") + "]" + val parsed = jsonString.fixJsonString().parseAs>() + + return parsed.map { + SEpisode.create().apply { + episode_number = it.number?.toFloatOrNull() ?: 1F + url = "/watch/${it.id}" + name = it.title ?: "Episodio ${it.number}" + date_upload = it.release_date.toDate() } - } else if (animeJson.episodes.isNotEmpty()) { - episodeList.addAll( - animeJson.episodes.map { ep -> - SEpisode.create().apply { - name = "Episode ${ep.episodeNumber.toIntOrNull() ?: (ep.episodeNumber.toFloatOrNull() ?: 1)} ${ep.title ?: ""}" - episode_number = ep.episodeNumber.toFloatOrNull() ?: 0F - if (ep.airingDate != null) date_upload = SimpleDateFormat("yyyy-MM-dd", Locale.ITALY).parse(ep.airingDate)!!.time - url = ep.id.toString() - } - }, - ) - } - - return episodeList.sortedBy { it.episode_number }.reversed() + }.reversed() } // ============================ Video Links ============================= - - override fun videoListRequest(episode: SEpisode): Request = GET("$baseUrl/api/episode/${episode.url}") + private val playlistUtils by lazy { PlaylistUtils(client, headers) } override fun videoListParse(response: Response): List