diff --git a/src/zh/anime1/build.gradle b/src/zh/anime1/build.gradle new file mode 100644 index 00000000..ce26ab4b --- /dev/null +++ b/src/zh/anime1/build.gradle @@ -0,0 +1,7 @@ +ext { + extName = 'Anime1.me' + extClass = '.Anime1' + extVersionCode = 1 +} + +apply from: "$rootDir/common.gradle" diff --git a/src/zh/anime1/res/mipmap-hdpi/ic_launcher.png b/src/zh/anime1/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 00000000..98585735 Binary files /dev/null and b/src/zh/anime1/res/mipmap-hdpi/ic_launcher.png differ diff --git a/src/zh/anime1/res/mipmap-mdpi/ic_launcher.png b/src/zh/anime1/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 00000000..186328d5 Binary files /dev/null and b/src/zh/anime1/res/mipmap-mdpi/ic_launcher.png differ diff --git a/src/zh/anime1/res/mipmap-xhdpi/ic_launcher.png b/src/zh/anime1/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 00000000..195d9a27 Binary files /dev/null and b/src/zh/anime1/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/src/zh/anime1/res/mipmap-xxhdpi/ic_launcher.png b/src/zh/anime1/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 00000000..599affaf Binary files /dev/null and b/src/zh/anime1/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/src/zh/anime1/res/mipmap-xxxhdpi/ic_launcher.png b/src/zh/anime1/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 00000000..20dda2b2 Binary files /dev/null and b/src/zh/anime1/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/src/zh/anime1/src/eu/kanade/tachiyomi/animeextension/zh/anime1/Anime1.kt b/src/zh/anime1/src/eu/kanade/tachiyomi/animeextension/zh/anime1/Anime1.kt new file mode 100644 index 00000000..7608d038 --- /dev/null +++ b/src/zh/anime1/src/eu/kanade/tachiyomi/animeextension/zh/anime1/Anime1.kt @@ -0,0 +1,185 @@ +package eu.kanade.tachiyomi.animeextension.zh.anime1 + +import android.webkit.CookieManager +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.network.GET +import eu.kanade.tachiyomi.network.POST +import eu.kanade.tachiyomi.network.awaitSuccess +import eu.kanade.tachiyomi.util.asJsoup +import eu.kanade.tachiyomi.util.parseAs +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.JsonArray +import kotlinx.serialization.json.contentOrNull +import kotlinx.serialization.json.jsonArray +import kotlinx.serialization.json.jsonPrimitive +import okhttp3.HttpUrl.Companion.toHttpUrl +import okhttp3.MediaType.Companion.toMediaTypeOrNull +import okhttp3.Request +import okhttp3.RequestBody.Companion.toRequestBody +import okhttp3.Response +import org.jsoup.Jsoup +import org.jsoup.nodes.Document +import java.text.SimpleDateFormat +import java.util.Locale + +class Anime1 : AnimeHttpSource() { + override val baseUrl: String + get() = "https://anime1.me" + override val lang: String + get() = "zh-hant" + override val name: String + get() = "Anime1.me" + override val supportsLatest: Boolean + get() = true + + override fun headersBuilder() = super.headersBuilder().add("referer", "$baseUrl/") + + private val videoApiUrl = "https://v.anime1.me/api" + private val dataUrl = "https://d1zquzjgwo9yb.cloudfront.net" + private val uploadDateFormat: SimpleDateFormat by lazy { + SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.getDefault()) + } + private lateinit var data: JsonArray + private val cookieManager + get() = CookieManager.getInstance() + + override fun animeDetailsParse(response: Response) = throw UnsupportedOperationException() + override suspend fun getAnimeDetails(anime: SAnime): SAnime { + return SAnime.create().apply { + thumbnail_url = FIX_COVER + } + } + + override fun episodeListParse(response: Response): List { + var document: Document? = response.asJsoup() + val episodes = mutableListOf() + val requestUrl = response.request.url.toString() + while (document != null) { + val items = document.select("article.post").map { + SEpisode.create().apply { + name = it.select(".entry-title").text() + val url = it.selectFirst(".entry-title a")?.attr("href") ?: requestUrl + setUrlWithoutDomain(url) + date_upload = it.select("time.updated").attr("datetime").let { date -> + runCatching { uploadDateFormat.parse(date)?.time }.getOrNull() ?: 0L + } + } + } + episodes.addAll(items) + val previousUrl = document.select(".nav-previous a").attr("href") + document = if (previousUrl.isBlank()) { + null + } else { + client.newCall(GET(previousUrl)).execute().asJsoup() + } + } + return episodes + } + + override fun videoListParse(response: Response): List