This commit is contained in:
Blatzar 2022-07-14 00:54:51 +00:00
commit 9360e90a96
14 changed files with 1287 additions and 478 deletions

View file

@ -100,6 +100,7 @@ object APIHolder {
OpenVidsProvider(),
IdlixProvider(),
MultiplexProvider(),
VidSrcProvider(),
// Metadata providers
//TmdbProvider(),

View file

@ -92,7 +92,9 @@ class GogoanimeProvider : MainAPI() {
secretDecryptKey: String?,
// This could be removed, but i prefer it verbose
isUsingAdaptiveKeys: Boolean,
isUsingAdaptiveData: Boolean
isUsingAdaptiveData: Boolean,
// If you don't want to re-fetch the document
iframeDocument: Document? = null
) = safeApiCall {
// https://github.com/saikou-app/saikou/blob/3e756bd8e876ad7a9318b17110526880525a5cd3/app/src/main/java/ani/saikou/anime/source/extractors/GogoCDN.kt
// No Licence on the following code
@ -104,9 +106,9 @@ class GogoanimeProvider : MainAPI() {
val id = Regex("id=([^&]+)").find(iframeUrl)!!.value.removePrefix("id=")
var document: Document? = null
var document: Document? = iframeDocument
val foundIv =
iv ?: app.get(iframeUrl).document.also { document = it }
iv ?: (document ?: app.get(iframeUrl).document.also { document = it })
.select("""div.wrapper[class*=container]""")
.attr("class").split("-").lastOrNull() ?: return@safeApiCall
val foundKey = secretKey ?: getKey(base64Decode(id) + foundIv) ?: return@safeApiCall

View file

@ -50,12 +50,12 @@ class MonoschinosProvider : MainAPI() {
HomePageList(
"Capítulos actualizados",
app.get(mainUrl, timeout = 120).document.select(".col-6").map {
val title = it.selectFirst("p.animetitles")!!.text()
val title = it.selectFirst("p.animetitles")?.text() ?: it.selectFirst(".animetitles")?.text() ?: ""
val poster = it.selectFirst(".animeimghv")!!.attr("data-src")
val epRegex = Regex("episodio-(\\d+)")
val url = it.selectFirst("a")?.attr("href")!!.replace("ver/", "anime/")
.replace(epRegex, "sub-espanol")
val epNum = it.selectFirst(".positioning h5")?.text()?.toIntOrNull()
val epNum = (it.selectFirst(".positioning h5")?.text() ?: it.selectFirst("div.positioning p")?.text())?.toIntOrNull()
newAnimeSearchResponse(title, url) {
this.posterUrl = fixUrl(poster)
addDubStatus(getDubStatus(title), epNum)

View file

@ -1,11 +1,7 @@
package com.lagradost.cloudstream3.movieproviders
import com.fasterxml.jackson.module.kotlin.readValue
import com.lagradost.cloudstream3.*
import com.lagradost.cloudstream3.animeproviders.GogoanimeProvider.Companion.extractVidstream
import com.lagradost.cloudstream3.extractors.XStreamCdn
import com.lagradost.cloudstream3.extractors.helper.AsianEmbedHelper
import com.lagradost.cloudstream3.utils.AppUtils.toJson
import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.utils.loadExtractor
@ -19,25 +15,23 @@ class DramaSeeProvider : MainAPI() {
override val supportedTypes = setOf(TvType.AsianDrama)
override suspend fun getMainPage(): HomePageResponse {
val headers = mapOf("X-Requested-By" to "dramasee.net")
val headers = mapOf("X-Requested-By" to mainUrl)
val document = app.get(mainUrl, headers = headers).document
val mainbody = document.getElementsByTag("body")
return HomePageResponse(
mainbody?.select("section")?.map { row ->
val main = row?.select("main") ?: return@map null
val title = main.select("div.title > div > h2")?.text() ?: "Main"
val inner = main.select("li.series-item") ?: return@map null
mainbody.select("section.block_area.block_area_home")?.map { main ->
val title = main.select("h2.cat-heading").text() ?: "Main"
val inner = main.select("div.flw-item") ?: return@map null
HomePageList(
title,
inner.mapNotNull {
// Get inner div from article
val innerBody = it?.selectFirst("a")
// Fetch details
val link = fixUrlNull(innerBody?.attr("href")) ?: return@mapNotNull null
val image = fixUrlNull(innerBody?.select("img")?.attr("src")) ?: ""
val name = it?.selectFirst("a.series-name")?.text() ?: "<Untitled>"
val image = fixUrlNull(it.select("img").attr("data-src")) ?: ""
val name = innerBody?.attr("title") ?: "<Untitled>"
//Log.i(this.name, "Result => (innerBody, image) ${innerBody} / ${image}")
MovieSearchResponse(
name,
@ -55,20 +49,17 @@ class DramaSeeProvider : MainAPI() {
override suspend fun search(query: String): List<SearchResponse> {
val url = "$mainUrl/search?q=$query"
val html = app.get(url).document
val document = html.getElementsByTag("body")
.select("section > main > ul.series > li") ?: return listOf()
val document = app.get(url).document
val posters = document.select ("div.film-poster")
return document.mapNotNull {
if (it == null) {
return@mapNotNull null
}
val innerA = it.select("a.series-img") ?: return@mapNotNull null
return posters.mapNotNull {
val innerA = it.select("a") ?: return@mapNotNull null
val link = fixUrlNull(innerA.attr("href")) ?: return@mapNotNull null
val title = it.select("a.series-name")?.text() ?: return@mapNotNull null
val year = null
val imgsrc = innerA.select("img")?.attr("src") ?: return@mapNotNull null
val image = fixUrlNull(imgsrc)
val title = innerA.attr("title") ?: return@mapNotNull null
val year = Regex(""".*\((\d{4})\)""").find(title)?.groupValues?.getOrNull(1)?.toIntOrNull()
val imgSrc = it.select("img")?.attr("data-src") ?: return@mapNotNull null
val image = fixUrlNull(imgSrc)
MovieSearchResponse(
name = title,
@ -84,12 +75,12 @@ class DramaSeeProvider : MainAPI() {
override suspend fun load(url: String): LoadResponse {
val doc = app.get(url).document
val body = doc.getElementsByTag("body")
val inner = body?.select("div.series-info")
val inner = body?.select("div.anis-content")
// Video details
val poster = fixUrlNull(inner?.select("div.img > img")?.attr("src")) ?: ""
val poster = fixUrlNull(inner?.select("img.film-poster-img")?.attr("src")) ?: ""
//Log.i(this.name, "Result => (imgLinkCode) ${imgLinkCode}")
val title = inner?.select("h1.series-name")?.text() ?: ""
val title = inner?.select("h2.film-name.dynamic-name")?.text() ?: ""
val year = if (title.length > 5) {
title.substring(title.length - 5)
.trim().trimEnd(')').toIntOrNull()
@ -97,15 +88,14 @@ class DramaSeeProvider : MainAPI() {
null
}
//Log.i(this.name, "Result => (year) ${title.substring(title.length - 5)}")
val seriesBody = body?.select("div.series-body")
val descript = seriesBody?.firstOrNull()?.select("div.js-content")?.text()
val tags = seriesBody?.select("div.series-tags > a")
val descript = body?.firstOrNull()?.select("div.film-description.m-hide")?.text()
val tags = inner?.select("div.item.item-list > a")
?.mapNotNull { it?.text()?.trim() ?: return@mapNotNull null }
val recs = body?.select("ul.series > li")?.mapNotNull {
val a = it.select("a.series-img") ?: return@mapNotNull null
val recs = body.select("div.flw-item")?.mapNotNull {
val a = it.select("a") ?: return@mapNotNull null
val aUrl = fixUrlNull(a.attr("href")) ?: return@mapNotNull null
val aImg = fixUrlNull(a.select("img")?.attr("src"))
val aName = a.select("img")?.attr("alt") ?: return@mapNotNull null
val aImg = fixUrlNull(it.select("img")?.attr("data-src"))
val aName = a.attr("title") ?: return@mapNotNull null
val aYear = aName.trim().takeLast(5).removeSuffix(")").toIntOrNull()
MovieSearchResponse(
url = aUrl,
@ -118,40 +108,41 @@ class DramaSeeProvider : MainAPI() {
}
// Episodes Links
val episodeList = ArrayList<Episode>()
body?.select("ul.episodes > li")?.forEach { ep ->
val innerA = ep.select("a") ?: return@forEach
val count = innerA.select("span.episode")?.text()?.toIntOrNull() ?: 0
val epLink = fixUrlNull(innerA.attr("href")) ?: return@forEach
//Log.i(this.name, "Result => (epLink) ${epLink}")
if (epLink.isNotBlank()) {
// Fetch video links
val epVidLinkEl = app.get(epLink, referer = mainUrl).document
val ajaxUrl = epVidLinkEl.select("div#js-player")?.attr("embed")
//Log.i(this.name, "Result => (ajaxUrl) ${ajaxUrl}")
if (!ajaxUrl.isNullOrEmpty()) {
val innerPage = app.get(fixUrl(ajaxUrl), referer = epLink).document
val listOfLinks = mutableListOf<String>()
innerPage.select("div.player.active > main > div")?.forEach { em ->
val href = fixUrlNull(em.attr("src")) ?: ""
if (href.isNotBlank()) {
listOfLinks.add(href)
}
}
val episodeUrl = body.select("a.btn.btn-radius.btn-primary.btn-play").attr("href")
val episodeDoc = app.get(episodeUrl).document
//Log.i(this.name, "Result => (listOfLinks) ${listOfLinks.toJson()}")
episodeList.add(
val episodeList = episodeDoc.select("div.ss-list.ss-list-min > a").mapNotNull { ep ->
val episodeNumber = ep.attr("data-number").toIntOrNull()
val epLink = fixUrlNull(ep.attr("href")) ?: return@mapNotNull null
// if (epLink.isNotBlank()) {
// // Fetch video links
// val epVidLinkEl = app.get(epLink, referer = mainUrl).document
// val ajaxUrl = epVidLinkEl.select("div#js-player")?.attr("embed")
// //Log.i(this.name, "Result => (ajaxUrl) ${ajaxUrl}")
// if (!ajaxUrl.isNullOrEmpty()) {
// val innerPage = app.get(fixUrl(ajaxUrl), referer = epLink).document
// val listOfLinks = mutableListOf<String>()
// innerPage.select("div.player.active > main > div")?.forEach { em ->
// val href = fixUrlNull(em.attr("src")) ?: ""
// if (href.isNotBlank()) {
// listOfLinks.add(href)
// }
// }
//
// //Log.i(this.name, "Result => (listOfLinks) ${listOfLinks.toJson()}")
//
// }
// }
Episode(
name = null,
season = null,
episode = count,
data = listOfLinks.distinct().toJson(),
posterUrl = poster,
episode = episodeNumber,
data = epLink,
posterUrl = null,
date = null
)
)
}
}
}
//If there's only 1 episode, consider it a movie.
@ -161,7 +152,7 @@ class DramaSeeProvider : MainAPI() {
url = url,
apiName = this.name,
type = TvType.Movie,
dataUrl = episodeList[0].data,
dataUrl = episodeList.first().data,
posterUrl = poster,
year = year,
plot = descript,
@ -174,7 +165,7 @@ class DramaSeeProvider : MainAPI() {
url = url,
apiName = this.name,
type = TvType.AsianDrama,
episodes = episodeList.reversed(),
episodes = episodeList,
posterUrl = poster,
year = year,
plot = descript,
@ -189,33 +180,37 @@ class DramaSeeProvider : MainAPI() {
subtitleCallback: (SubtitleFile) -> Unit,
callback: (ExtractorLink) -> Unit
): Boolean {
var count = 0
mapper.readValue<List<String>>(data).apmap { item ->
if (item.isNotEmpty()) {
count++
val url = fixUrl(item.trim())
//Log.i(this.name, "Result => (url) ${url}")
when {
url.startsWith("https://asianembed.io") || url.startsWith("https://asianload.io") -> {
println("DATATATAT $data")
val document = app.get(data).document
val iframeUrl = document.select("iframe").attr("src")
val iframe = app.get(iframeUrl)
val iframeDoc = iframe.document
argamap({
iframeDoc.select(".list-server-items > .linkserver")
.forEach { element ->
val status = element.attr("data-status") ?: return@forEach
if (status != "1") return@forEach
val extractorData = element.attr("data-video") ?: return@forEach
loadExtractor(extractorData, iframe.url, callback)
}
}, {
val iv = "9262859232435825"
val secretKey = "93422192433952489752342908585752"
extractVidstream(url, this.name, callback, iv, secretKey, secretKey,
val secretDecryptKey = "93422192433952489752342908585752"
extractVidstream(
iframe.url,
this.name,
callback,
iv,
secretKey,
secretDecryptKey,
isUsingAdaptiveKeys = false,
isUsingAdaptiveData = false
isUsingAdaptiveData = true,
iframeDocument = iframeDoc
)
AsianEmbedHelper.getUrls(url, callback)
}
url.startsWith("https://embedsito.com") -> {
val extractor = XStreamCdn()
extractor.domainUrl = "embedsito.com"
extractor.getSafeUrl(url)?.forEach(callback)
}
else -> {
loadExtractor(url, mainUrl, callback)
}
}
}
}
return count > 0
})
return true
}
}

View file

@ -1,12 +1,9 @@
package com.lagradost.cloudstream3.movieproviders
import com.fasterxml.jackson.annotation.JsonProperty
import com.fasterxml.jackson.module.kotlin.readValue
import com.lagradost.cloudstream3.*
import com.lagradost.cloudstream3.utils.AppUtils.parseJson
import com.lagradost.cloudstream3.utils.*
import com.lagradost.cloudstream3.utils.AppUtils.tryParseJson
import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.utils.loadExtractor
import org.jsoup.Jsoup
import org.jsoup.select.Elements

View file

@ -3,6 +3,7 @@ package com.lagradost.cloudstream3.movieproviders
import com.fasterxml.jackson.annotation.JsonProperty
import com.lagradost.cloudstream3.*
import com.lagradost.cloudstream3.LoadResponse.Companion.addActors
import com.lagradost.cloudstream3.network.cookies
import com.lagradost.cloudstream3.utils.AppUtils.parseJson
import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.utils.getQualityFromName
@ -22,6 +23,8 @@ class TheFlixToProvider : MainAPI() {
TvType.TvSeries,
)
data class HomeJson(
@JsonProperty("props") val props: HomeProps = HomeProps(),
)
@ -92,9 +95,54 @@ class TheFlixToProvider : MainAPI() {
@JsonProperty("conversionDate") val conversionDate: String? = null,
@JsonProperty("id") val id: Int? = null,
@JsonProperty("available") val available: Boolean? = null,
@JsonProperty("videos" ) val videos : ArrayList<String>? = arrayListOf(),
)
private suspend fun getCookies(): Map<String, String> {
// val cookieResponse = app.post(
// "https://theflix.to:5679/authorization/session/continue?contentUsageType=Viewing",
// headers = mapOf(
// "Host" to "theflix.to:5679",
// "User-Agent" to "Mozilla/5.0 (Windows NT 10.0; rv:91.0) Gecko/20100101 Firefox/91.0",
// "Accept" to "application/json, text/plain,"
// "Accept-Language" to "en-US,en;q=0.5",
// "Content-Type" to "application/json;charset=utf-8",
// "Content-Length" to "35",
// "Origin" to "https://theflix.to",
// "DNT" to "1",
// "Connection" to "keep-alive",
// "Referer" to "https://theflix.to/",
// "Sec-Fetch-Dest" to "empty",
// "Sec-Fetch-Mode" to "cors",
// "Sec-Fetch-Site" to "same-site",)).okhttpResponse.headers.values("Set-Cookie")
val cookies = app.post(
"$mainUrl:5679/authorization/session/continue?contentUsageType=Viewing",
headers = mapOf(
"Host" to "theflix.to:5679",
"User-Agent" to USER_AGENT,
"Accept" to "application/json, text/plain, */*",
"Accept-Language" to "en-US,en;q=0.5",
"Content-Type" to "application/json;charset=utf-8",
"Content-Length" to "35",
"Origin" to mainUrl,
"DNT" to "1",
"Connection" to "keep-alive",
"Referer" to mainUrl,
"Sec-Fetch-Dest" to "empty",
"Sec-Fetch-Mode" to "cors",
"Sec-Fetch-Site" to "same-site",)
).cookies
/* val cookieRegex = Regex("(theflix\\..*?id\\=[a-zA-Z0-9]{0,8}[a-zA-Z0-9_-]+)")
val findcookie = cookieRegex.findAll(cookieResponse.toString()).map { it.value }.toList()
val cookiesstring = findcookie.toString().replace(", ","; ").replace("[","").replace("]","")
val cookiesmap = mapOf("Cookie" to cookiesstring) */
latestCookies = cookies
return latestCookies
}
override suspend fun getMainPage(): HomePageResponse {
val items = ArrayList<HomePageList>()
val doc = app.get(mainUrl).document
@ -131,7 +179,7 @@ class TheFlixToProvider : MainAPI() {
if (type?.contains("TV") == true) TvType.TvSeries else TvType.Movie
val link =
if (typeinfo == TvType.Movie) "$mainUrl/movie/${info.id}-${cleanTitle(title)}"
else "$mainUrl/tv-show/${info.id}-${cleanTitle(title)}/season-1/episode-1"
else "$mainUrl/tv-show/${info.id}-${cleanTitle(title).replace("?","")}/season-1/episode-1"
TvSeriesSearchResponse(
title,
link,
@ -226,67 +274,53 @@ class TheFlixToProvider : MainAPI() {
}
return search
}
data class LoadMain (
@JsonProperty("props") val props: LoadProps = LoadProps(),
@JsonProperty("page") var page: String? = null,
//@JsonProperty("query") val query: Query? = Query(),
@JsonProperty("props" ) val props : LoadProps? = LoadProps(),
@JsonProperty("page" ) val page : String? = null,
@JsonProperty("buildId" ) val buildId : String? = null,
@JsonProperty("runtimeConfig" ) val runtimeConfig : RuntimeConfig? = RuntimeConfig(),
@JsonProperty("isFallback" ) val isFallback : Boolean? = null,
@JsonProperty("gssp" ) val gssp : Boolean? = null,
@JsonProperty("customServer" ) val customServer : Boolean? = null,
@JsonProperty("appGip" ) val appGip : Boolean? = null
)
data class RuntimeConfig(
@JsonProperty("AddThisService") val AddThisService: AddThisService? = AddThisService(),
//@JsonProperty("Application") val Application: Application? = Application(),
//@JsonProperty("Content") val Content: Content? = Content(),
//@JsonProperty("GtmService") val GtmService: GtmService? = GtmService(),
//@JsonProperty("IptvChannels") val IptvChannels: IptvChannels? = IptvChannels(),
//@JsonProperty("Notifications") val Notifications: Notifications? = Notifications(),
//@JsonProperty("Payments") val Payments: Payments? = Payments(),
//@JsonProperty("Redux") val Redux: Redux? = Redux(),
//@JsonProperty("Search") val Search: Search? = Search(),
@JsonProperty("Services") val Services: Services? = Services(),
//@JsonProperty("Sitemap") val Sitemap: Sitemap? = Sitemap(),
//@JsonProperty("Support") val Support: Support? = Support(),
@JsonProperty("Videos") val Videos: Videos? = Videos()
)
data class Server(
@JsonProperty("Url") var Url: String? = null
)
data class Services(
@JsonProperty("Server") val Server: Server? = Server(),
@JsonProperty("TmdbServer") val TmdbServer: Server? = Server()
)
data class AddThisService(
@JsonProperty("PublicId") val PublicId: String? = null
)
data class LoadProps (
@JsonProperty("pageProps") val pageProps: LoadPageProps = LoadPageProps(),
@JsonProperty("pageProps" ) val pageProps : LoadPageProps? = LoadPageProps(),
@JsonProperty("__N_SSP" ) val _NSSP : Boolean? = null
)
data class LoadPageProps (
@JsonProperty("selectedTv" ) val selectedTv : TheFlixMetadata? = TheFlixMetadata(),
@JsonProperty("movie") val movie: TheFlixMetadata? = TheFlixMetadata(),
@JsonProperty("videoUrl") val videoUrl: String? = null,
@JsonProperty("recommendationsList" ) val recommendationsList : RecommendationsList? = RecommendationsList(),
@JsonProperty("basePageSegments" ) val basePageSegments : ArrayList<String>? = arrayListOf()
)
data class Genres(
@JsonProperty("name") val name: String,
@JsonProperty("id") val id: Int? = null
data class TheFlixMetadata (
@JsonProperty("episodeRuntime" ) val episodeRuntime : Int? = null,
@JsonProperty("name" ) val name : String? = null,
@JsonProperty("numberOfSeasons" ) val numberOfSeasons : Int? = null,
@JsonProperty("numberOfEpisodes" ) val numberOfEpisodes : Int? = null,
@JsonProperty("originalLanguage" ) val originalLanguage : String? = null,
@JsonProperty("popularity" ) val popularity : Double? = null,
@JsonProperty("status" ) val status : String? = null,
@JsonProperty("voteAverage" ) val voteAverage : Double? = null,
@JsonProperty("voteCount" ) val voteCount : Int? = null,
@JsonProperty("cast" ) val cast : String? = null,
@JsonProperty("director" ) val director : String? = null,
@JsonProperty("overview" ) val overview : String? = null,
@JsonProperty("posterUrl" ) val posterUrl : String? = null,
@JsonProperty("releaseDate" ) val releaseDate : String? = null,
@JsonProperty("createdAt" ) val createdAt : String? = null,
@JsonProperty("updatedAt" ) val updatedAt : String? = null,
@JsonProperty("id" ) val id : Int? = null,
@JsonProperty("available" ) val available : Boolean? = null,
@JsonProperty("genres" ) val genres : ArrayList<Genres>? = arrayListOf(),
@JsonProperty("seasons" ) val seasons : ArrayList<Seasons>? = arrayListOf(),
@JsonProperty("videos" ) val videos : ArrayList<String>? = arrayListOf(),
@JsonProperty("runtime" ) val runtime : Int? = null,
)
data class Seasons(
@JsonProperty("name") val name: String? = null,
@JsonProperty("numberOfEpisodes") val numberOfEpisodes: Int? = null,
@ -297,7 +331,7 @@ class TheFlixToProvider : MainAPI() {
@JsonProperty("createdAt") val createdAt: String? = null,
@JsonProperty("updatedAt") val updatedAt: String? = null,
@JsonProperty("id") val id: Int? = null,
@JsonProperty("episodes") val episodes: ArrayList<Episodes> = arrayListOf()
@JsonProperty("episodes") val episodes: ArrayList<Episodes>? = arrayListOf()
)
data class Episodes(
@ -311,17 +345,50 @@ class TheFlixToProvider : MainAPI() {
@JsonProperty("createdAt") val createdAt: String? = null,
@JsonProperty("updatedAt") val updatedAt: String? = null,
@JsonProperty("id") val id: Int? = null,
@JsonProperty("videos") val videos: ArrayList<Videos> = arrayListOf()
@JsonProperty("videos") val videos: ArrayList<String>? = arrayListOf()
)
data class Videos(
@JsonProperty("language") val language: String? = null,
data class Genres (
@JsonProperty("name" ) val name : String? = null,
@JsonProperty("id" ) val id : Int? = null
)
data class RuntimeConfig (
@JsonProperty("AddThisService" ) val AddThisService : RuntimeConfigData? = RuntimeConfigData(),
@JsonProperty("Application" ) val Application : RuntimeConfigData? = RuntimeConfigData(),
@JsonProperty("GtmService" ) val GtmService : RuntimeConfigData? = RuntimeConfigData(),
@JsonProperty("Services" ) val Services : RuntimeConfigData? = RuntimeConfigData(),
)
data class RuntimeConfigData(
@JsonProperty("PublicId" ) val PublicId : String? = null,
@JsonProperty("ContentUsageType" ) val ContentUsageType : String? = null,
@JsonProperty("IsDevelopmentMode" ) val IsDevelopmentMode : Boolean? = null,
@JsonProperty("IsDevelopmentOrProductionMode" ) val IsDevelopmentOrProductionMode : Boolean? = null,
@JsonProperty("IsProductionMode" ) val IsProductionMode : Boolean? = null,
@JsonProperty("IsStagingMode" ) val IsStagingMode : Boolean? = null,
@JsonProperty("IsTestMode" ) val IsTestMode : Boolean? = null,
@JsonProperty("Mode" ) val Mode : String? = null,
@JsonProperty("Name" ) val Name : String? = null,
@JsonProperty("Url" ) val Url : String? = null,
@JsonProperty("UseFilterInfoInUrl" ) val UseFilterInfoInUrl : Boolean? = null,
@JsonProperty("TrackingId" ) val TrackingId : String? = null,
@JsonProperty("Server" ) val Server : Server? = Server(),
@JsonProperty("TmdbServer" ) val TmdbServer : TmdbServer? = TmdbServer(),
)
data class TmdbServer (
@JsonProperty("Url" ) val Url : String? = null
)
data class Server (
@JsonProperty("Url" ) val Url : String? = null
)
data class RecommendationsList (
@JsonProperty("docs") val docs: ArrayList<LoadDocs> = arrayListOf(),
@JsonProperty("docs" ) val docs : ArrayList<Docs> = arrayListOf(),
@JsonProperty("total" ) val total : Int? = null,
@JsonProperty("page" ) val page : Int? = null,
@JsonProperty("limit" ) val limit : Int? = null,
@ -329,52 +396,6 @@ class TheFlixToProvider : MainAPI() {
@JsonProperty("type" ) val type : String? = null,
)
data class LoadDocs(
@JsonProperty("name") val name: String = String(),
@JsonProperty("originalLanguage") val originalLanguage: String? = null,
@JsonProperty("popularity") val popularity: Double? = null,
@JsonProperty("runtime") val runtime: Int? = null,
@JsonProperty("status") val status: String? = null,
@JsonProperty("voteAverage") val voteAverage: Double? = null,
@JsonProperty("voteCount") val voteCount: Int? = null,
@JsonProperty("cast") val cast: String? = null,
@JsonProperty("director") val director: String? = null,
@JsonProperty("overview") val overview: String? = null,
@JsonProperty("posterUrl") val posterUrl: String? = null,
@JsonProperty("releaseDate") val releaseDate: String? = null,
@JsonProperty("createdAt") val createdAt: String? = null,
@JsonProperty("updatedAt") val updatedAt: String? = null,
@JsonProperty("id") val id: Int? = null,
@JsonProperty("available") val available: Boolean? = null,
)
data class TheFlixMetadata(
@JsonProperty("episodeRuntime") val episodeRuntime: Int? = null,
@JsonProperty("name") val name: String = String(),
@JsonProperty("originalLanguage") val originalLanguage: String? = null,
@JsonProperty("popularity") val popularity: Double? = null,
@JsonProperty("runtime") val runtime: Int? = null,
@JsonProperty("numberOfSeasons") val numberOfSeasons: Int? = null,
@JsonProperty("numberOfEpisodes") val numberOfEpisodes: Int? = null,
@JsonProperty("status") val status: String? = null,
@JsonProperty("voteAverage") val voteAverage: Double? = null,
@JsonProperty("voteCount") val voteCount: Int? = null,
@JsonProperty("cast") val cast: String? = null,
@JsonProperty("director") val director: String? = null,
@JsonProperty("overview") val overview: String? = null,
@JsonProperty("posterUrl") val posterUrl: String? = null,
@JsonProperty("releaseDate") val releaseDate: String? = null,
@JsonProperty("conversionDate") val conversionDate: String? = null,
@JsonProperty("createdAt") val createdAt: String? = null,
@JsonProperty("updatedAt") val updatedAt: String? = null,
@JsonProperty("id") val id: Int? = null,
@JsonProperty("available") val available: Boolean? = null,
@JsonProperty("genres") val genres: ArrayList<Genres> = arrayListOf(),
@JsonProperty("videos") val videos: ArrayList<Videos> = arrayListOf(),
@JsonProperty("seasons") val seasons: ArrayList<Seasons> = arrayListOf()
)
private fun cleanTitle(title: String): String {
val dotTitle = title.substringBefore("/season")
if (dotTitle.contains(Regex("\\..\\."))) { //For titles containing more than two dots (S.W.A.T.)
@ -395,60 +416,21 @@ class TheFlixToProvider : MainAPI() {
}
private suspend fun getLoadMan(url: String): LoadMain {
val og = app.get(url, cookies = latestCookies)
getCookies()
val og = app.get(url, headers = latestCookies)
val soup = og.document
val script = soup.selectFirst("script[type=application/json]")!!.data()
return parseJson(script)
}
// I legit cant figure this out
private suspend fun getLoadMainRetry(url: String): LoadMain {
val first = getLoadMan(url)
val notFound = "/404"
if (first.page == notFound) {
first.runtimeConfig?.Services?.TmdbServer?.Url?.let { authUrl ->
val optionsUrl = "$authUrl/authorization/session/continue?contentUsageType=Viewing"
val options = app.options(
optionsUrl,
headers = mapOf(
"User-Agent" to USER_AGENT,
"Access-Control-Request-Method" to "POST",
"Access-Control-Request-Headers" to "content-type",
"Origin" to url,
"Referer" to mainUrl,
)
)
//{"affiliateCode":"","pathname":"/movie/696806-the-adam-project"}
val data = mapOf("affiliateCode" to "", "pathname" to url.removePrefix(mainUrl))
val resp = app.post(
optionsUrl, headers = mapOf(
"User-Agent" to USER_AGENT,
"Content-Type" to "application/json;charset=UTF-8",
"Accept" to "application/json, text/plain, */*",
"Origin" to url,
"Referer" to mainUrl,
), data = data
)
latestCookies = resp.cookies
val newData = getLoadMan(url)
if (newData.page == notFound) {
throw ErrorLoadingException("404 Not found")
}
return newData
}
}
return first
}
override suspend fun load(url: String): LoadResponse? {
val tvtype = if (url.contains("movie")) TvType.Movie else TvType.TvSeries
val json = getLoadMainRetry(url)
val json = getLoadMan(url)
val episodes = ArrayList<Episode>()
val isMovie = tvtype == TvType.Movie
val pageMain = json.props.pageProps
val pageMain = json.props?.pageProps
val metadata: TheFlixMetadata? = if (isMovie) pageMain.movie else pageMain.selectedTv
val metadata: TheFlixMetadata? = if (isMovie) pageMain?.movie else pageMain?.selectedTv
val available = metadata?.available
@ -463,9 +445,9 @@ class TheFlixToProvider : MainAPI() {
val description = metadata.overview
if (!isMovie) {
metadata.seasons.map { seasons ->
metadata.seasons?.map { seasons ->
val seasonPoster = seasons.posterUrl ?: metadata.posterUrl
seasons.episodes.forEach { epi ->
seasons.episodes?.forEach { epi ->
val episodenu = epi.episodeNumber
val seasonum = epi.seasonNumber
val title = epi.name
@ -474,7 +456,7 @@ class TheFlixToProvider : MainAPI() {
val ratinginfo = (epi.voteAverage)?.times(10)?.toInt()
val rating = if (ratinginfo?.equals(0) == true) null else ratinginfo
val eps = Episode(
"$mainUrl/tv-show/$movieId-${cleanTitle(movietitle)}/season-$seasonum/episode-$episodenu",
"$mainUrl/tv-show/$movieId-${cleanTitle(movietitle!!)}/season-$seasonum/episode-$episodenu",
title,
seasonum,
episodenu,
@ -482,7 +464,7 @@ class TheFlixToProvider : MainAPI() {
posterUrl = seasonPoster,
rating = rating,
)
if (test.isNotEmpty()) {
if (test!!.isNotEmpty()) {
episodes.add(eps)
} else {
//Nothing, will prevent seasons/episodes with no videos to be added
@ -492,9 +474,9 @@ class TheFlixToProvider : MainAPI() {
}
val rating = metadata.voteAverage?.toFloat()?.times(1000)?.toInt()
val tags = metadata.genres.map { it.name }
val tags = metadata.genres?.mapNotNull { it.name }
val recommendationsitem = pageMain.recommendationsList?.docs?.map { loadDocs ->
val recommendationsitem = pageMain?.recommendationsList?.docs?.map { loadDocs ->
val title = loadDocs.name
val posterrec = loadDocs.posterUrl
val link = if (isMovie) "$mainUrl/movie/${loadDocs.id}-${cleanTitle(title)}"
@ -516,7 +498,7 @@ class TheFlixToProvider : MainAPI() {
return when (tvtype) {
TvType.TvSeries -> {
return newTvSeriesLoadResponse(movietitle, url, TvType.TvSeries, episodes) {
return newTvSeriesLoadResponse(movietitle!!, url, TvType.TvSeries, episodes) {
this.posterUrl = poster
this.year = year?.toIntOrNull()
this.plot = description
@ -529,7 +511,7 @@ class TheFlixToProvider : MainAPI() {
}
}
TvType.Movie -> {
newMovieLoadResponse(movietitle, url, TvType.Movie, url) {
newMovieLoadResponse(movietitle!!, url, TvType.Movie, url) {
this.year = year?.toIntOrNull()
this.posterUrl = poster
this.plot = description
@ -546,27 +528,76 @@ class TheFlixToProvider : MainAPI() {
}
data class VideoData (
@JsonProperty("url" ) val url : String? = null,
@JsonProperty("id" ) val id : String? = null,
@JsonProperty("type" ) val type : String? = null,
)
override suspend fun loadLinks(
data: String,
isCasting: Boolean,
subtitleCallback: (SubtitleFile) -> Unit,
callback: (ExtractorLink) -> Unit
): Boolean {
val json = getLoadMainRetry(data)
val extractedLink = json.props.pageProps.videoUrl
val json = getLoadMan(data)
val authhost = json.runtimeConfig?.Services?.Server?.Url
val isMovie = data.contains("/movie/")
val qualityReg = Regex("(\\d+p)")
if (extractedLink != null) {
val quality = qualityReg.find(extractedLink)?.value ?: ""
if (isMovie){
json.props?.pageProps?.movie?.videos?.apmap { id ->
val jsonmovie = app.get("$authhost/movies/videos/$id/request-access?contentUsageType=Viewing",
headers = latestCookies).parsedSafe<VideoData>() ?: return@apmap false
val extractedlink = jsonmovie.url
if (!extractedlink.isNullOrEmpty()) {
val quality = qualityReg.find(extractedlink)?.value ?: ""
callback(
ExtractorLink(
name,
"$name $quality",
extractedLink,
name,
extractedlink,
"",
getQualityFromName(quality),
false
)
)
} else null
}
}
else
{
val dataRegex = Regex("(season-(\\d+)\\/episode-(\\d+))")
val cleandatainfo = dataRegex.find(data)?.value?.replace(Regex("(season-|episode-)"),"")?.replace("/","x")
val tesatt = cleandatainfo.let { str ->
str?.split("x")?.mapNotNull { subStr -> subStr.toIntOrNull() }
}
val epID = tesatt?.getOrNull(1)
val seasonid = tesatt?.getOrNull(0)
json.props?.pageProps?.selectedTv?.seasons?.map {
it.episodes?.map {
val epsInfo = Triple(it.seasonNumber, it.episodeNumber, it.videos)
if (epsInfo.first == seasonid && epsInfo.second == epID) {
epsInfo.third?.apmap { id ->
val jsonserie = app.get("$authhost/tv/videos/$id/request-access?contentUsageType=Viewing", headers = latestCookies).parsedSafe<VideoData>() ?: return@apmap false
val extractedlink = jsonserie.url
if (!extractedlink.isNullOrEmpty()) {
val quality = qualityReg.find(extractedlink)?.value ?: ""
callback(
ExtractorLink(
name,
name,
extractedlink,
"",
getQualityFromName(quality),
false
)
)
} else null
}
}
}
}
}
return true
}

View file

@ -0,0 +1,73 @@
package com.lagradost.cloudstream3.movieproviders
import com.lagradost.cloudstream3.*
import com.lagradost.cloudstream3.metaproviders.TmdbLink
import com.lagradost.cloudstream3.metaproviders.TmdbProvider
import com.lagradost.cloudstream3.utils.AppUtils.parseJson
import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.utils.M3u8Helper.Companion.generateM3u8
import com.lagradost.cloudstream3.utils.loadExtractor
class VidSrcProvider : TmdbProvider() {
override val apiName = "VidSrc"
override var name = "VidSrc"
override var mainUrl = "https://v2.vidsrc.me"
override val useMetaLoadResponse = true
override val instantLinkLoading = false
override val supportedTypes = setOf(
TvType.Movie,
TvType.TvSeries,
)
override suspend fun loadLinks(
data: String,
isCasting: Boolean,
subtitleCallback: (SubtitleFile) -> Unit,
callback: (ExtractorLink) -> Unit
): Boolean {
val mappedData = parseJson<TmdbLink>(data)
val (id, site) = if (mappedData.imdbID != null) listOf(
mappedData.imdbID,
"imdb"
) else listOf(mappedData.tmdbID.toString(), "tmdb")
val isMovie = mappedData.episode == null && mappedData.season == null
val embedUrl = if (isMovie) {
if(site == "imdb") "$mainUrl/embed/$id" else
"$mainUrl/embed/$id"
} else {
val suffix = "$id/${mappedData.season ?: 1}-${mappedData.episode ?: 1}"
if (site == "imdb") "$mainUrl/embed/$suffix" else
"$mainUrl/embed/$suffix"
}
val iframedoc = app.get(embedUrl).document
val serverslist = iframedoc.select("div#sources.button_content div#content div#list div").map {
val datahash = it.attr("data-hash")
if (datahash.isNotBlank()) {
val links = try {
app.get("$mainUrl/src/$datahash", referer = "https://source.vidsrc.me/").url
} catch (e: Exception) {
""
}
links
} else ""
}
serverslist.apmap { server ->
val linkfixed = server.replace("https://vidsrc.xyz/","https://embedsito.com/")
if (linkfixed.contains("/pro")) {
val srcresponse = app.get(server, referer = mainUrl).text
val m3u8Regex = Regex("((https:|http:)\\/\\/.*\\.m3u8)")
val srcm3u8 = m3u8Regex.find(srcresponse)?.value ?: return@apmap false
generateM3u8(
name,
srcm3u8,
mainUrl
).forEach(callback)
} else
loadExtractor(linkfixed, embedUrl, callback)
}
return true
}
}

View file

@ -41,7 +41,8 @@ class SettingsLang : PreferenceFragmentCompat() {
Triple("", "Arabic", "ar"),
Triple("", "Turkish", "tr"),
Triple("", "Macedonian", "mk"),
Triple("\uD83C\uDDE7\uD83C\uDDF7", "Portuguese (Brazil)", "pt"),
Triple("\uD83C\uDDF5\uD83C\uDDF9", "Portuguese", "pt"),
Triple("\uD83C\uDDE7\uD83C\uDDF7", "Brazilian Portuguese", "bp"),
Triple("", "Romanian", "ro"),
Triple("", "Italian", "it"),
Triple("", "Chinese", "zh"),

View file

@ -63,7 +63,11 @@ open class ExtractorLink(
override val headers: Map<String, String> = mapOf(),
/** Used for getExtractorVerifierJob() */
open val extractorData: String? = null,
) : VideoDownloadManager.IDownloadableMinimum
) : VideoDownloadManager.IDownloadableMinimum {
override fun toString(): String {
return "ExtractorLink(name=$name, url=$url, referer=$referer, isM3u8=$isM3u8)"
}
}
data class ExtractorUri(
val uri: Uri,

View file

@ -0,0 +1,551 @@
<!--https://newbedev.com/concatenate-multiple-strings-in-xml-->
<resources>
<!-- KEYS DON'T TRANSLATE -->
<string name="search_providers_list_key" translatable="false">search_providers_list</string>
<string name="locale_key" translatable="false">app_locale</string>
<string name="search_types_list_key" translatable="false">search_type_list</string>
<string name="auto_update_key" translatable="false">auto_update</string>
<string name="skip_update_key" translatable="false">skip_update_key</string>
<string name="prerelease_update_key" translatable="false">prerelease_update</string>
<string name="manual_check_update_key" translatable="false">manual_check_update</string>
<string name="fast_forward_button_time_key" translatable="false">fast_forward_button_time</string>
<string name="benene_count" translatable="false">benene_count</string>
<string name="subtitle_settings_key" translatable="false">subtitle_settings_key</string>
<string name="subtitle_settings_chromecast_key" translatable="false">subtitle_settings_chromecast_key</string>
<string name="quality_pref_key" translatable="false">quality_pref_key</string>
<string name="prefer_limit_title_key" translatable="false">prefer_limit_title_key</string>
<string name="prefer_limit_title_rez_key" translatable="false">prefer_limit_title_rez_key</string>
<string name="video_buffer_size_key" translatable="false">video_buffer_size_key</string>
<string name="video_buffer_length_key" translatable="false">video_buffer_length_key</string>
<string name="video_buffer_clear_key" translatable="false">video_buffer_clear_key</string>
<string name="video_buffer_disk_key" translatable="false">video_buffer_disk_key</string>
<string name="prerelease_commit_hash" translatable="false">unknown_prerelease</string>
<string name="use_system_brightness_key" translatable="false">use_system_brightness_key</string>
<string name="swipe_enabled_key" translatable="false">swipe_enabled_key</string>
<string name="playback_speed_enabled_key" translatable="false">playback_speed_enabled_key</string>
<string name="player_resize_enabled_key" translatable="false">player_resize_enabled_key</string>
<string name="pip_enabled_key" translatable="false">pip_enabled_key</string>
<string name="double_tap_enabled_key" translatable="false">double_tap_enabled_key</string>
<string name="double_tap_pause_enabled_key" translatable="false">double_tap_pause_enabled_key</string>
<string name="double_tap_seek_time_key" translatable="false">double_tap_seek_time_key</string>
<string name="swipe_vertical_enabled_key" translatable="false">swipe_vertical_enabled_key</string>
<string name="display_sub_key" translatable="false">display_sub_key</string>
<string name="show_fillers_key" translatable="false">show_fillers_key</string>
<string name="show_trailers_key" translatable="false">show_trailers_key</string>
<string name="show_kitsu_posters_key" translatable="false">show_kitsu_posters_key</string>
<string name="random_button_key" translatable="false">random_button_key</string>
<string name="provider_lang_key" translatable="false">provider_lang_key</string>
<string name="dns_key" translatable="false">dns_key</string>
<string name="download_path_key" translatable="false">download_path_key</string>
<string name="app_name_download_path" translatable="false">Cloudstream</string>
<string name="app_layout_key" translatable="false">app_layout_key</string>
<string name="primary_color_key" translatable="false">primary_color_key</string>
<string name="restore_key" translatable="false">restore_key</string>
<string name="killswitch_key" translatable="false">killswitch_key</string>
<string name="backup_key" translatable="false">backup_key</string>
<string name="prefer_media_type_key" translatable="false">prefer_media_type_key</string>
<string name="app_theme_key" translatable="false">app_theme_key</string>
<string name="episode_sync_enabled_key" translatable="false">episode_sync_enabled_key</string>
<string name="log_enabled_key" translatable="false">log_enabled_key</string>
<string name="show_logcat_key" translatable="false">show_logcat_key</string>
<string name="bottom_title_key" translatable="false">bottom_title_key</string>
<string name="poster_ui_key" translatable="false">poster_ui_key</string>
<string name="subtitles_encoding_key" translatable="false">subtitles_encoding_key</string>
<string name="override_site_key" translatable="false">override_site_key</string>
<!-- FORMAT MIGHT TRANSLATE, WILL CAUSE CRASH IF APPLIED WRONG -->
<string name="extra_info_format" translatable="false" formatted="true">%d %s | %sMB</string>
<string name="storage_size_format" translatable="false" formatted="true">%s • %sGB</string>
<string name="download_size_format" translatable="false" formatted="true">%sMB / %sMB</string>
<string name="mb_format" translatable="false" formatted="true">%dMB</string>
<string name="episode_name_format" translatable="false" formatted="true">%s %s</string>
<string name="ffw_text_format" translatable="false" formatted="true">+%d</string>
<string name="rew_text_format" translatable="false" formatted="true">-%d</string>
<string name="ffw_text_regular_format" translatable="false" formatted="true">%d</string>
<string name="rew_text_regular_format" translatable="false" formatted="true">%d</string>
<string name="rating_format" translatable="false" formatted="true">%.1f/10.0</string>
<string name="year_format" translatable="false" formatted="true">%d</string>
<string name="app_dub_sub_episode_text_format" formatted="true">%s Ep %d</string>
<string name="cast_format" formatted="true">Elenco: %s</string>
<string name="next_episode_format" formatted="true">O episódio %d vai ser lançado em</string>
<string name="next_episode_time_day_format" formatted="true">%dd %dh %dm</string>
<string name="next_episode_time_hour_format" formatted="true">%dh %dm</string>
<string name="next_episode_time_min_format" formatted="true">%dm</string>
<!-- IS NOT NEEDED TO TRANSLATE AS THEY ARE ONLY USED FOR SCREEN READERS AND WONT SHOW UP TO NORMAL USERS -->
<string name="result_poster_img_des">Poster</string>
<string name="search_poster_img_des">@string/result_poster_img_des</string>
<string name="episode_poster_img_des">Episode Poster</string>
<string name="home_main_poster_img_des">Main Poster</string>
<string name="home_next_random_img_des">Next Random</string>
<string name="episode_play_img_des" translatable="false">@string/play_episode</string>
<string name="go_back_img_des">Go back</string>
<string name="change_providers_img_des" translatable="false">@string/home_change_provider_img_des</string>
<string name="home_change_provider_img_des">Change Provider</string>
<string name="preview_background_img_des">Preview Background</string>
<!-- TRANSLATE, BUT DON'T FORGET FORMAT -->
<string name="player_speed_text_format" formatted="true">Velocidade (%.2fx)</string>
<string name="rated_format" formatted="true">Nota: %.1f</string>
<string name="new_update_format" formatted="true">Nova atualização encontrada!\n%s -> %s</string>
<string name="filler" formatted="true">Filler</string>
<string name="duration_format" formatted="true">%d min</string>
<string name="app_name">CloudStream</string>
<string name="title_home">Início</string>
<string name="title_search">Procurar</string>
<string name="title_downloads">Downloads</string>
<string name="title_settings">Configurações</string>
<string name="search_hint">Procurar…</string>
<string name="search_hint_site" formatted="true">Procurar no %s…</string>
<string name="no_data">Sem dados</string>
<string name="episode_more_options_des">Mais Opções</string>
<string name="next_episode">Próximo episódio</string>
<string name="result_plot" translatable="false">@string/synopsis</string>
<string name="result_tags">Gêneros</string>
<string name="result_share">Compartilhar</string>
<string name="result_open_in_browser">Abrir no Navegador</string>
<string name="skip_loading">Pular Carregamento</string>
<string name="loading_chromecast">Carregando…</string>
<string name="type_watching">Assistindo</string>
<string name="type_on_hold">Em espera</string>
<string name="type_completed">Completado</string>
<string name="type_dropped">Deixado</string>
<string name="type_plan_to_watch">Planejando assistir</string>
<string name="type_none">Nenhum</string>
<string name="type_re_watching">Reassistindo</string>
<string name="play_movie_button">Assistir Filme</string>
<string name="play_torrent_button">Transmitir Torrent</string>
<string name="pick_source">Fontes</string>
<string name="pick_subtitle">Legendas</string>
<string name="reload_error">Tentar reconectar…</string>
<string name="go_back">Voltar</string>
<string name="play_episode">Assistir Episódio</string>
<!--<string name="need_storage">Permirtir baixar episódios</string>-->
<string name="download">Baixar</string>
<string name="downloaded">Baixado</string>
<string name="downloading">Baixando</string>
<string name="download_paused">Download Pausado</string>
<string name="download_started">Download Iniciado</string>
<string name="download_failed">Download Falhado</string>
<string name="download_canceled">Download Cancelado</string>
<string name="download_done">Download Finalizado</string>
<string name="download_format" translatable="false">%s - %s</string>
<string name="stream">Transmitir</string>
<string name="error_loading_links_toast">Erro Carregando Links</string>
<string name="download_storage_text">Armazenamento Interno</string>
<string name="app_dubbed_text">Dub</string>
<string name="app_subbed_text">Leg</string>
<string name="popup_delete_file">Deletar Arquivo</string>
<string name="popup_play_file">Assistir Arquivo</string>
<string name="popup_resume_download">Retomar Download</string>
<string name="popup_pause_download">Pausar Download</string>
<string name="pref_disable_acra">Desativar relatório automático de erros</string>
<string name="home_more_info">Mais info</string>
<string name="home_expanded_hide">Esconder</string>
<string name="home_play">Assistir</string>
<string name="home_info">Info</string>
<string name="filter_bookmarks">Filtrar Marcadores</string>
<string name="error_bookmarks_text">Marcadores</string>
<string name="action_remove_from_bookmarks">Remover</string>
<string name="action_add_to_bookmarks">Selecionar marcador</string>
<string name="sort_apply">Aplicar</string>
<string name="sort_cancel">Cancelar</string>
<string name="sort_copy">Copiar</string>
<string name="sort_close">Fechar</string>
<string name="sort_clear">Limpar</string>
<string name="sort_save">Salvar</string>
<string name="player_speed">Velocidade do Reprodutor</string>
<string name="subtitles_settings">Configurar Legendas</string>
<string name="subs_text_color">Cor do Texto</string>
<string name="subs_outline_color">Cor do Contorno</string>
<string name="subs_background_color">Cor do Fundo</string>
<string name="subs_window_color">Cor da Janela</string>
<string name="subs_edge_type">Tipo de Borda</string>
<string name="subs_subtitle_elevation">Elevação da Legenda</string>
<string name="subs_font">Fonte</string>
<string name="subs_font_size">Tamanho da Fonte</string>
<string name="search_provider_text_providers">Pesquisar usando fornecedor</string>
<string name="search_provider_text_types">Pesquisar usando genêros</string>
<string name="benene_count_text">%d Benenes doados aos desenvolvedores</string>
<string name="benene_count_text_none">Nenhuma Benenes doada</string>
<string name="subs_auto_select_language">Autosseleção de Lingua</string>
<string name="subs_download_languages">Baixar Linguas</string>
<string name="subs_subtitle_languages">Lingua da legenda</string>
<string name="subs_hold_to_reset_to_default">Segure para retornar a configuração padrão</string>
<string name="subs_import_text" formatted="true">Importe fontes colocando elas em %s</string>
<string name="continue_watching">Continue Assistindo</string>
<string name="action_remove_watching">Remover</string>
<string name="action_open_watching">Mais Info</string>
<string name="action_open_play">@string/home_play </string>
<string name="vpn_might_be_needed">Uma VPN pode ser necessária para esse fornecedor funcionar corretamente</string>
<string name="vpn_torrent">Esse fornecedor é um torrent, uma VPN é recomendada</string>
<string name="provider_info_meta">Metadados não são oferecidas pelo site, o carregamento do video pode falhar se ele não existir no site.</string>
<string name="torrent_plot">Descrição</string>
<string name="normal_no_plot">Sinopse não encontrada</string>
<string name="torrent_no_plot">Descrição não encontrada</string>
<string name="show_log_cat">Mostrar logcat 🐈</string>
<string name="picture_in_picture">Picture-in-picture</string>
<string name="picture_in_picture_des">Continua a reprodução em um player miniatura que sobrepõe outros aplicativos</string>
<string name="player_size_settings">Redimensionar player</string>
<string name="player_size_settings_des">Remover bordas pretas</string>
<string name="player_subtitles_settings">Legendas</string>
<string name="player_subtitles_settings_des">Configurações de legendas do Player</string>
<string name="chromecast_subtitles_settings">Legendas do Chromecast</string>
<string name="chromecast_subtitles_settings_des">Configurações de legendas do Chromecast</string>
<string name="eigengraumode_settings">Modo Eigengravy</string>
<string name="eigengraumode_settings_des">Adiciona um botão de velocidade no player</string>
<string name="swipe_to_seek_settings">Deslize para avançar o vídeo</string>
<string name="swipe_to_seek_settings_des">Deslize para a esq. ou dir. para controlar o tempo no player</string>
<string name="swipe_to_change_settings">Deslize para mudar as configurações</string>
<string name="swipe_to_change_settings_des">Deslize para o lado esq. ou dir. para ajustar brilho ou volume</string>
<string name="double_tap_to_seek_settings">Toque duplo para avançar o vídeo</string>
<string name="double_tap_to_pause_settings">Toque duplo para pausar</string>
<string name="double_tap_to_seek_amount_settings">Segundos avançados no player</string>
<string name="double_tap_to_seek_settings_des">Toque duplo no lado direito ou esquerdo para regredir ou avançar vídeo</string>
<string name="double_tap_to_pause_settings_des">Toque no meio para pausar</string>
<string name="use_system_brightness_settings">Usar brilho do sistema</string>
<string name="use_system_brightness_settings_des">Usar brilho do sistema no player ao invés da sobreposição escura</string>
<string name="episode_sync_settings">Atualizar progresso assistido</string>
<string name="episode_sync_settings_des">Sincronize automaticamente seu progresso do episódio</string>
<string name="restore_settings">Restaurar dados de backup</string>
<string name="killswitch_settings">Baixar metadados mais recentes do github</string>
<string name="killswitch_settings_des">Se você quiser acesso a todos os fornecedores (mesmo os quebrados) desmarque isso</string>
<string name="backup_settings">Fazer Backup</string>
<string name="restore_success">Arquivo de Backup carregado</string>
<string name="restore_failed_format" formatted="true">Falha em restaurar dados do arquivo %s</string>
<string name="backup_success">Dados salvos com sucesso</string>
<string name="backup_failed">Permissões de armazenamento faltando, por favor tente denovo</string>
<string name="backup_failed_error_format">Erro no backup de %s</string>
<string name="search">Procurar</string>
<string name="category_account">Contas</string>
<string name="category_updates">Atualizações e backup</string>
<string name="nginx_info_title">O que é Nginx ?</string>
<string name="nginx_info_summary">Nginx é um software que pode ser usado para exibir arquivos de um servidor que você possui. Clique para ver um guia de configuração do Nginx</string>
<string name="settings_info">Info</string>
<string name="advanced_search">Procura Avançada</string>
<string name="advanced_search_des">Mostrar resultados separados por fornecedor</string>
<string name="bug_report_settings_off">Só enviar dados sobre travamentos</string>
<string name="bug_report_settings_on">Não enviar nenhum dado</string>
<string name="show_fillers_settings">Mostrar episódios de Filler em anime</string>
<string name="show_trailers_settings">Mostrar trailers</string>
<string name="kitsu_settings">Mostrar posters do kitsu</string>
<string name="updates_settings">Mostrar atualizações do app</string>
<string name="updates_settings_des">Automaticamente procurar por novas atualizações ao abrir</string>
<string name="uprereleases_settings">Atualizar para pré-lançamento</string>
<string name="uprereleases_settings_des">Procura atualizações do pré-lançamento ao invés de apenas do lançamento oficial</string>
<string name="github">Github</string>
<string name="lightnovel">App de Light novel pelos mesmos desenvolvedores</string>
<string name="anim">App de Anime pelos mesmos desenvolvedores</string>
<string name="discord">Junte-se ao Discord</string>
<string name="benene">Dar um benene para os desenvolvedores</string>
<string name="benene_des">Benene dada</string>
<string name="app_language">Linguagem do App</string>
<string name="no_chromecast_support_toast">Esse fornecedor não possui suporte para Chromecast</string>
<string name="no_links_found_toast">Nenhum link encontrado</string>
<string name="copy_link_toast">Link copiado para área de transferência</string>
<string name="play_episode_toast">Assistir Episódio</string>
<string name="subs_default_reset_toast">Restaurar para o padrão</string>
<string name="acra_report_toast">Desculpe, a aplicação travou. Um relatório de erro anônimo será enviado para os
desenvolvedores
</string>
<string name="season">Temporada</string>
<string name="no_season">Nenhuma Temporada</string>
<string name="episode">Episódio</string>
<string name="episodes">Episódios</string>
<string name="season_short">S</string>
<string name="episode_short">E</string>
<string name="no_episodes_found">Nenhum Episódio encontrado</string>
<string name="delete_file">Deletar Arquivo</string>
<string name="delete">Deletar</string>
<string name="cancel" translatable="false">@string/sort_cancel</string>
<string name="pause">Pausar</string>
<string name="resume">Retomar</string>
<string name="go_back_30">-30</string>
<string name="go_forward_30">+30</string>
<string name="delete_message" formatted="true">Isso apagará %s permanentemente\nVocê tem certeza?</string>
<string name="resume_time_left" formatted="true">%dm\nsobrando</string>
<string name="status_ongoing">Em andamento</string>
<string name="status_completed">Concluído</string>
<string name="status">Estado</string>
<string name="year">Ano</string>
<string name="rating">Nota</string>
<string name="duration">Duração</string>
<string name="site">Site</string>
<string name="synopsis">Sinopse</string>
<string name="queued">Na fila</string>
<string name="no_subtitles">Sem Legendas</string>
<string name="default_subtitles">Padrão</string>
<string name="free_storage">Livre</string>
<string name="used_storage">Usado</string>
<string name="app_storage">App</string>
<!--plural-->
<string name="movies">Filmes</string>
<string name="tv_series">Séries</string>
<string name="cartoons">Desenhos Animados</string>
<string name="anime">Anime</string>
<string name="torrent">Torrents</string>
<string name="documentaries">Documentários</string>
<string name="ova">OVA</string>
<string name="asian_drama">Dramas Asiáticos</string>
<!--singular-->
<string name="movies_singular">Filme</string>
<string name="tv_series_singular">Série</string>
<string name="cartoons_singular">Desenho Animado</string>
<string name="anime_singular">@string/anime</string>
<string name="ova_singular">@string/ova</string>
<string name="torrent_singular">Torrent</string>
<string name="documentaries_singular">Documentário</string>
<string name="asian_drama_singular">Drama Asiático</string>
<string name="source_error">Erro de fornecimento</string>
<string name="remote_error">Erro remoto</string>
<string name="render_error">Erro de renderização</string>
<string name="unexpected_error">Erro de player inesperado</string>
<string name="storage_error">Erro ao baixar, verifique as permissões de armazenamento</string>
<string name="episode_action_chromecast_episode">Episódio pelo Chromecast</string>
<string name="episode_action_chromecast_mirror">Alternativa pelo Chromecast</string>
<string name="episode_action_play_in_app">Assistir no App</string>
<string name="episode_action_play_in_vlc">Assistir no VLC</string>
<string name="episode_action_play_in_browser">Assistir no navegador</string>
<string name="episode_action_copy_link">Copiar link</string>
<string name="episode_action_auto_download">Auto download</string>
<string name="episode_action_download_mirror">Baixar por servidor alternativo</string>
<string name="episode_action_reload_links">Recarregar links</string>
<string name="episode_action_download_subtitle">Baixar legendas</string>
<string name="show_hd">Etiqueta de qualidade</string>
<string name="show_dub">Etiqueta Dub</string>
<string name="show_sub">Etiqueta Sub</string>
<string name="show_title">Título</string>
<string name="show_hd_key" translatable="false">show_hd_key</string>
<string name="show_dub_key" translatable="false">show_dub_key</string>
<string name="show_sub_key" translatable="false">show_sub_key</string>
<string name="show_title_key" translatable="false">show_title_key</string>
<string name="poster_ui_settings">Alternar elementos da interface no pôster</string>
<string name="no_update_found">Nenhuma Atualização encontrada</string>
<string name="check_for_update">Procurar nova Atualização</string>
<string name="video_lock">Bloquear</string>
<string name="video_aspect_ratio_resize">Mudar Tamanho</string>
<string name="video_source">Fonte</string>
<string name="video_skip_op">Pular OP</string>
<string name="dont_show_again">Não mostrar de novo</string>
<string name="skip_update">Pular essa Atualização</string>
<string name="update">Atualizar</string>
<string name="watch_quality_pref">Qualidade preferida</string>
<string name="limit_title">Máximo de caracteres do título de vídeos</string>
<string name="limit_title_rez">Resolução do player de vídeo</string>
<string name="video_buffer_size_settings">Tamanho do buffer do vídeo</string>
<string name="video_buffer_length_settings">Comprimento do buffer do vídeo</string>
<string name="video_buffer_disk_settings">Cache do vídeo em disco</string>
<string name="video_buffer_clear_settings">Limpar cache de vídeo e imagem</string>
<string name="video_ram_description">Causará travamentos aleatórios se definido muito alto. Não mude caso tiver pouca memória RAM, como um Android TV ou um telefone antigo</string>
<string name="video_disk_description">Pode causar problemas em sistemas com pouco espaço de armazenamento se definido muito alto, como em dispositivos Android TV</string>
<string name="dns_pref">DNS sobre HTTPS</string>
<string name="dns_pref_summary">Útil para burlar bloqueios de provedores de internet</string>
<string name="add_site_pref">Clonar site</string>
<string name="remove_site_pref">Remover site</string>
<string name="add_site_summary">Adiciona um clone de um site existente, com uma url diferente</string>
<string name="download_path_pref">Caminho para Download</string>
<string name="nginx_url_pref">Url do servidor Nginx</string>
<string name="display_subbed_dubbed_settings">Mostrar Anime Dublado/Legendado</string>
<string name="resize_fit">Ajustar para a Tela</string>
<string name="resize_fill">Esticar</string>
<string name="resize_zoom">Zoom</string>
<string name="legal_notice">Aviso Legal</string>
<string name="legal_notice_key" translatable="false">legal_notice_key</string>
<string name="legal_notice_text" translatable="false">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.
</string>
<string name="category_general">Geral</string>
<string name="random_button_settings">Botão Aleatório</string>
<string name="random_button_settings_desc">Mostra o botão Aleatório na página inicial</string>
<string name="provider_lang_settings">Linguagem dos fornecedores</string>
<string name="app_layout">Layout do App</string>
<string name="preferred_media_settings">Mídia preferida</string>
<string name="subtitles_encoding">Codificação das legendas</string>
<string name="category_preferred_media_and_lang">Linguagem</string>
<string name="category_ui">Layout</string>
<string name="automatic">Auto</string>
<string name="tv_layout">Layout de TV</string>
<string name="phone_layout">Layout de celular</string>
<string name="emulator_layout">Layout de emulador</string>
<string name="primary_color_settings">Cor principal</string>
<string name="app_theme_settings">Tema do App</string>
<string name="bottom_title_settings">Local do título do poster</string>
<string name="bottom_title_settings_des">Coloca o título debaixo do poster</string>
<!-- account stuff -->
<string name="anilist_key" translatable="false">anilist_key</string>
<string name="mal_key" translatable="false">mal_key</string>
<string name="opensubtitles_key" translatable="false">opensubtitles_key</string>
<string name="nginx_key" translatable="false">nginx_key</string>
<string name="example_password">senha123</string>
<string name="example_username">MeuNomeLegal</string>
<string name="example_email">oi@mundo.com</string>
<string name="example_ip">127.0.0.1</string>
<string name="example_site_name">MeuSiteLegal</string>
<string name="example_site_url">examplo.com</string>
<string name="example_lang_name">Codigo da Língua (bp)</string>
<!--
<string name="mal_account_settings" translatable="false">MAL</string>
<string name="anilist_account_settings" translatable="false">AniList</string>
<string name="tmdb_account_settings" translatable="false">TMDB</string>
<string name="imdb_account_settings" translatable="false">IMDB</string>
<string name="kitsu_account_settings" translatable="false">Kitsu</string>
<string name="trakt_account_settings" translatable="false">Trakt</string>
-->
<string name="login_format" formatted="true">%s %s</string>
<string name="account">Conta</string>
<string name="logout">Sair</string>
<string name="login">Entrar</string>
<string name="switch_account">Trocar conta</string>
<string name="add_account">Adicionar conta</string>
<string name="create_account">Criar conta</string>
<string name="add_sync">Adicionar sincronização</string>
<string name="added_sync_format" formatted="true">%s adicionado</string>
<string name="upload_sync">Sincronizar</string>
<string name="sync_score">Nota</string>
<string name="sync_score_format" formatted="true">%d / 10</string>
<string name="sync_total_episodes_none">/??</string>
<string name="sync_total_episodes_some" formatted="true">/%d</string>
<string name="authenticated_user" formatted="true">%s autenticado</string>
<string name="authenticated_user_fail" formatted="true">Falha em autenticar para %s</string>
<!-- ============ -->
<string name="none">Nenhum</string>
<string name="normal">Normal</string>
<string name="all">Tudo</string>
<string name="max">Max</string>
<string name="min">Min</string>
<string name="subtitles_none" translatable="false">@string/none</string>
<string name="subtitles_outline">Contornado</string>
<string name="subtitles_depressed">Afundado</string>
<string name="subtitles_shadow">Sombreado</string>
<string name="subtitles_raised">Em Relevo</string>
<string name="subtitle_offset">Sincronizar legendas</string>
<string name="subtitle_offset_hint">1000ms</string>
<string name="subtitle_offset_title">Atraso de legenda</string>
<string name="subtitle_offset_extra_hint_later_format">Use isto se as legendas forem mostradas %dms adiantadas</string>
<string name="subtitle_offset_extra_hint_before_format">Use isto se as legendas forem mostradas %dms atrasadas</string>
<string name="subtitle_offset_extra_hint_none_format">Sem atraso de legenda</string>
<!--
Example text (pangram) can optionally be translated; if you do, include all the letters in the alphabet,
see:
https://en.wikipedia.org/w/index.php?title=Pangram&oldid=225849300
https://en.wikipedia.org/wiki/The_quick_brown_fox_jumps_over_the_lazy_dog
-->
<string name="subtitles_example_text">Já fiz vinho com toque de kiwi para belga sexy.</string>
<string name="recommended">Recomendada</string>
<string name="player_loaded_subtitles" formatted="true">%s carregada</string>
<string name="player_load_subtitles">Carregar de arquivo</string>
<string name="player_load_subtitles_online">Carregar da Internet</string>
<string name="downloaded_file">Arquivo baixado</string>
<string name="actor_main">Protagonista</string>
<string name="actor_supporting">Coadjuvante</string>
<string name="actor_background">Figurante</string>
<string name="home_source">Fonte</string>
<string name="home_random">Aleatório</string>
<string name="coming_soon">Em breve…</string>
<string name="quality_cam">Cam</string>
<string name="quality_cam_rip">Cam</string>
<string name="quality_cam_hd">Cam</string>
<string name="quality_hq">HQ</string>
<string name="quality_hd">HD</string>
<string name="quality_ts">TS</string>
<string name="quality_tc">TC</string>
<string name="quality_blueray">BlueRay</string>
<string name="quality_workprint">WP</string>
<string name="quality_dvd">DVD</string>
<string name="quality_4k">4K</string>
<string name="quality_sd">SD</string>
<string name="quality_uhd">UHD</string>
<string name="quality_hdr">HDR</string>
<string name="quality_sdr">SDR</string>
<string name="quality_webrip">Web</string>
<string name="poster_image">Imagem de Poster</string>
<string name="category_player">Player</string>
<string name="resolution_and_title">Resolução e título</string>
<string name="title">Título</string>
<string name="resolution">Resolução</string>
<string name="error_invalid_id">Id invalida</string>
<string name="error_invalid_data">Dado invalido</string>
<string name="error">Erro</string>
<string name="subtitles_remove_captions">Remover legendas ocultas(CC) das legendas</string>
<string name="subtitles_remove_bloat">Remover bloat das legendas</string>
<string name="extras">Extras</string>
<string name="trailer">Trailer</string>
</resources>

View file

@ -14,6 +14,10 @@
<string name="year_format" translatable="false" formatted="true">%d</string>
<string name="app_dub_sub_episode_text_format" formatted="true">%s Ep %d</string>
<string name="cast_format" formatted="true">Cast: %s</string>
<string name="next_episode_format" formatted="true">Bölüm %d şu tarihte yayınlanacak: </string>
<string name="next_episode_time_day_format" formatted="true">%dd %dh %dm</string>
<string name="next_episode_time_hour_format" formatted="true">%dh %dm</string>
<string name="next_episode_time_min_format" formatted="true">%dm</string>
<!-- IS NOT NEEDED TO TRANSLATE AS THEY ARE ONLY USED FOR SCREEN READERS AND WONT SHOW UP TO NORMAL USERS -->
<string name="result_poster_img_des">Poster</string>
@ -32,64 +36,67 @@
<string name="rated_format" formatted="true">Puan: %.1f</string>
<string name="new_update_format" formatted="true">Yeni güncelleme bulundu!\n%s -> %s</string>
<string name="filler" formatted="true">Filler</string>
<string name="duration_format" formatted="true">%d min</string>
<string name="duration_format" formatted="true">%d dakika</string>
<string name="app_name">CloudStream</string>
<string name="title_home">Ana Sayfa</string>
<string name="title_home">Ana sayfa</string>
<string name="title_search">Arama</string>
<string name="title_downloads">İndirmeler</string>
<string name="title_downloads">İndirilenler</string>
<string name="title_settings">Ayarlar</string>
<string name="search_hint">Ara…</string>
<string name="no_data">Veri Yok</string>
<string name="episode_more_options_des">Daha Fazla Seçenek</string>
<string name="search_hint_site" formatted="true">%s sağlayıcısında ara…</string>
<string name="no_data">Veri yok</string>
<string name="episode_more_options_des">Daha fazla seçenek</string>
<string name="next_episode">Sonraki bölüm</string>
<string name="result_plot" translatable="false">@string/synopsis</string>
<string name="result_tags">Türler</string>
<string name="result_share">Paylaş</string>
<string name="result_open_in_browser">Tarayıcıda Aç</string>
<string name="skip_loading">Yüklemeyi Atla</string>
<string name="result_open_in_browser">Tarayıcıda aç</string>
<string name="skip_loading">Yüklemeyi atla</string>
<string name="loading_chromecast">Yükleniyor…</string>
<string name="type_watching">İzleniyor</string>
<string name="type_on_hold">Bekleniyor</string>
<string name="type_on_hold">Beklemede</string>
<string name="type_completed">Tamamlandı</string>
<string name="type_dropped">Bırakıldı</string>
<string name="type_plan_to_watch">Planlandı</string>
<string name="type_none">Hiçbiri</string>
<string name="type_re_watching">Yeniden İzleniyor</string>
<string name="type_re_watching">Yeniden izleniyor</string>
<string name="play_movie_button">Filmi Oynat</string>
<string name="play_torrent_button">Torrent Oynat</string>
<string name="play_movie_button">Filmi oynat</string>
<string name="play_torrent_button">Torrent oynat</string>
<string name="pick_source">Kaynaklar</string>
<string name="pick_subtitle">Alt yazılar</string>
<string name="reload_error">Yeniden bağlan…</string>
<string name="go_back">Geri Dön</string>
<string name="play_episode">Bölümü Oynat</string>
<string name="go_back">Geri dön</string>
<string name="play_episode">Bölümü oynat</string>
<!--<string name="need_storage">Allow to download episodes</string>-->
<string name="download">İndir</string>
<string name="downloaded">İndirildi</string>
<string name="downloading">İndiriliyor</string>
<string name="download_paused">İndirme Durduruldu</string>
<string name="download_started">İndirme Başlatıldı</string>
<string name="download_failed">İndirme Başarısız</string>
<string name="download_canceled">İndirme İptal Edildi</string>
<string name="download_done">İndirme Bitti</string>
<string name="download_paused">İndirme duraklatıldı</string>
<string name="download_started">İndirme başladı</string>
<string name="download_failed">İndirme başarısız oldu</string>
<string name="download_canceled">İndirme iptal edildi</string>
<string name="download_done">İndirme bitti</string>
<string name="download_format" translatable="false">%s - %s</string>
<string name="stream">Yayınla</string>
<string name="error_loading_links_toast">Bağlantıları Yükleme Başarısız</string>
<string name="download_storage_text">Dahili Depolama</string>
<string name="error_loading_links_toast">Bağlantılar yüklenirken hata oluştu</string>
<string name="download_storage_text">Dahili depolama</string>
<string name="app_dubbed_text">Dublaj</string>
<string name="app_subbed_text">Altyazı</string>
<string name="app_dubbed_text">Dublajlı</string>
<string name="app_subbed_text">Alt yazılı</string>
<string name="popup_delete_file">Dosyayı Sil</string>
<string name="popup_play_file">Dosyayı Oynat</string>
<string name="popup_resume_download">İndirmeyi Sürdür</string>
<string name="popup_pause_download">İndirmeyi Durdur</string>
<string name="popup_delete_file">Dosyayı sil</string>
<string name="popup_play_file">Dosyayı oynat</string>
<string name="popup_resume_download">İndirmeyi sürdür</string>
<string name="popup_pause_download">İndirmeyi duraklat</string>
<string name="pref_disable_acra">Otomatik hata raporlamayı devre dışı bırak</string>
<string name="pref_disable_acra">Otomatik hata raporlamayı kapat</string>
<string name="home_more_info">Daha fazla bilgi</string>
<string name="home_expanded_hide">Gizle</string>
<string name="home_play">Oynat</string>
@ -99,23 +106,23 @@
<string name="action_remove_from_bookmarks">Kaldır</string>
<string name="action_add_to_bookmarks">İzleme durumunu ayarla</string>
<string name="sort_apply">Uygula</string>
<string name="sort_cancel">İptal Et</string>
<string name="sort_cancel">İptal et</string>
<string name="sort_copy">Kopyala</string>
<string name="sort_close">Kapat</string>
<string name="sort_clear">Temizle</string>
<string name="sort_save">Kaydet</string>
<string name="player_speed">Oynatma Hızı</string>
<string name="player_speed">Oynatıcı hızı</string>
<string name="subtitles_settings">Altyazı Ayarları</string>
<string name="subs_text_color">Metin Rengi</string>
<string name="subs_outline_color">Dış Hat Rengi</string>
<string name="subs_background_color">Arkaplan Rengi</string>
<string name="subs_window_color">Pencere Rengi</string>
<string name="subs_edge_type">Kenar Tipi</string>
<string name="subs_subtitle_elevation">Altyazı Yüksekliği</string>
<string name="subs_font">Font</string>
<string name="subs_font_size">Font Büyüklüğü</string>
<string name="subtitles_settings">Alt yazı ayarları</string>
<string name="subs_text_color">Yazı rengi</string>
<string name="subs_outline_color">Dış hat rengi</string>
<string name="subs_background_color">Arka plan rengi</string>
<string name="subs_window_color">Pencere rengi</string>
<string name="subs_edge_type">Kenar tipi</string>
<string name="subs_subtitle_elevation">Alt yazı yüksekliği</string>
<string name="subs_font">Yazı tipi</string>
<string name="subs_font_size">Yazı boyutu</string>
<string name="search_provider_text_providers">Sağlayıcıları kullanarak ara</string>
<string name="search_provider_text_types">Türleri kullanarak ara</string>
@ -123,97 +130,99 @@
<string name="benene_count_text">Geliştiricilere %d muz verildi</string>
<string name="benene_count_text_none">Hiç muz verilmedi</string>
<string name="subs_auto_select_language">Dili otomatik seç</string>
<string name="subs_download_languages">Dilleri İndir</string>
<string name="subs_auto_select_language">Otomatik seçilecek dil</string>
<string name="subs_download_languages">İndirilecek diller</string>
<string name="subs_subtitle_languages">Alt yazı dili</string>
<string name="subs_hold_to_reset_to_default">Varsayılana döndürmek için basılı tut</string>
<string name="continue_watching">İzlemeye Devam Et</string>
<string name="subs_import_text" formatted="true">Fontları içe aktarmak için %s konumuna yerleştirin</string>
<string name="continue_watching">İzlemeye devam et</string>
<string name="action_remove_watching">Kaldır</string>
<string name="action_open_watching">Daha Fazla Bilgi</string>
<string name="action_open_watching">Daha fazla bilgi</string>
<string name="action_open_play">@string/home_play </string>
<string name="vpn_might_be_needed">Bu sağlayıcının düzgün çalışması için VPN gerekebilir</string>
<string name="vpn_torrent">Bu sağlayıcı bir Torrent, VPN kullanmanız önerilir</string>
<string name="vpn_might_be_needed">Bu sağlayıcının düzgün çalışması için bir VPN gerekebilir</string>
<string name="vpn_torrent">Bu sağlayıcı bir torrent. VPN önerilir</string>
<string name="provider_info_meta">Site Metadata verisini sağlamadı, video eğer sitede bulunmuyorsa oynatma başarısız olabilir</string>
<string name="provider_info_meta">Metadata verisi site tarafından sağlanmadı, video yüklemesi eğer sitede bulunmuyorsa oynatma başarısız olacak</string>
<string name="torrent_plot">ıklama</string>
<string name="normal_no_plot">Senaryo bulunamadı</string>
<string name="normal_no_plot">Konu bulunamadı</string>
<string name="torrent_no_plot">ıklama bulunamadı</string>
<string name="show_log_cat">logcat\'i göster 🐈</string>
<string name="show_log_cat">Logcat\'i göster 🐈</string>
<string name="picture_in_picture">Resim-içinde-resim</string>
<string name="picture_in_picture_des">Diğer uygulamaların üzerinde minyatür oynatıcıyı çalıştırır</string>
<string name="player_size_settings">Yeniden boyutlandırma butonu</string>
<string name="player_size_settings_des">Siyah kenarlıkları kaldır</string>
<string name="player_subtitles_settings">Altyazılar</string>
<string name="player_subtitles_settings_des">Oynatıcı altyazı seçenekleri</string>
<string name="chromecast_subtitles_settings">Chromecast Altyazıları</string>
<string name="chromecast_subtitles_settings_des">Chromecast Altyazı Ayarları</string>
<string name="picture_in_picture_des">Diğer uygulamaların üzerinde minyatür bir oynatıcıda oynatmaya devam eder</string>
<string name="player_size_settings">Oynatıcı yeniden boyutlandırma butonu</string>
<string name="player_size_settings_des">Siyah sınırları kaldır</string>
<string name="player_subtitles_settings">Alt yazı</string>
<string name="player_subtitles_settings_des">Oynatıcı alt yazı ayarları</string>
<string name="chromecast_subtitles_settings">Chromecast alt yazı</string>
<string name="chromecast_subtitles_settings_des">Chromecast alt yazı ayarları</string>
<string name="eigengraumode_settings">Eigengravy Modu</string>
<string name="eigengraumode_settings_des">Hız seçeneği ekler</string>
<string name="eigengraumode_settings">Eigengravy modu</string>
<string name="eigengraumode_settings_des">Oynatıcıya bir hız seçeneği ekler</string>
<string name="swipe_to_seek_settings">Gözlemek için kaydır</string>
<string name="swipe_to_seek_settings_des">Zamanı ayarlamak için sağa ve sola kaydır</string>
<string name="swipe_to_seek_settings_des">Zamanı ayarlamak için sağa veya sola kaydır</string>
<string name="swipe_to_change_settings">Ayarları değiştirmek için kaydır</string>
<string name="swipe_to_change_settings_des">Sol ve sağ taraftan kaydırarak parlaklık ve sesi ayarla</string>
<string name="double_tap_to_seek_settings">Gözlemek için çift tıkla</string>
<string name="double_tap_to_pause_settings">Durdurmak için çift tıkla</string>
<string name="double_tap_to_seek_settings_des">İleri ve geri atlamak için sağ ve sola çift tıkla
</string>
<string name="double_tap_to_pause_settings_des">Durdurmak için ortaya bas</string>
<string name="double_tap_to_seek_amount_settings">Player seek amount</string>
<string name="double_tap_to_seek_settings_des">İleri ve geri atlamak için sağa ve sola çift tıkla</string>
<string name="double_tap_to_pause_settings_des">Durdurmak için ortaya tıkla</string>
<string name="use_system_brightness_settings">Sistem parlaklığını kullan</string>
<string name="use_system_brightness_settings_des">Oynatıcıda karanlık kaplama yerine sistem parlaklığını kullan
</string>
<string name="use_system_brightness_settings_des">Oynatıcıda karanlık kaplama yerine sistem parlaklığını kullan</string>
<string name="episode_sync_settings">İzleme ilerlemesini güncelle</string>
<string name="episode_sync_settings_des">Mevcut bölüm ilerlemesini otomatik güncelle</string>
<string name="restore_settings">Yedekten veri iade et</string>
<string name="killswitch_settings">Github\'dan en son metadata\'yı indir</string>
<string name="killswitch_settings_des">If you want access to all providers (even broken ones) turn this off Tüm sağlayıcılara erişim istiyorsan (bozuk olanlar dahil) bunu kapat</string>
<string name="restore_settings">Yedekten geri yükle</string>
<string name="killswitch_settings">GitHub\'tan en son metadata\'yı indir</string>
<string name="killswitch_settings_des">Tüm sağlayıcılara erişmek istiyorsanız (bozuk olanlara bile) bunu kapatın</string>
<string name="backup_settings">Veri Yedekle</string>
<string name="restore_success">Yedek dosyayı yüklendi</string>
<string name="restore_failed_format" formatted="true">Dosyadan veri iade etme başarısız %s</string>
<string name="backup_success">Veri başarıyla depolandı</string>
<string name="backup_settings">Yedekle</string>
<string name="restore_success">Yedek dosyası yüklendi</string>
<string name="restore_failed_format" formatted="true">Geri yükleme başarısız oldu: %s</string>
<string name="backup_success">Başarıyla yedeklendi</string>
<string name="backup_failed">Depolama izinleri eksik, lütfen tekrar deneyin</string>
<string name="backup_failed_error_format">Yedekleme hatası %s</string>
<string name="backup_failed_error_format">%s yedeklenirken hata</string>
<string name="search">Ara</string>
<string name="category_account">Hesaplar</string>
<string name="category_updates">Güncellemeler ve yedek</string>
<string name="nginx_info_title">Nginx nedir?</string>
<string name="nginx_info_summary">Nginx sahip olduğun sunucundaki dosyaları görüntülemek için kullanılabilecek bir yazılımdır. Nginx kurulum rehberini görmek için tıkla</string>
<string name="nginx_info_summary">Nginx, sahip olduğunuz bir sunucudan dosyaları görüntülemek için kullanılabilecek bir yazılımdır. Nginx kurulum kılavuzunu görmek için tıklayın</string>
<string name="settings_info">Bilgi</string>
<string name="advanced_search">Gelişmiş Arama</string>
<string name="advanced_search_des">Sağlaayıcılar ile ayrılmış arama sonuçlarını verir</string>
<string name="bug_report_settings_off">Sadece çökme durumunda veri gönderir</string>
<string name="advanced_search">Gelişmiş arama</string>
<string name="advanced_search_des">Sağlayıcılara göre ayrılmış arama sonuçlarını verir</string>
<string name="bug_report_settings_off">Yalnızca çökmelerle ilgili verileri gönderir</string>
<string name="bug_report_settings_on">Hiç veri göndermez</string>
<string name="show_fillers_settings">Anime için filler bölümleri gösterir</string>
<string name="show_trailers_settings">Fragmanları göster</string>
<string name="kitsu_settings">Kitsu\'dan posterleri göster</string>
<string name="updates_settings">Uygulama güncellemelerini göster</string>
<string name="updates_settings_des">Uygulamayı başlattığında yeni güncelleme olup olmadığını kontrol et</string>
<string name="uprereleases_settings">Ön sürüme güncelle</string>
<string name="uprereleases_settings_des"> Sadece tam sürümler yerine ön sürümleri de ara</string>
<string name="github">Github</string>
<string name="lightnovel">Aynı geliştiricilerden LightNovel uygulaması</string>
<string name="anim">Aynı geliştiricilerden anime uygulaması</string>
<string name="updates_settings_des">Başlangıçta yeni güncellemeleri otomatik olarak ara</string>
<string name="uprereleases_settings">Ön sürümlere güncelle</string>
<string name="uprereleases_settings_des">Sadece tam sürümler yerine ön sürüm güncellemelerini de ara</string>
<string name="github">GitHub</string>
<string name="lightnovel">Aynı geliştiriciler tarafından LightNovel uygulaması</string>
<string name="anim">Aynı geliştiriciler tarafından anime uygulaması</string>
<string name="discord">Discord\'a katıl</string>
<string name="benene">Geliştiricilere muz ver</string>
<string name="benene_des">Verilen muzlar</string>
<string name="app_language">Uygulama Dili</string>
<string name="benene_des">Verilen muz</string>
<string name="app_language">Uygulama dili</string>
<string name="no_chromecast_support_toast">Bu sağlayıcının Chromecast desteği yok</string>
<string name="no_links_found_toast">Bağlantı bulunamadı</string>
<string name="copy_link_toast">Bağlantı panoya kopyalandı</string>
<string name="play_episode_toast">Bölümü Oynat</string>
<string name="subs_default_reset_toast">Varsayılan değere dön</string>
<string name="acra_report_toast">Üzgünüm, uygulama çöktü. Anonim hata raporu geliştiricilere gönderilecek
</string>
<string name="play_episode_toast">Bölümü oynat</string>
<string name="subs_default_reset_toast">Varsayılana sıfırla</string>
<string name="acra_report_toast">Üzgünüz, uygulama çöktü. Geliştiricilere isimsiz bir hata raporu gönderilecek</string>
<string name="season">Sezon</string>
<string name="no_season">Sezon yok</string>
@ -221,18 +230,17 @@
<string name="episodes">Bölümler</string>
<string name="season_short">S</string>
<string name="episode_short">B</string>
<string name="no_episodes_found">Bölüm Bulunamadı</string>
<string name="no_episodes_found">Bölüm bulunamadı</string>
<string name="delete_file">Dosyayı Sil</string>
<string name="delete_file">Dosyayı sil</string>
<string name="delete">Sil</string>
<string name="cancel" translatable="false">@string/sort_cancel</string>
<string name="pause">Durdur</string>
<string name="resume">Sürdür</string>
<string name="go_back_30">-30</string>
<string name="go_forward_30">+30</string>
<string name="delete_message" formatted="true">Dosya tamamen silinecek %s\nEmin misin?</string>
<string name="resume_time_left" formatted="true">%dm\nkalan</string>
<string name="delete_message" formatted="true">%s dosyası tamamen silinecek\nEmins misiniz?</string>
<string name="resume_time_left" formatted="true">%dm\nkaldı</string>
<string name="status_ongoing">Devam ediyor</string>
<string name="status_completed">Tamamlandı</string>
@ -243,83 +251,98 @@
<string name="site">Site</string>
<string name="synopsis">Özet</string>
<string name="queued">kuyrukta</string>
<string name="no_subtitles">Altyazı Yok</string>
<string name="queued">Sıraya alındı</string>
<string name="no_subtitles">Alt yazı yok</string>
<string name="default_subtitles">Varsayılan</string>
<string name="free_storage">Kullanılabilir</string>
<string name="free_storage">Boş</string>
<string name="used_storage">Kullanılan</string>
<string name="app_storage">Uygulama</string>
<!--plural-->
<string name="movies">Filmler</string>
<string name="tv_series">Diziler</string>
<string name="cartoons">Çizgi Filmler</string>
<string name="anime">Anime</string>
<string name="cartoons">Çizgi filmler</string>
<string name="anime">Animeler</string>
<string name="torrent">Torrentler</string>
<string name="documentaries">Belgeseller</string>
<string name="ova">OVA</string>
<string name="asian_drama">Asya Dramaları</string>
<string name="asian_drama">Asya dramaları</string>
<!--singular-->
<string name="movies_singular">Film</string>
<string name="tv_series_singular">Dizi</string>
<string name="cartoons_singular">Çizgi Film</string>
<string name="cartoons_singular">Çizgi film</string>
<string name="anime_singular">@string/anime</string>
<string name="ova_singular">@string/ova</string>
<string name="torrent_singular">Torrent</string>
<string name="documentaries_singular">Belgesel</string>
<string name="asian_drama_singular">Asya Draması</string>
<string name="asian_drama_singular">Asya draması</string>
<string name="source_error">Kaynak hatası</string>
<string name="remote_error">Uzak sunucu hatası</string>
<string name="render_error">Oluşturucu hatası</string>
<string name="unexpected_error">Oynatıcıda beklenmeyen hata</string>
<string name="storage_error">İndirme hatası, depolama izinlerini kontrol et</string>
<string name="remote_error">Sunucu hatası</string>
<string name="render_error">İşleyici hatası</string>
<string name="unexpected_error">Beklenmeyen oynatıcı hatası</string>
<string name="storage_error">İndirme hatası, depolama izinlerini kontrol edin</string>
<string name="episode_action_chromecast_episode">Chromecast bölümü</string>
<string name="episode_action_chromecast_mirror">Chromecast yansıtma</string>
<string name="episode_action_chromecast_episode">Bölümü Chromecast ile yayınla</string>
<string name="episode_action_chromecast_mirror">Bağlantıyı Chromecast ile yayınla</string>
<string name="episode_action_play_in_app">Uygulamada oynat</string>
<string name="episode_action_play_in_vlc">VLC\'de oynat</string>
<string name="episode_action_play_in_browser">Tarayıcıda oynat</string>
<string name="episode_action_copy_link">Bağlantıyı kopyala</string>
<string name="episode_action_copy_link">Linki kopyala</string>
<string name="episode_action_auto_download">Otomatik indir</string>
<string name="episode_action_download_mirror">Ayna kaynaktan indir</string>
<string name="episode_action_reload_links">Bağlantıyı yeniden yükle</string>
<string name="episode_action_download_mirror">Şu kaynaktan indir</string>
<string name="episode_action_reload_links">Bağlantıları yenile</string>
<string name="episode_action_download_subtitle">Alt yazıları indir</string>
<string name="show_hd">Kalite etiketi</string>
<string name="show_dub">Dublaj etiketi</string>
<string name="show_sub">Alt yazı etiketi</string>
<string name="show_title">Başlık</string>
<string name="show_hd_key" translatable="false">show_hd_key</string>
<string name="show_dub_key" translatable="false">show_dub_key</string>
<string name="show_sub_key" translatable="false">show_sub_key</string>
<string name="show_title_key" translatable="false">show_title_key</string>
<string name="poster_ui_settings">Poster üzerindeki öğeler</string>
<string name="no_update_found">Güncelleme bulunamadı</string>
<string name="check_for_update">Güncellemeyi kontrol et</string>
<string name="check_for_update">Güncellemeleri denetle</string>
<string name="video_lock">Kilitle</string>
<string name="video_aspect_ratio_resize">Boyutlandır</string>
<string name="video_aspect_ratio_resize">Yeniden boyutlandır</string>
<string name="video_source">Kaynak</string>
<string name="video_skip_op">Başlangıcı atla</string>
<string name="video_skip_op">OP\'yi geç</string>
<string name="dont_show_again">Tekrar gösterme</string>
<string name="dont_show_again">Bir daha gösterme</string>
<string name="skip_update">Bu güncellemeyi atla</string>
<string name="update">Güncelle</string>
<string name="watch_quality_pref">Tercih edilen izleme kalitesi</string>
<string name="limit_title">Oynatıcıda başlık karakterini sınırla</string>
<string name="video_buffer_size_settings">Video ara bellek boyutu</string>
<string name="video_buffer_length_settings">Video ara bellek uzunluğu</string>
<string name="video_buffer_disk_settings">Video disk önbelleği</string>
<string name="limit_title">Oynatıcıdaki maksimum başlık karakter sayısı</string>
<string name="limit_title_rez">Oynatıcının üst tarafındaki öğeler</string>
<string name="video_buffer_size_settings">Video arabelleği boyutu</string>
<string name="video_buffer_length_settings">Video arabelleği uzunluğu</string>
<string name="video_buffer_disk_settings">Diskteki video önbelleği</string>
<string name="video_buffer_clear_settings">Video ve resim önbelleğini temizle</string>
<string name="video_ram_description">Android TV cihazları veya eski telefonlar gibi RAM\'i düşük olan sistemlerde çok yüksek ayarlarsanız sorun çıkarabilir</string>
<string name="video_disk_description">Çok yükseğe ayarlarsanız, Android TV cihazları gibi düşük depolama alanına sahip sistemlerde sorunlara neden olabilir</string>
<string name="video_ram_description">Çok yükseğe ayarlanırsa rastgele çökmelere neden olur. Android TV veya eski bir telefon gibi ram miktarı düşük cihazlarda değiştirmeyin</string>
<string name="video_disk_description">Çok yükseğe ayarlanırsa, Android TV cihazları gibi düşük depolama alanına sahip sistemlerde sorunlara neden olabilir</string>
<string name="dns_pref">HTTPS üzeri DNS</string>
<string name="dns_pref_summary">İSS engellerine karşı kullanışlu</string>
<string name="dns_pref">HTTPS üzerinden DNS</string>
<string name="dns_pref_summary">ISP bloklarını atlatmak için kullanışlıdır</string>
<string name="download_path_pref">İndirme yolu</string>
<string name="add_site_pref">Klon site</string>
<string name="remove_site_pref">Siteyi kaldır</string>
<string name="add_site_summary">Farklı bir URL ile mevcut bir sitenin klonunu ekleyin</string>
<string name="nginx_url_pref">Nginx sunucu url\'si</string>
<string name="download_path_pref">İndirme konumu</string>
<string name="display_subbed_dubbed_settings">Dublajlı/Altyazılı Anime göster</string>
<string name="nginx_url_pref">Nginx sunucu URL\'i</string>
<string name="resize_fit">Ekrana Sığdır</string>
<string name="display_subbed_dubbed_settings">Dublajlı/Alt yazılı animeleri göster</string>
<string name="resize_fit">Ekrana sığdır</string>
<string name="resize_fill">Uzat</string>
<string name="resize_zoom">Yakınlaştır</string>
@ -342,21 +365,39 @@
CloudStream 3 at your own risk.
</string>
<string name="category_general">Genel</string>
<string name="provider_lang_settings">Sağlayıcı Dilleri</string>
<string name="app_layout">Uygulama Düzeni</string>
<string name="preferred_media_settings">Tercih Edilen Medya</string>
<string name="random_button_settings">Rastgele butonu</string>
<string name="random_button_settings_desc">Ana sayfada rastgele butonunu göster</string>
<string name="provider_lang_settings">Sağlayıcı dilleri</string>
<string name="app_layout">Uygulama düzeni</string>
<string name="preferred_media_settings">Tercih edilen medya</string>
<string name="subtitles_encoding">Alt yazı kodlaması</string>
<string name="category_preferred_media_and_lang">Dil</string>
<string name="category_ui">Düzen</string>
<string name="automatic">Otomatik</string>
<string name="tv_layout">TV Düzeni</string>
<string name="phone_layout">Telefon Düzeni</string>
<string name="emulator_layout">Emülatör Düzeni</string>
<string name="tv_layout">TV düzeni</string>
<string name="phone_layout">Telefon düzeni</string>
<string name="emulator_layout">Emülatör düzeni</string>
<string name="primary_color_settings">Birincil renk</string>
<string name="app_theme_settings">Uygualama teması</string>
<string name="bottom_title_settings">Poster başlık konumu</string>
<string name="bottom_title_settings_des">Başlığı posterin altına yerleştir</string>
<string name="primary_color_settings">Birincil Renk</string>
<string name="app_theme_settings">Uygulama Teması</string>
<!-- account stuff -->
<string name="anilist_key" translatable="false">anilist_key</string>
<string name="mal_key" translatable="false">mal_key</string>
<string name="opensubtitles_key" translatable="false">opensubtitles_key</string>
<string name="nginx_key" translatable="false">nginx_key</string>
<string name="example_password">şifre123</string>
<string name="example_username">HavalıKullanıcıAdı</string>
<string name="example_email">hello@world.com</string>
<string name="example_ip">127.0.0.1</string>
<string name="example_site_name">MyCoolSite</string>
<string name="example_site_url">example.com</string>
<string name="example_lang_name">Dil kodu (tr)</string>
<!--
<string name="mal_account_settings" translatable="false">MAL</string>
<string name="anilist_account_settings" translatable="false">AniList</string>
@ -366,11 +407,12 @@
<string name="trakt_account_settings" translatable="false">Trakt</string>
-->
<string name="login_format" formatted="true">%s %s</string>
<string name="account">hesap</string>
<string name="logout">Çıkış</string>
<string name="login">Giriş</string>
<string name="account">hesabı</string>
<string name="logout">Çıkış yap</string>
<string name="login">Giriş yap</string>
<string name="switch_account">Hesap değiştir</string>
<string name="add_account">Hesap ekle</string>
<string name="create_account">Hesap oluştur</string>
<string name="add_sync">Bölüm takibi ekle</string>
<string name="added_sync_format" formatted="true">Eklendi %s</string>
<string name="upload_sync">Senkronize et</string>
@ -378,25 +420,25 @@
<string name="sync_score_format" formatted="true">%d / 10</string>
<string name="sync_total_episodes_none">/??</string>
<string name="sync_total_episodes_some" formatted="true">/%d</string>
<string name="authenticated_user" formatted="true">Doğrulandı %s</string>
<string name="authenticated_user_fail" formatted="true">Doğrulama Başarısız %s</string>
<string name="authenticated_user" formatted="true">%s için doğrulama başarılı</string>
<string name="authenticated_user_fail" formatted="true">%s için doğrulama başarısız</string>
<!-- ============ -->
<string name="none">Hiçbiri</string>
<string name="normal">Normal</string>
<string name="all">Hepsi</string>
<string name="max">Maks</string>
<string name="min">Min</string>
<string name="max">Maksimum</string>
<string name="min">Minimum</string>
<string name="subtitles_none" translatable="false">@string/none</string>
<string name="subtitles_outline">Dış Hat</string>
<string name="subtitles_depressed">Depresif</string>
<string name="subtitles_outline">Dış hat</string>
<string name="subtitles_depressed">Çökmüş</string>
<string name="subtitles_shadow">Gölge</string>
<string name="subtitles_raised">Yükseltilmiş</string>
<string name="subtitle_offset">Alt yazı senkronu</string>
<string name="subtitle_offset_hint">1000ms</string>
<string name="subtitle_offset_title">Alt yazı gecikmesi</string>
<string name="subtitle_offset_extra_hint_later_format">Bunu altyazılar %dms erken geliyorsa kullan</string>
<string name="subtitle_offset_extra_hint_before_format">Bunu altyazılar %dms geç kalıyorsa kullan</string>
<string name="subtitle_offset_extra_hint_later_format">Alt yazılar %dms erken gözüküyorsa bunu kullanın</string>
<string name="subtitle_offset_extra_hint_before_format">Alt yazılar %dms geç gözüküyorsa bunu kullanın</string>
<string name="subtitle_offset_extra_hint_none_format">Alt yazı gecikmesi yok</string>
<!--
@ -407,17 +449,19 @@
-->
<string name="subtitles_example_text">Pijamalı hasta yağız şoföre çabucak güvendi</string>
<string name="recommended">Tavsiye edilen</string>
<string name="player_loaded_subtitles" formatted="true">Yüklendi %s</string>
<string name="recommended">Önerilen</string>
<string name="player_loaded_subtitles" formatted="true">%s yüklendi</string>
<string name="player_load_subtitles">Dosyadan yükle</string>
<string name="player_load_subtitles_online">İnternetten yükle</string>
<string name="downloaded_file">İndirilen dosya</string>
<string name="actor_main">Ana</string>
<string name="actor_supporting">Destekliyor</string>
<string name="actor_background">Arkaplan</string>
<string name="actor_main">Baş</string>
<string name="actor_supporting">Yardımcı</string>
<string name="actor_background">Geri plan</string>
<string name="home_source">Kaynak</string>
<string name="home_random">Rastgele</string>
<string name="coming_soon">Çok Yakında…</string>
<string name="coming_soon">Çok yakında…</string>
<string name="quality_cam">Cam</string>
<string name="quality_cam_rip">Cam</string>
@ -436,5 +480,17 @@
<string name="quality_sdr">SDR</string>
<string name="quality_webrip">Web</string>
<string name="poster_image">Poster Resmi</string>
<string name="poster_image">Poster fotoğrafı</string>
<string name="category_player">Oynatıcı</string>
<string name="resolution_and_title">Çözünürlük ve başlık</string>
<string name="title">Başlık</string>
<string name="resolution">Çözünürlük</string>
<string name="error_invalid_id">Geçersiz ID</string>
<string name="error_invalid_data">Geçersiz veri</string>
<string name="error">Hata</string>
<string name="subtitles_remove_captions">Alt yazılardan seçmeli alt yazıyı kaldır</string>
<string name="subtitles_remove_bloat">Alt yazılardaki şişkinliği kaldır</string>
<string name="extras">Ekstralar</string>
<string name="trailer">Fragman</string>
</resources>

View file

@ -261,7 +261,7 @@
<item>Tối</item>
<item>Xám</item>
<item>Amoled</item>
<item>Flashbang</item>
<item>ng</item>
</string-array>
<string-array name="themes_names_values">
<item>AmoledLight</item>

View file

@ -1,9 +1,63 @@
<!--https://newbedev.com/concatenate-multiple-strings-in-xml-->
<resources>
<!-- KEYS DON'T TRANSLATE -->
<string name="search_providers_list_key" translatable="false">search_providers_list</string>
<string name="locale_key" translatable="false">app_locale</string>
<string name="search_types_list_key" translatable="false">search_type_list</string>
<string name="auto_update_key" translatable="false">auto_update</string>
<string name="skip_update_key" translatable="false">skip_update_key</string>
<string name="prerelease_update_key" translatable="false">prerelease_update</string>
<string name="manual_check_update_key" translatable="false">manual_check_update</string>
<string name="fast_forward_button_time_key" translatable="false">fast_forward_button_time</string>
<string name="benene_count" translatable="false">benene_count</string>
<string name="subtitle_settings_key" translatable="false">subtitle_settings_key</string>
<string name="subtitle_settings_chromecast_key" translatable="false">subtitle_settings_chromecast_key</string>
<string name="quality_pref_key" translatable="false">quality_pref_key</string>
<string name="prefer_limit_title_key" translatable="false">prefer_limit_title_key</string>
<string name="prefer_limit_title_rez_key" translatable="false">prefer_limit_title_rez_key</string>
<string name="video_buffer_size_key" translatable="false">video_buffer_size_key</string>
<string name="video_buffer_length_key" translatable="false">video_buffer_length_key</string>
<string name="video_buffer_clear_key" translatable="false">video_buffer_clear_key</string>
<string name="video_buffer_disk_key" translatable="false">video_buffer_disk_key</string>
<string name="prerelease_commit_hash" translatable="false">unknown_prerelease</string>
<string name="use_system_brightness_key" translatable="false">use_system_brightness_key</string>
<string name="swipe_enabled_key" translatable="false">swipe_enabled_key</string>
<string name="playback_speed_enabled_key" translatable="false">playback_speed_enabled_key</string>
<string name="player_resize_enabled_key" translatable="false">player_resize_enabled_key</string>
<string name="pip_enabled_key" translatable="false">pip_enabled_key</string>
<string name="double_tap_enabled_key" translatable="false">double_tap_enabled_key</string>
<string name="double_tap_pause_enabled_key" translatable="false">double_tap_pause_enabled_key</string>
<string name="double_tap_seek_time_key" translatable="false">double_tap_seek_time_key</string>
<string name="swipe_vertical_enabled_key" translatable="false">swipe_vertical_enabled_key</string>
<string name="display_sub_key" translatable="false">display_sub_key</string>
<string name="show_fillers_key" translatable="false">show_fillers_key</string>
<string name="show_trailers_key" translatable="false">show_trailers_key</string>
<string name="show_kitsu_posters_key" translatable="false">show_kitsu_posters_key</string>
<string name="random_button_key" translatable="false">random_button_key</string>
<string name="provider_lang_key" translatable="false">provider_lang_key</string>
<string name="dns_key" translatable="false">dns_key</string>
<string name="download_path_key" translatable="false">download_path_key</string>
<string name="app_name_download_path" translatable="false">Cloudstream</string>
<string name="app_layout_key" translatable="false">app_layout_key</string>
<string name="primary_color_key" translatable="false">primary_color_key</string>
<string name="restore_key" translatable="false">restore_key</string>
<string name="killswitch_key" translatable="false">killswitch_key</string>
<string name="backup_key" translatable="false">backup_key</string>
<string name="prefer_media_type_key" translatable="false">prefer_media_type_key</string>
<string name="app_theme_key" translatable="false">app_theme_key</string>
<string name="episode_sync_enabled_key" translatable="false">episode_sync_enabled_key</string>
<string name="log_enabled_key" translatable="false">log_enabled_key</string>
<string name="show_logcat_key" translatable="false">show_logcat_key</string>
<string name="bottom_title_key" translatable="false">bottom_title_key</string>
<string name="poster_ui_key" translatable="false">poster_ui_key</string>
<string name="subtitles_encoding_key" translatable="false">subtitles_encoding_key</string>
<string name="override_site_key" translatable="false">override_site_key</string>
<!-- FORMAT MIGHT TRANSLATE, WILL CAUSE CRASH IF APPLIED WRONG -->
<string name="extra_info_format" translatable="false" formatted="true">%d %s | %sMB</string>
<string name="storage_size_format" translatable="false" formatted="true">%s • %sGB</string>
<string name="download_size_format" translatable="false" formatted="true">%sMB / %sMB</string>
<string name="mb_format" translatable="false" formatted="true">%dMB</string>
<string name="episode_name_format" translatable="false" formatted="true">%s %s</string>
<string name="ffw_text_format" translatable="false" formatted="true">+%d</string>
<string name="rew_text_format" translatable="false" formatted="true">-%d</string>
@ -11,11 +65,11 @@
<string name="rew_text_regular_format" translatable="false" formatted="true">%d</string>
<string name="rating_format" translatable="false" formatted="true">%.1f/10.0</string>
<string name="year_format" translatable="false" formatted="true">%d</string>
<string name="app_dub_sub_episode_text_format" formatted="true">%s Ep %d</string>
<string name="cast_format" formatted="true">Cast: %s</string>
<string name="next_episode_format" formatted="true">L\'episodio %d uscirà in</string>
<string name="next_episode_time_day_format" formatted="true">%dg %do %dm</string>
<string name="next_episode_time_hour_format" formatted="true">%do %dm</string>
<string name="app_dub_sub_episode_text_format" formatted="true">%s Tập %d</string>
<string name="cast_format" formatted="true">Diễn viên: %s</string>
<string name="next_episode_format" formatted="true">Tập %d sẽ ra mắt sau</string>
<string name="next_episode_time_day_format" formatted="true">%dd %dh %dm</string>
<string name="next_episode_time_hour_format" formatted="true">%dh %dm</string>
<string name="next_episode_time_min_format" formatted="true">%dm</string>
<!-- IS NOT NEEDED TO TRANSLATE AS THEY ARE ONLY USED FOR SCREEN READERS AND WONT SHOW UP TO NORMAL USERS -->
@ -24,7 +78,9 @@
<string name="episode_poster_img_des">Episode Poster</string>
<string name="home_main_poster_img_des">Main Poster</string>
<string name="home_next_random_img_des">Next Random</string>
<string name="episode_play_img_des" translatable="false">@string/play_episode</string>
<string name="go_back_img_des">Go back</string>
<string name="change_providers_img_des" translatable="false">@string/home_change_provider_img_des</string>
<string name="home_change_provider_img_des">Change Provider</string>
<string name="preview_background_img_des">Preview Background</string>
@ -35,7 +91,7 @@
<string name="filler" formatted="true">Bộ lọc</string>
<string name="duration_format" formatted="true">%d phút</string>
<!-- <string name="app_name">CloudStream</string> -->
<string name="app_name">CloudStream</string>
<string name="title_home">Trang Chủ</string>
<string name="title_search">Tìm Kiếm</string>
<string name="title_downloads">Tải Về</string>
@ -47,6 +103,7 @@
<string name="no_data">Không có dữ liệu</string>
<string name="episode_more_options_des">Thêm tuỳ chọn</string>
<string name="next_episode">Tập tiếp theo</string>
<string name="result_plot" translatable="false">@string/synopsis</string>
<string name="result_tags">Thể loại</string>
<string name="result_share">Chia sẻ</string>
<string name="result_open_in_browser">Mở bằng trình duyệt</string>
@ -55,7 +112,7 @@
<string name="type_watching">Đang xem</string>
<string name="type_on_hold">Đang chờ</string>
<string name="type_completed">Hoàn thành</string>
<string name="type_completed">Đã xem</string>
<string name="type_dropped">Bỏ qua</string>
<string name="type_plan_to_watch">Xem sau</string>
<string name="type_none">Mặc định</string>
@ -64,12 +121,13 @@
<string name="play_movie_button">Xem Ngay</string>
<string name="play_torrent_button">Xem Bằng Torrent</string>
<string name="pick_source">Nguồn Phim</string>
<string name="pick_subtitle">Phụ Đ</string>
<string name="pick_subtitle">Phụ đ</string>
<string name="reload_error">Thử kết nối lại…</string>
<string name="go_back">Quay lại</string>
<string name="play_episode">Xem Tập Phim</string>
<!--<string name="need_storage">Allow to download episodes</string>-->
<string name="download">Tải Xuống</string>
<string name="download">Tải xuống</string>
<string name="downloaded">Đã tải</string>
<string name="downloading">Đang tải</string>
<string name="download_paused">Tạm dừng</string>
@ -130,7 +188,7 @@
<string name="subs_subtitle_languages">Ngôn ngữ phụ đề</string>
<string name="subs_hold_to_reset_to_default">Giữ để làm mới toàn bộ</string>
<string name="subs_import_text" formatted="true">Thêm phông chữ tại %s</string>
<string name="continue_watching">Đang Xem</string>
<string name="continue_watching">Tiếp tục xem</string>
<string name="action_remove_watching">Loại bỏ</string>
<string name="action_open_watching">Thông tin thêm</string>
@ -150,26 +208,27 @@
<string name="picture_in_picture">Chế độ cửa sổ nhỏ</string>
<string name="picture_in_picture_des">Tiếp tục xem phim khi thoát app hoặc đang tìm kiếm</string>
<string name="player_size_settings">Bật nút thu phóng khi xem</string>
<string name="player_size_settings_des">Điều này sẽ xóa khoảng đen của phim</string>
<string name="player_size_settings_des">Xóa khoảng đen của phim</string>
<string name="player_subtitles_settings">Phụ đề</string>
<string name="player_subtitles_settings_des">Cài đặt phụ đề</string>
<string name="chromecast_subtitles_settings">Phụ đề Chromecast</string>
<string name="chromecast_subtitles_settings_des">Cài đặt phụ đề Chromecast</string>
<string name="eigengraumode_settings">Điều chỉnh tốc độ khi xem phim</string>
<string name="eigengraumode_settings">Chỉnh tốc độ phim</string>
<string name="eigengraumode_settings_des">Có thể điều chỉnh tốc độ phát phim</string>
<string name="swipe_to_seek_settings">Vuốt để tua nhanh</string>
<string name="swipe_to_seek_settings_des">Bạn có thể vuốt trái hoặc phải để tua nhanh khi đang xem phim</string>
<string name="swipe_to_change_settings">Vuốt để điều chỉnh âm lượng và độ sáng</string>
<string name="swipe_to_seek_settings_des">Bạn có thể vuốt trái hoặc phải để tua nhanh khi xem phim</string>
<string name="swipe_to_change_settings">Vuốt để chỉnh độ sáng và âm lượng</string>
<string name="swipe_to_change_settings_des">Vuốt từ dưới lên trên ở bên trái hoặc phải đều điều chỉnh độ sáng và âm lượng</string>
<string name="double_tap_to_seek_settings">Nhấn 2 lần để tua</string>
<string name="double_tap_to_pause_settings">Chạm 2 lần để tạm dừng</string>
<string name="double_tap_to_seek_settings_des">Nhấn 2 lần vào bên trái hoặc màn hình để tua trước hoặc sau</string>
<string name="double_tap_to_pause_settings">Nhấn 2 lần để tạm dừng</string>
<string name="double_tap_to_seek_amount_settings">Thời lượng tua</string>
<string name="double_tap_to_seek_settings_des">Nhấn 2 lần vào bên trái hoặc bên phải màn hình để tua trước hoặc sau</string>
<string name="double_tap_to_pause_settings_des">Nhấn vào giữa để tạm dừng</string>
<string name="use_system_brightness_settings">Sử dụng độ sáng hệ thống</string>
<string name="use_system_brightness_settings_des">Sử dụng độ sáng hệ thống trong trình phát ứng dụng</string>
<!--<string name="episode_sync_settings">Update watch progress</string>-->
<string name="episode_sync_settings">Cập nhật tiến trình xem</string>
<string name="episode_sync_settings_des">Tự động đồng bộ tiến trình hiện tại của bạn</string>
<string name="restore_settings">Khôi phục dữ liệu từ bản sao lưu</string>
@ -267,8 +326,8 @@
<string name="movies_singular">Phim Lẻ</string>
<string name="tv_series_singular">Phim Bộ</string>
<string name="cartoons_singular">Hoạt Hình</string>
<string name="anime_singular">Anime</string>
<string name="ova_singular">OVA</string>
<string name="anime_singular">@string/anime</string>
<string name="ova_singular">@string/ova</string>
<string name="torrent_singular">Torrent</string>
<string name="documentaries_singular">Phim Tài Liệu</string>
<string name="asian_drama_singular">Truyền Hình Châu Á</string>
@ -294,6 +353,10 @@
<string name="show_dub">Nhãn lồng tiếng</string>
<string name="show_sub">Nhãn phụ đề</string>
<string name="show_title">Tiêu đề</string>
<string name="show_hd_key" translatable="false">show_hd_key</string>
<string name="show_dub_key" translatable="false">show_dub_key</string>
<string name="show_sub_key" translatable="false">show_sub_key</string>
<string name="show_title_key" translatable="false">show_title_key</string>
<string name="poster_ui_settings">Thay đổi giao diện trên poster</string>
<string name="no_update_found">Bạn đang dùng phiên bản mới nhất</string>
@ -301,18 +364,18 @@
<string name="video_lock">Khóa</string>
<string name="video_aspect_ratio_resize">Thu Phóng</string>
<string name="video_source">Phụ đề</string>
<string name="video_source">Tuỳ chọn</string>
<string name="video_skip_op">Tập tiếp</string>
<string name="dont_show_again">Không hiển thị lại</string>
<string name="skip_update">Bỏ qua bản cập nhật này</string>
<string name="dont_show_again">Không hiện lại</string>
<string name="skip_update">Bỏ qua</string>
<string name="update">Cập nhật</string>
<string name="watch_quality_pref">Tự động chọn chất lượng phim</string>
<string name="limit_title">Kí tự tối đa trên tiêu đề</string>
<string name="limit_title_rez">Độ phân giải tối đa</string>
<string name="limit_title_rez">Định dạng trình phát</string>
<string name="video_buffer_size_settings">Kích thước video cache</string>
<string name="video_buffer_length_settings">Dung lượng bộ nhớ đệm</string>
<string name="video_buffer_size_settings">Dung lượng video cache</string>
<string name="video_buffer_length_settings">Thời lượng bộ nhớ đệm</string>
<string name="video_buffer_disk_settings">Dung lượng video cache</string>
<string name="video_buffer_clear_settings">Xoá hình ảnh và video</string>
@ -337,6 +400,23 @@
<string name="resize_zoom">Phóng to</string>
<string name="legal_notice">Disclaimer</string>
<string name="legal_notice_key" translatable="false">legal_notice_key</string>
<string name="legal_notice_text" translatable="false">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.
</string>
<string name="category_general">Tổng quan</string>
<string name="random_button_settings">Nút ngẫu nhiên</string>
<string name="random_button_settings_desc">Hiện nút ngẫu nhiên trên trang chủ</string>
@ -358,6 +438,10 @@
<string name="bottom_title_settings_des">Đặt tiêu đề dưới poster</string>
<!-- account stuff -->
<string name="anilist_key" translatable="false">anilist_key</string>
<string name="mal_key" translatable="false">mal_key</string>
<string name="opensubtitles_key" translatable="false">opensubtitles_key</string>
<string name="nginx_key" translatable="false">nginx_key</string>
<string name="example_password">Mật khẩu</string>
<string name="example_username">Tài khoản</string>
<string name="example_email">Email</string>
@ -366,6 +450,14 @@
<string name="example_site_url">example.com</string>
<string name="example_lang_name">Mã ngôn ngữ (vi)</string>
<!--
<string name="mal_account_settings" translatable="false">MAL</string>
<string name="anilist_account_settings" translatable="false">AniList</string>
<string name="tmdb_account_settings" translatable="false">TMDB</string>
<string name="imdb_account_settings" translatable="false">IMDB</string>
<string name="kitsu_account_settings" translatable="false">Kitsu</string>
<string name="trakt_account_settings" translatable="false">Trakt</string>
-->
<string name="login_format" formatted="true">%s %s</string>
<string name="account">tài khoản</string>
<string name="logout">Đăng xuất</string>
@ -410,7 +502,7 @@
<string name="recommended">Được đề xuất</string>
<string name="player_loaded_subtitles" formatted="true">Đã tải %s</string>
<string name="player_load_subtitles">Chọn tệp</string>
<string name="player_load_subtitles">Chọn từ máy</string>
<string name="player_load_subtitles_online">Chọn từ Internet</string>
<string name="downloaded_file">Tệp đã tải</string>
<string name="actor_main">Vai chính</string>
@ -447,8 +539,8 @@
<string name="error_invalid_id">Id không hợp lệ</string>
<string name="error_invalid_data">Lỗi dữ liệu</string>
<string name="error">Lỗi</string>
<!--<string name="subtitles_remove_captions">Remove closed captions from subtitles</string>-->
<!--<string name="subtitles_remove_bloat">Remove bloat from subtitles</string>-->
<!--<string name="extras">Extra</string>-->
<string name="subtitles_remove_captions">Xoá phụ đề đã dùng</string>
<string name="subtitles_remove_bloat">Loại bỏ mã hoá phụ đề</string>
<string name="extras">Thêm</string>
<string name="trailer">Trailer</string>
</resources>

View file

@ -472,7 +472,7 @@
"TheFlixToProvider": {
"language": "en",
"name": "TheFlix.to",
"status": 0,
"status": 1,
"url": "https://theflix.to"
},
"TrailersTwoProvider": {
@ -511,6 +511,12 @@
"status": 1,
"url": "https://vidembed.cc"
},
"VidSrcProvider": {
"language": "en",
"name": "VidSrc",
"status": 1,
"url": "https://v2.vidsrc.me"
},
"WatchAsianProvider": {
"language": "en",
"name": "WatchAsian",