animepahe improvements
* lazy initializer for baseUrl * sub/dub preference
This commit is contained in:
@ -5,8 +5,13 @@ ext {
|
|||||||
extName = 'AnimePahe'
|
extName = 'AnimePahe'
|
||||||
pkgNameSuffix = 'en.animepahe'
|
pkgNameSuffix = 'en.animepahe'
|
||||||
extClass = '.AnimePahe'
|
extClass = '.AnimePahe'
|
||||||
extVersionCode = 6
|
extVersionCode = 7
|
||||||
libVersion = '12'
|
libVersion = '12'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
ext.coroutinesVersion = "1.4.3"
|
||||||
|
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutinesVersion")
|
||||||
|
}
|
||||||
|
|
||||||
apply from: "$rootDir/common.gradle"
|
apply from: "$rootDir/common.gradle"
|
||||||
|
@ -5,6 +5,7 @@ import android.content.SharedPreferences
|
|||||||
import androidx.preference.ListPreference
|
import androidx.preference.ListPreference
|
||||||
import androidx.preference.PreferenceScreen
|
import androidx.preference.PreferenceScreen
|
||||||
import com.google.gson.JsonElement
|
import com.google.gson.JsonElement
|
||||||
|
import com.google.gson.JsonNull
|
||||||
import com.google.gson.JsonObject
|
import com.google.gson.JsonObject
|
||||||
import com.google.gson.JsonParser
|
import com.google.gson.JsonParser
|
||||||
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
|
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
|
||||||
@ -17,6 +18,9 @@ import eu.kanade.tachiyomi.animesource.online.AnimeHttpSource
|
|||||||
import eu.kanade.tachiyomi.network.GET
|
import eu.kanade.tachiyomi.network.GET
|
||||||
import eu.kanade.tachiyomi.network.POST
|
import eu.kanade.tachiyomi.network.POST
|
||||||
import eu.kanade.tachiyomi.util.asJsoup
|
import eu.kanade.tachiyomi.util.asJsoup
|
||||||
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
import kotlinx.coroutines.runBlocking
|
||||||
|
import kotlinx.coroutines.withContext
|
||||||
import okhttp3.FormBody
|
import okhttp3.FormBody
|
||||||
import okhttp3.Headers
|
import okhttp3.Headers
|
||||||
import okhttp3.OkHttpClient
|
import okhttp3.OkHttpClient
|
||||||
@ -37,7 +41,7 @@ class AnimePahe : ConfigurableAnimeSource, AnimeHttpSource() {
|
|||||||
|
|
||||||
override val name = "AnimePahe"
|
override val name = "AnimePahe"
|
||||||
|
|
||||||
override val baseUrl = preferences.getString("preferred_domain", "https://animepahe.com")!!
|
override val baseUrl by lazy { preferences.getString("preferred_domain", "https://animepahe.com")!! }
|
||||||
|
|
||||||
override val lang = "en"
|
override val lang = "en"
|
||||||
|
|
||||||
@ -65,15 +69,33 @@ class AnimePahe : ConfigurableAnimeSource, AnimeHttpSource() {
|
|||||||
|
|
||||||
override val client: OkHttpClient = network.cloudflareClient
|
override val client: OkHttpClient = network.cloudflareClient
|
||||||
|
|
||||||
|
override fun animeDetailsRequest(anime: SAnime): Request {
|
||||||
|
val responseString = runBlocking {
|
||||||
|
withContext(Dispatchers.IO) {
|
||||||
|
client.newCall(GET("$baseUrl/api?m=search&q=${anime.title}"))
|
||||||
|
.execute().body!!.string()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
val animeId = anime.url.substringAfterLast("?anime_id=")
|
||||||
|
val session = responseString.substringAfter("\"id\":$animeId")
|
||||||
|
.substringAfter("\"session\":\"").substringBefore("\"")
|
||||||
|
return GET("$baseUrl/anime/$session?anime_id=$animeId")
|
||||||
|
}
|
||||||
|
|
||||||
override fun animeDetailsParse(response: Response): SAnime {
|
override fun animeDetailsParse(response: Response): SAnime {
|
||||||
val jsoup = response.asJsoup()
|
val jsoup = response.asJsoup()
|
||||||
val anime = SAnime.create()
|
val anime = SAnime.create()
|
||||||
|
anime.setUrlWithoutDomain(response.request.url.toString())
|
||||||
anime.title = jsoup.selectFirst("div.title-wrapper h1").text()
|
anime.title = jsoup.selectFirst("div.title-wrapper h1").text()
|
||||||
anime.author = jsoup.selectFirst("div.col-sm-4.anime-info p:contains(Studio:)").text().replace("Studio: ", "")
|
anime.author = jsoup.select("div.col-sm-4.anime-info p:contains(Studio:)")
|
||||||
|
.firstOrNull()?.text()?.replace("Studio: ", "")
|
||||||
anime.status = parseStatus(jsoup.selectFirst("div.col-sm-4.anime-info p:contains(Status:) a").text())
|
anime.status = parseStatus(jsoup.selectFirst("div.col-sm-4.anime-info p:contains(Status:) a").text())
|
||||||
anime.thumbnail_url = jsoup.selectFirst("div.anime-poster a").attr("href")
|
anime.thumbnail_url = jsoup.selectFirst("div.anime-poster a").attr("href")
|
||||||
anime.genre = jsoup.select("div.anime-genre ul li").joinToString { it.text() }
|
anime.genre = jsoup.select("div.anime-genre ul li").joinToString { it.text() }
|
||||||
anime.description = jsoup.select("div.anime-summary").text()
|
val synonyms = jsoup.select("div.col-sm-4.anime-info p:contains(Synonyms:)")
|
||||||
|
.firstOrNull()?.text()
|
||||||
|
anime.description = jsoup.select("div.anime-summary").text() +
|
||||||
|
if (synonyms.isNullOrEmpty()) "" else "\n\n$synonyms"
|
||||||
return anime
|
return anime
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -195,36 +217,46 @@ class AnimePahe : ConfigurableAnimeSource, AnimeHttpSource() {
|
|||||||
val array = JsonParser.parseString(response.body!!.string())
|
val array = JsonParser.parseString(response.body!!.string())
|
||||||
.asJsonObject.get("data").asJsonArray
|
.asJsonObject.get("data").asJsonArray
|
||||||
val videos = mutableListOf<Video>()
|
val videos = mutableListOf<Video>()
|
||||||
for (item in array.reversed()) {
|
for (item in array) {
|
||||||
val quality = item.asJsonObject.keySet().first()
|
val quality = item.asJsonObject.keySet().first()
|
||||||
val adflyLink = item.asJsonObject.get(quality)
|
val adflyLink = item.asJsonObject.get(quality)
|
||||||
.asJsonObject.get("kwik_adfly").asString
|
.asJsonObject.get("kwik_adfly").asString
|
||||||
videos.add(getVideo(adflyLink, quality))
|
val audio = item.asJsonObject.get(quality).asJsonObject.get("audio")
|
||||||
|
val qualityString = if (audio is JsonNull) "${quality}p" else "${quality}p (" + audio.asString + " audio)"
|
||||||
|
videos.add(getVideo(adflyLink, qualityString))
|
||||||
}
|
}
|
||||||
return videos
|
return videos
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getVideo(adflyUrl: String, quality: String): Video {
|
private fun getVideo(adflyUrl: String, quality: String): Video {
|
||||||
val videoUrl = KwikExtractor().getStreamUrlFromKwik(adflyUrl)
|
val videoUrl = KwikExtractor().getStreamUrlFromKwik(adflyUrl)
|
||||||
return Video(videoUrl, "${quality}p", videoUrl, null)
|
return Video(videoUrl, quality, videoUrl, null)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun List<Video>.sort(): List<Video> {
|
override fun List<Video>.sort(): List<Video> {
|
||||||
val quality = preferences.getString("preferred_quality", null)
|
val subPreference = preferences.getString("preferred_sub", "jpn")!!
|
||||||
if (quality != null) {
|
val quality = preferences.getString("preferred_quality", "1080")!!
|
||||||
val newList = mutableListOf<Video>()
|
val qualityList = mutableListOf<Video>()
|
||||||
var preferred = 0
|
val newList = mutableListOf<Video>()
|
||||||
for (video in this) {
|
var preferred = 0
|
||||||
if (video.quality.contains(quality)) {
|
for (video in this.reversed()) {
|
||||||
newList.add(preferred, video)
|
if (video.quality.contains(quality)) {
|
||||||
preferred++
|
qualityList.add(preferred, video)
|
||||||
} else {
|
preferred++
|
||||||
newList.add(video)
|
} else {
|
||||||
}
|
qualityList.add(video)
|
||||||
}
|
}
|
||||||
return newList
|
|
||||||
}
|
}
|
||||||
return this
|
preferred = 0
|
||||||
|
for (video in qualityList) {
|
||||||
|
if (video.quality.contains(subPreference)) {
|
||||||
|
newList.add(preferred, video)
|
||||||
|
preferred++
|
||||||
|
} else {
|
||||||
|
newList.add(video)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return newList
|
||||||
}
|
}
|
||||||
|
|
||||||
inner class KwikExtractor {
|
inner class KwikExtractor {
|
||||||
@ -406,8 +438,8 @@ class AnimePahe : ConfigurableAnimeSource, AnimeHttpSource() {
|
|||||||
val videoQualityPref = ListPreference(screen.context).apply {
|
val videoQualityPref = ListPreference(screen.context).apply {
|
||||||
key = "preferred_quality"
|
key = "preferred_quality"
|
||||||
title = "Preferred quality"
|
title = "Preferred quality"
|
||||||
entries = arrayOf("1080p", "720p", "480p", "360p")
|
entries = arrayOf("1080p", "720p", "360p")
|
||||||
entryValues = arrayOf("1080", "720", "480", "360")
|
entryValues = arrayOf("1080", "720", "360")
|
||||||
setDefaultValue("1080")
|
setDefaultValue("1080")
|
||||||
summary = "%s"
|
summary = "%s"
|
||||||
|
|
||||||
@ -433,7 +465,23 @@ class AnimePahe : ConfigurableAnimeSource, AnimeHttpSource() {
|
|||||||
preferences.edit().putString(key, entry).commit()
|
preferences.edit().putString(key, entry).commit()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
val subPref = ListPreference(screen.context).apply {
|
||||||
|
key = "preferred_sub"
|
||||||
|
title = "Prefer subs or dubs?"
|
||||||
|
entries = arrayOf("sub", "dub")
|
||||||
|
entryValues = arrayOf("jpn", "eng")
|
||||||
|
setDefaultValue("jpn")
|
||||||
|
summary = "%s"
|
||||||
|
|
||||||
|
setOnPreferenceChangeListener { _, newValue ->
|
||||||
|
val selected = newValue as String
|
||||||
|
val index = findIndexOfValue(selected)
|
||||||
|
val entry = entryValues[index] as String
|
||||||
|
preferences.edit().putString(key, entry).commit()
|
||||||
|
}
|
||||||
|
}
|
||||||
screen.addPreference(videoQualityPref)
|
screen.addPreference(videoQualityPref)
|
||||||
screen.addPreference(domainPref)
|
screen.addPreference(domainPref)
|
||||||
|
screen.addPreference(subPref)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user