animepahe improvements

* lazy initializer for baseUrl

* sub/dub preference
This commit is contained in:
jmir1
2021-09-24 19:04:54 +02:00
parent e7a07da64b
commit c9e400d9fb
2 changed files with 75 additions and 22 deletions

View File

@ -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"

View File

@ -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)
} }
} }