From 53fa4ca33f253a2918c5c707b3e87ec5b4b93932 Mon Sep 17 00:00:00 2001 From: LagradOst <11805592+LagradOst@users.noreply.github.com> Date: Sat, 30 Jul 2022 18:56:41 +0200 Subject: [PATCH 1/4] made inf scrolling better + fixed search bug --- .../animeproviders/GogoanimeProvider.kt | 86 ++++---- .../movieproviders/AltadefinizioneProvider.kt | 60 +++--- .../movieproviders/CinecalidadProvider.kt | 55 +++-- .../EntrepeliculasyseriesProvider.kt | 71 ++++--- .../movieproviders/FilmpertuttiProvider.kt | 189 +++++++++--------- .../movieproviders/OpenVidsProvider.kt | 1 - .../movieproviders/PeliSmartProvider.kt | 3 +- .../movieproviders/SoaptwoDayProvider.kt | 59 +++--- .../movieproviders/TantiFilmProvider.kt | 70 +++---- .../cloudstream3/utils/SubtitleHelper.kt | 7 +- 10 files changed, 298 insertions(+), 303 deletions(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/animeproviders/GogoanimeProvider.kt b/app/src/main/java/com/lagradost/cloudstream3/animeproviders/GogoanimeProvider.kt index e45976d2..b0ce2c7f 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/animeproviders/GogoanimeProvider.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/animeproviders/GogoanimeProvider.kt @@ -167,7 +167,7 @@ class GogoanimeProvider : MainAPI() { } } - override var mainUrl = "https://gogoanime.sk" + override var mainUrl = "https://gogoanime.lu" override var name = "GogoAnime" override val hasQuickSearch = false override val hasMainPage = true @@ -178,52 +178,50 @@ class GogoanimeProvider : MainAPI() { TvType.OVA ) - override suspend fun getMainPage(page: Int, categoryName: String, categoryData: String): HomePageResponse { - val headers = mapOf( - "authority" to "ajax.gogo-load.com", - "sec-ch-ua" to "\"Google Chrome\";v=\"89\", \"Chromium\";v=\"89\", \";Not A Brand\";v=\"99\"", - "accept" to "text/html, */*; q=0.01", - "dnt" to "1", - "sec-ch-ua-mobile" to "?0", - "user-agent" to "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36", - "origin" to mainUrl, - "sec-fetch-site" to "cross-site", - "sec-fetch-mode" to "cors", - "sec-fetch-dest" to "empty", - "referer" to "$mainUrl/" - ) - val parseRegex = - Regex("""
  • \s*\n.*\n.*\n.*?img src="(.*?)"""") + val headers = mapOf( + "authority" to "ajax.gogo-load.com", + "sec-ch-ua" to "\"Google Chrome\";v=\"89\", \"Chromium\";v=\"89\", \";Not A Brand\";v=\"99\"", + "accept" to "text/html, */*; q=0.01", + "dnt" to "1", + "sec-ch-ua-mobile" to "?0", + "user-agent" to "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36", + "origin" to mainUrl, + "sec-fetch-site" to "cross-site", + "sec-fetch-mode" to "cors", + "sec-fetch-dest" to "empty", + "referer" to "$mainUrl/" + ) + val parseRegex = + Regex("""
  • \s*\n.*\n.*\n.*?img src="(.*?)"""") - val urls = listOf( - Pair("1", "Recent Release - Sub"), - Pair("2", "Recent Release - Dub"), - Pair("3", "Recent Release - Chinese"), - ) + override val mainPage = mainPageOf( + Pair("1", "Recent Release - Sub"), + Pair("2", "Recent Release - Dub"), + Pair("3", "Recent Release - Chinese"), + ) - val items = ArrayList() - for (i in urls) { - try { - val params = mapOf("page" to "1", "type" to i.first) - val html = app.get( - "https://ajax.gogo-load.com/ajax/page-recent-release.html", - headers = headers, - params = params - ) - items.add(HomePageList(i.second, (parseRegex.findAll(html.text).map { - val (link, epNum, title, poster) = it.destructured - val isSub = listOf(1, 3).contains(i.first.toInt()) - newAnimeSearchResponse(title, link) { - this.posterUrl = poster - addDubStatus(!isSub, epNum.toIntOrNull()) - } - }).toList())) - } catch (e: Exception) { - e.printStackTrace() + override suspend fun getMainPage( + page: Int, + categoryName: String, + categoryData: String + ): HomePageResponse { + val params = mapOf("page" to page.toString(), "type" to categoryData) + val html = app.get( + "https://ajax.gogo-load.com/ajax/page-recent-release.html", + headers = headers, + params = params + ) + val isSub = listOf(1, 3).contains(categoryData.toInt()) + + val home = parseRegex.findAll(html.text).map { + val (link, epNum, title, poster) = it.destructured + newAnimeSearchResponse(title, link) { + this.posterUrl = poster + addDubStatus(!isSub, epNum.toIntOrNull()) } - } - if (items.size <= 0) throw ErrorLoadingException() - return HomePageResponse(items) + }.toList() + + return newHomePageResponse(categoryName, home) } override suspend fun search(query: String): ArrayList { diff --git a/app/src/main/java/com/lagradost/cloudstream3/movieproviders/AltadefinizioneProvider.kt b/app/src/main/java/com/lagradost/cloudstream3/movieproviders/AltadefinizioneProvider.kt index ee393f7f..ba689f97 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/movieproviders/AltadefinizioneProvider.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/movieproviders/AltadefinizioneProvider.kt @@ -3,7 +3,6 @@ package com.lagradost.cloudstream3.movieproviders import androidx.core.text.parseAsHtml import com.lagradost.cloudstream3.* import com.lagradost.cloudstream3.LoadResponse.Companion.addTrailer -import com.lagradost.cloudstream3.mvvm.logError import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.loadExtractor @@ -18,40 +17,37 @@ class AltadefinizioneProvider : MainAPI() { TvType.Movie ) - override suspend fun getMainPage(page: Int, categoryName: String, categoryData: String): HomePageResponse { - val items = ArrayList() - val urls = listOf( - Pair("$mainUrl/azione/", "Azione"), - Pair("$mainUrl/avventura/", "Avventura"), - ) - for ((url, name) in urls) { - try { - val soup = app.get(url).document - val home = soup.select("div.box").map { - val title = it.selectFirst("img")!!.attr("alt") - val link = it.selectFirst("a")!!.attr("href") - val image = mainUrl + it.selectFirst("img")!!.attr("src") - val quality = getQualityFromString(it.selectFirst("span")!!.text()) + override val mainPage = mainPageOf( + Pair("$mainUrl/azione/page/", "Azione"), + Pair("$mainUrl/avventura/page/", "Avventura"), + ) - MovieSearchResponse( - title, - link, - this.name, - TvType.Movie, - image, - null, - null, - quality, - ) - } + override suspend fun getMainPage( + page: Int, + categoryName: String, + categoryData: String + ): HomePageResponse { + val url = categoryData + page - items.add(HomePageList(name, home)) - } catch (e: Exception) { - logError(e) - } + val soup = app.get(url).document + val home = soup.select("div.box").map { + val title = it.selectFirst("img")!!.attr("alt") + val link = it.selectFirst("a")!!.attr("href") + val image = mainUrl + it.selectFirst("img")!!.attr("src") + val quality = getQualityFromString(it.selectFirst("span")!!.text()) + + MovieSearchResponse( + title, + link, + this.name, + TvType.Movie, + image, + null, + null, + quality, + ) } - if (items.size <= 0) throw ErrorLoadingException() - return HomePageResponse(items) + return newHomePageResponse(categoryName, home) } override suspend fun search(query: String): List { diff --git a/app/src/main/java/com/lagradost/cloudstream3/movieproviders/CinecalidadProvider.kt b/app/src/main/java/com/lagradost/cloudstream3/movieproviders/CinecalidadProvider.kt index ff2ad22d..ee60e543 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/movieproviders/CinecalidadProvider.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/movieproviders/CinecalidadProvider.kt @@ -2,7 +2,6 @@ package com.lagradost.cloudstream3.movieproviders import com.lagradost.cloudstream3.* import com.lagradost.cloudstream3.extractors.Cinestart -import com.lagradost.cloudstream3.mvvm.logError import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.loadExtractor @@ -19,39 +18,35 @@ class CinecalidadProvider : MainAPI() { ) override val vpnStatus = VPNStatus.MightBeNeeded //Due to evoload sometimes not loading - override suspend fun getMainPage(page: Int, categoryName: String, categoryData: String): HomePageResponse { - val items = ArrayList() - val urls = listOf( - Pair("$mainUrl/ver-serie/", "Series"), - Pair("$mainUrl/", "Peliculas"), - Pair("$mainUrl/genero-de-la-pelicula/peliculas-en-calidad-4k/", "4K UHD"), - ) + override val mainPage = mainPageOf( + Pair("$mainUrl/ver-serie/page/", "Series"), + Pair("$mainUrl/page/", "Peliculas"), + Pair("$mainUrl/genero-de-la-pelicula/peliculas-en-calidad-4k/page/", "4K UHD"), + ) - for ((url, name) in urls) { - try { - val soup = app.get(url).document - val home = soup.select(".item.movies").map { - val title = it.selectFirst("div.in_title")!!.text() - val link = it.selectFirst("a")!!.attr("href") - TvSeriesSearchResponse( - title, - link, - this.name, - if (link.contains("/ver-pelicula/")) TvType.Movie else TvType.TvSeries, - it.selectFirst(".poster.custom img")!!.attr("data-src"), - null, - null, - ) - } + override suspend fun getMainPage( + page: Int, + categoryName: String, + categoryData: String + ): HomePageResponse { + val url = categoryData + page - items.add(HomePageList(name, home)) - } catch (e: Exception) { - logError(e) - } + val soup = app.get(url).document + val home = soup.select(".item.movies").map { + val title = it.selectFirst("div.in_title")!!.text() + val link = it.selectFirst("a")!!.attr("href") + TvSeriesSearchResponse( + title, + link, + this.name, + if (link.contains("/ver-pelicula/")) TvType.Movie else TvType.TvSeries, + it.selectFirst(".poster.custom img")!!.attr("data-src"), + null, + null, + ) } - if (items.size <= 0) throw ErrorLoadingException() - return HomePageResponse(items) + return newHomePageResponse(categoryName, home) } override suspend fun search(query: String): List { diff --git a/app/src/main/java/com/lagradost/cloudstream3/movieproviders/EntrepeliculasyseriesProvider.kt b/app/src/main/java/com/lagradost/cloudstream3/movieproviders/EntrepeliculasyseriesProvider.kt index 97921755..a0b82789 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/movieproviders/EntrepeliculasyseriesProvider.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/movieproviders/EntrepeliculasyseriesProvider.kt @@ -1,11 +1,10 @@ package com.lagradost.cloudstream3.movieproviders import com.lagradost.cloudstream3.* -import com.lagradost.cloudstream3.mvvm.logError import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.loadExtractor -class EntrepeliculasyseriesProvider:MainAPI() { +class EntrepeliculasyseriesProvider : MainAPI() { override var mainUrl = "https://entrepeliculasyseries.nu" override var name = "EntrePeliculasySeries" override var lang = "es" @@ -18,39 +17,35 @@ class EntrepeliculasyseriesProvider:MainAPI() { ) override val vpnStatus = VPNStatus.MightBeNeeded //Due to evoload sometimes not loading - override suspend fun getMainPage(page: Int, categoryName: String, categoryData: String): HomePageResponse { - val items = ArrayList() - val urls = listOf( - Pair("$mainUrl/series/", "Series"), - Pair("$mainUrl/peliculas/", "Peliculas"), - Pair("$mainUrl/anime/", "Animes"), - ) + override val mainPage = mainPageOf( + Pair("$mainUrl/series/page/", "Series"), + Pair("$mainUrl/peliculas/page/", "Peliculas"), + Pair("$mainUrl/anime/page/", "Animes"), + ) - for ((url, name) in urls) { - try { - val soup = app.get(url).document - val home = soup.select("ul.list-movie li").map { - val title = it.selectFirst("a.link-title h2")!!.text() - val link = it.selectFirst("a")!!.attr("href") - TvSeriesSearchResponse( - title, - link, - this.name, - if (link.contains("/pelicula/")) TvType.Movie else TvType.TvSeries, - it.selectFirst("a.poster img")!!.attr("src"), - null, - null, - ) - } + override suspend fun getMainPage( + page: Int, + categoryName: String, + categoryData: String + ): HomePageResponse { + val url = categoryData + page - items.add(HomePageList(name, home)) - } catch (e: Exception) { - logError(e) - } + val soup = app.get(url).document + val home = soup.select("ul.list-movie li").map { + val title = it.selectFirst("a.link-title h2")!!.text() + val link = it.selectFirst("a")!!.attr("href") + TvSeriesSearchResponse( + title, + link, + this.name, + if (link.contains("/pelicula/")) TvType.Movie else TvType.TvSeries, + it.selectFirst("a.poster img")!!.attr("src"), + null, + null, + ) } - if (items.size <= 0) throw ErrorLoadingException() - return HomePageResponse(items) + return newHomePageResponse(categoryName, home) } override suspend fun search(query: String): List { @@ -110,7 +105,8 @@ class EntrepeliculasyseriesProvider:MainAPI() { fixUrl(epThumb) ) } - return when (val tvType = if (url.contains("/pelicula/")) TvType.Movie else TvType.TvSeries) { + return when (val tvType = + if (url.contains("/pelicula/")) TvType.Movie else TvType.TvSeries) { TvType.TvSeries -> { TvSeriesLoadResponse( title, @@ -151,8 +147,10 @@ class EntrepeliculasyseriesProvider:MainAPI() { val doc = app.get(servers).document doc.select("input").apmap { val postkey = it.attr("value") - app.post("https://entrepeliculasyseries.nu/r.php", - headers = mapOf("Host" to "entrepeliculasyseries.nu", + app.post( + "https://entrepeliculasyseries.nu/r.php", + headers = mapOf( + "Host" to "entrepeliculasyseries.nu", "User-Agent" to USER_AGENT, "Accept" to "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8", "Accept-Language" to "en-US,en;q=0.5", @@ -165,9 +163,10 @@ class EntrepeliculasyseriesProvider:MainAPI() { "Sec-Fetch-Dest" to "document", "Sec-Fetch-Mode" to "navigate", "Sec-Fetch-Site" to "same-origin", - "Sec-Fetch-User" to "?1",), + "Sec-Fetch-User" to "?1", + ), //params = mapOf(Pair("h", postkey)), - data = mapOf(Pair("h", postkey)), + data = mapOf(Pair("h", postkey)), allowRedirects = false ).okhttpResponse.headers.values("location").apmap { loadExtractor(it, data, subtitleCallback, callback) diff --git a/app/src/main/java/com/lagradost/cloudstream3/movieproviders/FilmpertuttiProvider.kt b/app/src/main/java/com/lagradost/cloudstream3/movieproviders/FilmpertuttiProvider.kt index bce4e955..3f14622b 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/movieproviders/FilmpertuttiProvider.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/movieproviders/FilmpertuttiProvider.kt @@ -1,13 +1,13 @@ package com.lagradost.cloudstream3.movieproviders + import androidx.core.text.parseAsHtml import com.lagradost.cloudstream3.* -import com.lagradost.cloudstream3.mvvm.logError -import com.lagradost.cloudstream3.app -import com.lagradost.cloudstream3.utils.* -import com.lagradost.cloudstream3.LoadResponse.Companion.addTrailer import com.lagradost.cloudstream3.LoadResponse.Companion.addRating +import com.lagradost.cloudstream3.LoadResponse.Companion.addTrailer import com.lagradost.cloudstream3.utils.AppUtils.toJson import com.lagradost.cloudstream3.utils.AppUtils.tryParseJson +import com.lagradost.cloudstream3.utils.ExtractorLink +import com.lagradost.cloudstream3.utils.loadExtractor import com.lagradost.nicehttp.NiceResponse import org.jsoup.nodes.Element @@ -23,42 +23,41 @@ class FilmpertuttiProvider : MainAPI() { TvType.TvSeries ) - override suspend fun getMainPage(page: Int, categoryName: String, categoryData: String): HomePageResponse { - val items = ArrayList() - val urls = listOf( - Pair("$mainUrl/category/serie-tv/", "Serie Tv"), - Pair("$mainUrl/category/film/azione/", "Azione"), - Pair("$mainUrl/category/film/avventura/", "Avventura"), - ) - for ((url, name) in urls) { - try { - val soup = app.get(url).document - val home = soup.select("ul.posts > li").map { - val title = it.selectFirst("div.title")!!.text().substringBeforeLast("(").substringBeforeLast("[") - val link = it.selectFirst("a")!!.attr("href") - val image = it.selectFirst("a")!!.attr("data-thumbnail") - val qualitydata = it.selectFirst("div.hd") - val quality = if (qualitydata!= null) { - getQualityFromString(qualitydata?.text()) - } - else { - null - } - newTvSeriesSearchResponse( - title, - link) { - this.posterUrl = image - this.quality = quality - } - } + override val mainPage = mainPageOf( + Pair("$mainUrl/category/serie-tv/page/", "Serie Tv"), + Pair("$mainUrl/category/film/azione/page/", "Azione"), + Pair("$mainUrl/category/film/avventura/page/", "Avventura"), + ) - items.add(HomePageList(name, home)) - } catch (e: Exception) { - logError(e) + override suspend fun getMainPage( + page: Int, + categoryName: String, + categoryData: String + ): HomePageResponse { + val url = categoryData + page + + val soup = app.get(url).document + val home = soup.select("ul.posts > li").map { + val title = it.selectFirst("div.title")!!.text().substringBeforeLast("(") + .substringBeforeLast("[") + val link = it.selectFirst("a")!!.attr("href") + val image = it.selectFirst("a")!!.attr("data-thumbnail") + val qualitydata = it.selectFirst("div.hd") + val quality = if (qualitydata != null) { + getQualityFromString(qualitydata.text()) + } else { + null + } + newTvSeriesSearchResponse( + title, + link + ) { + this.posterUrl = image + this.quality = quality } } - if (items.size <= 0) throw ErrorLoadingException() - return HomePageResponse(items) + + return newHomePageResponse(categoryName, home) } override suspend fun search(query: String): List { @@ -66,7 +65,8 @@ class FilmpertuttiProvider : MainAPI() { val url = "$mainUrl/?s=$queryformatted" val doc = app.get(url).document return doc.select("ul.posts > li").map { - val title = it.selectFirst("div.title")!!.text().substringBeforeLast("(").substringBeforeLast("[") + val title = it.selectFirst("div.title")!!.text().substringBeforeLast("(") + .substringBeforeLast("[") val link = it.selectFirst("a")!!.attr("href") val image = it.selectFirst("a")!!.attr("data-thumbnail") val quality = getQualityFromString(it.selectFirst("div.hd")?.text()) @@ -90,50 +90,58 @@ class FilmpertuttiProvider : MainAPI() { val title = document.selectFirst("#content > h1")!!.text().substringBeforeLast("(") .substringBeforeLast("[") - val description = document.selectFirst("i.fa.fa-file-text-o.fa-fw")?.parent()?.nextSibling()?.toString()?.parseAsHtml().toString() + val description = + document.selectFirst("i.fa.fa-file-text-o.fa-fw")?.parent()?.nextSibling()?.toString() + ?.parseAsHtml().toString() val rating = document.selectFirst("div.rating > div.value")?.text() val year = - document.selectFirst("#content > h1")?.text()?.substringAfterLast("(")?.filter { it.isDigit() }?.toIntOrNull() ?: - description.substringAfter("trasmessa nel").take(6).filter { it.isDigit() }.toIntOrNull() ?: - (document.selectFirst("i.fa.fa-calendar.fa-fw")?.parent()?.nextSibling() as Element?)?.text()?.substringAfterLast(" ")?.filter { it.isDigit() }?.toIntOrNull() + document.selectFirst("#content > h1")?.text()?.substringAfterLast("(") + ?.filter { it.isDigit() }?.toIntOrNull() + ?: description.substringAfter("trasmessa nel").take(6).filter { it.isDigit() } + .toIntOrNull() ?: (document.selectFirst("i.fa.fa-calendar.fa-fw")?.parent() + ?.nextSibling() as Element?)?.text()?.substringAfterLast(" ") + ?.filter { it.isDigit() }?.toIntOrNull() val poster = document.selectFirst("div.meta > div > img")?.attr("data-src") - val trailerurl = document.selectFirst("div.youtube-player")?.attr("data-id")?.let{ urldata-> - "https://www.youtube.com/watch?v=$urldata" - } + val trailerurl = + document.selectFirst("div.youtube-player")?.attr("data-id")?.let { urldata -> + "https://www.youtube.com/watch?v=$urldata" + } if (type == TvType.TvSeries) { val episodeList = ArrayList() - document.select("div.accordion-item").filter{it.selectFirst("#season > ul > li.s_title > span")!!.text().isNotEmpty()}.map { element -> - val season = - element.selectFirst("#season > ul > li.s_title > span")!!.text().toInt() - element.select("div.episode-wrap").map { episode -> - val href = - episode.select("#links > div > div > table > tbody:nth-child(2) > tr") - .map { it.selectFirst("a")!!.attr("href") }.toJson() - val epNum = episode.selectFirst("li.season-no")!!.text().substringAfter("x") - .filter { it.isDigit() }.toIntOrNull() - val epTitle = episode.selectFirst("li.other_link > a")?.text() + document.select("div.accordion-item") + .filter { it.selectFirst("#season > ul > li.s_title > span")!!.text().isNotEmpty() } + .map { element -> + val season = + element.selectFirst("#season > ul > li.s_title > span")!!.text().toInt() + element.select("div.episode-wrap").map { episode -> + val href = + episode.select("#links > div > div > table > tbody:nth-child(2) > tr") + .map { it.selectFirst("a")!!.attr("href") }.toJson() + val epNum = episode.selectFirst("li.season-no")!!.text().substringAfter("x") + .filter { it.isDigit() }.toIntOrNull() + val epTitle = episode.selectFirst("li.other_link > a")?.text() - val posterUrl = episode.selectFirst("figure > img")?.attr("data-src") - episodeList.add( - Episode( - href, - epTitle, - season, - epNum, - posterUrl, + val posterUrl = episode.selectFirst("figure > img")?.attr("data-src") + episodeList.add( + Episode( + href, + epTitle, + season, + epNum, + posterUrl, + ) ) - ) + } } - } return newTvSeriesLoadResponse( title, url, type, episodeList @@ -147,10 +155,12 @@ class FilmpertuttiProvider : MainAPI() { } else { val urls0 = document.select("div.embed-player") - val urls = if (urls0.isNotEmpty()){ - urls0.map { it.attr("data-id") }.toJson() - } - else{ document.select("#info > ul > li ").mapNotNull { it.selectFirst("a")?.attr("href") }.toJson() } + val urls = if (urls0.isNotEmpty()) { + urls0.map { it.attr("data-id") }.toJson() + } else { + document.select("#info > ul > li ").mapNotNull { it.selectFirst("a")?.attr("href") } + .toJson() + } return newMovieLoadResponse( title, @@ -168,46 +178,49 @@ class FilmpertuttiProvider : MainAPI() { } } -// to be updated when UnshortenUrl is ready + // to be updated when UnshortenUrl is ready suspend fun unshorten_linkup(uri: String): String { var r: NiceResponse? = null var uri = uri - when{ + when { uri.contains("/tv/") -> uri = uri.replace("/tv/", "/tva/") uri.contains("delta") -> uri = uri.replace("/delta/", "/adelta/") - (uri.contains("/ga/") || uri.contains("/ga2/")) -> uri = base64Decode(uri.split('/').last()).trim() - uri.contains("/speedx/") -> uri = uri.replace("http://linkup.pro/speedx", "http://speedvideo.net") + (uri.contains("/ga/") || uri.contains("/ga2/")) -> uri = + base64Decode(uri.split('/').last()).trim() + uri.contains("/speedx/") -> uri = + uri.replace("http://linkup.pro/speedx", "http://speedvideo.net") else -> { r = app.get(uri, allowRedirects = true) uri = r.url val link = - Regex("]*src=\\'([^'>]*)\\'[^<>]*>").find(r.text)?.value ?: - Regex("""action="(?:[^/]+.*?/[^/]+/([a-zA-Z0-9_]+))">""").find(r.text)?.value ?: - Regex("""href","((.|\\n)*?)"""").findAll(r.text).elementAtOrNull(1)?.groupValues?.get(1) + Regex("]*src=\\'([^'>]*)\\'[^<>]*>").find(r.text)?.value + ?: Regex("""action="(?:[^/]+.*?/[^/]+/([a-zA-Z0-9_]+))">""").find(r.text)?.value + ?: Regex("""href","((.|\\n)*?)"""").findAll(r.text) + .elementAtOrNull(1)?.groupValues?.get(1) - if (link!=null) { + if (link != null) { uri = link } } } val short = Regex("""^https?://.*?(https?://.*)""").find(uri)?.value - if (short!=null){ + if (short != null) { uri = short } - if (r==null){ + if (r == null) { r = app.get( uri, - allowRedirects = false) - if (r.headers["location"]!= null){ + allowRedirects = false + ) + if (r.headers["location"] != null) { uri = r.headers["location"].toString() } } if (uri.contains("snip.")) { if (uri.contains("out_generator")) { uri = Regex("url=(.*)\$").find(uri)!!.value - } - else if (uri.contains("/decode/")) { + } else if (uri.contains("/decode/")) { uri = app.get(uri, allowRedirects = true).url } } @@ -222,16 +235,14 @@ class FilmpertuttiProvider : MainAPI() { callback: (ExtractorLink) -> Unit ): Boolean { tryParseJson>(data)?.apmap { id -> - if (id.contains("buckler")){ - val id2 = unshorten_linkup(id).trim().replace("/v/","/e/").replace("/f/","/e/") + if (id.contains("buckler")) { + val id2 = unshorten_linkup(id).trim().replace("/v/", "/e/").replace("/f/", "/e/") loadExtractor(id2, data, subtitleCallback, callback) - } - else if (id.contains("isecure")){ + } else if (id.contains("isecure")) { val doc1 = app.get(id).document val id2 = doc1.selectFirst("iframe")!!.attr("src") loadExtractor(id2, data, subtitleCallback, callback) - } - else{ + } else { loadExtractor(id, data, subtitleCallback, callback) } } diff --git a/app/src/main/java/com/lagradost/cloudstream3/movieproviders/OpenVidsProvider.kt b/app/src/main/java/com/lagradost/cloudstream3/movieproviders/OpenVidsProvider.kt index 569aef26..3e00011a 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/movieproviders/OpenVidsProvider.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/movieproviders/OpenVidsProvider.kt @@ -2,7 +2,6 @@ package com.lagradost.cloudstream3.movieproviders import com.fasterxml.jackson.annotation.JsonProperty import com.lagradost.cloudstream3.* -import com.lagradost.cloudstream3.animeproviders.GogoanimeProvider import com.lagradost.cloudstream3.animeproviders.GogoanimeProvider.Companion.extractVidstream import com.lagradost.cloudstream3.metaproviders.TmdbLink import com.lagradost.cloudstream3.metaproviders.TmdbProvider diff --git a/app/src/main/java/com/lagradost/cloudstream3/movieproviders/PeliSmartProvider.kt b/app/src/main/java/com/lagradost/cloudstream3/movieproviders/PeliSmartProvider.kt index 1cb5e0d0..7ef4a441 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/movieproviders/PeliSmartProvider.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/movieproviders/PeliSmartProvider.kt @@ -25,7 +25,8 @@ class PeliSmartProvider: MainAPI() { Pair("$mainUrl/documentales/", "Documentales"), ) - for ((url, name) in urls) { + // has no inf loading + urls.apmap { (url, name) -> try { val soup = app.get(url).document val home = soup.select(".description-off").map { diff --git a/app/src/main/java/com/lagradost/cloudstream3/movieproviders/SoaptwoDayProvider.kt b/app/src/main/java/com/lagradost/cloudstream3/movieproviders/SoaptwoDayProvider.kt index 38c60be8..85687616 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/movieproviders/SoaptwoDayProvider.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/movieproviders/SoaptwoDayProvider.kt @@ -2,7 +2,6 @@ package com.lagradost.cloudstream3.movieproviders import com.fasterxml.jackson.annotation.JsonProperty import com.lagradost.cloudstream3.* -import com.lagradost.cloudstream3.mvvm.logError import com.lagradost.cloudstream3.utils.AppUtils.parseJson import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.Qualities @@ -19,37 +18,35 @@ class SoaptwoDayProvider : MainAPI() { TvType.TvSeries, ) - override suspend fun getMainPage(page: Int, categoryName: String, categoryData: String): HomePageResponse { - val items = ArrayList() - val urls = listOf( - Pair("$mainUrl/movielist/", "Movies"), - Pair("$mainUrl/tvlist/", "TV Series"), - ) - for ((url, name) in urls) { - try { - val soup = app.get(url).document - val home = - soup.select("div.container div.row div.col-sm-12.col-lg-12 div.row div.col-sm-12.col-lg-12 .col-xs-6") - .map { - val title = it.selectFirst("h5 a")!!.text() - val link = it.selectFirst("a")!!.attr("href") - TvSeriesSearchResponse( - title, - link, - this.name, - TvType.TvSeries, - fixUrl(it.selectFirst("img")!!.attr("src")), - null, - null, - ) - } + override val mainPage = mainPageOf( + Pair("$mainUrl/movielist?page=", "Movies"), + Pair("$mainUrl/tvlist?page=", "TV Series"), + ) - items.add(HomePageList(name, home)) - } catch (e: Exception) { - logError(e) - } - } - return HomePageResponse(items) + override suspend fun getMainPage( + page: Int, + categoryName: String, + categoryData: String + ): HomePageResponse { + val url = categoryData + page + + val soup = app.get(url).document + val home = + soup.select("div.container div.row div.col-sm-12.col-lg-12 div.row div.col-sm-12.col-lg-12 .col-xs-6") + .map { + val title = it.selectFirst("h5 a")!!.text() + val link = it.selectFirst("a")!!.attr("href") + TvSeriesSearchResponse( + title, + link, + this.name, + TvType.TvSeries, + fixUrl(it.selectFirst("img")!!.attr("src")), + null, + null, + ) + } + return newHomePageResponse(categoryName, home) } override suspend fun search(query: String): List { diff --git a/app/src/main/java/com/lagradost/cloudstream3/movieproviders/TantiFilmProvider.kt b/app/src/main/java/com/lagradost/cloudstream3/movieproviders/TantiFilmProvider.kt index 711b6895..e84e6ddf 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/movieproviders/TantiFilmProvider.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/movieproviders/TantiFilmProvider.kt @@ -1,10 +1,9 @@ package com.lagradost.cloudstream3.movieproviders import com.lagradost.cloudstream3.* -import com.lagradost.cloudstream3.mvvm.logError -import com.lagradost.cloudstream3.app -import com.lagradost.cloudstream3.utils.* import com.lagradost.cloudstream3.LoadResponse.Companion.addTrailer +import com.lagradost.cloudstream3.utils.ExtractorLink +import com.lagradost.cloudstream3.utils.loadExtractor class TantifilmProvider : MainAPI() { @@ -18,37 +17,33 @@ class TantifilmProvider : MainAPI() { TvType.TvSeries, ) - override suspend fun getMainPage(page: Int, categoryName: String, categoryData: String): HomePageResponse { - val items = ArrayList() - val urls = listOf( - Pair("$mainUrl/watch-genre/serie-tv/", "Serie Tv"), - Pair("$mainUrl/watch-genre/azione/", "Azione"), - Pair("$mainUrl/watch-genre/avventura/", "Avventura"), - ) - for ((url, name) in urls) { - try { - val soup = app.get(url).document - val home = soup.select("div.media3").map { - val title = it.selectFirst("p")!!.text().substringBefore("(") - val link = it.selectFirst("a")!!.attr("href") - TvSeriesSearchResponse( - title, - link, - this.name, - TvType.Movie, - it.selectFirst("img")!!.attr("src"), - null, - null, - ) - } + override val mainPage = mainPageOf( + Pair("$mainUrl/watch-genre/serie-tv/page/", "Serie Tv"), + Pair("$mainUrl/watch-genre/azione/page/", "Azione"), + Pair("$mainUrl/watch-genre/avventura/page/", "Avventura"), + ) - items.add(HomePageList(name, home)) - } catch (e: Exception) { - logError(e) - } + override suspend fun getMainPage( + page: Int, + categoryName: String, + categoryData: String + ): HomePageResponse { + val url = categoryData + page + val soup = app.get(url).document + val home = soup.select("div.media3").map { + val title = it.selectFirst("p")!!.text().substringBefore("(") + val link = it.selectFirst("a")!!.attr("href") + TvSeriesSearchResponse( + title, + link, + this.name, + TvType.Movie, + it.selectFirst("img")!!.attr("src"), + null, + null, + ) } - if (items.size <= 0) throw ErrorLoadingException() - return HomePageResponse(items) + return newHomePageResponse(categoryName, home) } override suspend fun search(query: String): List { @@ -125,7 +120,7 @@ class TantifilmProvider : MainAPI() { val episodeList = ArrayList() - for ((season,seasonurl) in list) { + for ((season, seasonurl) in list) { val seasonDocument = app.get(seasonurl).document val episodes = seasonDocument.select("nav.second_nav > select > option") if (episodes.isNotEmpty()) { @@ -147,11 +142,12 @@ class TantifilmProvider : MainAPI() { title, url, type, - episodeList) { - this.posterUrl= fixUrlNull(poster) + episodeList + ) { + this.posterUrl = fixUrlNull(poster) this.year = year.toIntOrNull() - this.plot= descipt[0] - this.rating= rating + this.plot = descipt[0] + this.rating = rating this.recommendations = recomm addTrailer(trailerurl) } diff --git a/app/src/main/java/com/lagradost/cloudstream3/utils/SubtitleHelper.kt b/app/src/main/java/com/lagradost/cloudstream3/utils/SubtitleHelper.kt index 12236aad..0d761560 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/utils/SubtitleHelper.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/utils/SubtitleHelper.kt @@ -119,8 +119,10 @@ object SubtitleHelper { private val flagRegex = Regex("[\uD83C\uDDE6-\uD83C\uDDFF]{2}") fun getFlagFromIso(inp: String?): String? { + if (inp.isNullOrBlank() || inp.length < 2) return null + try { - val ret = getFlagFromIsoShort(flags[inp ?: return null]) + val ret = getFlagFromIsoShort(flags[inp]) ?: getFlagFromIsoShort(inp.uppercase()) ?: return null return if (flagRegex.matches(ret)) { @@ -135,8 +137,9 @@ object SubtitleHelper { } private fun getFlagFromIsoShort(flagAscii: String?): String? { + if (flagAscii.isNullOrBlank() || flagAscii.length < 2) return null try { - val firstChar: Int = Character.codePointAt(flagAscii ?: return null, 0) + offset + val firstChar: Int = Character.codePointAt(flagAscii, 0) + offset val secondChar: Int = Character.codePointAt(flagAscii, 1) + offset return (String(Character.toChars(firstChar)) + String(Character.toChars(secondChar))) From e2fb8263683c16d81b2eda0cce2614e9dfcc4d2e Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Sat, 30 Jul 2022 16:59:12 +0000 Subject: [PATCH 2/4] chore(docs): update list of sites --- docs/providers.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/providers.json b/docs/providers.json index 86efa83d..ef223c59 100644 --- a/docs/providers.json +++ b/docs/providers.json @@ -240,7 +240,7 @@ "language": "en", "name": "GogoAnime", "status": 1, - "url": "https://gogoanime.sk" + "url": "https://gogoanime.lu" }, "GomunimeProvider": { "language": "id", From a5ee7f712daf44e3f0e70e202d8ce8bbfc0ba98d Mon Sep 17 00:00:00 2001 From: LagradOst <11805592+LagradOst@users.noreply.github.com> Date: Sat, 30 Jul 2022 19:34:10 +0200 Subject: [PATCH 3/4] fixed #1344 --- .../movieproviders/FilmpertuttiProvider.kt | 79 +-- .../cloudstream3/ui/settings/SettingsLang.kt | 14 +- app/src/main/res/values-id/strings.xml | 467 ------------------ 3 files changed, 54 insertions(+), 506 deletions(-) delete mode 100644 app/src/main/res/values-id/strings.xml diff --git a/app/src/main/java/com/lagradost/cloudstream3/movieproviders/FilmpertuttiProvider.kt b/app/src/main/java/com/lagradost/cloudstream3/movieproviders/FilmpertuttiProvider.kt index 6741640c..830ecef1 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/movieproviders/FilmpertuttiProvider.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/movieproviders/FilmpertuttiProvider.kt @@ -1,4 +1,5 @@ package com.lagradost.cloudstream3.movieproviders + import androidx.core.text.parseAsHtml import com.lagradost.cloudstream3.* import com.lagradost.cloudstream3.LoadResponse.Companion.addRating @@ -64,7 +65,8 @@ class FilmpertuttiProvider : MainAPI() { val url = "$mainUrl/?s=$queryformatted" val doc = app.get(url).document return doc.select("ul.posts > li").map { - val title = it.selectFirst("div.title")!!.text().substringBeforeLast("(").substringBeforeLast("[") + val title = it.selectFirst("div.title")!!.text().substringBeforeLast("(") + .substringBeforeLast("[") val link = it.selectFirst("a")!!.attr("href") val image = it.selectFirst("a")!!.attr("data-thumbnail") val quality = getQualityFromString(it.selectFirst("div.hd")?.text()) @@ -88,28 +90,36 @@ class FilmpertuttiProvider : MainAPI() { val title = document.selectFirst("#content > h1")!!.text().substringBeforeLast("(") .substringBeforeLast("[") - val description = document.selectFirst("i.fa.fa-file-text-o.fa-fw")?.parent()?.nextSibling()?.toString()?.parseAsHtml().toString() + val description = + document.selectFirst("i.fa.fa-file-text-o.fa-fw")?.parent()?.nextSibling()?.toString() + ?.parseAsHtml().toString() val rating = document.selectFirst("div.rating > div.value")?.text() val year = - document.selectFirst("#content > h1")?.text()?.substringAfterLast("(")?.filter { it.isDigit() }?.toIntOrNull() ?: - description.substringAfter("trasmessa nel").take(6).filter { it.isDigit() }.toIntOrNull() ?: - (document.selectFirst("i.fa.fa-calendar.fa-fw")?.parent()?.nextSibling() as Element?)?.text()?.substringAfterLast(" ")?.filter { it.isDigit() }?.toIntOrNull() + document.selectFirst("#content > h1")?.text()?.substringAfterLast("(") + ?.filter { it.isDigit() }?.toIntOrNull() + ?: description.substringAfter("trasmessa nel").take(6).filter { it.isDigit() } + .toIntOrNull() ?: (document.selectFirst("i.fa.fa-calendar.fa-fw")?.parent() + ?.nextSibling() as Element?)?.text()?.substringAfterLast(" ") + ?.filter { it.isDigit() }?.toIntOrNull() val poster = document.selectFirst("div.meta > div > img")?.attr("data-src") - val trailerurl = document.selectFirst("div.youtube-player")?.attr("data-id")?.let{ urldata-> - "https://www.youtube.com/watch?v=$urldata" - } + val trailerurl = + document.selectFirst("div.youtube-player")?.attr("data-id")?.let { urldata -> + "https://www.youtube.com/watch?v=$urldata" + } if (type == TvType.TvSeries) { val episodeList = ArrayList() - document.select("div.accordion-item").filter{it.selectFirst("#season > ul > li.s_title > span")!!.text().isNotEmpty()}.map { element -> + document.select("div.accordion-item").filter { a -> + a.selectFirst("#season > ul > li.s_title > span")!!.text().isNotEmpty() + }.map { element -> val season = element.selectFirst("#season > ul > li.s_title > span")!!.text().toInt() element.select("div.episode-wrap").map { episode -> @@ -145,10 +155,12 @@ class FilmpertuttiProvider : MainAPI() { } else { val urls0 = document.select("div.embed-player") - val urls = if (urls0.isNotEmpty()){ - urls0.map { it.attr("data-id") }.toJson() - } - else{ document.select("#info > ul > li ").mapNotNull { it.selectFirst("a")?.attr("href") }.toJson() } + val urls = if (urls0.isNotEmpty()) { + urls0.map { it.attr("data-id") }.toJson() + } else { + document.select("#info > ul > li ").mapNotNull { it.selectFirst("a")?.attr("href") } + .toJson() + } return newMovieLoadResponse( title, @@ -166,46 +178,49 @@ class FilmpertuttiProvider : MainAPI() { } } -// to be updated when UnshortenUrl is ready + // to be updated when UnshortenUrl is ready suspend fun unshorten_linkup(uri: String): String { var r: NiceResponse? = null var uri = uri - when{ + when { uri.contains("/tv/") -> uri = uri.replace("/tv/", "/tva/") uri.contains("delta") -> uri = uri.replace("/delta/", "/adelta/") - (uri.contains("/ga/") || uri.contains("/ga2/")) -> uri = base64Decode(uri.split('/').last()).trim() - uri.contains("/speedx/") -> uri = uri.replace("http://linkup.pro/speedx", "http://speedvideo.net") + (uri.contains("/ga/") || uri.contains("/ga2/")) -> uri = + base64Decode(uri.split('/').last()).trim() + uri.contains("/speedx/") -> uri = + uri.replace("http://linkup.pro/speedx", "http://speedvideo.net") else -> { r = app.get(uri, allowRedirects = true) uri = r.url val link = - Regex("]*src=\\'([^'>]*)\\'[^<>]*>").find(r.text)?.value ?: - Regex("""action="(?:[^/]+.*?/[^/]+/([a-zA-Z0-9_]+))">""").find(r.text)?.value ?: - Regex("""href","((.|\\n)*?)"""").findAll(r.text).elementAtOrNull(1)?.groupValues?.get(1) + Regex("]*src=\\'([^'>]*)\\'[^<>]*>").find(r.text)?.value + ?: Regex("""action="(?:[^/]+.*?/[^/]+/([a-zA-Z0-9_]+))">""").find(r.text)?.value + ?: Regex("""href","((.|\\n)*?)"""").findAll(r.text) + .elementAtOrNull(1)?.groupValues?.get(1) - if (link!=null) { + if (link != null) { uri = link } } } val short = Regex("""^https?://.*?(https?://.*)""").find(uri)?.value - if (short!=null){ + if (short != null) { uri = short } - if (r==null){ + if (r == null) { r = app.get( uri, - allowRedirects = false) - if (r.headers["location"]!= null){ + allowRedirects = false + ) + if (r.headers["location"] != null) { uri = r.headers["location"].toString() } } if (uri.contains("snip.")) { if (uri.contains("out_generator")) { uri = Regex("url=(.*)\$").find(uri)!!.value - } - else if (uri.contains("/decode/")) { + } else if (uri.contains("/decode/")) { uri = app.get(uri, allowRedirects = true).url } } @@ -220,16 +235,14 @@ class FilmpertuttiProvider : MainAPI() { callback: (ExtractorLink) -> Unit ): Boolean { tryParseJson>(data)?.apmap { id -> - if (id.contains("buckler")){ - val id2 = unshorten_linkup(id).trim().replace("/v/","/e/").replace("/f/","/e/") + if (id.contains("buckler")) { + val id2 = unshorten_linkup(id).trim().replace("/v/", "/e/").replace("/f/", "/e/") loadExtractor(id2, data, subtitleCallback, callback) - } - else if (id.contains("isecure")){ + } else if (id.contains("isecure")) { val doc1 = app.get(id).document val id2 = doc1.selectFirst("iframe")!!.attr("src") loadExtractor(id2, data, subtitleCallback, callback) - } - else{ + } else { loadExtractor(id, data, subtitleCallback, callback) } } diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsLang.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsLang.kt index 4693d066..fd5be423 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsLang.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsLang.kt @@ -5,12 +5,14 @@ import android.os.Bundle import android.view.View import androidx.preference.PreferenceFragmentCompat import androidx.preference.PreferenceManager -import com.lagradost.cloudstream3.* +import com.lagradost.cloudstream3.APIHolder import com.lagradost.cloudstream3.APIHolder.getApiDubstatusSettings import com.lagradost.cloudstream3.APIHolder.getApiProviderLangSettings import com.lagradost.cloudstream3.AcraApplication.Companion.removeKey +import com.lagradost.cloudstream3.CommonActivity +import com.lagradost.cloudstream3.DubStatus +import com.lagradost.cloudstream3.R import com.lagradost.cloudstream3.mvvm.logError -import com.lagradost.cloudstream3.network.initClient import com.lagradost.cloudstream3.ui.APIRepository import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.getPref import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setUpToolbar @@ -55,7 +57,7 @@ val appLanguages = arrayListOf( Triple("", "Romanian", "ro"), Triple("", "Italian", "it"), Triple("", "Chinese", "zh"), - Triple("", "Indonesian", "id"), + Triple("\uD83C\uDDEE\uD83C\uDDE9", "Indonesian", "in"), Triple("", "Czech", "cs"), ).sortedBy { it.second } //ye, we go alphabetical, so ppl don't put their lang on top @@ -120,13 +122,13 @@ class SettingsLang : PreferenceFragmentCompat() { return@setOnPreferenceClickListener true } - getPref(R.string.locale_key)?.setOnPreferenceClickListener { + getPref(R.string.locale_key)?.setOnPreferenceClickListener { pref -> val tempLangs = appLanguages.toMutableList() //if (beneneCount > 100) { // tempLangs.add(Triple("\uD83E\uDD8D", "mmmm... monke", "mo")) //} - val current = getCurrentLocale(requireContext()) - val languageCodes = tempLangs.map { it.third } + val current = getCurrentLocale(pref.context) + val languageCodes = tempLangs.map { (_, _, iso) -> iso } val languageNames = tempLangs.map { (emoji, name, iso) -> val flag = emoji.ifBlank { SubtitleHelper.getFlagFromIso(iso) ?: "ERROR" } "$flag $name" diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml deleted file mode 100644 index b0ef6f5b..00000000 --- a/app/src/main/res/values-id/strings.xml +++ /dev/null @@ -1,467 +0,0 @@ - - - - - %d %s | %sMB - %s • %sGB - %sMB / %sMB - %dMB - %s %s - +%d - -%d - %d - %d - %.1f/10.0 - %d - %s Ep %d - Pemeran: %s - - - Poster - @string/result_poster_img_des - Episode Poster - Main Poster - Next Random - @string/play_episode - Go back - @string/home_change_provider_img_des - Change Provider - Preview Background - - - Kecepatan (%.2fx) - Dinilai: %.1f - Update baru ditemukan!\n%s -> %s - Filler - %d mnt - - CloudStream - Beranda - Cari - Download - Pengaturan - - Cari… - Cari %s… - - Tidak Ada Data - Opsi Lanjutan - Episode selanjutnya - @string/synopsis - Genre - Bagikan - Buka Di Browser - Skip Loading - Loading… - - Sedang Menonton - Tertahan - Selesai - Dihentikan - Rencana untuk Menonton - Tidak Ada - Menonton Ulang - - Putar Movie - Streaming Torrent - Sumber - Subtitle - Coba ulang koneksi… - Kembali - Putar Episode - - - Download - Terdownload - Sedang Didownload - Download Dijeda - Download Dimulai - Download Gagal - Download Dibatalkan - Download Selesai - %s - %s - - Error Memuat Tautan - Penyimpanan Internal - - Dub - Sub - - Hapus File - Putar File - Lanjutkan Download - Jeda Download - - Matikan pelaporan bug otomatis - Lebih banyak info - Sembunyikan - Putar - Info - Filter Bookmark - Bookmark - Hapus - Atur status tontonan - Terapkan - Batalkan - Salin - Tutup - Bersihkan - Simpan - - Kecepatan Pemutar - - Pengaturan Subtitle - Warna Teks - Warna Garis Luar - Warna Latar Belakang - Warna Window - Jenis Tepi - Ketinggian Subtitle - Font - Ukuran Font - - Cari menggunakan provider - Cari menggunakan jenis - - %d Piseng yang diberikan kepada developer - Tidak ada piseng yang diberikan - - Pilih Bahasa Otomatis - Download Bahasa - Tahan untuk mengatur ulang ke default - Impor font dengan meletakkan mereka di %s - Lanjutkan Menonton - - Hapus - Info lebih lanjut - @string/home_play - - Sebuah VPN mungkin diperlukan agar provider ini bisa bekerja dengan benar - Provider ini adalah sebuah torrent, VPN direkomendasikan - - Metadata tidak disediakan oleh situs, loading video akan gagal jika tidak ada di situs. - - Deskripsi - Tidak Ada Plot Yang Ditemukan - Tidak Ada Deskripsi Yang Ditemukan - - Tampilkan logcat 🐈 - - Picture-in-picture - Melanjutkan pemutaran di pemutar mini di atas aplikasi lain - Tombol mengubah ukuran pemutar - Menghapus batasan hitam - Subtitle - Pengaturan subtitle pemutar - Subtitle Chromecast - Pengaturan subtitle Chromecast - - Mode Eigengravy - Menambahkan opsi kecepatan di pemutar - Geser untuk mengubah waktu - Geser ke kiri atau kanan untuk mengontrol waktu di pemutar video - Geser untuk mengubah pengaturan - Geser ke sisi kiri atau kanan untuk mengubah pencerahan atau volume - Tekan dua kali untuk mengubah waktu - Tekan dua kali untuk menjeda - Jumlah pengubah waktu pemutar - Tekan dua kali di sisi kanan atau kiri untuk mengubah waktu ke depan atau ke belakang - - Tekan di tengah untuk menjeda - Gunakan pencerahan sistem - Gunakan pencerahan sistem di pemutar aplikasi dari pada hamparan gelap - - - Update progres tontonan - Sinkronisasikan progres episode saat ini secara otomatis - - Pulihkan data dari cadangan - Download metadata terbaru dari github - Jika anda ingin askes dari seluruh provider (bahkan yang sudah rusak) matikan ini - - Cadangkan data - File cadangan termuat - Gagal untuk memulihkan data dari file %s - Data berhasil disimpan - Izin penyimpanan tidak ditemukan, mohon coba lagi - Error saat mencadang %s - - Cari - Kredit dan akun - Update dan cadangan - Apa itu Nginx ? - Nginx adalah sebuah software yang dapat digunakan untuk menampilkan file dari server yang anda miliki. Klik untuk melihat panduan pengaturan Nginx - - Info - Pencarian Lanjutan - Memberikan hasil pencarian yang dipisahkan berdasarkan provider - Hanya mengirim data saat ngecrash - Tidak mengirim data - Tampilkan episode filler untuk anime - Tampilkan update aplikasi - Secara otomatis mencari update terbaru saat aplikasi dibuka - Update ke prarilis - Hanya mencari update prarilis daripada rilis penuh - Github - Aplikasi novel ringan dari developer yang sama - Aplikasi anime dari developer yang sama - Bergabung dengan Discord - Berikan sebuah piseng kepada developer - Piseng yang diberikan - - Bahasa Aplikasi - - Provider ini tidak memiliki dukungan Chromecast - Tidak Ada Tautan Yang Ditemukan - Tautan disalin ke papan klip - Putar Episode - Ulang ke pengaturan default - Maaf, aplikasi ngecrash. Laporan bug anonim akan dikirim ke developer - - - Season - Tidak Ada Season - Episode - Episode - S - E - Episode Tidak Ditemukan - - Hapus File - Hapus - @string/sort_cancel - Jeda - Lanjutkan - -30 - +30 - Ini akan secara permanen menghapus %s\nApakah anda yakin? - %dm\ntersisa - - - Masih Berlanjut - Tamat - Status - Tahun - Skor - Durasi - Situs - Sinopsis - - antri - Tidak Ada Subtitle - Default - - Bebas - Terpakai - Aplikasi - - - Movie - Seri TV - Kartun - Anime - Torrent - Film Dokumenter - OVA - Drama Asia - - - Movie - Seri - Kartun - @string/anime - @string/ova - Torrent - Film Dokumenter - Drama Asia - - Error sumber - Error jarak jauh - Error perender - Error pemutar yang tidak terduga - Error mendownload, cek izin penyimpanan - - Episode Chromecast - Mirror Chromecast - Putar di aplikasi - Putar di VLC - Putar di browser - Salin tautan - Download otomatis - Download mirror - Muat ulang tautan - Download subtitle - - Label kualitas - Label dub - Label sub - Judul - show_hd_key - show_dub_key - show_sub_key - show_title_key - Aktifkan atau nonaktifkan elemen UI pada poster - - Tidak Ada Update Yang Ditemukan - Cek Untuk Update - - Kunci - Ubah Ukuran - Sumber - Skip OP - - Jangan tunjukkan lagi - Skip Update ini - Update - Kualitas tontonan yang lebih diinginkan - Karakter maksimal judul pemutar video - Resolusi pemutar video - - Ukuran buffer video - Panjang buffer video - Cache video di disk - Membersihkan cache video dan gambar - - Akan menyebabkan crash acak jika disetel terlalu tinggi. Jangan diubah jika anda memiliki jumlah ram yang rendah seperti TV Android atau ponsel lama - Dapat menyebabkan masalah pada sistem dengan ruang penyimpanan yang rendah seperti perangkat Android TV jika anda menyetelnya terlalu tinggi - - DNS melalui HTTPS - Berguna untuk melewati blok ISP - - Jalur download - - Url server Nginx - - Tampilkan Anime Dub/Sub - - Paskan dengan layar - Regang - Zoom - - Peringatan - legal_notice_key - Any legal issues regarding the content on this application - should be taken up with the actual file hosts and providers themselves as we are not affiliated with them. - - In case of copyright infringement, please directly contact the responsible parties or the streaming websites. - - The app is purely for educational and personal use. - - CloudStream 3 does not host any content on the app, and has no control over what media is put up or taken down. - CloudStream 3 functions like any other search engine, such as Google. CloudStream 3 does not host, upload or - manage any videos, films or content. It simply crawls, aggregates and displayes links in a convenient, - user-friendly interface. - - It merely scrapes 3rd-party websites that are publicly accessable via any regular web browser. It is the - responsibility of user to avoid any actions that might violate the laws governing his/her locality. Use - CloudStream 3 at your own risk. - - Umum - Tombol Acak - Tampilkan tombol acak di Beranda - Bahasa provider - Tata Letak Aplikasi - Media yang lebih diinginkan - Media dan bahasa yang lebih diinginkan - Antarmuka pengguna - - Otomatis - Tata letak TV - Tata letak HP - Tata letak emulator - - Warna primer - Tema aplikasi - Lokasi judul poster - Meletakkan judul di bawah poster - - - - anilist_key - mal_key - - %s %s - akun - Logout - Login - Ganti akun - Tambah akun - Tambah pelacak - Menambah %s - Sinkronisasi - Skor - %d / 10 - /?? - /%d - %s Diautentikasikan - Gagal untuk mengautentikasi ke %s - - - Tidak Ada - Normal - Semua - Maks - Min - @string/none - Garis luar - Depresi - Bayangan - Menonjol - Sinkronisasi sub - 1000ms - Penundaan subtitle - Gunakan ini jika subtitle ditampilkan %dms terlalu cepat - Gunakan ini jika subtitle ditampilkan %dms terlalu lambat - Tidak ada penundaan subtitle - - - The quick brown fox jumps over the lazy dog - - Direkomendasikan - Memuat %s - Muat dari file - File terdownload - Utama - Pendukung - Latar Belakang - - Sumber - Acak - - Segera hadir… - - Cam - Cam - Cam - HQ - HD - TS - TC - BlueRay - WP - DVD - 4K - SD - UHD - HDR - SDR - Web - - Gambar Poster - Pemutar - Resolusi dan judul - Judul - Resolusi - From dc62ee278a7ba457cb05d71fad392a9b6c954e6c Mon Sep 17 00:00:00 2001 From: LagradOst <11805592+LagradOst@users.noreply.github.com> Date: Sat, 30 Jul 2022 19:35:07 +0200 Subject: [PATCH 4/4] readd strings.xml --- app/src/main/res/values-in/strings.xml | 467 +++++++++++++++++++++++++ 1 file changed, 467 insertions(+) create mode 100644 app/src/main/res/values-in/strings.xml diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml new file mode 100644 index 00000000..b0ef6f5b --- /dev/null +++ b/app/src/main/res/values-in/strings.xml @@ -0,0 +1,467 @@ + + + + + %d %s | %sMB + %s • %sGB + %sMB / %sMB + %dMB + %s %s + +%d + -%d + %d + %d + %.1f/10.0 + %d + %s Ep %d + Pemeran: %s + + + Poster + @string/result_poster_img_des + Episode Poster + Main Poster + Next Random + @string/play_episode + Go back + @string/home_change_provider_img_des + Change Provider + Preview Background + + + Kecepatan (%.2fx) + Dinilai: %.1f + Update baru ditemukan!\n%s -> %s + Filler + %d mnt + + CloudStream + Beranda + Cari + Download + Pengaturan + + Cari… + Cari %s… + + Tidak Ada Data + Opsi Lanjutan + Episode selanjutnya + @string/synopsis + Genre + Bagikan + Buka Di Browser + Skip Loading + Loading… + + Sedang Menonton + Tertahan + Selesai + Dihentikan + Rencana untuk Menonton + Tidak Ada + Menonton Ulang + + Putar Movie + Streaming Torrent + Sumber + Subtitle + Coba ulang koneksi… + Kembali + Putar Episode + + + Download + Terdownload + Sedang Didownload + Download Dijeda + Download Dimulai + Download Gagal + Download Dibatalkan + Download Selesai + %s - %s + + Error Memuat Tautan + Penyimpanan Internal + + Dub + Sub + + Hapus File + Putar File + Lanjutkan Download + Jeda Download + + Matikan pelaporan bug otomatis + Lebih banyak info + Sembunyikan + Putar + Info + Filter Bookmark + Bookmark + Hapus + Atur status tontonan + Terapkan + Batalkan + Salin + Tutup + Bersihkan + Simpan + + Kecepatan Pemutar + + Pengaturan Subtitle + Warna Teks + Warna Garis Luar + Warna Latar Belakang + Warna Window + Jenis Tepi + Ketinggian Subtitle + Font + Ukuran Font + + Cari menggunakan provider + Cari menggunakan jenis + + %d Piseng yang diberikan kepada developer + Tidak ada piseng yang diberikan + + Pilih Bahasa Otomatis + Download Bahasa + Tahan untuk mengatur ulang ke default + Impor font dengan meletakkan mereka di %s + Lanjutkan Menonton + + Hapus + Info lebih lanjut + @string/home_play + + Sebuah VPN mungkin diperlukan agar provider ini bisa bekerja dengan benar + Provider ini adalah sebuah torrent, VPN direkomendasikan + + Metadata tidak disediakan oleh situs, loading video akan gagal jika tidak ada di situs. + + Deskripsi + Tidak Ada Plot Yang Ditemukan + Tidak Ada Deskripsi Yang Ditemukan + + Tampilkan logcat 🐈 + + Picture-in-picture + Melanjutkan pemutaran di pemutar mini di atas aplikasi lain + Tombol mengubah ukuran pemutar + Menghapus batasan hitam + Subtitle + Pengaturan subtitle pemutar + Subtitle Chromecast + Pengaturan subtitle Chromecast + + Mode Eigengravy + Menambahkan opsi kecepatan di pemutar + Geser untuk mengubah waktu + Geser ke kiri atau kanan untuk mengontrol waktu di pemutar video + Geser untuk mengubah pengaturan + Geser ke sisi kiri atau kanan untuk mengubah pencerahan atau volume + Tekan dua kali untuk mengubah waktu + Tekan dua kali untuk menjeda + Jumlah pengubah waktu pemutar + Tekan dua kali di sisi kanan atau kiri untuk mengubah waktu ke depan atau ke belakang + + Tekan di tengah untuk menjeda + Gunakan pencerahan sistem + Gunakan pencerahan sistem di pemutar aplikasi dari pada hamparan gelap + + + Update progres tontonan + Sinkronisasikan progres episode saat ini secara otomatis + + Pulihkan data dari cadangan + Download metadata terbaru dari github + Jika anda ingin askes dari seluruh provider (bahkan yang sudah rusak) matikan ini + + Cadangkan data + File cadangan termuat + Gagal untuk memulihkan data dari file %s + Data berhasil disimpan + Izin penyimpanan tidak ditemukan, mohon coba lagi + Error saat mencadang %s + + Cari + Kredit dan akun + Update dan cadangan + Apa itu Nginx ? + Nginx adalah sebuah software yang dapat digunakan untuk menampilkan file dari server yang anda miliki. Klik untuk melihat panduan pengaturan Nginx + + Info + Pencarian Lanjutan + Memberikan hasil pencarian yang dipisahkan berdasarkan provider + Hanya mengirim data saat ngecrash + Tidak mengirim data + Tampilkan episode filler untuk anime + Tampilkan update aplikasi + Secara otomatis mencari update terbaru saat aplikasi dibuka + Update ke prarilis + Hanya mencari update prarilis daripada rilis penuh + Github + Aplikasi novel ringan dari developer yang sama + Aplikasi anime dari developer yang sama + Bergabung dengan Discord + Berikan sebuah piseng kepada developer + Piseng yang diberikan + + Bahasa Aplikasi + + Provider ini tidak memiliki dukungan Chromecast + Tidak Ada Tautan Yang Ditemukan + Tautan disalin ke papan klip + Putar Episode + Ulang ke pengaturan default + Maaf, aplikasi ngecrash. Laporan bug anonim akan dikirim ke developer + + + Season + Tidak Ada Season + Episode + Episode + S + E + Episode Tidak Ditemukan + + Hapus File + Hapus + @string/sort_cancel + Jeda + Lanjutkan + -30 + +30 + Ini akan secara permanen menghapus %s\nApakah anda yakin? + %dm\ntersisa + + + Masih Berlanjut + Tamat + Status + Tahun + Skor + Durasi + Situs + Sinopsis + + antri + Tidak Ada Subtitle + Default + + Bebas + Terpakai + Aplikasi + + + Movie + Seri TV + Kartun + Anime + Torrent + Film Dokumenter + OVA + Drama Asia + + + Movie + Seri + Kartun + @string/anime + @string/ova + Torrent + Film Dokumenter + Drama Asia + + Error sumber + Error jarak jauh + Error perender + Error pemutar yang tidak terduga + Error mendownload, cek izin penyimpanan + + Episode Chromecast + Mirror Chromecast + Putar di aplikasi + Putar di VLC + Putar di browser + Salin tautan + Download otomatis + Download mirror + Muat ulang tautan + Download subtitle + + Label kualitas + Label dub + Label sub + Judul + show_hd_key + show_dub_key + show_sub_key + show_title_key + Aktifkan atau nonaktifkan elemen UI pada poster + + Tidak Ada Update Yang Ditemukan + Cek Untuk Update + + Kunci + Ubah Ukuran + Sumber + Skip OP + + Jangan tunjukkan lagi + Skip Update ini + Update + Kualitas tontonan yang lebih diinginkan + Karakter maksimal judul pemutar video + Resolusi pemutar video + + Ukuran buffer video + Panjang buffer video + Cache video di disk + Membersihkan cache video dan gambar + + Akan menyebabkan crash acak jika disetel terlalu tinggi. Jangan diubah jika anda memiliki jumlah ram yang rendah seperti TV Android atau ponsel lama + Dapat menyebabkan masalah pada sistem dengan ruang penyimpanan yang rendah seperti perangkat Android TV jika anda menyetelnya terlalu tinggi + + DNS melalui HTTPS + Berguna untuk melewati blok ISP + + Jalur download + + Url server Nginx + + Tampilkan Anime Dub/Sub + + Paskan dengan layar + Regang + Zoom + + Peringatan + legal_notice_key + Any legal issues regarding the content on this application + should be taken up with the actual file hosts and providers themselves as we are not affiliated with them. + + In case of copyright infringement, please directly contact the responsible parties or the streaming websites. + + The app is purely for educational and personal use. + + CloudStream 3 does not host any content on the app, and has no control over what media is put up or taken down. + CloudStream 3 functions like any other search engine, such as Google. CloudStream 3 does not host, upload or + manage any videos, films or content. It simply crawls, aggregates and displayes links in a convenient, + user-friendly interface. + + It merely scrapes 3rd-party websites that are publicly accessable via any regular web browser. It is the + responsibility of user to avoid any actions that might violate the laws governing his/her locality. Use + CloudStream 3 at your own risk. + + Umum + Tombol Acak + Tampilkan tombol acak di Beranda + Bahasa provider + Tata Letak Aplikasi + Media yang lebih diinginkan + Media dan bahasa yang lebih diinginkan + Antarmuka pengguna + + Otomatis + Tata letak TV + Tata letak HP + Tata letak emulator + + Warna primer + Tema aplikasi + Lokasi judul poster + Meletakkan judul di bawah poster + + + + anilist_key + mal_key + + %s %s + akun + Logout + Login + Ganti akun + Tambah akun + Tambah pelacak + Menambah %s + Sinkronisasi + Skor + %d / 10 + /?? + /%d + %s Diautentikasikan + Gagal untuk mengautentikasi ke %s + + + Tidak Ada + Normal + Semua + Maks + Min + @string/none + Garis luar + Depresi + Bayangan + Menonjol + Sinkronisasi sub + 1000ms + Penundaan subtitle + Gunakan ini jika subtitle ditampilkan %dms terlalu cepat + Gunakan ini jika subtitle ditampilkan %dms terlalu lambat + Tidak ada penundaan subtitle + + + The quick brown fox jumps over the lazy dog + + Direkomendasikan + Memuat %s + Muat dari file + File terdownload + Utama + Pendukung + Latar Belakang + + Sumber + Acak + + Segera hadir… + + Cam + Cam + Cam + HQ + HD + TS + TC + BlueRay + WP + DVD + 4K + SD + UHD + HDR + SDR + Web + + Gambar Poster + Pemutar + Resolusi dan judul + Judul + Resolusi +