fix movizland and tuktukcinema (#1025)

This commit is contained in:
adly98
2022-11-15 12:48:25 +02:00
committed by GitHub
parent c1b128c7b3
commit 3fb3d4e2b1
4 changed files with 96 additions and 104 deletions

View File

@ -5,7 +5,7 @@ ext {
extName = 'موفيزلاند' extName = 'موفيزلاند'
pkgNameSuffix = 'ar.movizland' pkgNameSuffix = 'ar.movizland'
extClass = '.Movizland' extClass = '.Movizland'
extVersionCode = 9 extVersionCode = 10
libVersion = '13' libVersion = '13'
} }

View File

@ -29,13 +29,13 @@ import org.jsoup.nodes.Element
import org.jsoup.select.Elements import org.jsoup.select.Elements
import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get import uy.kohesive.injekt.api.get
import java.lang.Exception import kotlin.Exception
class Movizland : ConfigurableAnimeSource, ParsedAnimeHttpSource() { class Movizland : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
override val name = "موفيزلاند" override val name = "موفيزلاند"
override val baseUrl = "https://watch.movizland.cyou" override val baseUrl = "https://movizland.icu"
override val lang = "ar" override val lang = "ar"
@ -47,45 +47,24 @@ class Movizland : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
Injekt.get<Application>().getSharedPreferences("source_$id", 0x0000) Injekt.get<Application>().getSharedPreferences("source_$id", 0x0000)
} }
// Popular // ============================= popular =============================
private fun titleEdit(title: String, details: Boolean = false): String {
return if (Regex("فيلم (.*?) مترجم").containsMatchIn(title))
Regex("فيلم (.*?) مترجم").find(title)!!.groupValues[1] + " (فيلم)" // افلام اجنبيه مترجمه
else if (Regex("فيلم (.*?) مدبلج").containsMatchIn(title))
Regex("فيلم (.*?) مدبلج").find(title)!!.groupValues[1] + " (مدبلج)(فيلم)" // افلام اجنبيه مدبلجه
else if (Regex("فيلم ([^a-zA-Z]+) ([0-9]+)").containsMatchIn(title)) // افلام عربى
Regex("فيلم ([^a-zA-Z]+) ([0-9]+)").find(title)!!.groupValues[1] + " (فيلم)"
else if (title.contains("مسلسل")) {
if (title.contains("الموسم") and details) {
val newTitle = Regex("مسلسل (.*?) الموسم (.*?) الحلقة ([0-9]+)").find(title)
"${newTitle!!.groupValues[1]} (م.${newTitle.groupValues[2]})(${newTitle.groupValues[3]}ح)"
} else if (title.contains("الحلقة")and details) {
val newTitle = Regex("مسلسل (.*?) الحلقة ([0-9]+)").find(title)
"${newTitle!!.groupValues[1]} (${newTitle.groupValues[2]}ح)"
} else Regex(if (title.contains("الموسم")) "مسلسل (.*?) الموسم" else "مسلسل (.*?) الحلقة").find(title)!!.groupValues[1] + " (مسلسل)"
} else if (title.contains("انمي"))
return Regex(if (title.contains("الموسم"))"انمي (.*?) الموسم" else "انمي (.*?) الحلقة").find(title)!!.groupValues[1] + " (انمى)"
else if (title.contains("برنامج"))
Regex(if (title.contains("الموسم"))"برنامج (.*?) الموسم" else "برنامج (.*?) الحلقة").find(title)!!.groupValues[1] + " (برنامج)"
else
title
}
override fun popularAnimeSelector(): String = "div.BlockItem" override fun popularAnimeSelector(): String = "div.BlockItem a"
override fun popularAnimeRequest(page: Int): Request = GET("$baseUrl/page/$page/") override fun popularAnimeRequest(page: Int): Request = GET("$baseUrl/page/$page/")
override fun popularAnimeFromElement(element: Element): SAnime { override fun popularAnimeFromElement(element: Element): SAnime {
val anime = SAnime.create() val anime = SAnime.create()
anime.thumbnail_url = element.select("a div.BlockImageItem img").attr("data-src") anime.thumbnail_url = element.select("div.BlockImageItem img").attr("data-src")
anime.setUrlWithoutDomain(element.select("a").attr("href")) anime.setUrlWithoutDomain(element.attr("href"))
anime.title = titleEdit(element.select("a div.BlockImageItem img").attr("alt")) anime.title = titleEdit(element.select("div.BlockImageItem img").attr("alt"), true)
return anime return anime
} }
override fun popularAnimeNextPageSelector(): String = "div.pagination li a.next" override fun popularAnimeNextPageSelector(): String = "div.pagination li a.next"
// episodes // ============================= episodes =============================
private fun seasonsNextPageSelector() = "div.BlockItem a" private fun seasonsNextPageSelector() = "div.BlockItem a"
override fun episodeListParse(response: Response): List<SEpisode> { override fun episodeListParse(response: Response): List<SEpisode> {
@ -97,13 +76,11 @@ class Movizland : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
if (type == "assembly") if (type == "assembly")
episode.name = title.replace("فيلم", "").trim() episode.name = title.replace("فيلم", "").trim()
else if (type == "movie") else if (type == "movie")
episode.name = "watch" episode.name = "مشاهدة"
else if (Regex("الموسم (.*)").containsMatchIn(title)) else if (TitleRegex.SEASON.containsMatchIn(title))
episode.name = Regex("الموسم (.*)").find(title)!!.value.replace("مترجمة", "").replace("والاخيرة", "").trim() episode.name = TitleRegex.SEASON.find(title)!!.value.replace("مترجمة", "").replace("والاخيرة", "").trim()
else if (Regex("الحلقة (.*)").containsMatchIn(title)) else if (TitleRegex.EPISODE.containsMatchIn(title))
episode.name = Regex("الحلقة (.*)").find(title)!!.value.replace("مترجمة", "").replace("والاخيرة", "").trim() episode.name = TitleRegex.EPISODE.find(title)!!.value.replace("مترجمة", "").replace("والاخيرة", "").trim()
else if (Regex("حلقة (.*)").containsMatchIn(title))
episode.name = Regex("حلقة (.*)").find(title)!!.value.replace("مترجمة", "").replace("والاخيرة", "").trim()
else else
episode.name = title episode.name = title
@ -187,7 +164,7 @@ class Movizland : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
override fun episodeFromElement(element: Element): SEpisode = throw Exception("not used") override fun episodeFromElement(element: Element): SEpisode = throw Exception("not used")
// Video links // ============================= video links =============================
override fun videoListParse(response: Response): List<Video> { override fun videoListParse(response: Response): List<Video> {
val videos = mutableListOf<Video>() val videos = mutableListOf<Video>()
@ -217,24 +194,6 @@ class Movizland : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
override fun videoListSelector() = "body" override fun videoListSelector() = "body"
private fun videosFromElement(element: Element): List<Video> {
val videoList = mutableListOf<Video>()
val qualityMap = mapOf("l" to "240p", "n" to "360p", "h" to "480p", "x" to "720p", "o" to "1080p")
val data = element.data().substringAfter(", file: \"").substringBefore("\"}],")
val url = Regex("(.*)_,(.*),\\.urlset/master(.*)").find(data)
val sources = url!!.groupValues[2].split(",")
for (quality in sources) {
val src = url.groupValues[1] + "_" + quality + "/index-v1-a1" + url.groupValues[3]
val video = qualityMap[quality]?.let {
Video(src, it, src)
}
if (video != null) {
videoList.add(video)
}
}
return videoList
}
override fun List<Video>.sort(): List<Video> { override fun List<Video>.sort(): List<Video> {
val quality = preferences.getString("preferred_quality", null) val quality = preferences.getString("preferred_quality", null)
if (quality != null) { if (quality != null) {
@ -257,7 +216,7 @@ class Movizland : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
override fun videoFromElement(element: Element) = throw Exception("not used") override fun videoFromElement(element: Element) = throw Exception("not used")
// Search // ============================= search =============================
override fun searchAnimeFromElement(element: Element): SAnime { override fun searchAnimeFromElement(element: Element): SAnime {
val anime = SAnime.create() val anime = SAnime.create()
@ -275,11 +234,8 @@ class Movizland : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
override fun searchAnimeSelector(): String = "div.BlocksInner div.BlocksUI div.BlockItem, div.BoxOfficeOtherSide div.BlocksUI div.BlockItem" override fun searchAnimeSelector(): String = "div.BlocksInner div.BlocksUI div.BlockItem, div.BoxOfficeOtherSide div.BlocksUI div.BlockItem"
override fun searchAnimeRequest(page: Int, query: String, filters: AnimeFilterList): Request { override fun searchAnimeRequest(page: Int, query: String, filters: AnimeFilterList): Request {
var newQuery = query
if (Regex("(.*)\\(").containsMatchIn(query))
newQuery = Regex("(.*)\\(").find(query)!!.groupValues[1].replace("(", "")
val url = if (query.isNotBlank()) { val url = if (query.isNotBlank()) {
"$baseUrl/page/$page/?s=$newQuery" "$baseUrl/page/$page/?s=$query"
} else { } else {
(if (filters.isEmpty()) getFilterList() else filters).forEach { filter -> (if (filters.isEmpty()) getFilterList() else filters).forEach { filter ->
when (filter) { when (filter) {
@ -298,7 +254,7 @@ class Movizland : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
return GET(url, headers) return GET(url, headers)
} }
// Anime Details // ============================= anime details =============================
override fun animeDetailsParse(document: Document): SAnime { override fun animeDetailsParse(document: Document): SAnime {
val anime = SAnime.create() val anime = SAnime.create()
@ -312,7 +268,7 @@ class Movizland : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
return anime return anime
} }
// Latest // ============================= latest =============================
override fun latestUpdatesNextPageSelector(): String = throw Exception("Not used") override fun latestUpdatesNextPageSelector(): String = throw Exception("Not used")
@ -322,7 +278,7 @@ class Movizland : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
override fun latestUpdatesSelector(): String = throw Exception("Not used") override fun latestUpdatesSelector(): String = throw Exception("Not used")
// Filters // ============================= filters =============================
override fun getFilterList() = AnimeFilterList( override fun getFilterList() = AnimeFilterList(
AnimeFilter.Header("الفلترات مش هتشتغل لو بتبحث او وهي فاضيه"), AnimeFilter.Header("الفلترات مش هتشتغل لو بتبحث او وهي فاضيه"),
@ -353,8 +309,44 @@ class Movizland : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
CatUnit("مسلسلات تركى", "series/turkish-series"), CatUnit("مسلسلات تركى", "series/turkish-series"),
CatUnit("مسلسلات عربى", "series/arab-series") CatUnit("مسلسلات عربى", "series/arab-series")
) )
// ============================= title edit =============================
// preferred quality settings private fun titleEdit(title: String, details: Boolean = false): String {
val movie = "فيلم"
val finalTitle = if (title.contains("مسلسل")) {
if (TitleRegex.SERIES_SEASONS.containsMatchIn(title)) {
val newTitle = TitleRegex.SERIES_SEASONS.find(title)
newTitle!!.groupValues[1].trim() + if (details) " (م.${newTitle.groupValues[2].trim()})(${newTitle.groupValues[3].trim()}ح)" else ""
} else if (TitleRegex.SERIES_EPISODES.containsMatchIn(title)) {
val newTitle = TitleRegex.SERIES_EPISODES.find(title)
newTitle!!.groupValues[1].trim() + if (details) " (${newTitle.groupValues[2].trim()}ح)" else ""
} else title
} else if (title.contains("فيلم")) {
if (TitleRegex.ARABIC_MOVIE.containsMatchIn(title)) // افلام عربى
TitleRegex.ARABIC_MOVIE.find(title)!!.groupValues[1].trim() + if (details) " ($movie)" else ""
else if (TitleRegex.MOVIES.containsMatchIn(title))
TitleRegex.MOVIES.find(title)!!.groupValues[1].trim() + if (details) " (${TitleRegex.MOVIES.find(title)!!.groupValues[2].trim()})($movie)" else ""
else title
} else if (title.contains("انمي"))
Regex(if (title.contains("الموسم"))"انمي(.*)الموسم" else "انمي(.*)الحلقة").find(title)!!.groupValues[1] + if (details) " (انمى)" else ""
else if (title.contains("برنامج"))
Regex(if (title.contains("الموسم"))"برنامج(.*)الموسم" else "برنامج(.*)حلقة").find(title)!!.groupValues[1].removeSurrounding(" ال") + if (details) " (برنامج)" else ""
else
title
return finalTitle.trim()
}
object TitleRegex {
val MOVIES = "(?:[^a-zA-Z]+)(.*)(?:[0-9 ]+)([^a-zA-Z]+)".toRegex()
val ARABIC_MOVIE = "فيلم ([^a-zA-Z]+) ([0-9]+)".toRegex()
val SERIES_SEASONS = "مسلسل(.*)الموسم(.*)الحلقة([ 0-9]+)".toRegex()
val SERIES_EPISODES = "مسلسل(.*)الحلقة([ 0-9]+)".toRegex()
val SEASON = "الموسم(.*)".toRegex()
val EPISODE = "حلقة(.*)".toRegex()
}
// ============================ quality settings =======================
override fun setupPreferenceScreen(screen: PreferenceScreen) { override fun setupPreferenceScreen(screen: PreferenceScreen) {
val videoQualityPref = ListPreference(screen.context).apply { val videoQualityPref = ListPreference(screen.context).apply {

View File

@ -2,10 +2,10 @@ apply plugin: 'com.android.application'
apply plugin: 'kotlin-android' apply plugin: 'kotlin-android'
ext { ext {
extName = 'تك تك سينما' extName = وك توك سينما'
pkgNameSuffix = 'ar.tuktukcinema' pkgNameSuffix = 'ar.tuktukcinema'
extClass = '.Tuktukcinema' extClass = '.Tuktukcinema'
extVersionCode = 1 extVersionCode = 2
libVersion = '13' libVersion = '13'
} }

View File

@ -32,7 +32,7 @@ import java.lang.Exception
class Tuktukcinema : ConfigurableAnimeSource, ParsedAnimeHttpSource() { class Tuktukcinema : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
override val name = "تك تك سينما" override val name = "توك توك سينما"
override val baseUrl = "https://w.tuktukcinema.net" override val baseUrl = "https://w.tuktukcinema.net"
@ -61,24 +61,26 @@ class Tuktukcinema : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
} }
private fun titleEdit(title: String, details: Boolean = false): String { private fun titleEdit(title: String, details: Boolean = false): String {
return if (Regex("فيلم (.*?) مترجم").containsMatchIn(title)) return if (title.contains("فيلم")) {
Regex("فيلم (.*?) مترجم").find(title)!!.groupValues[1] + " (فيلم)" // افلام اجنبيه مترجمه if (Regex("فيلم (.*?) مترجم").containsMatchIn(title))
else if (Regex("فيلم (.*?) مدبلج").containsMatchIn(title)) Regex("فيلم (.*?) مترجم").find(title)!!.groupValues[1] + if (details) " (فيلم)" else "" // افلام اجنبيه مترجمه
Regex("فيلم (.*?) مدبلج").find(title)!!.groupValues[1] + " (مدبلج)(فيلم)" // افلام اجنبيه مدبلجه else if (Regex("فيلم (.*?) مدبلج").containsMatchIn(title))
else if (Regex("فيلم ([^a-zA-Z]+) ([0-9]+)").containsMatchIn(title)) // افلام عربى Regex("فيلم (.*?) مدبلج").find(title)!!.groupValues[1] + if (details) " (مدبلج)(فيلم)" else "" // افلام اجنبيه مدبلجه
Regex("فيلم ([^a-zA-Z]+) ([0-9]+)").find(title)!!.groupValues[1] + " (فيلم)" else if (Regex("فيلم ([^a-zA-Z]+) ([0-9]+)").containsMatchIn(title)) // افلام عربى
else if (title.contains("مسلسل")) { Regex("فيلم ([^a-zA-Z]+) ([0-9]+)").find(title)!!.groupValues[1] + if (details) " (فيلم)" else ""
if (title.contains("الموسم") and details) { else title
} else if (title.contains("مسلسل")) {
if (title.contains("الموسم")) {
val newTitle = Regex("مسلسل (.*?) الموسم (.*?) الحلقة ([0-9]+)").find(title) val newTitle = Regex("مسلسل (.*?) الموسم (.*?) الحلقة ([0-9]+)").find(title)
return "${newTitle!!.groupValues[1]} (م.${newTitle.groupValues[2]})(${newTitle.groupValues[3]}ح)" newTitle!!.groupValues[1] + if (details) " (م.${newTitle.groupValues[2]})(${newTitle.groupValues[3]}ح)" else ""
} else if (title.contains("الحلقة") and details) { } else if (title.contains("الحلقة")) {
val newTitle = Regex("مسلسل (.*?) الحلقة ([0-9]+)").find(title) val newTitle = Regex("مسلسل (.*?) الحلقة ([0-9]+)").find(title)
return "${newTitle!!.groupValues[1]} (${newTitle.groupValues[2]}ح)" newTitle!!.groupValues[1] + if (details) " (${newTitle.groupValues[2]}ح)" else ""
} else Regex(if (title.contains("الموسم")) "مسلسل (.*?) الموسم" else "مسلسل (.*?) الحلقة").find(title)!!.groupValues[1] + " (مسلسل)" } else Regex(if (title.contains("الموسم")) "مسلسل (.*?) الموسم" else "مسلسل (.*?) الحلقة").find(title)!!.groupValues[1] + if (details) " (مسلسل)" else ""
} else if (title.contains("انمي")) } else if (title.contains("انمي"))
return Regex(if (title.contains("الموسم"))"انمي (.*?) الموسم" else "انمي (.*?) الحلقة").find(title)!!.groupValues[1] + " (انمى)" return Regex(if (title.contains("الموسم"))"انمي (.*?) الموسم" else "انمي (.*?) الحلقة").find(title)!!.groupValues[1] + if (details) " (انمى)" else ""
else if (title.contains("برنامج")) else if (title.contains("برنامج"))
Regex(if (title.contains("الموسم"))"برنامج (.*?) الموسم" else "برنامج (.*?) الحلقة").find(title)!!.groupValues[1] + " (برنامج)" Regex(if (title.contains("الموسم"))"برنامج (.*?) الموسم" else "برنامج (.*?) الحلقة").find(title)!!.groupValues[1] + if (details) " (برنامج)" else ""
else else
title title
} }
@ -118,7 +120,7 @@ class Tuktukcinema : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
addEpisodeNew( addEpisodeNew(
ep.attr("href"), ep.attr("href"),
"series", "series",
seasonNum + " " + ep.text() seasonNum + " : الحلقة " + ep.select("em").text()
) )
} }
} else { } else {
@ -132,7 +134,7 @@ class Tuktukcinema : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
addEpisodeNew( addEpisodeNew(
ep.attr("href"), ep.attr("href"),
"series", "series",
seasonNum + " " + ep.text() seasonNum + " : الحلقة " + ep.select("em").text()
) )
} }
} }
@ -203,7 +205,7 @@ class Tuktukcinema : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
override fun searchAnimeSelector(): String = "div.Block--Item" override fun searchAnimeSelector(): String = "div.Block--Item"
override fun searchAnimeNextPageSelector(): String = "div.paginate ul.page-numbers li.next a" override fun searchAnimeNextPageSelector(): String = "div.paginate ul.page-numbers li a.next"
override fun searchAnimeRequest(page: Int, query: String, filters: AnimeFilterList): Request { override fun searchAnimeRequest(page: Int, query: String, filters: AnimeFilterList): Request {
val url = if (query.isNotBlank()) { val url = if (query.isNotBlank()) {
@ -229,8 +231,11 @@ class Tuktukcinema : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
override fun searchAnimeFromElement(element: Element): SAnime { override fun searchAnimeFromElement(element: Element): SAnime {
val anime = SAnime.create() val anime = SAnime.create()
anime.title = titleEdit(element.select("a").attr("title"), true).trim() anime.title = titleEdit(element.select("h3").text(), true).trim()
anime.thumbnail_url = element.select("img").attr("data-src") if (element.ownerDocument().location().contains("?s="))
anime.thumbnail_url = element.select("img").attr("src")
else
anime.thumbnail_url = element.select("img").attr("data-src")
anime.setUrlWithoutDomain(element.select("a").attr("href") + "watch/") anime.setUrlWithoutDomain(element.select("a").attr("href") + "watch/")
return anime return anime
} }
@ -239,12 +244,12 @@ class Tuktukcinema : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
override fun animeDetailsParse(document: Document): SAnime { override fun animeDetailsParse(document: Document): SAnime {
val anime = SAnime.create() val anime = SAnime.create()
val info = client.newCall(GET(document.select(episodeListSelector()).attr("href").replace("watch/", ""))).execute().asJsoup() anime.genre = document.select("div.catssection li a").joinToString(", ") { it.text() }
anime.genre = info.select("div.catssection li a").joinToString(", ") { it.text() } anime.title = titleEdit(document.select("h1.post-title").text()).trim()
anime.title = titleEdit(info.select("h1.post-title").text()).trim() anime.author = document.select("ul.RightTaxContent li:contains(دولة) a").text()
anime.author = info.select("ul.RightTaxContent li:contains(دولة) a").text() anime.description = document.select("div.story").text().trim()
anime.description = info.select("div.story").text().trim()
anime.status = SAnime.COMPLETED anime.status = SAnime.COMPLETED
anime.thumbnail_url = document.select("div.left div.image img").attr("src")
return anime return anime
} }
@ -252,7 +257,7 @@ class Tuktukcinema : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
override fun latestUpdatesSelector(): String = "div.Block--Item" override fun latestUpdatesSelector(): String = "div.Block--Item"
override fun latestUpdatesNextPageSelector(): String = "div.paginate ul.page-numbers li.next a" override fun latestUpdatesNextPageSelector(): String = "div.paginate ul.page-numbers li a.next"
override fun latestUpdatesRequest(page: Int): Request = GET("$baseUrl/recent/page/$page/") override fun latestUpdatesRequest(page: Int): Request = GET("$baseUrl/recent/page/$page/")
@ -285,16 +290,11 @@ class Tuktukcinema : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
CatUnit("افلام اسيويه", "category/movies-33/افلام-اسيوي/"), CatUnit("افلام اسيويه", "category/movies-33/افلام-اسيوي/"),
CatUnit("افلام هنديه", "category/movies-33/افلام-هندى/"), CatUnit("افلام هنديه", "category/movies-33/افلام-هندى/"),
CatUnit("كل المسسلسلات", "category/series-9/"), CatUnit("كل المسسلسلات", "category/series-9/"),
CatUnit("مسلسلات اجنبى", "sercat/مسلسلات-اجنبي/"), CatUnit("مسلسلات اجنبى", "category/series-9/مسلسلات-اجنبي/"),
CatUnit("جديد مسلسلات اجنبى", "category/series-9/مسلسلات-اجنبي/"), CatUnit("مسلسلات انمى", "category/anime-6/انمي-مترجم/"),
CatUnit("مسلسلات انمى", "sercat/قائمة-الانمي/"), CatUnit("مسلسلات تركى", "category/series-9/مسلسلات-تركي/"),
CatUnit("جديد مسلسلات انمى", "category/anime-6/انمي-مترجم/"), CatUnit("مسلسلات اسيوى", "category/series-9/مسلسلات-أسيوي/"),
CatUnit("مسلسلات تركى", "sercat/مسلسلات-تركي/"), CatUnit("مسلسلات هندى", "category/series-9/مسلسلات-هندي/")
CatUnit("جديد مسلسلات تركى", "category/series-9/مسلسلات-تركي/"),
CatUnit("مسلسلات اسيوى", "sercat/مسلسلات-أسيوي/"),
CatUnit("جديد مسلسلات اسيوى", "category/series-9/مسلسلات-أسيوي/"),
CatUnit("مسلسلات هندى", "sercat/مسلسلات-هندي/"),
CatUnit("جديد مسلسلات هندى", "category/series-9/مسلسلات-هندي/")
) )
// preferred quality settings // preferred quality settings