optimize search and fix arabic movies name not showing (#798)
* Shahid4U extension * optimize search and fix arabic movies name not showing
This commit is contained in:
@ -5,7 +5,7 @@ ext {
|
|||||||
extName = 'موفيزلاند'
|
extName = 'موفيزلاند'
|
||||||
pkgNameSuffix = 'ar.movizland'
|
pkgNameSuffix = 'ar.movizland'
|
||||||
extClass = '.Movizland'
|
extClass = '.Movizland'
|
||||||
extVersionCode = 1
|
extVersionCode = 2
|
||||||
libVersion = '13'
|
libVersion = '13'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -40,6 +40,18 @@ class Movizland : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Popular
|
// Popular
|
||||||
|
private fun titleEdit(title: String): String {
|
||||||
|
return if (Regex("فيلم(.*?)م").containsMatchIn(title) and Regex("[A-Za-z]").containsMatchIn(title))
|
||||||
|
Regex("فيلم(.*?)م").find(title)!!.groupValues[1] + "(فيلم)"
|
||||||
|
else if (title.contains("مسلسل"))
|
||||||
|
Regex(if (title.contains("الموسم"))"مسلسل(.*?)الموسم" else "مسلسل(.*?)الحلقة").find(title)!!.groupValues[1] + "(مسلسل)"
|
||||||
|
else if (title.contains("انمي"))
|
||||||
|
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.BoxOfficeOtherSide div.BlocksUI div.BlockItem"
|
override fun popularAnimeSelector(): String = "div.BoxOfficeOtherSide div.BlocksUI div.BlockItem"
|
||||||
|
|
||||||
@ -49,11 +61,7 @@ class Movizland : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
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("a div.BlockImageItem img").attr("data-src")
|
||||||
anime.setUrlWithoutDomain(element.select("a").attr("href"))
|
anime.setUrlWithoutDomain(element.select("a").attr("href"))
|
||||||
anime.title = element.select("a div.BlockImageItem img").attr("alt").replace("فيلم", "Movie").replace("مسلسل", "Series").replace("[^A-Za-z ]".toRegex(), "").trim()
|
anime.title = titleEdit(element.select("a div.BlockImageItem img").attr("alt"))
|
||||||
if (anime.title.contains("Movie"))
|
|
||||||
anime.title = anime.title.replace("Movie ", "") + " (Movie)"
|
|
||||||
else
|
|
||||||
anime.title = anime.title.replace("Series ", "") + " (Series)"
|
|
||||||
return anime
|
return anime
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -64,38 +72,41 @@ class Movizland : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
|
|
||||||
override fun episodeListParse(response: Response): List<SEpisode> {
|
override fun episodeListParse(response: Response): List<SEpisode> {
|
||||||
val episodes = mutableListOf<SEpisode>()
|
val episodes = mutableListOf<SEpisode>()
|
||||||
fun addEpisode(document: Document) {
|
fun addEpisode(document: Document, season: String) {
|
||||||
document.select(episodeListSelector()).map { episodes.add(episodeFromElement(it)) }
|
document.select(episodeListSelector()).map { episodes.add(episodeFromElement(it, season)) }
|
||||||
}
|
}
|
||||||
fun addEpisodes(document: Document) {
|
fun addEpisodes(document: Document) {
|
||||||
// Add all season in search
|
// 1 episode in search to whole season
|
||||||
if (!document.select("div.SeriesSingle div.container h2:contains(موفيز لاند) a").isNullOrEmpty()) {
|
if (!document.select("div.SeriesSingle div.container h2:contains(موفيز لاند) a").isNullOrEmpty()) {
|
||||||
val seriesLink = document.select("div.SeriesSingle div.container h2:contains(موفيز لاند) a")
|
val seriesLink = document.select("div.SeriesSingle div.container h2:contains(موفيز لاند) a")
|
||||||
addEpisodes(client.newCall(GET(seriesLink.attr("href"), headers)).execute().asJsoup())
|
addEpisodes(client.newCall(GET(seriesLink.attr("href"), headers)).execute().asJsoup())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if (document.select("link[rel=canonical]").attr("href").contains("series")) {
|
if (document.select("link[rel=canonical]").attr("href").contains("series")) {
|
||||||
// Series
|
// Series and movie-series
|
||||||
for (season in document.select(seasonsNextPageSelector())) {
|
for (season in document.select(seasonsNextPageSelector())) {
|
||||||
season.let {
|
season.let {
|
||||||
val link = it.attr("href")
|
val link = it.attr("href")
|
||||||
// More than 1 season
|
// if series > 1 season
|
||||||
if (link.contains("series")) {
|
if (link.contains("series")) {
|
||||||
val seasonHTML = client.newCall(GET(link, headers)).execute().asJsoup()
|
val seasonHTML = client.newCall(GET(link, headers)).execute().asJsoup()
|
||||||
for (episode in seasonHTML.select(seasonsNextPageSelector())) {
|
for (episode in seasonHTML.select(seasonsNextPageSelector())) {
|
||||||
episode.run {
|
episode.run {
|
||||||
addEpisode(client.newCall(GET(this.attr("href"), headers)).execute().asJsoup())
|
addEpisode(client.newCall(GET(this.attr("href"), headers)).execute().asJsoup(), "series")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// 1 season only
|
// if series 1 season only
|
||||||
addEpisode(client.newCall(GET(it.attr("href"), headers)).execute().asJsoup())
|
addEpisode(
|
||||||
|
client.newCall(GET(it.attr("href"), headers)).execute().asJsoup(),
|
||||||
|
if (it.select("img").first().attr("alt").contains("فيلم")) "assembly" else "1"
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Movies
|
// Movies
|
||||||
addEpisode(document)
|
addEpisode(document, "0")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
addEpisodes(response.asJsoup())
|
addEpisodes(response.asJsoup())
|
||||||
@ -104,12 +115,19 @@ class Movizland : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
|
|
||||||
override fun episodeListSelector() = "link[rel=canonical]"
|
override fun episodeListSelector() = "link[rel=canonical]"
|
||||||
|
|
||||||
override fun episodeFromElement(element: Element): SEpisode {
|
override fun episodeFromElement(element: Element): SEpisode = throw Exception("not used")
|
||||||
|
|
||||||
|
private fun episodeFromElement(element: Element, season: String): SEpisode {
|
||||||
// movie
|
// movie
|
||||||
val episode = SEpisode.create()
|
val episode = SEpisode.create()
|
||||||
episode.setUrlWithoutDomain(element.attr("href"))
|
episode.setUrlWithoutDomain(element.attr("href"))
|
||||||
episode.name = element.ownerDocument().select("meta[property=og:title]").attr("content").replace("مسلسل", "").replace("انمي", "").replace("فيلم", "").replace("مشاهدة", "").replace("وتحميل", "").replace("مترجمة", "").replace("مترجم", "").replace("[A-Za-z:?]".toRegex(), "").trim()
|
episode.name = element.ownerDocument().select("meta[property=og:title]").attr("content")
|
||||||
|
if (season == "assembly")
|
||||||
|
episode.name = titleEdit(episode.name)
|
||||||
|
else if (episode.name.contains("فيلم"))
|
||||||
|
episode.name = "watch"
|
||||||
|
else
|
||||||
|
episode.name = Regex("الموسم(.*?)مترجمة").find(episode.name)!!.value.replace("مترجمة", "").replace("والاخيرة", "").trim()
|
||||||
return episode
|
return episode
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -130,7 +148,7 @@ class Movizland : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
private fun videosFromElement(element: Element): List<Video> {
|
private fun videosFromElement(element: Element): List<Video> {
|
||||||
val videoList = mutableListOf<Video>()
|
val videoList = mutableListOf<Video>()
|
||||||
val qualityMap = mapOf("l" to "240p", "n" to "360p", "h" to "480p", "x" to "720p", "o" to "1080p")
|
val qualityMap = mapOf("l" to "240p", "n" to "360p", "h" to "480p", "x" to "720p", "o" to "1080p")
|
||||||
val script = element.select("script[type='text/javascript']")
|
element.select("script[type='text/javascript']")
|
||||||
.firstOrNull { it.data().contains("jwplayer(\"vplayer\").setup({") }
|
.firstOrNull { it.data().contains("jwplayer(\"vplayer\").setup({") }
|
||||||
val data = element.data().substringAfter(", file: \"").substringBefore("\"}],")
|
val data = element.data().substringAfter(", file: \"").substringBefore("\"}],")
|
||||||
val sources = data.split(",l,n,h,x,o,.urlset/master")
|
val sources = data.split(",l,n,h,x,o,.urlset/master")
|
||||||
@ -173,11 +191,7 @@ class Movizland : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
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("a div.BlockImageItem img").attr("data-src")
|
||||||
anime.setUrlWithoutDomain(element.select("a").attr("href"))
|
anime.setUrlWithoutDomain(element.select("a").attr("href"))
|
||||||
anime.title = element.select("a div.BlockImageItem div.BlockTitle").text().replace("فيلم", "Movie").replace("مسلسل", "Series").replace("[^A-Za-z ]".toRegex(), "").trim()
|
anime.title = titleEdit(element.select("a div.BlockImageItem div.BlockTitle").text())
|
||||||
if (anime.title.contains("Movie"))
|
|
||||||
anime.title = anime.title.replace("Movie ", "") + " (Movie)"
|
|
||||||
else
|
|
||||||
anime.title = anime.title.replace("Series ", "") + " (Series)"
|
|
||||||
return anime
|
return anime
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -211,12 +225,8 @@ class Movizland : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
override fun animeDetailsParse(document: Document): SAnime {
|
override fun animeDetailsParse(document: Document): SAnime {
|
||||||
val anime = SAnime.create()
|
val anime = SAnime.create()
|
||||||
// div.CoverSingle div.CoverSingleContent
|
// div.CoverSingle div.CoverSingleContent
|
||||||
anime.genre = document.select("div.SingleDetails li:contains(النوع) a").joinToString(", ") { it.text() }
|
anime.genre = document.select("div.SingleDetails li:contains(النوع) a,div.SingleDetails li:contains(الجودة) a").joinToString(", ") { it.text() }
|
||||||
anime.title = document.select("meta[property=og:title]").attr("content").replace("فيلم", "Movie").replace("مسلسل", "Series").replace("[^A-Za-z ]".toRegex(), "").trim()
|
anime.title = titleEdit(document.select("meta[property=og:title]").attr("content"))
|
||||||
if (anime.title.contains("Movie"))
|
|
||||||
anime.title = anime.title.replace("Movie ", "") + " (Movie)"
|
|
||||||
else
|
|
||||||
anime.title = anime.title.replace("Series ", "") + " (Series)"
|
|
||||||
anime.author = document.select("div.SingleDetails li:contains(دولة) a").text()
|
anime.author = document.select("div.SingleDetails li:contains(دولة) a").text()
|
||||||
anime.description = document.select("div.ServersEmbeds section.story").text().replace(document.select("meta[property=og:title]").attr("content"), "").replace(":", "").trim()
|
anime.description = document.select("div.ServersEmbeds section.story").text().replace(document.select("meta[property=og:title]").attr("content"), "").replace(":", "").trim()
|
||||||
anime.status = SAnime.COMPLETED
|
anime.status = SAnime.COMPLETED
|
||||||
@ -225,7 +235,7 @@ class Movizland : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
|
|
||||||
// Latest
|
// Latest
|
||||||
|
|
||||||
override fun latestUpdatesNextPageSelector(): String? = throw Exception("Not used")
|
override fun latestUpdatesNextPageSelector(): String = throw Exception("Not used")
|
||||||
|
|
||||||
override fun latestUpdatesFromElement(element: Element): SAnime = throw Exception("Not used")
|
override fun latestUpdatesFromElement(element: Element): SAnime = throw Exception("Not used")
|
||||||
|
|
||||||
@ -246,20 +256,21 @@ class Movizland : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
}.toTypedArray()
|
}.toTypedArray()
|
||||||
|
|
||||||
private fun getCategoryList() = listOf(
|
private fun getCategoryList() = listOf(
|
||||||
CatUnit("All Movies", "movies"),
|
CatUnit("افلام", "movies"),
|
||||||
CatUnit("English Movies", "movies/foreign"),
|
CatUnit("افلام اجنبى", "movies/foreign"),
|
||||||
CatUnit("Netflix Movies", "movies/netflix"),
|
CatUnit("افلام نتفلكس", "movies/netflix"),
|
||||||
CatUnit("Animation Movies", "movies/anime"),
|
CatUnit("سلاسل افلام", "movies/backs"),
|
||||||
CatUnit("Asian Movies", "movies/asia"),
|
CatUnit("افلام انمى", "movies/anime"),
|
||||||
CatUnit("Indian Movies", "movies/india"),
|
CatUnit("افلام اسيوى", "movies/asia"),
|
||||||
CatUnit("Arabic Movies", "movies/arab"),
|
CatUnit("افلام هندى", "movies/india"),
|
||||||
CatUnit("Turkish Movies", "movies/turkey"),
|
CatUnit("افلام عربى", "movies/arab"),
|
||||||
CatUnit("All Series", "series"),
|
CatUnit("افلام تركى", "movies/turkey"),
|
||||||
CatUnit("English Series", "series/foreign-series"),
|
CatUnit("مسلسلات", "series"),
|
||||||
CatUnit("Netflix Series", "series/netflix-series"),
|
CatUnit("مسلسلات اجنبى", "series/foreign-series"),
|
||||||
CatUnit("Animation Series", "series/anime-series"),
|
CatUnit("مسلسلات نتفلكس", "series/netflix-series"),
|
||||||
CatUnit("Turkish Series", "series/turkish-series"),
|
CatUnit("مسلسلات انمى", "series/anime-series"),
|
||||||
CatUnit("Arabic Series", "series/arab-series")
|
CatUnit("مسلسلات تركى", "series/turkish-series"),
|
||||||
|
CatUnit("مسلسلات عربى", "series/arab-series")
|
||||||
)
|
)
|
||||||
|
|
||||||
// preferred quality settings
|
// preferred quality settings
|
||||||
|
Reference in New Issue
Block a user