diff --git a/src/zh/anime1/build.gradle b/src/zh/anime1/build.gradle new file mode 100644 index 00000000..83e053fc --- /dev/null +++ b/src/zh/anime1/build.gradle @@ -0,0 +1,8 @@ +ext { + extName = 'Anime1.me' + extClass = '.Anime1' + extVersionCode = 1 + isNsfw = true +} + +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..55bfff14 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..8e8609cd 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..c0fad5b8 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..800cd8d1 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..76fa6770 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..ead2a8ff --- /dev/null +++ b/src/zh/anime1/src/eu/kanade/tachiyomi/animeextension/zh/anime1/Anime1.kt @@ -0,0 +1,170 @@ +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.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" + 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 // real data + private val cookieManager + get() = CookieManager.getInstance() + + override fun animeDetailsParse(response: Response) = SAnime.create() + + override fun episodeListParse(response: Response): List { + var document: Document? = response.asJsoup() + val episodes = mutableListOf() + while (document != null) { + val items = document.select("article.post").map { + SEpisode.create().apply { + name = it.select(".entry-title").text() + setUrlWithoutDomain(it.select(".entry-title a").attr("href")) + 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