diff --git a/src/all/sudatchi/build.gradle b/src/all/sudatchi/build.gradle index 9cc02ebbb..cd0b43884 100644 --- a/src/all/sudatchi/build.gradle +++ b/src/all/sudatchi/build.gradle @@ -1,7 +1,8 @@ ext { extName = 'Sudatchi' extClass = '.Sudatchi' - extVersionCode = 2 + extVersionCode = 3 + isNsfw = true } apply from: "$rootDir/common.gradle" diff --git a/src/all/sudatchi/src/eu/kanade/tachiyomi/animeextension/all/sudatchi/Sudatchi.kt b/src/all/sudatchi/src/eu/kanade/tachiyomi/animeextension/all/sudatchi/Sudatchi.kt index 584dae56c..9cfd09084 100644 --- a/src/all/sudatchi/src/eu/kanade/tachiyomi/animeextension/all/sudatchi/Sudatchi.kt +++ b/src/all/sudatchi/src/eu/kanade/tachiyomi/animeextension/all/sudatchi/Sudatchi.kt @@ -4,12 +4,13 @@ import android.app.Application import android.content.SharedPreferences import androidx.preference.ListPreference import androidx.preference.PreferenceScreen +import eu.kanade.tachiyomi.animeextension.all.sudatchi.dto.AnimeDto +import eu.kanade.tachiyomi.animeextension.all.sudatchi.dto.AnimePageDto import eu.kanade.tachiyomi.animeextension.all.sudatchi.dto.DirectoryDto -import eu.kanade.tachiyomi.animeextension.all.sudatchi.dto.HomeListDto -import eu.kanade.tachiyomi.animeextension.all.sudatchi.dto.LongAnimeDto -import eu.kanade.tachiyomi.animeextension.all.sudatchi.dto.ShortAnimeDto +import eu.kanade.tachiyomi.animeextension.all.sudatchi.dto.EpisodePageDto +import eu.kanade.tachiyomi.animeextension.all.sudatchi.dto.HomePageDto +import eu.kanade.tachiyomi.animeextension.all.sudatchi.dto.PropsDto import eu.kanade.tachiyomi.animeextension.all.sudatchi.dto.SubtitleDto -import eu.kanade.tachiyomi.animeextension.all.sudatchi.dto.WatchDto import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource import eu.kanade.tachiyomi.animesource.model.AnimeFilterList import eu.kanade.tachiyomi.animesource.model.AnimesPage @@ -27,6 +28,7 @@ import kotlinx.serialization.json.Json import okhttp3.HttpUrl.Companion.toHttpUrl import okhttp3.Request import okhttp3.Response +import org.jsoup.nodes.Document import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import uy.kohesive.injekt.injectLazy @@ -37,6 +39,8 @@ class Sudatchi : AnimeHttpSource(), ConfigurableAnimeSource { override val baseUrl = "https://sudatchi.com" + private val ipfsUrl = "https://ipfs.animeui.com" + override val lang = "all" override val supportsLatest = true @@ -52,7 +56,7 @@ class Sudatchi : AnimeHttpSource(), ConfigurableAnimeSource { } // ============================== Popular =============================== - override fun popularAnimeRequest(page: Int) = GET("$baseUrl/api/home-list", headers) + override fun popularAnimeRequest(page: Int) = GET(baseUrl, headers) private fun Int.parseStatus() = when (this) { 1 -> SAnime.UNKNOWN // Not Yet Released @@ -61,7 +65,7 @@ class Sudatchi : AnimeHttpSource(), ConfigurableAnimeSource { else -> SAnime.UNKNOWN } - private fun ShortAnimeDto.toSAnime(titleLang: String) = SAnime.create().apply { + private fun AnimeDto.toSAnime(titleLang: String) = SAnime.create().apply { url = "/anime/$slug" title = when (titleLang) { "romaji" -> titleRomanji @@ -70,14 +74,19 @@ class Sudatchi : AnimeHttpSource(), ConfigurableAnimeSource { } ?: arrayOf(titleEnglish, titleRomanji, titleJapanese, "").firstNotNullOf { it } description = synopsis status = statusId.parseStatus() - thumbnail_url = "$baseUrl$imgUrl" + thumbnail_url = when { + imgUrl.startsWith("/") -> "$baseUrl$imgUrl" + else -> "$ipfsUrl/ipfs/$imgUrl" + } genre = animeGenres?.joinToString { it.genre.name } } override fun popularAnimeParse(response: Response): AnimesPage { sudatchiFilters.fetchFilters() val titleLang = preferences.title - return AnimesPage(response.parseAs().animeSpotlight.map { it.toSAnime(titleLang) }, false) + val document = response.asJsoup() + val data = document.parseAs().animeSpotlight + return AnimesPage(data.map { it.toSAnime(titleLang) }, false) } // =============================== Latest =============================== @@ -97,7 +106,7 @@ class Sudatchi : AnimeHttpSource(), ConfigurableAnimeSource { override suspend fun getSearchAnime(page: Int, query: String, filters: AnimeFilterList): AnimesPage { return if (query.startsWith(PREFIX_SEARCH)) { // URL intent handler val id = query.removePrefix(PREFIX_SEARCH) - client.newCall(GET("$baseUrl/api/anime/$id", headers)) + client.newCall(GET("$baseUrl/anime/$id", headers)) .awaitSuccess() .use(::searchAnimeByIdParse) } else { @@ -130,15 +139,18 @@ class Sudatchi : AnimeHttpSource(), ConfigurableAnimeSource { // =========================== Anime Details ============================ override fun getAnimeUrl(anime: SAnime) = "$baseUrl${anime.url}" - override fun animeDetailsRequest(anime: SAnime) = GET("$baseUrl/api${anime.url}", headers) - - override fun animeDetailsParse(response: Response) = response.parseAs().toSAnime(preferences.title) + override fun animeDetailsParse(response: Response): SAnime { + val document = response.asJsoup() + val data = document.parseAs().animeData + return data.toSAnime(preferences.title) + } // ============================== Episodes ============================== override fun episodeListRequest(anime: SAnime) = animeDetailsRequest(anime) override fun episodeListParse(response: Response): List { - val anime = response.parseAs() + val document = response.asJsoup() + val anime = document.parseAs().animeData return anime.episodes.map { SEpisode.create().apply { name = it.title @@ -155,8 +167,7 @@ class Sudatchi : AnimeHttpSource(), ConfigurableAnimeSource { override fun videoListParse(response: Response): List