Merge branch 'recloudstream:master' into master

This commit is contained in:
CranberrySoup 2024-04-25 16:17:16 +00:00 committed by GitHub
commit fff325ff36
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
51 changed files with 1113 additions and 120 deletions

View file

@ -202,7 +202,7 @@ dependencies {
// PlayBack
implementation("com.jaredrummler:colorpicker:1.1.0") // Subtitle Color Picker
implementation("com.github.recloudstream:media-ffmpeg:1.1.0") // Custom FF-MPEG Lib for Audio Codecs
implementation("com.github.teamnewpipe:NewPipeExtractor:6dc25f7") /* For Trailers
implementation("com.github.TeamNewPipe.NewPipeExtractor:NewPipeExtractor:6dc25f7b97") /* For Trailers
^ Update to Latest Commits if Trailers Misbehave, github.com/TeamNewPipe/NewPipeExtractor/commits/dev */
implementation("com.github.albfernandez:juniversalchardet:2.4.0") // Subtitle Decoding

View file

@ -0,0 +1,28 @@
package com.lagradost.cloudstream3.extractors
import android.util.Log
import com.fasterxml.jackson.annotation.JsonProperty
import com.lagradost.cloudstream3.app
import com.lagradost.cloudstream3.utils.*
import com.lagradost.cloudstream3.utils.AppUtils.tryParseJson
open class EPlayExtractor : ExtractorApi() {
override var name = "EPlay"
override var mainUrl = "https://eplayvid.net"
override val requiresReferer = true
override suspend fun getUrl(url: String, referer: String?): List<ExtractorLink>? {
val response = app.get(url).document
val trueUrl = response.select("source").attr("src")
return listOf(
ExtractorLink(
this.name,
this.name,
trueUrl,
mainUrl,
getQualityFromName(""), // this needs to be auto
false
)
)
}
}

View file

@ -25,9 +25,13 @@ open class Vidmoly : ExtractorApi() {
subtitleCallback: (SubtitleFile) -> Unit,
callback: (ExtractorLink) -> Unit
) {
val headers = mapOf(
"User-Agent" to "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Mobile Safari/537.36",
"Sec-Fetch-Dest" to "iframe"
)
val script = app.get(
url,
headers = headers,
referer = referer,
).document.select("script")
.find { it.data().contains("sources:") }?.data()
@ -66,4 +70,4 @@ open class Vidmoly : ExtractorApi() {
@JsonProperty("kind") val kind: String? = null,
)
}
}

View file

@ -66,7 +66,7 @@ open class Vidplay : ExtractorApi() {
}
private suspend fun callFutoken(id: String, url: String): String? {
val script = app.get("$mainUrl/futoken").text
val script = app.get("$mainUrl/futoken", referer = url).text
val k = "k='(\\S+)'".toRegex().find(script)?.groupValues?.get(1) ?: return null
val a = mutableListOf(k)
for (i in id.indices) {

View file

@ -0,0 +1,40 @@
package com.lagradost.cloudstream3.extractors
import android.util.Log
import com.fasterxml.jackson.annotation.JsonProperty
import com.lagradost.cloudstream3.app
import com.lagradost.cloudstream3.utils.*
import com.lagradost.cloudstream3.utils.AppUtils.tryParseJson
import com.lagradost.cloudstream3.utils.JsUnpacker
import com.lagradost.cloudstream3.utils.ExtractorApi
import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.utils.Qualities
import com.lagradost.cloudstream3.utils.getQualityFromName
import java.net.URI
open class Vtbe : ExtractorApi() {
override var name = "Vtbe"
override var mainUrl = "https://vtbe.to"
override val requiresReferer = true
override suspend fun getUrl(url: String, referer: String?): List<ExtractorLink>? {
val response = app.get(url,referer=mainUrl).document
val extractedpack =response.selectFirst("script:containsData(function(p,a,c,k,e,d))")?.data().toString()
JsUnpacker(extractedpack).unpack()?.let { unPacked ->
Regex("sources:\\[\\{file:\"(.*?)\"").find(unPacked)?.groupValues?.get(1)?.let { link ->
return listOf(
ExtractorLink(
this.name,
this.name,
link,
referer ?: "",
Qualities.Unknown.value,
URI(link).path.endsWith(".m3u8")
)
)
}
}
return null
}
}

View file

@ -0,0 +1,430 @@
package com.lagradost.cloudstream3.metaproviders
import android.net.Uri
import com.lagradost.cloudstream3.*
import com.fasterxml.jackson.annotation.JsonAlias
import com.fasterxml.jackson.annotation.JsonProperty
import com.lagradost.cloudstream3.LoadResponse.Companion.addImdbId
import com.lagradost.cloudstream3.LoadResponse.Companion.addTMDbId
import com.lagradost.cloudstream3.LoadResponse.Companion.addTrailer
import com.lagradost.cloudstream3.mvvm.logError
import com.lagradost.cloudstream3.utils.AppUtils.parseJson
import com.lagradost.cloudstream3.utils.AppUtils.toJson
import java.util.Locale
import java.text.SimpleDateFormat
import kotlin.math.roundToInt
open class TraktProvider : MainAPI() {
override var name = "Trakt"
override val hasMainPage = true
override val providerType = ProviderType.MetaProvider
override val supportedTypes = setOf(
TvType.Movie,
TvType.TvSeries,
TvType.Anime,
)
private val traktClientId = base64Decode("N2YzODYwYWQzNGI4ZTZmOTdmN2I5MTA0ZWQzMzEwOGI0MmQ3MTdlMTM0MmM2NGMxMTg5NGE1MjUyYTQ3NjE3Zg==")
private val traktApiUrl = base64Decode("aHR0cHM6Ly9hcGl6LnRyYWt0LnR2")
override val mainPage = mainPageOf(
"$traktApiUrl/movies/trending" to "Trending Movies", //Most watched movies right now
"$traktApiUrl/movies/popular" to "Popular Movies", //The most popular movies for all time
"$traktApiUrl/shows/trending" to "Trending Shows", //Most watched Shows right now
"$traktApiUrl/shows/popular" to "Popular Shows", //The most popular Shows for all time
)
override suspend fun getMainPage(page: Int, request: MainPageRequest): HomePageResponse {
val apiResponse = getApi("${request.data}?extended=cloud9,full&page=$page")
val results = parseJson<List<MediaDetails>>(apiResponse).map { element ->
element.toSearchResponse()
}
return newHomePageResponse(request.name, results)
}
private fun MediaDetails.toSearchResponse(): SearchResponse {
val media = this.media ?: this
val mediaType = if (media.ids?.tvdb == null) TvType.Movie else TvType.TvSeries
val poster = media.images?.poster?.firstOrNull()
if (mediaType == TvType.Movie) {
return newMovieSearchResponse(
name = media.title!!,
url = Data(
type = mediaType,
mediaDetails = media,
).toJson(),
type = TvType.Movie,
) {
posterUrl = fixPath(poster)
}
} else {
return newTvSeriesSearchResponse(
name = media.title!!,
url = Data(
type = mediaType,
mediaDetails = media,
).toJson(),
type = TvType.TvSeries,
) {
this.posterUrl = fixPath(poster)
}
}
}
override suspend fun search(query: String): List<SearchResponse>? {
val apiResponse = getApi("$traktApiUrl/search/movie,show?extended=cloud9,full&limit=20&page=1&query=$query")
val results = parseJson<List<MediaDetails>>(apiResponse).map { element ->
element.toSearchResponse()
}
return results
}
override suspend fun load(url: String): LoadResponse {
val data = parseJson<Data>(url)
val mediaDetails = data.mediaDetails
val moviesOrShows = if (data.type == TvType.Movie) "movies" else "shows"
val posterUrl = mediaDetails?.images?.poster?.firstOrNull()
val backDropUrl = mediaDetails?.images?.fanart?.firstOrNull()
val resActor = getApi("$traktApiUrl/$moviesOrShows/${mediaDetails?.ids?.trakt}/people?extended=cloud9,full")
val actors = parseJson<People>(resActor).cast?.map {
ActorData(
Actor(
name = it.person?.name!!,
image = getWidthImageUrl(it.person.images?.headshot?.firstOrNull(), "w500")
),
roleString = it.character
)
}
val resRelated = getApi("$traktApiUrl/$moviesOrShows/${mediaDetails?.ids?.trakt}/related?extended=cloud9,full&limit=20")
val relatedMedia = parseJson<List<MediaDetails>>(resRelated).map { it.toSearchResponse() }
val isCartoon = mediaDetails?.genres?.contains("animation") == true || mediaDetails?.genres?.contains("anime") == true
val isAnime = isCartoon && (mediaDetails?.language == "zh" || mediaDetails?.language == "ja")
val isAsian = !isAnime && (mediaDetails?.language == "zh" || mediaDetails?.language == "ko")
val isBollywood = mediaDetails?.country == "in"
if (data.type == TvType.Movie) {
val linkData = LinkData(
id = mediaDetails?.ids?.tmdb,
imdbId = mediaDetails?.ids?.imdb.toString(),
tvdbId = mediaDetails?.ids?.tvdb,
type = data.type.toString(),
title = mediaDetails?.title,
year = mediaDetails?.year,
orgTitle = mediaDetails?.title,
isAnime = isAnime,
//jpTitle = later if needed as it requires another network request,
airedDate = mediaDetails?.released
?: mediaDetails?.firstAired,
isAsian = isAsian,
isBollywood = isBollywood,
).toJson()
return newMovieLoadResponse(
name = mediaDetails?.title!!,
url = data.toJson(),
dataUrl = linkData.toJson(),
type = if (isAnime) TvType.AnimeMovie else TvType.Movie,
) {
this.name = mediaDetails.title
this.apiName = "Trakt"
this.type = if (isAnime) TvType.AnimeMovie else TvType.Movie
this.posterUrl = getOriginalWidthImageUrl(posterUrl)
this.year = mediaDetails.year
this.plot = mediaDetails.overview
this.rating = mediaDetails.rating?.times(1000)?.roundToInt()
this.tags = mediaDetails.genres
this.duration = mediaDetails.runtime
this.recommendations = relatedMedia
this.actors = actors
this.comingSoon = isUpcoming(mediaDetails.released)
//posterHeaders
this.backgroundPosterUrl = getOriginalWidthImageUrl(backDropUrl)
this.contentRating = mediaDetails.certification
addTrailer(mediaDetails.trailer)
addImdbId(mediaDetails.ids?.imdb)
addTMDbId(mediaDetails.ids?.tmdb.toString())
}
} else {
val resSeasons = getApi("$traktApiUrl/shows/${mediaDetails?.ids?.trakt.toString()}/seasons?extended=cloud9,full,episodes")
val episodes = mutableListOf<Episode>()
val seasons = parseJson<List<Seasons>>(resSeasons)
val seasonsNames = mutableListOf<SeasonData>()
seasons.forEach { season ->
seasonsNames.add(
SeasonData(
season.number!!,
season.title
)
)
season.episodes?.map { episode ->
val linkData = LinkData(
id = mediaDetails?.ids?.tmdb,
imdbId = mediaDetails?.ids?.imdb.toString(),
tvdbId = mediaDetails?.ids?.tvdb,
type = data.type.toString(),
season = episode.season,
episode = episode.number,
title = mediaDetails?.title,
year = mediaDetails?.year,
orgTitle = mediaDetails?.title,
isAnime = isAnime,
airedYear = mediaDetails?.year,
lastSeason = seasons.size,
epsTitle = episode.title,
//jpTitle = later if needed as it requires another network request,
date = episode.firstAired,
airedDate = episode.firstAired,
isAsian = isAsian,
isBollywood = isBollywood,
isCartoon = isCartoon
).toJson()
episodes.add(
Episode(
data = linkData.toJson(),
name = episode.title,
season = episode.season,
episode = episode.number,
posterUrl = fixPath(episode.images?.screenshot?.firstOrNull()),
rating = episode.rating?.times(10)?.roundToInt(),
description = episode.overview,
).apply {
this.addDate(episode.firstAired)
}
)
}
}
return newTvSeriesLoadResponse(
name = mediaDetails?.title!!,
url = data.toJson(),
type = if (isAnime) TvType.Anime else TvType.TvSeries,
episodes = episodes
) {
this.name = mediaDetails.title
this.apiName = "Trakt"
this.type = if (isAnime) TvType.Anime else TvType.TvSeries
this.episodes = episodes
this.posterUrl = getOriginalWidthImageUrl(posterUrl)
this.year = mediaDetails.year
this.plot = mediaDetails.overview
this.showStatus = getStatus(mediaDetails.status)
this.rating = mediaDetails.rating?.times(1000)?.roundToInt()
this.tags = mediaDetails.genres
this.duration = mediaDetails.runtime
this.recommendations = relatedMedia
this.actors = actors
this.comingSoon = isUpcoming(mediaDetails.released)
//posterHeaders
this.seasonNames = seasonsNames
this.backgroundPosterUrl = getOriginalWidthImageUrl(backDropUrl)
this.contentRating = mediaDetails.certification
addTrailer(mediaDetails.trailer)
addImdbId(mediaDetails.ids?.imdb)
addTMDbId(mediaDetails.ids?.tmdb.toString())
}
}
}
private suspend fun getApi(url: String) : String {
return app.get(
url = url,
headers = mapOf(
"Content-Type" to "application/json",
"trakt-api-version" to "2",
"trakt-api-key" to traktClientId,
)
).toString()
}
private fun isUpcoming(dateString: String?): Boolean {
return try {
val format = SimpleDateFormat("yyyy-MM-dd", Locale.getDefault())
val dateTime = dateString?.let { format.parse(it)?.time } ?: return false
APIHolder.unixTimeMS < dateTime
} catch (t: Throwable) {
logError(t)
false
}
}
private fun getStatus(t: String?): ShowStatus {
return when (t) {
"returning series" -> ShowStatus.Ongoing
"continuing" -> ShowStatus.Ongoing
else -> ShowStatus.Completed
}
}
private fun fixPath(url: String?): String? {
url ?: return null
return "https://$url"
}
private fun getWidthImageUrl(path: String?, width: String) : String? {
if (path == null) return null
if (!path.contains("image.tmdb.org")) return fixPath(path)
val fileName = Uri.parse(path).lastPathSegment ?: return null
return "https://image.tmdb.org/t/p/${width}/${fileName}"
}
private fun getOriginalWidthImageUrl(path: String?) : String? {
if (path == null) return null
if (!path.contains("image.tmdb.org")) return fixPath(path)
return getWidthImageUrl(path, "original")
}
data class Data(
val type: TvType? = null,
val mediaDetails: MediaDetails? = null,
)
data class MediaDetails(
@JsonProperty("title") val title: String? = null,
@JsonProperty("year") val year: Int? = null,
@JsonProperty("ids") val ids: Ids? = null,
@JsonProperty("tagline") val tagline: String? = null,
@JsonProperty("overview") val overview: String? = null,
@JsonProperty("released") val released: String? = null,
@JsonProperty("runtime") val runtime: Int? = null,
@JsonProperty("country") val country: String? = null,
@JsonProperty("updatedAt") val updatedAt: String? = null,
@JsonProperty("trailer") val trailer: String? = null,
@JsonProperty("homepage") val homepage: String? = null,
@JsonProperty("status") val status: String? = null,
@JsonProperty("rating") val rating: Double? = null,
@JsonProperty("votes") val votes: Long? = null,
@JsonProperty("comment_count") val commentCount: Long? = null,
@JsonProperty("language") val language: String? = null,
@JsonProperty("languages") val languages: List<String>? = null,
@JsonProperty("available_translations") val availableTranslations: List<String>? = null,
@JsonProperty("genres") val genres: List<String>? = null,
@JsonProperty("certification") val certification: String? = null,
@JsonProperty("aired_episodes") val airedEpisodes: Int? = null,
@JsonProperty("first_aired") val firstAired: String? = null,
@JsonProperty("airs") val airs: Airs? = null,
@JsonProperty("network") val network: String? = null,
@JsonProperty("images") val images: Images? = null,
@JsonProperty("movie") @JsonAlias("show") val media: MediaDetails? = null
)
data class Airs(
@JsonProperty("day") val day: String? = null,
@JsonProperty("time") val time: String? = null,
@JsonProperty("timezone") val timezone: String? = null,
)
data class Ids(
@JsonProperty("trakt") val trakt: Int? = null,
@JsonProperty("slug") val slug: String? = null,
@JsonProperty("tvdb") val tvdb: Int? = null,
@JsonProperty("imdb") val imdb: String? = null,
@JsonProperty("tmdb") val tmdb: Int? = null,
@JsonProperty("tvrage") val tvrage: String? = null,
)
data class Images(
@JsonProperty("fanart") val fanart: List<String>? = null,
@JsonProperty("poster") val poster: List<String>? = null,
@JsonProperty("logo") val logo: List<String>? = null,
@JsonProperty("clearart") val clearart: List<String>? = null,
@JsonProperty("banner") val banner: List<String>? = null,
@JsonProperty("thumb") val thumb: List<String>? = null,
@JsonProperty("screenshot") val screenshot: List<String>? = null,
@JsonProperty("headshot") val headshot: List<String>? = null,
)
data class People(
@JsonProperty("cast") val cast: List<Cast>? = null,
)
data class Cast(
@JsonProperty("character") val character: String? = null,
@JsonProperty("characters") val characters: List<String>? = null,
@JsonProperty("episode_count") val episodeCount: Long? = null,
@JsonProperty("person") val person: Person? = null,
@JsonProperty("images") val images: Images? = null,
)
data class Person(
@JsonProperty("name") val name: String? = null,
@JsonProperty("ids") val ids: Ids? = null,
@JsonProperty("images") val images: Images? = null,
)
data class Seasons(
@JsonProperty("aired_episodes") val airedEpisodes: Int? = null,
@JsonProperty("episode_count") val episodeCount: Int? = null,
@JsonProperty("episodes") val episodes: List<TraktEpisode>? = null,
@JsonProperty("first_aired") val firstAired: String? = null,
@JsonProperty("ids") val ids: Ids? = null,
@JsonProperty("images") val images: Images? = null,
@JsonProperty("network") val network: String? = null,
@JsonProperty("number") val number: Int? = null,
@JsonProperty("overview") val overview: String? = null,
@JsonProperty("rating") val rating: Double? = null,
@JsonProperty("title") val title: String? = null,
@JsonProperty("updated_at") val updatedAt: String? = null,
@JsonProperty("votes") val votes: Int? = null,
)
data class TraktEpisode(
@JsonProperty("available_translations") val availableTranslations: List<String>? = null,
@JsonProperty("comment_count") val commentCount: Int? = null,
@JsonProperty("episode_type") val episodeType: String? = null,
@JsonProperty("first_aired") val firstAired: String? = null,
@JsonProperty("ids") val ids: Ids? = null,
@JsonProperty("images") val images: Images? = null,
@JsonProperty("number") val number: Int? = null,
@JsonProperty("number_abs") val numberAbs: Int? = null,
@JsonProperty("overview") val overview: String? = null,
@JsonProperty("rating") val rating: Double? = null,
@JsonProperty("runtime") val runtime: Int? = null,
@JsonProperty("season") val season: Int? = null,
@JsonProperty("title") val title: String? = null,
@JsonProperty("updated_at") val updatedAt: String? = null,
@JsonProperty("votes") val votes: Int? = null,
)
data class LinkData(
val id: Int? = null,
val imdbId: String? = null,
val tvdbId: Int? = null,
val type: String? = null,
val season: Int? = null,
val episode: Int? = null,
val aniId: String? = null,
val animeId: String? = null,
val title: String? = null,
val year: Int? = null,
val orgTitle: String? = null,
val isAnime: Boolean = false,
val airedYear: Int? = null,
val lastSeason: Int? = null,
val epsTitle: String? = null,
val jpTitle: String? = null,
val date: String? = null,
val airedDate: String? = null,
val isAsian: Boolean = false,
val isBollywood: Boolean = false,
val isCartoon: Boolean = false,
)
}

View file

@ -1,7 +1,10 @@
package com.lagradost.cloudstream3.ui.player
import android.annotation.SuppressLint
import android.content.*
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.graphics.drawable.AnimatedImageDrawable
import android.graphics.drawable.AnimatedVectorDrawable
import android.media.metrics.PlaybackErrorEvent
@ -24,11 +27,7 @@ import androidx.fragment.app.Fragment
import androidx.media3.common.PlaybackException
import androidx.media3.exoplayer.ExoPlayer
import androidx.media3.session.MediaSession
import androidx.media3.ui.AspectRatioFrameLayout
import androidx.media3.ui.DefaultTimeBar
import androidx.media3.ui.PlayerView
import androidx.media3.ui.SubtitleView
import androidx.media3.ui.TimeBar
import androidx.media3.ui.*
import androidx.preference.PreferenceManager
import androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat
import com.github.rubensousa.previewseekbar.PreviewBar
@ -442,6 +441,9 @@ abstract class AbstractPlayerFragment(
is VideoEndedEvent -> {
context?.let { ctx ->
// Resets subtitle delay on ended video
player.setSubtitleOffset(0)
// Only play next episode if autoplay is on (default)
if (PreferenceManager.getDefaultSharedPreferences(ctx)
?.getBoolean(

View file

@ -1118,6 +1118,9 @@ class CS3IPlayer : IPlayer {
}
Player.STATE_ENDED -> {
// Resets subtitle delay on ended video
setSubtitleOffset(0)
// Only play next episode if autoplay is on (default)
if (PreferenceManager.getDefaultSharedPreferences(context)
?.getBoolean(

View file

@ -14,13 +14,7 @@ import android.os.Bundle
import android.provider.Settings
import android.text.Editable
import android.text.format.DateUtils
import android.view.KeyEvent
import android.view.LayoutInflater
import android.view.MotionEvent
import android.view.Surface
import android.view.View
import android.view.ViewGroup
import android.view.WindowManager
import android.view.*
import android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
import android.view.animation.AlphaAnimation
import android.view.animation.Animation
@ -50,7 +44,6 @@ import com.lagradost.cloudstream3.ui.settings.Globals
import com.lagradost.cloudstream3.ui.settings.Globals.EMULATOR
import com.lagradost.cloudstream3.ui.settings.Globals.TV
import com.lagradost.cloudstream3.ui.settings.Globals.isLayout
import com.lagradost.cloudstream3.ui.settings.SettingsFragment
import com.lagradost.cloudstream3.utils.AppUtils.isUsingMobileData
import com.lagradost.cloudstream3.utils.DataStoreHelper
import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showDialog
@ -498,6 +491,11 @@ open class FullScreenPlayer : AbstractPlayerFragment() {
dialog.dismissSafe(activity)
player.seekTime(1L)
}
resetBtt.setOnClickListener {
subtitleDelay = 0
dialog.dismissSafe(activity)
player.seekTime(1L)
}
cancelBtt.setOnClickListener {
subtitleDelay = beforeOffset
dialog.dismissSafe(activity)
@ -1159,6 +1157,7 @@ open class FullScreenPlayer : AbstractPlayerFragment() {
}
}
KeyEvent.KEYCODE_DPAD_DOWN,
KeyEvent.KEYCODE_DPAD_UP -> {
if (!isShowing) {
onClickChange()

View file

@ -33,6 +33,7 @@ import com.lagradost.cloudstream3.ui.WatchType
import com.lagradost.cloudstream3.ui.download.DownloadButtonSetup
import com.lagradost.cloudstream3.ui.player.ExtractorLinkGenerator
import com.lagradost.cloudstream3.ui.player.GeneratorPlayer
import com.lagradost.cloudstream3.ui.player.NEXT_WATCH_EPISODE_PERCENTAGE
import com.lagradost.cloudstream3.ui.quicksearch.QuickSearchFragment
import com.lagradost.cloudstream3.ui.result.ResultFragment.getStoredData
import com.lagradost.cloudstream3.ui.result.ResultFragment.updateUIEvent
@ -782,7 +783,10 @@ class ResultFragmentTv : Fragment() {
// resultEpisodeLoading.isVisible = episodes is Resource.Loading
if (episodes is Resource.Success) {
val lastWatchedIndex = episodes.value.indexOfLast { ep -> ep.videoWatchState == VideoWatchState.Watched }
val lastWatchedIndex = episodes.value.indexOfLast { ep ->
ep.getWatchProgress() >= NEXT_WATCH_EPISODE_PERCENTAGE.toFloat() / 100.0f || ep.videoWatchState == VideoWatchState.Watched
}
val firstUnwatched = episodes.value.getOrElse(lastWatchedIndex + 1) { episodes.value.firstOrNull() }
if (firstUnwatched != null) {

View file

@ -5,6 +5,7 @@ import android.content.*
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.text.format.Formatter.formatFileSize
import android.util.Log
import android.widget.Toast
import androidx.annotation.MainThread
@ -20,7 +21,6 @@ import com.lagradost.cloudstream3.APIHolder.apis
import com.lagradost.cloudstream3.APIHolder.getId
import com.lagradost.cloudstream3.APIHolder.unixTime
import com.lagradost.cloudstream3.APIHolder.unixTimeMS
import com.lagradost.cloudstream3.AcraApplication.Companion.context
import com.lagradost.cloudstream3.AcraApplication.Companion.setKey
import com.lagradost.cloudstream3.CommonActivity.activity
import com.lagradost.cloudstream3.CommonActivity.getCastSession
@ -1280,9 +1280,14 @@ class ResultViewModel2 : ViewModel() {
callback: (Pair<LinkLoadingResult, Int>) -> Unit,
) {
loadLinks(result, isVisible = true, type) { links ->
// Could not find a better way to do this
val context = AcraApplication.context
postPopup(
text,
links.links.map { txt("${it.name} ${Qualities.getStringByInt(it.quality)}") }) {
links.links.apmap {
val size = it.getVideoSize()?.let { size -> " " + formatFileSize(context, size) } ?: ""
txt("${it.name} ${Qualities.getStringByInt(it.quality)}$size")
}) {
callback.invoke(links to (it ?: return@postPopup))
}
}

View file

@ -1,13 +1,13 @@
package com.lagradost.cloudstream3.ui.settings
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import androidx.annotation.StringRes
import androidx.core.view.children
import androidx.core.view.isVisible
import androidx.core.view.updateLayoutParams
import androidx.fragment.app.Fragment
import androidx.preference.Preference
@ -18,12 +18,14 @@ import com.lagradost.cloudstream3.BuildConfig
import com.lagradost.cloudstream3.R
import com.lagradost.cloudstream3.databinding.MainSettingsBinding
import com.lagradost.cloudstream3.mvvm.logError
import com.lagradost.cloudstream3.syncproviders.AccountManager
import com.lagradost.cloudstream3.syncproviders.AccountManager.Companion.accountManagers
import com.lagradost.cloudstream3.ui.home.HomeFragment
import com.lagradost.cloudstream3.ui.result.txt
import com.lagradost.cloudstream3.ui.settings.Globals.EMULATOR
import com.lagradost.cloudstream3.ui.settings.Globals.TV
import com.lagradost.cloudstream3.ui.settings.Globals.isLayout
import com.lagradost.cloudstream3.utils.DataStoreHelper
import com.lagradost.cloudstream3.utils.UIHelper
import com.lagradost.cloudstream3.utils.UIHelper.clipboardHelper
import com.lagradost.cloudstream3.utils.UIHelper.navigate
@ -133,7 +135,6 @@ class SettingsFragment : Fragment() {
val localBinding = MainSettingsBinding.inflate(inflater, container, false)
binding = localBinding
return localBinding.root
//return inflater.inflate(R.layout.main_settings, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
@ -141,21 +142,44 @@ class SettingsFragment : Fragment() {
activity?.navigate(id, Bundle())
}
// used to debug leaks showToast(activity,"${VideoDownloadManager.downloadStatusEvent.size} : ${VideoDownloadManager.downloadProgressEvent.size}")
/** used to debug leaks
showToast(activity,"${VideoDownloadManager.downloadStatusEvent.size} :
${VideoDownloadManager.downloadProgressEvent.size}") **/
for (syncApi in accountManagers) {
val login = syncApi.loginInfo()
val pic = login?.profilePicture ?: continue
if (binding?.settingsProfilePic?.setImage(
pic,
errorImageDrawable = HomeFragment.errorProfilePic
) == true
) {
binding?.settingsProfileText?.text = login.name
binding?.settingsProfile?.isVisible = true
break
fun hasProfilePictureFromAccountManagers(accountManagers: List<AccountManager>): Boolean {
for (syncApi in accountManagers) {
val login = syncApi.loginInfo()
val pic = login?.profilePicture ?: continue
if (binding?.settingsProfilePic?.setImage(
pic,
errorImageDrawable = HomeFragment.errorProfilePic
) == true
) {
binding?.settingsProfileText?.text = login.name
return true // sync profile exists
}
}
return false // not syncing
}
// display local account information if not syncing
if (!hasProfilePictureFromAccountManagers(accountManagers)) {
val activity = activity ?: return
val currentAccount = try {
DataStoreHelper.accounts.firstOrNull {
it.keyIndex == DataStoreHelper.selectedKeyIndex
} ?: activity.let { DataStoreHelper.getDefaultAccount(activity) }
} catch (t: IllegalStateException) {
Log.e("AccountManager", "Activity not found", t)
null
}
binding?.settingsProfilePic?.setImage(currentAccount?.image)
binding?.settingsProfileText?.text = currentAccount?.name
}
binding?.apply {
listOf(
settingsGeneral to R.id.action_navigation_global_to_navigation_settings_general,

View file

@ -98,6 +98,7 @@ val appLanguages = arrayListOf(
Triple("", "македонски", "mk"),
Triple("", "മലയാളം", "ml"),
Triple("", "bahasa Melayu", "ms"),
Triple("", "Malti", "mt"),
Triple("", "ဗမာစာ", "my"),
Triple("", "नेपाली", "ne"),
Triple("", "Nederlands", "nl"),

View file

@ -217,6 +217,8 @@ import com.lagradost.cloudstream3.extractors.Zorofile
import com.lagradost.cloudstream3.extractors.Zplayer
import com.lagradost.cloudstream3.extractors.ZplayerV2
import com.lagradost.cloudstream3.extractors.Ztreamhub
import com.lagradost.cloudstream3.extractors.EPlayExtractor
import com.lagradost.cloudstream3.extractors.Vtbe
import com.lagradost.cloudstream3.mvvm.logError
import com.lagradost.cloudstream3.mvvm.normalSafeApiCall
import kotlinx.coroutines.delay
@ -402,9 +404,29 @@ open class ExtractorLink constructor(
open val extractorData: String? = null,
open val type: ExtractorLinkType,
) : VideoDownloadManager.IDownloadableMinimum {
val isM3u8 : Boolean get() = type == ExtractorLinkType.M3U8
val isDash : Boolean get() = type == ExtractorLinkType.DASH
val isM3u8: Boolean get() = type == ExtractorLinkType.M3U8
val isDash: Boolean get() = type == ExtractorLinkType.DASH
// Cached video size
private var videoSize: Long? = null
/**
* Get video size in bytes with one head request. Only available for ExtractorLinkType.Video
* @param timeoutSeconds timeout of the head request.
*/
suspend fun getVideoSize(timeoutSeconds: Long = 3L): Long? {
// Content-Length is not applicable to other types of formats
if (this.type != ExtractorLinkType.VIDEO) return null
videoSize = videoSize ?: runCatching {
val response =
app.head(this.url, headers = headers, referer = referer, timeout = timeoutSeconds)
response.headers["Content-Length"]?.toLong()
}.getOrNull()
return videoSize
}
@JsonIgnore
fun getAllHeaders() : Map<String, String> {
if (referer.isBlank()) {
@ -864,7 +886,9 @@ val extractorApis: MutableList<ExtractorApi> = arrayListOf(
Megacloud(),
VidhideExtractor(),
StreamWishExtractor(),
EmturbovidExtractor()
EmturbovidExtractor(),
Vtbe(),
EPlayExtractor()
)

View file

@ -50,7 +50,7 @@ class JsUnpacker(packedJS: String?) {
throw Exception("Unknown p.a.c.k.e.r. encoding")
}
val unbase = Unbase(radix)
p = Pattern.compile("\\b\\w+\\b")
p = Pattern.compile("""\b[a-zA-Z0-9_]+\b""")
m = p.matcher(payload)
val decoded = StringBuilder(payload)
var replaceOffset = 0

View file

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="@android:color/white">
<item>
<shape android:shape="oval">
<stroke
android:width="2dp"
android:color="?attr/white" />
<corners android:radius="10dp" />
</shape>
</item>
</ripple>

View file

@ -24,7 +24,6 @@
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="20dp"
android:visibility="gone"
tools:visibility="visible">
<androidx.cardview.widget.CardView
@ -36,7 +35,11 @@
android:id="@+id/settings_profile_pic"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:ignore="ContentDescription" />
android:scaleType="centerCrop"
android:foreground="@drawable/rounded_outline"
tools:src="@drawable/profile_bg_orange"
android:contentDescription="@string/account"/>
</androidx.cardview.widget.CardView>
<TextView
@ -50,7 +53,7 @@
android:textColor="?attr/textColor"
android:textSize="18sp"
android:textStyle="normal"
tools:text="Hello world" />
tools:text="Quick Brown Fox" />
</LinearLayout>
<TextView

View file

@ -38,21 +38,20 @@
android:requiresFadingEdge="vertical"
android:id="@+id/video_tracks_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_rowWeight="1"
android:background="?attr/primaryBlackBackground"
android:nextFocusLeft="@id/sort_subtitles"
android:nextFocusRight="@id/apply_btt"
android:nextFocusRight="@id/audio_tracks_holder"
tools:listitem="@layout/sort_bottom_single_choice" />
</LinearLayout>
<LinearLayout
android:id="@+id/audio_tracks_holder"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="50"
android:orientation="vertical">
android:id="@+id/audio_tracks_holder"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="50"
android:orientation="vertical">
<!-- android:id="@+id/subs_settings" android:foreground="?android:attr/selectableItemBackgroundBorderless"
-->
@ -107,17 +106,16 @@
</LinearLayout>
<ListView
android:requiresFadingEdge="vertical"
android:id="@+id/auto_tracks_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_rowWeight="1"
android:background="?attr/primaryBlackBackground"
android:nextFocusLeft="@id/sort_providers"
android:nextFocusRight="@id/cancel_btt"
tools:listfooter="@layout/sort_bottom_footer_add_choice"
tools:listitem="@layout/sort_bottom_single_choice" />
android:requiresFadingEdge="vertical"
android:id="@+id/auto_tracks_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_rowWeight="1"
android:background="?attr/primaryBlackBackground"
android:nextFocusRight="@id/apply_btt"
android:nextFocusLeft="@id/video_tracks_list"
tools:listfooter="@layout/sort_bottom_footer_add_choice"
tools:listitem="@layout/sort_bottom_single_choice" />
</LinearLayout>
</LinearLayout>
@ -132,11 +130,12 @@
<com.google.android.material.button.MaterialButton
style="@style/WhiteButton"
android:layout_gravity="center_vertical|end"
android:text="@string/sort_apply"
android:id="@+id/apply_btt"
android:layout_width="wrap_content" />
style="@style/WhiteButton"
android:layout_gravity="center_vertical|end"
android:text="@string/sort_apply"
android:id="@+id/apply_btt"
android:nextFocusLeft="@id/auto_tracks_list"
android:layout_width="wrap_content" />
<com.google.android.material.button.MaterialButton
style="@style/BlackButton"

View file

@ -113,6 +113,13 @@
<requestFocus />
</com.google.android.material.button.MaterialButton>
<com.google.android.material.button.MaterialButton
android:id="@+id/reset_btt"
style="@style/BlackButton"
android:layout_width="wrap_content"
android:layout_gravity="center_vertical|end"
android:text="@string/reset_btn" />
<com.google.android.material.button.MaterialButton
android:id="@+id/cancel_btt"
style="@style/BlackButton"

View file

@ -143,7 +143,7 @@
<string name="loading">لودينگ…</string>
<string name="action_remove_watching">شيل</string>
<string name="action_open_watching">بَعِد مَعلومات</string>
<string name="category_updates">التجديد والنسخات الاحتياطية</string>
<string name="category_updates">التجديدات والنسخات الاحتياطية</string>
<string name="pref_filter_search_quality">خبي هيدي الجودات من نتائج التنبيش</string>
<string name="type_on_hold">موقف موقتًا</string>
<string name="app_name">كلود ستريم</string>
@ -448,7 +448,7 @@
<string name="skip_type_recap">التلخيص</string>
<string name="yes">إِيه</string>
<string name="actor_main">الرئيسي</string>
<string name="apply_on_restart">طبّق وقتما سكّر الآپ</string>
<string name="apply_on_restart">سكر الآپ حتى تطبق التغيرات</string>
<string name="help">ساعدوني</string>
<string name="subtitle_offset_extra_hint_before_format">عوز هيدا إذا عم بتبين الترجمة %d ميلي ثانية بعدما لازم</string>
<string name="app_not_found_error">ما نلاقا الآپ</string>
@ -614,4 +614,12 @@
<string name="clipboard_unknown_error">في ارور بالنسخ. پليز نسوخ الـLogcat 🐈 وبعته ل المسؤولين عن دعم الآپ.</string>
<string name="biometric_warning">هلّق نعمل نسخة احتياطية للداتا تبع \"كلود ستريم\". إذا مابق ينفتح ويمشي الآپ، فيك تعمل كلير للداتا تبعه وترَجع الداتا من النسخة الاحتياطية اللي هلّق عملنالك ياها.
\nالاحتمال انو مابق ينفتح الآپ احتمالية زغيرة كتير، بس كل جهاز بيتصرف بشكل مختلف، ونحنا منعتذر إذا سببنا أي إزعاج.</string>
<string name="ok">أوكي</string>
<string name="battery_dialog_title">وقف اپتميزايشن بطارية جهازك</string>
<string name="app_unrestricted_toast">بطارية الآپ اصلًا محطوطة ع «غير مقيد» \"Unrestricted\"</string>
<string name="app_info_intent_error">ما قدرنا نفتح معلومات الآپ تبع \"كلود ستريم\".</string>
<string name="music_singlar">موسيقى</string>
<string name="audio_book_singular">أوديو بوك</string>
<string name="custom_media_singluar">الميديا</string>
<string name="battery_dialog_message">لتضمن عدم انقطاع التنزيلات والنوتيفيكايشنات للبرامج التلفزيونية يلي مشتركلها، الآپ \"كلود ستريم\" بده إذن ليمشي بـ الباكگروند. ازا كبست أوكي، رح تتوجه ع صفحة معلومات التطبيق. هونيك، نزال حتى توصل ل «استخدام بطارية التطبيق» \"App battery usage\" وحط استخدام البطارية ع «غير مقيد» \"Unrestricted\". ملاحظة إنو هيدا الإذن ما بيعني إنو \"كلود ستريم 3\" رح تستنزف البطارية. ومش رح يشتغل الآن بـ الباكگروند إلّا عند الضرورة، متل لمّا تتلقا نوتيفيكايشن أو تنزل ڤيديو من الريپو الاصلي. فيك ترجع ترد هيدا الستنگ بـ«الإعدادات العامة» \"General settings\"، إزا غيرت رأيك.</string>
</resources>

View file

@ -440,7 +440,7 @@
<string name="tracks">المسارات</string>
<string name="audio_tracks">مسار الصوت</string>
<string name="video_tracks">مسار الفيديو</string>
<string name="apply_on_restart">تطبيق بعد إعادة التشغيل</string>
<string name="apply_on_restart">أعد تشغيل التطبيق لرؤية التغييرات.</string>
<string name="safe_mode_title">الوضع الآمن قيد التشغيل</string>
<string name="safe_mode_description">تم إيقاف تشغيل جميع الملحقات بسبب عطل لمساعدتك في العثور على الإضافة التي تسبب مشكلة.</string>
<string name="safe_mode_crash_info">عرض بيانات الاعطال</string>
@ -641,4 +641,13 @@
<string name="clipboard_permission_error">خطأ في الوصول الي حافظة النسخ، برجاء المحاولة مرة اخرى.</string>
<string name="toast_copied">تم النسخ!</string>
<string name="clipboard_unknown_error">خطأ في عملية النسخ، برجاء نسخ ال logcat و ارساله الى مسؤولين دعم التطبيق.</string>
<string name="battery_dialog_title">تعطيل تحسين البطارية</string>
<string name="app_unrestricted_toast">تم ضبط استخدام بطارية التطبيق بالفعل على غير مقيد</string>
<string name="app_info_intent_error">غير قادر على فتح معلومات تطبيق CloudStream.</string>
<string name="audio_book_singular">كتاب صوتي</string>
<string name="ok">حسناً</string>
<string name="battery_dialog_message">لضمان عدم انقطاع التنزيلات والإشعارات للبرامج التلفزيونية المشتركة، يحتاج CloudStream إلى إذن للتشغيل في الخلفية. بالضغط على موافق، سيتم توجيهك إلى معلومات التطبيق. هناك، انتقل إلى استخدام بطارية التطبيق
\nواضبط استخدام البطارية على غير مقيد. يرجى ملاحظة أن هذا الإذن لا يعني أن CS3 سوف يستنزف البطارية. ولن يعمل إلا في الخلفية عند الضرورة، كما هو الحال عند تلقي الإشعارات أو تنزيل مقاطع الفيديو من الملحقات الرسمية. إذا اخترت الإلغاء، فيمكنك ضبط هذا الإعداد لاحقًا في الإعدادات العامة.</string>
<string name="music_singlar">موسيقى</string>
<string name="custom_media_singluar">الوسائط</string>
</resources>

View file

@ -50,7 +50,7 @@
<string name="pick_source">Fontes</string>
<string name="pick_subtitle">Legendas</string>
<string name="reload_error">Tentando conectar novamente…</string>
<string name="go_back">Voltar</string>
<string name="go_back">Volte</string>
<string name="play_episode">Reproduzir episódio</string>
<!--<string name="need_storage">Permirtir baixar episódios</string>-->
<string name="download">Download</string>
@ -145,7 +145,7 @@
<string name="backup_failed_error_format">Erro no backup de %s</string>
<string name="search">Procurar</string>
<string name="category_account">Contas e Segurança</string>
<string name="category_updates">Atualizações e backup</string>
<string name="category_updates">Atualizações e Backup</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>
@ -473,7 +473,7 @@
<string name="nsfw_singular">Conteúdo +18</string>
<string name="help">Ajuda</string>
<string name="redo_setup_process">Processo de configuração de Redo</string>
<string name="update_notification_failed">Não pudemos instalar a nova versão do App</string>
<string name="update_notification_failed">Não foi possível instalar a nova versão do aplicativo</string>
<string name="apk_installer_package_installer">instalador de pacotes</string>
<string name="sort_by">Organizar por</string>
<string name="sort_rating_desc">Votação (Alta para Baixa)</string>
@ -541,7 +541,7 @@
<string name="player_settings_play_in_mpv">MPV</string>
<string name="skip_type_mixed_op">Abrindo mistura</string>
<string name="player_settings_play_in_vlc">VLC</string>
<string name="apply_on_restart">Aplicar quando reiniciar</string>
<string name="apply_on_restart">Reinicie o aplicativo para ver as alterações.</string>
<string name="safe_mode_crash_info">Visualização info de crash</string>
<string name="audio_tracks">Faixas de áudio</string>
<string name="sort_updated_new">Adicionado em (novo para antigo)</string>
@ -631,4 +631,12 @@
<string name="clipboard_permission_error">Erro ao acessar a área de transferência. Tente novamente.</string>
<string name="repo_copy_label">Nome e URL do repositório</string>
<string name="clipboard_unknown_error">Erro ao copiar. Copie o logcat e entre em contato com o suporte do aplicativo.</string>
<string name="battery_dialog_message">Para garantir downloads e notificações ininterruptos para programas de TV assinados, o CloudStream precisa de permissão para ser executado em segundo plano. Ao pressionar OK, você será direcionado para as informações do aplicativo. Lá, vá até Uso da bateria do aplicativo e defina o uso da bateria como Irrestrito. Observe que esta permissão não significa que o CS3 irá descarregar sua bateria. Ele só funcionará em segundo plano quando necessário, como ao receber notificações ou baixar vídeos de extensões oficiais. Se você optar por cancelar, poderá ajustar essa configuração posteriormente nas Configurações Gerais.</string>
<string name="ok">Ok</string>
<string name="battery_dialog_title">Desativar otimização de bateria</string>
<string name="app_unrestricted_toast">O uso da bateria do app já está definido como irrestrito</string>
<string name="app_info_intent_error">Não foi possível abrir as informações do aplicativo CloudStream.</string>
<string name="music_singlar">Música</string>
<string name="audio_book_singular">Áudio-livro</string>
<string name="custom_media_singluar">Mídia</string>
</resources>

View file

@ -383,7 +383,7 @@
<string name="plugins_downloaded" formatted="true">Staženo: %d</string>
<string name="audio_tracks">Zvukové stopy</string>
<string name="video_tracks">Videostopy</string>
<string name="apply_on_restart">Použít při restartu</string>
<string name="apply_on_restart">Restartujte aplikaci pro použití změn.</string>
<string name="safe_mode_title">Bezpečný režim povolen</string>
<string name="extension_size">Velikost</string>
<string name="extension_authors">Autoři</string>
@ -633,4 +633,12 @@
<string name="clipboard_unknown_error">Chyba při kopírování, zkopírujte prosím protokol a kontaktujte podporu aplikace.</string>
<string name="toast_copied">Zkopírováno!</string>
<string name="clipboard_permission_error">Chyba při přístupu ke schránce, zkuste to prosím znovu.</string>
<string name="ok">OK</string>
<string name="app_unrestricted_toast">Využití baterie aplikací je již nastaveno na neomezené</string>
<string name="app_info_intent_error">Nepodařilo se otevřít informace o aplikaci CloudStream.</string>
<string name="music_singlar">Hudba</string>
<string name="custom_media_singluar">Média</string>
<string name="battery_dialog_title">Zakažte optimalizace baterie</string>
<string name="battery_dialog_message">Aby bylo zajištěno nepřetržité stahování a upozornění na odebírané seriály, potřebuje aplikace CloudStream povolení ke spuštění na pozadí. Stisknutím tlačítka OK budete přesměrováni na informace o aplikaci. Tam přejděte na položku Využití baterie aplikací a nastavte možnost Využití baterie na hodnotu Neomezené. Upozorňujeme, že toto povolení neznamená, že CS3 bude vybíjet baterii. Na pozadí bude pracovat pouze v případě potřeby, například při přijímání oznámení nebo stahování videí z oficiálních rozšíření. Pokud se rozhodnete toto nastavení zrušit, můžete jej později upravit v Obecných nastaveních.</string>
<string name="audio_book_singular">Audiokniha</string>
</resources>

View file

@ -281,7 +281,7 @@
<string name="skip_setup">Omitir configuración</string>
<string name="preferred_media_subtext">Qué quieres ver</string>
<string name="uppercase_all_subtitles">Poner en MAYÚSCULAS todos los subtítulos</string>
<string name="apply_on_restart">Se aplicarán los cambios al reiniciar la App</string>
<string name="apply_on_restart">Se aplicarán los cambios al reiniciar la App.</string>
<string name="player_settings_play_in_app">Reproductor interno</string>
<string name="extension_language">Idioma</string>
<string name="apk_installer_legacy">Legacy (método antiguo)</string>
@ -609,4 +609,12 @@
<string name="toast_copied">¡Copiado!</string>
<string name="clipboard_unknown_error">Error al copiar. Por favor, copie el logcat y comuníquese con el soporte de la aplicación.</string>
<string name="clipboard_permission_error">Error al acceder al portapapeles. Inténtelo de nuevo.</string>
<string name="ok">De acuerdo</string>
<string name="battery_dialog_title">Desactivar optimización de batería</string>
<string name="music_singlar">Música</string>
<string name="app_unrestricted_toast">El uso de la batería de la aplicación está configurado sin restricciones</string>
<string name="app_info_intent_error">No se puede abrir la información de la aplicación CloudStream.</string>
<string name="custom_media_singluar">Media</string>
<string name="audio_book_singular">Audiolibro</string>
<string name="battery_dialog_message">Para garantizar descargas y notificaciones ininterrumpidas para programas de televisión suscritos, CloudStream necesita permiso para ejecutarse en segundo plano. Al presionar OK, se le dirigirá a información de la aplicación. Allí, desplácese hasta Uso de la batería de la aplicación y establezca el uso de la batería en Sin restricciones. Tenga en cuenta que este permiso no significa que CS3 agotará su batería. Solo funcionará en segundo plano cuando sea necesario, como cuando reciba notificaciones o descargue videos de extensiones oficiales. Si decide cancelar, puede ajustar esta configuración más adelante en los ajustes generales.</string>
</resources>

View file

@ -33,16 +33,16 @@
<string name="next_episode_time_hour_format" formatted="true">%1$dساعت %2$dدقیقه</string>
<string name="next_episode_time_min_format" formatted="true">%dدقیقه</string>
<string name="home_main_poster_img_des">پوستر اصلی</string>
<string name="torrent">تورنت</string>
<string name="torrent">تورنتها</string>
<string name="free_storage">آزاد</string>
<string name="documentaries">مستند ها</string>
<string name="documentaries">مستندها</string>
<string name="ova">انیمیشن ویدیویی اصلی</string>
<string name="max">حداکثر</string>
<string name="movies">فیلم‌ها</string>
<string name="tv_series">سریال های تلویزیونی</string>
<string name="asian_drama">درام های آسیایی</string>
<string name="asian_drama">درامهای آسیایی</string>
<string name="anime">انیمه</string>
<string name="cartoons">کارتونها</string>
<string name="cartoons">کارتونها</string>
<string name="used_storage">استفاده شده</string>
<string name="app_storage">برنامه</string>
<string name="go_back_img_des">بازگشت</string>
@ -52,7 +52,7 @@
<string name="action_open_watching">اطلاعات بیشتر</string>
<string name="torrent_plot">شرح</string>
<string name="subs_subtitle_languages">زبان زیرنویس</string>
<string name="player_subtitles_settings">زیرنویس</string>
<string name="player_subtitles_settings">زیرنویسها</string>
<string name="action_remove_from_bookmarks">حذف</string>
<string name="download_started">بارگیری آغاز شد</string>
<string name="pref_disable_acra">غیرفعال کردن گذارش باگ خودکار</string>
@ -128,4 +128,67 @@
<string name="type_completed">به پایان رسیده</string>
<string name="result_open_in_browser">باز کردن در مرورگر</string>
<string name="type_plan_to_watch">برنامه‌ریزی برای تماشا</string>
<string name="subs_hold_to_reset_to_default">برای بازنشانی به پیشفرض نگه‌دارید</string>
<string name="library">کتابخانه</string>
<string name="status_ongoing">درادامه</string>
<string name="delete_message" formatted="true">این فرآیند بطور کامل %s را حذف می‌کند
\nآیا از این کار اطمینان دارید؟</string>
<string name="repo_copy_label">نام مخزن و نشانی</string>
<string name="toast_copied">رونویسی شد!</string>
<string name="settings_info">درباره</string>
<string name="subs_font">قلم</string>
<string name="subs_font_size">اندازه قلم</string>
<string name="swipe_to_change_settings">برای تغییر تنظیمات بکشید</string>
<string name="swipe_to_change_settings_des">برای تغییر میزان روشنایی یا صدا در سمت چپ و راست به بالا یا پایین بکشید</string>
<string name="automatic_plugin_updates">بروزرسانی خودکار افزونه</string>
<string name="start">آغاز</string>
<string name="app_language">زبان برنامه</string>
<string name="play_episode_toast">پخش قسمت</string>
<string name="year">سال</string>
<string name="movies_singular">فیلم</string>
<string name="tv_series_singular">سریال</string>
<string name="anime_singular">انیمه</string>
<string name="subs_outline_color">رنگ حاشیه متن</string>
<string name="player_size_settings">دکمه تغییر‌اندازه پخش‌کننده</string>
<string name="speed_setting_summary">افزودن گزینه سرعت در پخش‌کننده</string>
<string name="category_updates">بروزرسانی‌ و پشتیبانی</string>
<string name="kitsu_settings">نمایش پوستر از طریق Kitsu</string>
<string name="advanced_search">جستجوی پیشرفته</string>
<string name="season">فصل</string>
<string name="episode">قسمت</string>
<string name="season_short">ف</string>
<string name="episode_short">ق</string>
<string name="other_singular">ویدئو</string>
<string name="source_error">خطای منبع</string>
<string name="test_log">گزارش</string>
<string name="player_size_settings_des">حذف حاشیه سیاه</string>
<string name="player_subtitles_settings_des">تنظیمات زیرنویس پخش‌کننده</string>
<string name="category_account">حساب‌ها و امنیت</string>
<string name="show_log_cat">نمایش گزارش‌پیوسته 🐈</string>
<string name="copy_link_toast">پیوند در بریده‌دان رونویسی شد</string>
<string name="no_links_found_toast">هیچ پیوندی یافت‌نشد</string>
<string name="asian_drama_singular">درام آسیایی</string>
<string name="automatic_plugin_download">بارگیری خودکار افزونه‌ها</string>
<string name="documentaries_singular">مستند</string>
<string name="eigengraumode_settings">سرعت پخش</string>
<string name="no_episodes_found">هیچ قسمتی یافت‌نشد</string>
<string name="rated_format" formatted="true">امتیاز: %.1f</string>
<string name="subs_import_text" formatted="true">قلم‌ها را با گذاشتن در %s وارد کنید</string>
<string name="resume">ادامه</string>
<string name="subs_default_reset_toast">بازگردانی به مقدار پیشفرض</string>
<string name="go_back_30">−۳۰</string>
<string name="go_forward_30">+۳۰</string>
<string name="delete_file">حذف پرونده</string>
<string name="show_trailers_settings">نمایش پیش‌پرده‌ها</string>
<string name="episodes">قسمت‌ها</string>
<string name="resume_time_left" formatted="true">%dد
\nباقیمانده</string>
<string name="github">گیتهاب</string>
<string name="pref_filter_search_quality">نهان کردن کیفیت ویدئو انتخابی در نتایج جستجو</string>
<string name="cancel">لغو</string>
<string name="resume_remaining" formatted="true">%s
\nباقیمانده</string>
<string name="action_default">پیش‌فرض</string>
<string name="cartoons_singular">کارتون</string>
<string name="torrent_singular">تورنت</string>
</resources>

View file

@ -279,7 +279,7 @@
<string name="backup_failed">Permissions de stockage manquantes. Veuillez réessayer.</string>
<string name="backup_failed_error_format">Erreur de sauvegarde %s</string>
<string name="search">Recherche</string>
<string name="category_account">Comptes</string>
<string name="category_account">Comptes et Sécurité</string>
<string name="category_updates">Mises à jour et sauvegarde</string>
<string name="settings_info">Info</string>
<string name="advanced_search">Recherche avancée</string>

View file

@ -138,7 +138,7 @@
<string name="backup_failed_error_format">Error saat mencadang %s</string>
<string name="search">Cari</string>
<string name="category_account">Akun dan Keamanan</string>
<string name="category_updates">Update dan cadangan</string>
<string name="category_updates">Update dan Cadangan</string>
<string name="settings_info">Info</string>
<string name="advanced_search">Pencarian Lanjutan</string>
<string name="advanced_search_des">Memberikan hasil pencarian yang dipisahkan berdasarkan provider</string>
@ -432,7 +432,7 @@
<string name="safe_mode_title">Semua Umur</string>
<string name="single_plugin_disabled" formatted="true">%s (Tidak aktif)</string>
<string name="tracks">Trek</string>
<string name="apply_on_restart">Terapkan saat dimuat ulang</string>
<string name="apply_on_restart">Terapkan saat dimuat ulang untuk melihat perubahan.</string>
<string name="extension_description">Keterangan</string>
<string name="extension_version">Versi</string>
<string name="extension_status">Status</string>
@ -630,4 +630,12 @@
<string name="clipboard_permission_error">Gagal mengakses Papan Klip, mohon coba lagi.</string>
<string name="toast_copied">disalin!</string>
<string name="clipboard_unknown_error">Gagal menyalin, mohon salin logcat dan hubungi pengembang aplikasi.</string>
<string name="ok">Oke</string>
<string name="battery_dialog_title">Matikan pengoptimalan Baterai</string>
<string name="app_unrestricted_toast">Pemakaian baterai untuk aplikasi ini sudah diatur menjadi tidak dibatasi</string>
<string name="app_info_intent_error">Gagal membuka info aplikasi CloudStream.</string>
<string name="music_singlar">Musik</string>
<string name="audio_book_singular">Buku Audio</string>
<string name="custom_media_singluar">Media</string>
<string name="battery_dialog_message">Untuk memastikan unduhan dan pemberitahuan tanpa gangguan untuk acara TV berlangganan, CloudStream memerlukan izin untuk berjalan di latar belakang. Dengan menekan OK, Anda akan diarahkan ke Info aplikasi. Di sana, gulir ke Penggunaan baterai aplikasi dan atur penggunaan baterai ke Tidak Terbatas. Harap dicatat, izin ini tidak berarti CS3 akan menguras baterai Anda. Ini hanya akan beroperasi di latar belakang ketika diperlukan, seperti ketika menerima pemberitahuan atau mengunduh video dari ekstensi resmi. Jika Anda memilih untuk membatalkannya, Anda dapat menyesuaikan pengaturan ini nanti di Pengaturan Umum.</string>
</resources>

View file

@ -432,7 +432,7 @@
<string name="tracks">Tracce</string>
<string name="audio_tracks">Traccia audio</string>
<string name="video_tracks">Traccia video</string>
<string name="apply_on_restart">Applica al riavvio</string>
<string name="apply_on_restart">Riavvia app per visualizzare le modifiche.</string>
<string name="safe_mode_title">Safe mode attiva</string>
<string name="safe_mode_description">Tutte le estensioni sono state disabilitate a causa di un arresto anomalo per aiutarti a trovare l\'estensione che causa il problema.</string>
<string name="safe_mode_crash_info">Vedi informazioni del crash</string>
@ -629,4 +629,12 @@
<string name="toast_copied">copiato!</string>
<string name="clipboard_permission_error">Errore durante l\'accesso agli Appunti. Riprova.</string>
<string name="clipboard_unknown_error">Errore durante la copia. Copia logcat e contatta il supporto dell\'app.</string>
<string name="ok">OK</string>
<string name="battery_dialog_title">Disabilita ottimizzazione della batteria</string>
<string name="app_info_intent_error">Impossibile aprire le informazioni sull\'app CloudStream.</string>
<string name="custom_media_singluar">Media</string>
<string name="battery_dialog_message">Per garantire download e notifiche ininterrotti per i programmi TV sottoscritti, CloudStream necessita dell\'autorizzazione per l\'esecuzione in background. Premendo OK, verrai indirizzato alle informazioni sull\'app. Successivamente, scorri fino a \"Utilizzo della batteria\" e imposta l\'utilizzo della batteria su \"Senza restrizioni\". Tieni presente che questa autorizzazione non significa che CS3 scaricherà la batteria. Funzionerà in background solo quando necessario, ad esempio quando si ricevono notifiche o si scaricano video da estensioni ufficiali. Se scegli di annullare, puoi modificare questa impostazione più tardi in \"Impostazioni generali\".</string>
<string name="app_unrestricted_toast">L\'utilizzo della batteria dell\'app è già impostato su \"Senza restrizioni\"</string>
<string name="music_singlar">Musica</string>
<string name="audio_book_singular">Audiolibro</string>
</resources>

View file

@ -3,14 +3,14 @@
<!-- TRANSLATE, BUT DON'T FORGET FORMAT -->
<string name="player_speed_text_format" formatted="true">വേഗം (%.2fx)</string>
<string name="rated_format" formatted="true">റേറ്റിംഗ്: %.1f</string>
<string name="new_update_format" formatted="true">പുതിയ അപ്ഡേറ്റ്
<string name="new_update_format" formatted="true">പുതിയ അപ്ഡേറ്റ്!
\n%1$s -&gt; %2$s</string>
<string name="app_name">CloudStream</string>
<string name="app_name">ക്ലൗഡ് സ്ട്രീം</string>
<string name="title_home">ഹോം</string>
<string name="title_search">തിരയുക</string>
<string name="title_downloads">ഡൗൺലോഡ്സ്</string>
<string name="title_settings">സെറ്റിങ്‌സ്</string>
<string name="search_hint">തിരയുക</string>
<string name="search_hint">തിരയുക</string>
<string name="no_data">ടാറ്റ ലഭ്യമല്ല</string>
<string name="episode_more_options_des">കൂടുതൽ ഓപ്ഷൻസ്</string>
<string name="next_episode">അടുത്ത എപ്പിസോഡ്</string>
@ -167,11 +167,11 @@
<string name="watch_quality_pref">ഔചിത്യ വീഡിയോ ക്വാളിറ്റി</string>
<string name="history">ചരിത്രം</string>
<string name="action_mark_as_watched">കണ്ടതാണെന്ന് അടയാളപ്പെടുത്തുക</string>
<string name="next_episode_time_day_format" formatted="true">%1$d%2$d</string>
<string name="next_episode_format" formatted="true">yg5t4r%dujyhtg</string>
<string name="next_episode_time_day_format" formatted="true">%d ദിവസങ്ങൾ %d മണിക്കൂർ %d മിനിറ്റ്</string>
<string name="next_episode_format" formatted="true">അധ്യായം%dൽ റിലീസ് ചെയ്യും</string>
<string name="next_episode_time_hour_format" formatted="true">%1$d മണിക്കൂർ %2$d മിനിറ്റ്</string>
<string name="app_dub_sub_episode_text_format" formatted="true">%1$sghj%2$d</string>
<string name="cast_format" formatted="true">rtf:%</string>
<string name="app_dub_sub_episode_text_format" formatted="true">%1$sഅധ്യാ%2$d</string>
<string name="cast_format" formatted="true">കാസ്റ്റ്:%s</string>
<string name="create_account">അക്കൗണ്ട് ഉണ്ടാക്കുക</string>
<string name="delayed_update_notice">പുറത്ത്പോകുന്നതോടുകൂടി ആപ് അപ്ഡേറ്റ് ആവുന്നതാണ്</string>
<string name="select_library">ലൈബ്രറി തിരഞ്ഞെടുക്കുക</string>
@ -179,8 +179,8 @@
<string name="play_trailer_button">ട്രെയിലർ പ്ലേ ചെയ്യുക</string>
<string name="play_livestream_button">ലൈവ് സ്ട്രീം പ്ലേ ചെയ്യുക</string>
<string name="filler" formatted="true">ഫില്ലർ</string>
<string name="duration_format" formatted="true">%d min</string>
<string name="play_with_app_name">ക്ലൗഡ് സ്ട്രീം ഉപയോഗിച്ച് കളിക്കുക</string>
<string name="duration_format" formatted="true">%d മിനിറ്റ്</string>
<string name="play_with_app_name">ക്ലൗഡ് സ്ട്രീം ഉപയോഗിച്ച് പ്രവർത്തിപ്പിക്കുക</string>
<string name="home_next_random_img_des">അടുത്ത ക്രമരഹിതമായ</string>
<string name="episode_poster_img_des">എപ്പിസോഡ് പോസ്റ്റർ</string>
<string name="update_started">അപ്ഡേറ്റ് ആരംഭിച്ചു</string>
@ -188,7 +188,7 @@
<string name="search_poster_img_des">പോസ്റ്റർ</string>
<string name="skip_loading">ലോഡിംഗ് ഒഴിവാക്കുക</string>
<string name="search_hint_site" formatted="true">തിരയുക %s…</string>
<string name="next_episode_time_min_format" formatted="true">%dm</string>
<string name="next_episode_time_min_format" formatted="true">%dമിനിറ്റ്</string>
<string name="go_back_img_des">മടങ്ങിപ്പോവുക</string>
<string name="preview_background_img_des">പശ്ചാത്തല പ്രിവ്യൂ</string>
<string name="result_poster_img_des">പോസ്റ്റർ</string>
@ -202,8 +202,6 @@
<string name="view_public_repositories_button_short">പൊതു പട്ടിക</string>
<string name="blank_repo_message">CloudStream-ന് സ്ഥിരസ്ഥിതിയായി സൈറ്റുകളൊന്നും ഇൻസ്റ്റാൾ ചെയ്തിട്ടില്ല. നിങ്ങൾ റിപ്പോസിറ്ററികളിൽ നിന്ന് സൈറ്റുകൾ ഇൻസ്റ്റാൾ ചെയ്യേണ്ടതുണ്ട്.
\n
\nസ്കൈ യുകെ ലിമിറ്റഡിലെ ഡോഗ്‌ഷിറ്റ് ആളുകളിൽ നിന്ന് DMCA നീക്കം ചെയ്‌തതിനാൽ 🤮 ഞങ്ങൾക്ക് ആപ്പിൽ റിപ്പോസിറ്ററി സൈറ്റ് ലിങ്ക് ചെയ്യാൻ കഴിയില്ല.
\n
\nഞങ്ങളുടെ ഡിസ്കോർഡിൽ ചേരുക അല്ലെങ്കിൽ ഓൺലൈനിൽ തിരയുക.</string>
<string name="sort_copy">പകർത്തുക</string>
<string name="uppercase_all_subtitles">എല്ലാ സബ്‌ടൈറ്റിലുകളും വലിയക്ഷരമാക്കുക</string>
@ -214,7 +212,7 @@
<string name="manage_accounts">അക്കൗണ്ടുകൾ കൈകാര്യം ചെയ്യുക</string>
<string name="coming_soon">ഉടൻ വരുന്നു…</string>
<string name="apply_on_restart">പുനരാരംഭിക്കുമ്പോൾ പ്രയോഗിക്കുക</string>
<string name="edit_account">അക്കൗണ്ട് എഡിറ്റ് ചെയ്യുക</string>
<string name="edit_account">അക്കൗണ്ട് തിരുത്തുക</string>
<string name="pin_error_incorrect">തെറ്റായ പിൻ. ദയവായി വീണ്ടും ശ്രമിക്കുക.</string>
<string name="stop">നിർത്തുക</string>
<string name="tracks">ട്രാക്കുകൾ</string>
@ -245,4 +243,41 @@
<string name="source_error">ഉറവിട പിശക്</string>
<string name="enter_current_pin">നിലവിലെ പിൻ നൽകുക</string>
<string name="audio_tracks">ഓഡിയോ ട്രാക്കുകൾ</string>
<string name="picture_in_picture">ചിത്രം-ഇൻ-ചിത്രം</string>
<string name="sort_updated_old">പുതുക്കിയത് (പഴയത് മുതൽ പുതിയത് വരെ)</string>
<string name="sort_rating_desc">റേറ്റിംഗ് (ഉയർന്നത് മുതൽ താഴ്ന്നത്)</string>
<string name="apk_installer_legacy">പാരമ്പര്യം</string>
<string name="subs_window_color">വിൻഡോ നിറം</string>
<string name="sort_clear">ക്ലിയർ</string>
<string name="test_log">ലോഗ്</string>
<string name="recommendations_tooltip">ശുപാർശകൾ കാണിക്കുക</string>
<string name="logged_account" formatted="true">%s ആയി ലോഗിൻ ചെയ്തു</string>
<string name="sort_by">ഇങ്ങനെ അടുക്കുക</string>
<string name="sort">അടുക്കുക</string>
<string name="edit">തിരുത്തുക</string>
<string name="sort_updated_new">പുതുക്കിയത് (പുതിയത് മുതൽ പഴയത് വരെ)</string>
<string name="nsfw_singular">NSFW</string>
<string name="update_notification_installing">ആപ്പ് അപ്ഡേറ്റ് ഇൻസ്റ്റാൾ ചെയ്യുന്നു…</string>
<string name="category_updates">അപ്ഡേറ്റുകളും ഒപ്പം ബാക്കപ്പും</string>
<string name="single_plugin_disabled" formatted="true">%s(അപ്രാപ്തമാക്കി)</string>
<string name="sort_rating_asc">റേറ്റിംഗ് (താഴ്ന്നത് മുതൽ ഉയർന്നത് വരെ)</string>
<string name="subs_text_color">വാചക നിറം</string>
<string name="update_notification_failed">ആപ്പിൻ്റെ പുതിയ പതിപ്പ് ഇൻസ്റ്റാൾ ചെയ്യാനായില്ല</string>
<string name="apk_installer_package_installer">പാക്കേജ് ഇൻസ്റ്റാളർ</string>
<string name="sort_alphabetical_a">അക്ഷരമാലാക്രമം (A മുതൽ Z വരെ)</string>
<string name="sort_alphabetical_z">അക്ഷരമാലാക്രമം (Z മുതൽ A വരെ)</string>
<string name="empty_library_logged_in_message">ഈ ലിസ്റ്റ് ശൂന്യമാണ്. മറ്റൊന്നിലേക്ക് മാറാൻ ശ്രമിക്കുക.</string>
<string name="clear_history">ചരിത്രം മായ്ക്കുക</string>
<string name="show_log_cat">ലോഗ്കാറ്റ് കാണിക്കുക 🐈</string>
<string name="empty_library_no_accounts_message">നിങ്ങളുടെ ലൈബ്രറി ശൂന്യമാണ് :(
\nഒരു ലൈബ്രറി അക്കൗണ്ടിൽ ലോഗിൻ ചെയ്യുക അല്ലെങ്കിൽ നിങ്ങളുടെ പ്രാദേശിക ലൈബ്രറിയിലേക്ക് ഷോകൾ ചേർക്കുക.</string>
<string name="other_singular">വീഡിയോ</string>
<string name="repo_copy_label">റിപ്പോസിറ്ററി നാമവും URL ഉം</string>
<string name="toast_copied">പകർത്തി!</string>
<string name="subscribe_tooltip">പുതിയ എപ്പിസോഡ് അറിയിപ്പ്</string>
<string name="result_search_tooltip">മറ്റ് വിപുലീകരണങ്ങളിൽ തിരയുക</string>
<string name="subtitles_settings">ഉപശീർഷകം ക്രമീകരണങ്ങൾ</string>
<string name="subs_edge_type">എഡ്ജ് തരം</string>
<string name="subs_outline_color">ഔട്ട്ലൈൻ നിറം</string>
<string name="subs_background_color">പശ്ചാത്തല നിറം</string>
</resources>

View file

@ -0,0 +1,126 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="subtitles_settings">Preferenzi tas-sottotitli</string>
<string name="subs_text_color">Kulur tal-kitba</string>
<string name="subs_window_color">Kulur tat-Tieqa</string>
<string name="search_provider_text_types">Fittex bl-użu ta \'tipi</string>
<string name="subs_import_text" formatted="true">Importa fonts billi tpoġġihom ġo %s</string>
<string name="vpn_torrent">Dan il-fornitur huwa torrent, VPN huwa rakkomandat</string>
<string name="cast_format" formatted="true">Atturi: %s</string>
<string name="next_episode_format" formatted="true">L-episodju %d ha johrog fil</string>
<string name="next_episode_time_hour_format" formatted="true">%1$dh %2$dm</string>
<string name="next_episode_time_min_format" formatted="true">%dm</string>
<string name="result_poster_img_des">Kartellun</string>
<string name="search_poster_img_des">Kartellun</string>
<string name="episode_poster_img_des">Kartellun tal-episodju</string>
<string name="home_main_poster_img_des">Kartellun Principali</string>
<string name="home_next_random_img_des">Li jmiss bl\'addoċċ</string>
<string name="home_change_provider_img_des">Ibdel Il-fornitur</string>
<string name="player_speed_text_format" formatted="true">veloċità (%.2fx)</string>
<string name="rated_format" formatted="true">Klassifikazzjoni: %.1f</string>
<string name="new_update_format" formatted="true">Aġġornament ġdid misjub!
\n%1$s -&gt; %2$s</string>
<string name="duration_format" formatted="true">%d min</string>
<string name="app_name">CloudStream</string>
<string name="play_with_app_name">Ara bil-CloudStream</string>
<string name="title_home">Dar</string>
<string name="title_search">Fittex</string>
<string name="title_downloads">Imnizzel</string>
<string name="title_settings">Preferenzi</string>
<string name="search_hint">Fittex…</string>
<string name="search_hint_site" formatted="true">Fittex%s…</string>
<string name="no_data">Bla dejta</string>
<string name="episode_more_options_des">Iktar Preferenzi</string>
<string name="next_episode">L-episodju li\'jmiss</string>
<string name="result_tags">Ġeneri</string>
<string name="result_share">Aqsam</string>
<string name="result_open_in_browser">Iftah fil-brawser</string>
<string name="browser">Brawser</string>
<string name="skip_loading">Aqbez it-tagħbija</string>
<string name="loading">Tagħbija…</string>
<string name="type_watching">Jaraw</string>
<string name="type_on_hold">Stenna ftit</string>
<string name="type_completed">Lest</string>
<string name="type_dropped">Imwaqqa</string>
<string name="type_plan_to_watch">Pjana biex tara</string>
<string name="type_re_watching">Terġa\' tara</string>
<string name="play_trailer_button">Ibda t-trejler</string>
<string name="play_livestream_button">Ibda l-livestream</string>
<string name="play_torrent_button">Stream Torrent</string>
<string name="pick_source">Sorsi</string>
<string name="reload_error">Erġa\' pprova l-konnessjoni…</string>
<string name="go_back">Mur lura</string>
<string name="play_episode">Ibda l-episodju</string>
<string name="download_paused">Tniżżila ppawzata</string>
<string name="downloading">Qed jinżlu</string>
<string name="downloaded">Imniżżel</string>
<string name="download_canceled">Tniżżil ikkanċellat</string>
<string name="download_done">Lest it-tniżżil</string>
<string name="update_started">Beda l-aġġornament</string>
<string name="stream">Network stream</string>
<string name="error_loading_links_toast">Tagħbija tal-Links falliet</string>
<string name="links_reloaded_toast">Links regaw gew mogħbija</string>
<string name="download_storage_text">Ħażna Interna</string>
<string name="app_dubbed_text">Dub</string>
<string name="home_play">Ibda</string>
<string name="home_info">Info</string>
<string name="action_add_to_bookmarks">Issettja l-istatus ta-rajtux</string>
<string name="sort_apply">Applika</string>
<string name="sort_copy">Ikkopja</string>
<string name="sort_close">Għalaq</string>
<string name="sort_clear">Neħħi</string>
<string name="sort_save">Issevja</string>
<string name="repo_copy_label">Isem tar-repożitorju u URL</string>
<string name="toast_copied">Ikkupjat!</string>
<string name="subscribe_tooltip">Notifika ta\' episodju ġdid</string>
<string name="result_search_tooltip">Fittex f\'estensjonijiet oħra</string>
<string name="recommendations_tooltip">Uri r-rakkomandazzjonijiet</string>
<string name="player_speed">Veloċità tal-Plejer</string>
<string name="subs_outline_color">Kulur tal-Kontorn</string>
<string name="subs_background_color">Kulur tal-Isfond</string>
<string name="subs_edge_type">Tip tat-tarf</string>
<string name="subs_subtitle_elevation">Elevazzjoni tas-Sottotitolu</string>
<string name="subs_font">Font</string>
<string name="subs_font_size">Daqs tal-font</string>
<string name="search_provider_text_providers">Fittex bl-użu ta\' fornituri</string>
<string name="benene_count_text">%d Benenes mogħtija lil devs</string>
<string name="benene_count_text_none">Ebda Benenes mogħtija</string>
<string name="subs_auto_select_language">Agħżel il-Lingwa Awtomatikament</string>
<string name="subs_download_languages">Niżżel Lingwi</string>
<string name="subs_subtitle_languages">Lingwa tas-sottotitolu</string>
<string name="subs_hold_to_reset_to_default">Żomm biex tirrisettja għal default</string>
<string name="continue_watching">Kompli Ara</string>
<string name="action_remove_watching">Neħħi</string>
<string name="action_open_watching">Iktar informazzjoni</string>
<string name="action_open_play">@string/home_play</string>
<string name="vpn_might_be_needed">Jista\' jkun hemm bżonn ta\' VPN biex dan il-fornitur jaħdem b\'mod korrett</string>
<string name="provider_info_meta">Il-metadata mhix ipprovduta mis-sit, it-tagħbija tal-vidjo se tfalli jekk ma teżistix fuq is-sit.</string>
<string name="torrent_plot">Deskrizzjoni</string>
<string name="normal_no_plot">Lebda Plot misjub</string>
<string name="torrent_no_plot">Lebda Deskrizzjoni misjuba</string>
<string name="show_log_cat">Uri Logcat 🐈</string>
<string name="test_log">ġurnal</string>
<string name="picture_in_picture">Stampa f-istampa</string>
<string name="picture_in_picture_des">Ikompli d-daqq fi player minjatura fuq apps oħra</string>
<string name="app_dub_sub_episode_text_format" formatted="true">%1$s Ep %2$d</string>
<string name="next_episode_time_day_format" formatted="true">%1$dd %2$dh %3$dm</string>
<string name="go_back_img_des">Mur Lura</string>
<string name="preview_background_img_des">Ara l\'isfond</string>
<string name="filler" formatted="true">Mili</string>
<string name="play_movie_button">Ibda l-film</string>
<string name="pick_subtitle">Sottotitli</string>
<string name="app_subbed_text">Sut</string>
<string name="popup_play_file">Ibda l-fajl</string>
<string name="download">Niżżel</string>
<string name="popup_delete_file">Hassar il-fajl</string>
<string name="popup_resume_download">Kompli Nizzel</string>
<string name="popup_pause_download">Ieqaf Nizzel</string>
<string name="pref_disable_acra">Iddiżattiva r-rappurtar awtomatiku tal-bugs</string>
<string name="home_more_info">Iktar Informazzjoni</string>
<string name="home_expanded_hide">Aħbi</string>
<string name="filter_bookmarks">Iffiltra l-Bookmarks</string>
<string name="download_started">Beda t-tniżżil</string>
<string name="error_bookmarks_text">Bookmarks</string>
<string name="action_remove_from_bookmarks">Neħħi</string>
<string name="download_failed">Falla t-tniżżil</string>
</resources>

View file

@ -137,7 +137,7 @@
<string name="backup_failed_error_format">Błąd tworzenia kopii zapasowej %s</string>
<string name="search">Szukaj</string>
<string name="category_account">Konta i zabezpieczenia</string>
<string name="category_updates">Aktualizacje i kopia zapasowa</string>
<string name="category_updates">Aktualizacje i kopie zapasowe</string>
<string name="settings_info">Informacje</string>
<string name="advanced_search">Zaawansowane wyszukiwanie</string>
<string name="advanced_search_des">Szukaj z podziałem na źródła</string>
@ -278,7 +278,7 @@
<string name="random_button_settings_desc">Pokaż przycisk do losowania na stronie głównej i w bibliotece</string>
<string name="provider_lang_settings">Języki rozszerzeń</string>
<string name="app_layout">Układ aplikacji</string>
<string name="preferred_media_settings">Preferowane media</string>
<string name="preferred_media_settings">Preferowane multimedia</string>
<string name="enable_nsfw_on_providers">Włącz NSFW w obsługiwanych rozszerzeniach</string>
<string name="subtitles_encoding">Kodowanie napisów</string>
<string name="category_providers">Źródła</string>
@ -405,7 +405,7 @@
<string name="tracks">Ścieżki</string>
<string name="audio_tracks">Ścieżki audio</string>
<string name="video_tracks">Ścieżki wideo</string>
<string name="apply_on_restart">Zastosuj po ponownym uruchomieniu</string>
<string name="apply_on_restart">Uruchom ponownie aplikację, aby zobaczyć zmiany.</string>
<string name="safe_mode_title">Tryb bezpieczny włączony</string>
<string name="safe_mode_description">Z powodu wystąpienia błędu wszystkie rozszerzenia zostały wyłączone, aby ułatwić wykrycie tego wadliwego.</string>
<string name="safe_mode_crash_info">Wyświetl informacje o błędzie</string>
@ -610,4 +610,12 @@
<string name="clipboard_permission_error">Błąd dostępu do schowka. Spróbuj ponownie.</string>
<string name="toast_copied">skopiowano!</string>
<string name="clipboard_unknown_error">Błąd podczas kopiowania. Skopiuj logcat i skontaktuj się z pomocą techniczną aplikacji.</string>
<string name="battery_dialog_title">Wyłącz optymalizację akumulatora</string>
<string name="app_info_intent_error">Nie można otworzyć informacji o aplikacji CloudStream.</string>
<string name="music_singlar">Muzyka</string>
<string name="audio_book_singular">Audiobook</string>
<string name="ok">OK</string>
<string name="custom_media_singluar">Multimedia</string>
<string name="app_unrestricted_toast">Użycie akumulatora przez aplikację jest już ustawione na nieograniczone</string>
<string name="battery_dialog_message">Aby zapewnić nieprzerwane pobieranie i powiadomienia o subskrybowanych programach telewizyjnych, CloudStream potrzebuje pozwolenia na działanie w tle. Naciskając OK, zostaniesz przekierowany do informacji o aplikacji. Tam przewiń do użycia akumulatora przez aplikację i ustaw je na nieograniczone. Pamiętaj, że to pozwolenie nie oznacza, że CS3 będzie zużywać akumulator. Będzie działać w tle tylko wtedy, gdy będzie to konieczne, na przykład podczas odbierania powiadomień lub pobierania filmów z oficjalnych rozszerzeń. Jeśli zdecydujesz się anulować, możesz dostosować to ustawienie później w ustawieniach głównych.</string>
</resources>

View file

@ -143,7 +143,7 @@
<string name="backup_failed_error_format">Erro no backup de %s</string>
<string name="search">Procurar</string>
<string name="category_account">Contas e segurança</string>
<string name="category_updates">Atualizações e backup</string>
<string name="category_updates">Atualizações e cópias de segurança</string>
<string name="settings_info">Info</string>
<string name="advanced_search">Procura Avançada</string>
<string name="advanced_search_des">Mostra resultados separados por fornecedor</string>
@ -458,7 +458,7 @@
<string name="subscription_deleted">Inscrição cancelada em %s</string>
<string name="skip_type_mixed_ed">Final misto</string>
<string name="sort_rating_desc">Avaliações (Decrescente)</string>
<string name="apply_on_restart">Aplicar ao reiniciar</string>
<string name="apply_on_restart">Reinicie a aplicação para ver as alterações.</string>
<string name="referer">Referenciador (opcional)</string>
<string name="android_tv_interface_off_seek_settings">Player oculto - Quantidade de Busca</string>
<string name="jsdelivr_proxy">Proxy do GitHub</string>
@ -605,6 +605,14 @@
<string name="password_pin_authentication_title">Autenticação por palavra-passe/PIN</string>
<string name="biometric_unsupported">A autenticação biométrica não é suportada neste dispositivo</string>
<string name="biometric_setting_summary">Desbloqueie a aplicação com impressão digital, ID facial, PIN, padrão e palavra-passe.</string>
<string name="biometric_prompt_description">Esta janela fechar-se-á após algumas tentativas falhadas. Terá de reiniciar a aplicação.</string>
<string name="biometric_warning">Foi feita uma cópia de segurança dos seus dados CloudStream, embora a probabilidade deste caso raro seja muito baixa, mas todos os dispositivos se comportam de forma diferente. No caso de ficar impedido de aceder à aplicação, na pior das hipóteses, limpe totalmente os dados da aplicação e restaure a cópia de segurança. Lamentamos profundamente qualquer inconveniente.</string>
<string name="biometric_prompt_description">Este ecrã foi encerrado devido a várias tentativas falhadas. Reinicie a aplicação.</string>
<string name="biometric_warning">Os dados do seu CloudStream já foram copiados. Embora a possibilidade de isto acontecer ser muito baixa, todos os dispositivos podem comportar-se de forma diferente. No caso raro de ficar impedido de aceder à aplicação, limpe completamente os dados da aplicação e restaure a partir de uma cópia de segurança. Lamentamos qualquer incómodo causado por esta situação.</string>
<string name="ok">OK</string>
<string name="app_unrestricted_toast">A utilização da bateria da aplicação já está definida como sem restrições</string>
<string name="app_info_intent_error">Não é possível abrir a informação da aplicação CloudStream.</string>
<string name="music_singlar">Música</string>
<string name="audio_book_singular">Livro Aúdio</string>
<string name="custom_media_singluar">Multimédia</string>
<string name="battery_dialog_title">Desativar a otimização da bateria</string>
<string name="battery_dialog_message">Para garantir descarregamentos ininterruptos e notificações de programas de TV subscritos, o CloudStream precisa de permissão para ser executado em segundo plano. Ao premir OK, será direcionado para informações da aplicação. Aí, desloque-se para utilização da bateria da aplicação e defina a utilização da bateria para sem restrições. Tenha em atenção que esta permissão não significa que o CS3 irá esgotar a sua bateria. Este só funcionará em segundo plano quando necessário, como ao receber notificações ou baixar vídeos de extensões oficiais. Se optar por cancelar, pode ajustar esta definição mais tarde em definições gerais.</string>
</resources>

View file

@ -39,7 +39,7 @@
<string name="filler" formatted="true">Заполнитель</string>
<string name="app_name">CloudStream</string>
<string name="action_remove_from_bookmarks">Убирать</string>
<string name="app_dub_sub_episode_text_format" formatted="true">%1$s Серия %2$d</string>
<string name="app_dub_sub_episode_text_format" formatted="true">%1$s Ep %2$d</string>
<string name="play_with_app_name">Смотреть с CloudStream</string>
<string name="title_home">Главная</string>
<string name="title_search">Поиск</string>
@ -148,8 +148,8 @@
<string name="restore_success">Загружена резервная копия</string>
<string name="restore_failed_format" formatted="true">Не удалось восстановить данные из %s</string>
<string name="backup_failed">Отсутствует разрешение на хранение. Пожалуйста попробуйте снова.</string>
<string name="category_account">Аккаунты</string>
<string name="category_updates">Обновления и резервное копирование</string>
<string name="category_account">Аккаунты и Безопасность</string>
<string name="category_updates">Обновления и Резервное копирование</string>
<string name="settings_info">Информация</string>
<string name="advanced_search">Расширенный поиск</string>
<string name="show_trailers_settings">Показывать трейлеры</string>
@ -457,7 +457,7 @@
<string name="player_load_subtitles_online">Загрузить из интернета</string>
<string name="update_notification_downloading">Загрузка обновления приложения…</string>
<string name="error_invalid_url">Недопустимый URL</string>
<string name="apply_on_restart">Будет применено при перезапуске</string>
<string name="apply_on_restart">Перезапустите приложение, чтобы увидеть изменения.</string>
<string name="crash_reporting_title">Отчеты ошибках</string>
<string name="preferred_media_subtext">Что вы хотите увидеть</string>
<string name="provider_languages_tip">Смотрите видео на этих языках</string>
@ -593,4 +593,27 @@
<string name="test_extensions_summary">Этот тест предназначен только для разработчиков и не подтверждает или не опровергает работоспособность провайдеров.</string>
<string name="speed_setting_summary">Добавление настроек скорости в плеер</string>
<string name="test_extensions">Протестировать всех провайдеров</string>
<string name="toast_copied">скопировано!</string>
<string name="ok">ОК</string>
<string name="repo_copy_label">Имя репозитория и URL адрес</string>
<string name="clipboard_permission_error">Ошибка доступа к буферу обмена, пожалуйста, попробуйте ещё раз</string>
<string name="clipboard_unknown_error">Ошибка при копировании, пожалуйста, скопируйте лог и свяжитесь с технической поддержкой.</string>
<string name="unfavorite">Нелюбимое</string>
<string name="biometric_authentication_title">Разблокировать CloudStream</string>
<string name="favorite">Любимое</string>
<string name="app_unrestricted_toast">Использование батареи приложением уже настроено на неограниченное</string>
<string name="app_info_intent_error">Не удается открыть информацию о приложении CloudStream.</string>
<string name="biometric_setting">Заблокировать биометрией</string>
<string name="music_singlar">Музыка</string>
<string name="audio_book_singular">Аудиокнига</string>
<string name="custom_media_singluar">Медиа</string>
<string name="biometric_setting_summary">Разблокируйте приложение с помощью отпечатка пальца, Face ID, PIN-кода, шаблона и пароля.</string>
<string name="resume_remaining" formatted="true">%s
\nосталось</string>
<string name="battery_dialog_title">Отключить оптимизацию батареи</string>
<string name="password_pin_authentication_title">Аутентификация по паролю/PIN-коду</string>
<string name="biometric_unsupported">Биометрическая аутентификация на этом устройстве не поддерживается</string>
<string name="biometric_prompt_description">Этот экран был закрыт из-за нескольких неудачных попыток. Пожалуйста, перезапустите приложение.</string>
<string name="biometric_warning">Ваши данные в CloudStream были скопированы. Хотя вероятность этого очень мала, все устройства могут вести себя по-разному. В редких случаях, когда доступ к приложению заблокирован, полностью удалите данные приложения и восстановите их из резервной копии. Мы приносим свои извинения за любые неудобства, связанные с этим.</string>
<string name="battery_dialog_message">Чтобы обеспечить бесперебойную загрузку и получение уведомлений о телепередачах, на которые вы подписаны, CloudStream необходимо разрешение на запуск в фоновом режиме. Нажав OK, вы перейдете к информации о приложении. Там перейдите к разделу 𝘼𝙥𝙥 𝙗𝙖𝙩𝙩𝙚𝙧𝙮 𝙪𝙨𝙖𝙜𝙚 и установите значение \"Использование батареи\" 𝙐𝙣𝙧𝙚𝙨𝙩𝙧𝙞𝙘𝙩𝙚𝙙. Пожалуйста, обратите внимание, что это разрешение не означает, что CS3 разрядит вашу батарею. Он будет работать в фоновом режиме только при необходимости, например, при получении уведомлений или загрузке видео с официальных расширений. Если вы решите отменить, вы можете изменить эту настройку позже в 𝙂𝙚𝙣𝙚𝙧𝙖𝙡 𝙎𝙚𝙩𝙩𝙞𝙣𝙜𝙨.</string>
</resources>

View file

@ -162,7 +162,7 @@
<string name="backup_failed_error_format">%s yedeklenirken hata</string>
<string name="search">Ara</string>
<string name="category_account">Hesaplar ve Güvenlik</string>
<string name="category_updates">Güncellemeler ve yedekleme</string>
<string name="category_updates">Güncellemeler ve Yedekleme</string>
<string name="settings_info">Bilgi</string>
<string name="advanced_search">Gelişmiş arama</string>
<string name="advanced_search_des">Arama sonuçlarını sağlayıcıya göre ayırır</string>
@ -466,7 +466,7 @@
<string name="tracks">Parçalar</string>
<string name="audio_tracks">Ses parçaları</string>
<string name="video_tracks">Video parçaları</string>
<string name="apply_on_restart">Yeniden başlatmada uygula</string>
<string name="apply_on_restart">Değişiklikleri görmek için uygulamayı yeniden başlatın.</string>
<string name="safe_mode_title">Güvenli mod açık</string>
<string name="safe_mode_description">Çöküşe neden olan eklentiyi bulmaya yardımcı olabilmek için tüm eklentiler kapatıldı.</string>
<string name="safe_mode_crash_info">Çökme bilgisini göster</string>
@ -656,4 +656,12 @@
<string name="toast_copied">kopyalandı!</string>
<string name="clipboard_permission_error">Panoya erişimde hata oluştu. Lütfen tekrar deneyin.</string>
<string name="clipboard_unknown_error">Kopyalama hatası. Lütfen logcat\'i kopyalayın ve uygulama desteğiyle iletişime geçin.</string>
<string name="ok">Tamam</string>
<string name="battery_dialog_title">Pil optimizasyonunu devre dışı bırak</string>
<string name="app_info_intent_error">CloudStream\'in Uygulama bilgileri açılamıyor.</string>
<string name="music_singlar">Müzik</string>
<string name="audio_book_singular">Sesli Kitap</string>
<string name="custom_media_singluar">Medya</string>
<string name="battery_dialog_message">Abone olunan TV şovları için kesintisiz indirmeleri ve bildirimleri sağlamak için, CloudStream\'in arka planda çalışmasına izin vermeniz gerekmektedir. Tamam\'a basarak Uygulama bilgilerine yönlendirileceksiniz. Orada, 𝘼𝙥𝙥 𝙗𝙖𝙩𝙩𝙚𝙧𝙮 𝙪𝙨𝙖𝙜𝙚 (Uygulama pil kullanımı) kısmına gidip pil kullanımını 𝙐𝙣𝙧𝙚𝙨𝙩𝙧𝙞𝙘𝙩𝙚𝙙 (Sınırsız) olarak ayarlayın. Bu iznin CS3\'ün pilinizi hızlıca tüketeceği anlamına gelmediğini lütfen unutmayın. Sadece gerektiğinde, resmi eklentilerden bildirim almak veya videoları indirmek gibi durumlarda arka planda çalışacaktır. İptal etmeyi seçerseniz, bu ayarı daha sonra 𝙂𝙚𝙣𝙚𝙧𝙖𝙡 𝙎𝙚𝙩𝙩𝙞𝙣𝙜𝙨 (Genel Ayarlar) bölümünden ayarlayabilirsiniz.</string>
<string name="app_unrestricted_toast">Uygulama pil kullanımı zaten sınırsız olarak ayarlanmış</string>
</resources>

View file

@ -433,7 +433,7 @@
<string name="uppercase_all_subtitles">Усі субтитри у верхньому регістрі</string>
<string name="single_plugin_disabled" formatted="true">%s (Вимкнено)</string>
<string name="video_tracks">Відео доріжки</string>
<string name="apply_on_restart">Застосується при перезавантаженні</string>
<string name="apply_on_restart">Перезапустіть застосунок, щоб побачити зміни.</string>
<string name="safe_mode_crash_info">Переглянути інформацію про збій</string>
<string name="extension_rating" formatted="true">Рейтинг: %s</string>
<string name="extension_description">Опис</string>
@ -609,4 +609,12 @@
<string name="repo_copy_label">Назва репозиторію та URL</string>
<string name="clipboard_unknown_error">Помилка копіювання, будь ласка, скопіюйте logcat й зверніться до служби підтримки застосунку.</string>
<string name="clipboard_permission_error">Помилка доступу до буфера обміну, спробуйте ще раз.</string>
<string name="ok">Добре</string>
<string name="battery_dialog_title">Вимкнути оптимізацію батареї</string>
<string name="battery_dialog_message">Щоб забезпечити безперебійне завантаження та повідомлення про підписані телепередачі, CloudStream потребує дозволу на роботу у фоновому режимі. Натиснувши \"Добре\", вас буде перенаправлено до інформації про застосунок. Там прокрутіть до \"Споживання батареї застосунком\" й встановіть використання батареї на \"Без обмежень\". Зверніть увагу, що цей дозвіл не означає, що CS3 розряджатиме вашу батарею. Він працюватиме у фоновому режимі лише за необхідності, наприклад, під час отримання повідомлень або завантаження відео з офіційних розширень. Якщо ви вирішите скасувати дозвіл, ви зможете змінити це налаштування пізніше в загальних налаштуваннях.</string>
<string name="app_unrestricted_toast">Споживання батареї застосунком вже налаштовано на без обмежень</string>
<string name="app_info_intent_error">Не вдається відкрити інформацію про застосунок CloudStream.</string>
<string name="audio_book_singular">Аудіо книга</string>
<string name="music_singlar">Музика</string>
<string name="custom_media_singluar">Медіа</string>
</resources>

View file

@ -123,7 +123,7 @@
<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">Chỉnh tốc độ phim</string>
<string name="eigengraumode_settings">Tốc độ phát</string>
<string name="swipe_to_seek_settings">Vuốt để tua nhanh</string>
<string name="swipe_to_seek_settings_des">Vuốt sang trái hoặc phải để tua video</string>
<string name="swipe_to_change_settings">Vuốt để chỉnh độ sáng và âm lượng</string>
@ -147,8 +147,8 @@
<string name="backup_failed">Thiếu quyền truy cập bộ nhớ, hãy thử lại.</string>
<string name="backup_failed_error_format">Lỗi khi sao lưu %s</string>
<string name="search">Tìm kiếm</string>
<string name="category_account">Tài khoản</string>
<string name="category_updates">Cập nhật và sao lưu</string>
<string name="category_account">Tài khoản và Bảo mật</string>
<string name="category_updates">Cập nhật và Sao lưu</string>
<string name="settings_info">Thông tin</string>
<string name="advanced_search">Tìm kiếm nâng cao</string>
<string name="advanced_search_des">Cho phép tìm kiếm theo bộ lọc từng nhà cung cấp</string>
@ -286,7 +286,7 @@
<string name="legal_notice">Disclaimer</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>
<string name="random_button_settings_desc">Hiện nút ngẫu nhiên trên Trang chủ và Thư viện</string>
<string name="provider_lang_settings">Ngôn ngữ nguồn phim</string>
<string name="app_layout">Giao diện App</string>
<string name="preferred_media_settings">Thể loại ưu tiên</string>
@ -307,7 +307,7 @@
<string name="example_username">Tài khoản</string>
<string name="example_email">Email</string>
<string name="example_ip">127.0.0.1</string>
<string name="example_site_name">Địa chỉ trang web</string>
<string name="example_site_name">Địa chỉ trang web­</string>
<string name="example_site_url">https://example.com</string>
<string name="example_lang_name">Mã ngôn ngữ (vi)</string>
<string name="login_format" formatted="true">%1$s %2$s</string>
@ -431,7 +431,7 @@
<string name="tracks">Thêm</string>
<string name="audio_tracks">Âm thanh</string>
<string name="video_tracks">Chất lượng Video</string>
<string name="apply_on_restart">Áp dụng khi khởi động lại</string>
<string name="apply_on_restart">Áp dụng khi khởi động lại.</string>
<string name="safe_mode_title">Chế độ an toàn được bật</string>
<string name="safe_mode_description">Đã xảy ra sự cố và chúng tôi đã tự động tắt tất cả các tiện ích mở rộng, hãy tìm và xóa tiện ích mở rộng đang gây ra sự cố.</string>
<string name="safe_mode_crash_info">Xem thông tin sự cố</string>
@ -535,7 +535,7 @@
\nKhông tải bất cứ tiện ích mở rộng nào khi khởi động cho đến khi loại bỏ tệp.</string>
<string name="revert">Đảo ngược lại</string>
<string name="subscription_in_progress_notification">Đang cập nhật các phim đã đăng kí</string>
<string name="jsdelivr_proxy_summary">Bỏ qua chặn GitHub bằng cách dùng jsDelivr. Có thể gây ra việc cập nhật bị chậm vài ngày.</string>
<string name="jsdelivr_proxy_summary">Bỏ qua chặn đường link GitHub bằng cách dùng jsDelivr. Có thể gây ra việc cập nhật bị chậm vài ngày.</string>
<string name="android_tv_interface_off_seek_settings_summary">Lượng tua thêm được sử dụng khi trình phát ẩn</string>
<string name="android_tv_interface_off_seek_settings">Lượng tua thêm</string>
<string name="android_tv_interface_on_seek_settings_summary">Lượng tua thêm được sử dụng khi trình phát hiện lên</string>
@ -606,4 +606,27 @@
<string name="rotate_video_desc">Hiển thị nút xoay màn hình</string>
<string name="auto_rotate_video_desc">Kích hoạt chế độ xoay màn hình tự động</string>
<string name="auto_rotate_video">Tự động xoay</string>
<string name="toast_copied">đã sao chép!</string>
<string name="clipboard_permission_error">Vấn đề truy cập Bảng ghi tạm, Hãy thử lại.</string>
<string name="clipboard_unknown_error">Lỗi sao chép, Hãy sao chép logcat và liên hệ hỗ trợ ứng dụng.</string>
<string name="favorite">Yêu thích</string>
<string name="ok">OK</string>
<string name="battery_dialog_title">Vô hiệu Tối ưu pin</string>
<string name="app_info_intent_error">Không thể mở thông tin ứng dụng của CloudStream.</string>
<string name="unfavorite">Không thích</string>
<string name="biometric_authentication_title">Mở khóa Cloudstream</string>
<string name="music_singlar">Nhạc</string>
<string name="audio_book_singular">Sách nói</string>
<string name="biometric_setting">Khóa với sinh trắc học</string>
<string name="resume_remaining" formatted="true">%s
\ncòn lại</string>
<string name="biometric_unsupported">Xác thực bằng sinh trắc học không được hỗ trợ trên thiết bị này</string>
<string name="password_pin_authentication_title">Mật khẩu/PIN Xác thực</string>
<string name="biometric_warning">Dữ liệu CloudStream của bạn đã được sao lưu. Dù khả năng rất thấp, nhưng mỗi thiết bị có thể hoạt động khác nhau. Trong trường hợp thiểu số, bạn sẽ bị khóa khỏi ứng dụng, hãy xóa dữ liệu ứng dụng và khởi tạo từ bản sao lưu. Chúng tôi rất xin lỗi vì bất kỳ sự bất tiện nào.</string>
<string name="biometric_setting_summary">Mở khóa ứng dụng bằng Vân tay, Khuôn mặt, PIN, Hình vẽ và Mật khẩu.</string>
<string name="biometric_prompt_description">Màn hình bị đóng sau nhiều lần thử thất bại. Hãy khởi động lại ứng dụng.</string>
<string name="test_extensions_summary">Phần kiểm thử này chỉ dành cho nhà phát triển và không xác nhận hay từ chối việc hoạt động của nguồn phim.</string>
<string name="app_unrestricted_toast">Chế độ tiêu thụ pin của ứng dụng đã được đặt ở mức không giới hạn</string>
<string name="custom_media_singluar">… 
\n———</string>
</resources>

View file

@ -651,4 +651,12 @@
\n剩余</string>
<string name="test_extensions">测试所有扩展</string>
<string name="toast_copied">已复制!</string>
<string name="clipboard_permission_error">访问剪贴板出错,请重试。</string>
<string name="app_unrestricted_toast">应用程序电池使用量已设置为不受限制</string>
<string name="audio_book_singular">有声书</string>
<string name="custom_media_singluar">媒体</string>
<string name="battery_dialog_title">禁用电池最佳化</string>
<string name="music_singlar">音乐</string>
<string name="app_info_intent_error">无法打开 CloudStream 的应用程序信息。</string>
<string name="biometric_setting_summary">使用指纹、面部 ID、PIN 码、图案和密码解锁应用程序。</string>
</resources>

View file

@ -767,4 +767,5 @@
<string name="music_singlar">Music</string>
<string name="audio_book_singular">Audio Book</string>
<string name="custom_media_singluar">Media</string>
<string name="reset_btn">Reset</string>
</resources>

View file

@ -0,0 +1 @@
-ചേഞ്ച്ലോഗ് ചേർത്തു!

View file

@ -0,0 +1,10 @@
ക്ലൗഡ് സ്ട്രീം-3 സിനിമകൾ, ടിവി സീരീസ്, ആനിമേഷൻ എന്നിവ സ്ട്രീം ചെയ്യാനും ഡൗൺലോഡ് ചെയ്യാനും നിങ്ങളെ അനുവദിക്കുന്നു.
പരസ്യങ്ങളും അനലിറ്റിക്‌സും കൂടാതെ ആപ്പ് വരുന്നു ഒപ്പം
ഒന്നിലധികം ട്രെയിലർ, മൂവി സൈറ്റുകൾ എന്നിവയും മറ്റും പിന്തുണയ്ക്കുന്നു, ഉദാഹരണം
ബുക്ക്മാർക്കുകൾ
ഉപശീർഷകം ഡൗൺലോഡുകൾ
ക്രോംകാസ്റ്റ് പിന്തുണ

View file

@ -0,0 +1 @@
സ്ട്രീം ഒപ്പം ഡൗൺലോഡ് സിനിമകളും, ടിവി സീരീസുകളും, ആനിമേഷനും .

View file

@ -0,0 +1 @@
ക്ലൗഡ് സ്ട്രീം

View file

@ -0,0 +1 @@
- Changelog miżjud!

View file

@ -0,0 +1,10 @@
CloudStream-3 iħallik tistrimja u tniżżel Films, Serje TV u Anime.
L-app tiġi mingħajr reklami u analytics u
jappoġġja siti multipli ta' trejlers u films, u aktar, eż.
Bookmarks
Downloads tas-sottotitli
Appoġġ tal-Chromecast

View file

@ -0,0 +1 @@
Tistrimja u tniżżel films, serje tat-TV u Anime.

View file

@ -0,0 +1 @@
CloudStream

View file

@ -0,0 +1 @@
- Добавлен список изменений!

View file

@ -0,0 +1,10 @@
CloudStream-3 позволяет транслировать и скачивать фильмы, сериалы и аниме.
Приложение поставляется без рекламы и аналитики и
поддерживает множество сайтов с трейлерами и фильмами, а также многое другое, например
Книжные закладки
Загрузка субтитров
Поддержка Chromecast

View file

@ -0,0 +1 @@
Транслируйте и скачивайте фильмы, сериалы и аниме.

View file

@ -0,0 +1 @@
Облачный поток

View file

@ -1 +1 @@
CloudStream
double_tap_seek_time_key2