xsanime, xsmovie: add qualities in ext settings (#221)

* xsanime: add qualities it settings

* Update build.gradle

* xsmovie: add qualities to ext settings

* Update build.gradle
This commit is contained in:
Ahmed gamal
2022-01-06 00:13:10 +02:00
committed by GitHub
parent c1a01366f8
commit bec19f6267
4 changed files with 84 additions and 20 deletions

View File

@ -5,7 +5,7 @@ ext {
extName = 'XS Anime' extName = 'XS Anime'
pkgNameSuffix = 'ar.xsanime' pkgNameSuffix = 'ar.xsanime'
extClass = '.XsAnime' extClass = '.XsAnime'
extVersionCode = 5 extVersionCode = 6
libVersion = '12' libVersion = '12'
} }

View File

@ -1,5 +1,10 @@
package eu.kanade.tachiyomi.animeextension.ar.xsanime package eu.kanade.tachiyomi.animeextension.ar.xsanime
import android.app.Application
import android.content.SharedPreferences
import androidx.preference.ListPreference
import androidx.preference.PreferenceScreen
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
import eu.kanade.tachiyomi.animesource.model.AnimeFilter import eu.kanade.tachiyomi.animesource.model.AnimeFilter
import eu.kanade.tachiyomi.animesource.model.AnimeFilterList import eu.kanade.tachiyomi.animesource.model.AnimeFilterList
import eu.kanade.tachiyomi.animesource.model.SAnime import eu.kanade.tachiyomi.animesource.model.SAnime
@ -8,16 +13,18 @@ import eu.kanade.tachiyomi.animesource.model.Video
import eu.kanade.tachiyomi.animesource.online.ParsedAnimeHttpSource import eu.kanade.tachiyomi.animesource.online.ParsedAnimeHttpSource
import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.util.asJsoup import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.Headers.Companion.toHeaders import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import okhttp3.Response import okhttp3.Response
import org.jsoup.nodes.Document import org.jsoup.nodes.Document
import org.jsoup.nodes.Element import org.jsoup.nodes.Element
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
import java.lang.Exception import java.lang.Exception
class XsAnime : ParsedAnimeHttpSource() { class XsAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
override val name = "XS Anime" override val name = "XS Anime"
@ -29,6 +36,10 @@ class XsAnime : ParsedAnimeHttpSource() {
override val client: OkHttpClient = network.cloudflareClient override val client: OkHttpClient = network.cloudflareClient
private val preferences: SharedPreferences by lazy {
Injekt.get<Application>().getSharedPreferences("source_$id", 0x0000)
}
// Popular Anime // Popular Anime
override fun popularAnimeSelector(): String = "ul.boxes--holder div.itemtype_anime a" override fun popularAnimeSelector(): String = "ul.boxes--holder div.itemtype_anime a"
@ -51,7 +62,7 @@ class XsAnime : ParsedAnimeHttpSource() {
val episode = SEpisode.create() val episode = SEpisode.create()
episode.setUrlWithoutDomain(element.attr("abs:href")) episode.setUrlWithoutDomain(element.attr("abs:href"))
episode.name = element.select("a > em").text() episode.name = element.select("a > em").text()
episode.episode_number = element.select("a > em").text().replace(" و", "").replace("الأخيرة", "").toFloat() // episode.episode_number = element.select("a > em").text().replace(" و", "").replace("الأخيرة", "").toFloat()
episode.date_upload = System.currentTimeMillis() episode.date_upload = System.currentTimeMillis()
return episode return episode
@ -61,11 +72,11 @@ class XsAnime : ParsedAnimeHttpSource() {
override fun videoListParse(response: Response): List<Video> { override fun videoListParse(response: Response): List<Video> {
val document = response.asJsoup() val document = response.asJsoup()
val iframe = document.select("iframe").attr("src").removePrefix("https://ww.xsanime.com/embedd?url=") val srcVid = preferences.getString("preferred_quality", "الجودة العالية")!!
val referer = response.request.url.encodedPath val iframe = document.select("div.downloads ul div.listServ:contains($srcVid) div.serL a[href~=4shared]").attr("href").substringBeforeLast("/").replace("video", "web/embed/file")
val newHeaderList = mutableMapOf(Pair("referer", baseUrl + referer)) val referer = response.request.url.toString()
headers.forEach { newHeaderList[it.first] = it.second } val refererHeaders = Headers.headersOf("referer", referer)
val iframeResponse = client.newCall(GET(iframe, newHeaderList.toHeaders())) val iframeResponse = client.newCall(GET(iframe, refererHeaders))
.execute().asJsoup() .execute().asJsoup()
return iframeResponse.select(videoListSelector()).map { videoFromElement(it) } return iframeResponse.select(videoListSelector()).map { videoFromElement(it) }
} }
@ -74,7 +85,7 @@ class XsAnime : ParsedAnimeHttpSource() {
override fun videoFromElement(element: Element): Video { override fun videoFromElement(element: Element): Video {
element.attr("src") element.attr("src")
return Video(element.attr("src"), "Default", element.attr("src"), null) return Video(element.attr("src"), "Default: If you want to change the quality go to extension settings", element.attr("src"), null)
} }
override fun videoUrlParse(document: Document) = throw Exception("not used") override fun videoUrlParse(document: Document) = throw Exception("not used")
@ -186,4 +197,25 @@ class XsAnime : ParsedAnimeHttpSource() {
override fun latestUpdatesRequest(page: Int): Request = throw Exception("Not used") override fun latestUpdatesRequest(page: Int): Request = throw Exception("Not used")
override fun latestUpdatesSelector(): String = throw Exception("Not used") override fun latestUpdatesSelector(): String = throw Exception("Not used")
// Preferences
override fun setupPreferenceScreen(screen: PreferenceScreen) {
val qualityPref = ListPreference(screen.context).apply {
key = "preferred_quality"
title = "Preferred Quality"
entries = arrayOf("الجودة العالية", "الجودة الخارقة", "الجودة المتوسطة")
entryValues = arrayOf("الجودة العالية", "الجودة الخارقة", "الجودة المتوسطة")
setDefaultValue("الجودة العالية")
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(qualityPref)
}
} }

View File

@ -5,7 +5,7 @@ ext {
extName = 'XS Movie' extName = 'XS Movie'
pkgNameSuffix = 'ar.xsmovie' pkgNameSuffix = 'ar.xsmovie'
extClass = '.XsMovie' extClass = '.XsMovie'
extVersionCode = 2 extVersionCode = 3
libVersion = '12' libVersion = '12'
} }

View File

@ -1,5 +1,10 @@
package eu.kanade.tachiyomi.animeextension.ar.xsmovie package eu.kanade.tachiyomi.animeextension.ar.xsmovie
import android.app.Application
import android.content.SharedPreferences
import androidx.preference.ListPreference
import androidx.preference.PreferenceScreen
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
import eu.kanade.tachiyomi.animesource.model.AnimeFilterList import eu.kanade.tachiyomi.animesource.model.AnimeFilterList
import eu.kanade.tachiyomi.animesource.model.SAnime import eu.kanade.tachiyomi.animesource.model.SAnime
import eu.kanade.tachiyomi.animesource.model.SEpisode import eu.kanade.tachiyomi.animesource.model.SEpisode
@ -7,15 +12,17 @@ import eu.kanade.tachiyomi.animesource.model.Video
import eu.kanade.tachiyomi.animesource.online.ParsedAnimeHttpSource import eu.kanade.tachiyomi.animesource.online.ParsedAnimeHttpSource
import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.util.asJsoup import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.Headers.Companion.toHeaders import okhttp3.Headers
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import okhttp3.Response import okhttp3.Response
import org.jsoup.nodes.Document import org.jsoup.nodes.Document
import org.jsoup.nodes.Element import org.jsoup.nodes.Element
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
import java.lang.Exception import java.lang.Exception
class XsMovie : ParsedAnimeHttpSource() { class XsMovie : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
override val name = "XS Movie" override val name = "XS Movie"
@ -27,6 +34,10 @@ class XsMovie : ParsedAnimeHttpSource() {
override val client: OkHttpClient = network.cloudflareClient override val client: OkHttpClient = network.cloudflareClient
private val preferences: SharedPreferences by lazy {
Injekt.get<Application>().getSharedPreferences("source_$id", 0x0000)
}
// Popular Anime // Popular Anime
override fun popularAnimeSelector(): String = "ul.boxes--holder div.itemtype_anime a" override fun popularAnimeSelector(): String = "ul.boxes--holder div.itemtype_anime a"
@ -48,7 +59,7 @@ class XsMovie : ParsedAnimeHttpSource() {
override fun episodeFromElement(element: Element): SEpisode { override fun episodeFromElement(element: Element): SEpisode {
val episode = SEpisode.create() val episode = SEpisode.create()
episode.setUrlWithoutDomain(element.attr("href")) episode.setUrlWithoutDomain(element.attr("href"))
episode.name = "movie" episode.name = element.text().replace("فيلم ", "").replace("مترجم ", "").replace("اون لاين ", "").replace("بلوراي", "") // "movie"
return episode return episode
} }
@ -57,11 +68,11 @@ class XsMovie : ParsedAnimeHttpSource() {
override fun videoListParse(response: Response): List<Video> { override fun videoListParse(response: Response): List<Video> {
val document = response.asJsoup() val document = response.asJsoup()
val iframe = document.select("div.player--iframe iframe").attr("src").removePrefix("https://ww.xsanime.com/embedd?url=") val srcVid = preferences.getString("preferred_quality", "الجودة العالية")!!
val referer = response.request.url.encodedPath val iframe = document.select("div.downloads ul div.listServ:contains($srcVid) div.serL a[href~=4shared]").attr("href").substringBeforeLast("/").replace("video", "web/embed/file")
val newHeaderList = mutableMapOf(Pair("referer", baseUrl + referer)) val referer = response.request.url.toString()
headers.forEach { newHeaderList[it.first] = it.second } val refererHeaders = Headers.headersOf("referer", referer)
val iframeResponse = client.newCall(GET(iframe, newHeaderList.toHeaders())) val iframeResponse = client.newCall(GET(iframe, refererHeaders))
.execute().asJsoup() .execute().asJsoup()
return iframeResponse.select(videoListSelector()).map { videoFromElement(it) } return iframeResponse.select(videoListSelector()).map { videoFromElement(it) }
} }
@ -69,7 +80,7 @@ class XsMovie : ParsedAnimeHttpSource() {
override fun videoListSelector() = "source" override fun videoListSelector() = "source"
override fun videoFromElement(element: Element): Video { override fun videoFromElement(element: Element): Video {
return Video(element.attr("src"), "Default", element.attr("src"), null) return Video(element.attr("src"), "Default: If you want to change the quality go to extension settings", element.attr("src"), null)
} }
override fun videoUrlParse(document: Document) = throw Exception("not used") override fun videoUrlParse(document: Document) = throw Exception("not used")
@ -118,4 +129,25 @@ class XsMovie : ParsedAnimeHttpSource() {
override fun latestUpdatesRequest(page: Int): Request = throw Exception("Not used") override fun latestUpdatesRequest(page: Int): Request = throw Exception("Not used")
override fun latestUpdatesSelector(): String = throw Exception("Not used") override fun latestUpdatesSelector(): String = throw Exception("Not used")
// Preferences
override fun setupPreferenceScreen(screen: PreferenceScreen) {
val qualityPref = ListPreference(screen.context).apply {
key = "preferred_quality"
title = "Preferred Quality"
entries = arrayOf("الجودة العالية", "الجودة الخارقة", "الجودة المتوسطة")
entryValues = arrayOf("الجودة العالية", "الجودة الخارقة", "الجودة المتوسطة")
setDefaultValue("الجودة العالية")
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(qualityPref)
}
} }