Merge remote-tracking branch 'myorigin/exotime' into exotime

This commit is contained in:
IndusAryan 2024-01-22 00:13:40 +05:30
commit f2b6cf08c2
47 changed files with 659 additions and 85 deletions

View file

@ -139,6 +139,10 @@ android {
abortOnError = false abortOnError = false
checkReleaseBuilds = false checkReleaseBuilds = false
} }
buildFeatures {
buildConfig = true
}
namespace = "com.lagradost.cloudstream3" namespace = "com.lagradost.cloudstream3"
} }
@ -195,13 +199,13 @@ dependencies {
// PlayBack // PlayBack
implementation("com.jaredrummler:colorpicker:1.1.0") // Subtitle Color Picker 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.recloudstream:media-ffmpeg:1.1.0") // Custom FF-MPEG Lib for Audio Codecs
implementation("com.github.teamnewpipe:NewPipeExtractor:eac850") /* For Trailers implementation("com.github.teamnewpipe:NewPipeExtractor:6dc25f7") /* For Trailers
^ Update to Latest Commits if Trailers Misbehave, github.com/TeamNewPipe/NewPipeExtractor/commits/dev */ ^ Update to Latest Commits if Trailers Misbehave, github.com/TeamNewPipe/NewPipeExtractor/commits/dev */
implementation("com.github.albfernandez:juniversalchardet:2.4.0") // Subtitle Decoding implementation("com.github.albfernandez:juniversalchardet:2.4.0") // Subtitle Decoding
// Crash Reports (AcraApplication.kt) // Crash Reports (AcraApplication.kt)
implementation("ch.acra:acra-core:5.11.2") implementation("ch.acra:acra-core:5.11.3")
implementation("ch.acra:acra-toast:5.11.2") implementation("ch.acra:acra-toast:5.11.3")
// UI Stuff // UI Stuff
implementation("com.facebook.shimmer:shimmer:0.5.0") // Shimmering Effect (Loading Skeleton) implementation("com.facebook.shimmer:shimmer:0.5.0") // Shimmering Effect (Loading Skeleton)
@ -226,7 +230,7 @@ dependencies {
// Downloading & Networking // Downloading & Networking
implementation("androidx.work:work-runtime:2.9.0") implementation("androidx.work:work-runtime:2.9.0")
implementation("androidx.work:work-runtime-ktx:2.9.0") implementation("androidx.work:work-runtime-ktx:2.9.0")
implementation("com.github.Blatzar:NiceHttp:0.4.4") // HTTP Lib implementation("com.github.Blatzar:NiceHttp:0.4.5") // HTTP Lib
} }
tasks.register("androidSourcesJar", Jar::class) { tasks.register("androidSourcesJar", Jar::class) {

View file

@ -0,0 +1,39 @@
package com.lagradost.cloudstream3.extractors
import com.lagradost.cloudstream3.app
import com.lagradost.cloudstream3.utils.ExtractorApi
import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.utils.Qualities
open class EmturbovidExtractor : ExtractorApi() {
override var name = "Emturbovid"
override var mainUrl = "https://emturbovid.com"
override val requiresReferer = false
override suspend fun getUrl(url: String, referer: String?): List<ExtractorLink>? {
val response = app.get(
url, referer = referer ?: "$mainUrl/"
)
val playerScript =
response.document.selectXpath("//script[contains(text(),'var urlPlay')]")
.html()
val sources = mutableListOf<ExtractorLink>()
if (playerScript.isNotBlank()) {
val m3u8Url =
playerScript.substringAfter("var urlPlay = '").substringBefore("'")
sources.add(
ExtractorLink(
source = name,
name = name,
url = m3u8Url,
referer = "$mainUrl/",
quality = Qualities.Unknown.value,
isM3u8 = true
)
)
}
return sources
}
}

View file

@ -0,0 +1,43 @@
package com.lagradost.cloudstream3.extractors
import com.lagradost.cloudstream3.SubtitleFile
import com.lagradost.cloudstream3.app
import com.lagradost.cloudstream3.utils.ExtractorApi
import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.utils.INFER_TYPE
import com.lagradost.cloudstream3.utils.Qualities
open class Mediafire : ExtractorApi() {
override val name = "Mediafire"
override val mainUrl = "https://www.mediafire.com"
override val requiresReferer = true
override suspend fun getUrl(
url: String,
referer: String?,
subtitleCallback: (SubtitleFile) -> Unit,
callback: (ExtractorLink) -> Unit
) {
val res = app.get(url, referer = referer).document
val title = res.select("div.dl-btn-label").text()
val video = res.selectFirst("a#downloadButton")?.attr("href")
callback.invoke(
ExtractorLink(
this.name,
this.name,
video ?: return,
"",
getQuality(title),
INFER_TYPE
)
)
}
private fun getQuality(str: String?): Int {
return Regex("(\\d{3,4})[pP]").find(str ?: "")?.groupValues?.getOrNull(1)?.toIntOrNull()
?: Qualities.Unknown.value
}
}

View file

@ -16,13 +16,13 @@ import javax.crypto.Cipher
import javax.crypto.spec.IvParameterSpec import javax.crypto.spec.IvParameterSpec
import javax.crypto.spec.SecretKeySpec import javax.crypto.spec.SecretKeySpec
// Code found in https://github.com/Claudemirovsky/keys // Code found in https://github.com/theonlymo/keys
// special credits to @Claudemirovsky for providing key // special credits to @theonlymo for providing key
class Megacloud : Rabbitstream() { class Megacloud : Rabbitstream() {
override val name = "Megacloud" override val name = "Megacloud"
override val mainUrl = "https://megacloud.tv" override val mainUrl = "https://megacloud.tv"
override val embed = "embed-2/ajax/e-1" override val embed = "embed-2/ajax/e-1"
override val key = "https://raw.githubusercontent.com/Claudemirovsky/keys/e1/key" override val key = "https://raw.githubusercontent.com/theonlymo/keys/e1/key"
} }
class Dokicloud : Rabbitstream() { class Dokicloud : Rabbitstream() {
@ -35,7 +35,7 @@ open class Rabbitstream : ExtractorApi() {
override val mainUrl = "https://rabbitstream.net" override val mainUrl = "https://rabbitstream.net"
override val requiresReferer = false override val requiresReferer = false
open val embed = "ajax/embed-4" open val embed = "ajax/embed-4"
open val key = "https://raw.githubusercontent.com/Claudemirovsky/keys/e4/key" open val key = "https://raw.githubusercontent.com/theonlymo/keys/e4/key"
override suspend fun getUrl( override suspend fun getUrl(
url: String, url: String,

View file

@ -0,0 +1,34 @@
package com.lagradost.cloudstream3.extractors
import com.lagradost.cloudstream3.app
import com.lagradost.cloudstream3.network.WebViewResolver
import com.lagradost.cloudstream3.utils.ExtractorApi
import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.utils.Qualities
open class StreamWishExtractor : ExtractorApi() {
override var name = "StreamWish"
override var mainUrl = "https://streamwish.to"
override val requiresReferer = false
override suspend fun getUrl(url: String, referer: String?): List<ExtractorLink>? {
val response = app.get(
url, referer = referer ?: "$mainUrl/", interceptor = WebViewResolver(
Regex("""master\.m3u8""")
)
)
val sources = mutableListOf<ExtractorLink>()
if (response.url.contains("m3u8"))
sources.add(
ExtractorLink(
source = name,
name = name,
url = response.url,
referer = referer ?: "$mainUrl/",
quality = Qualities.Unknown.value,
isM3u8 = true
)
)
return sources
}
}

View file

@ -0,0 +1,34 @@
package com.lagradost.cloudstream3.extractors
import com.lagradost.cloudstream3.app
import com.lagradost.cloudstream3.network.WebViewResolver
import com.lagradost.cloudstream3.utils.ExtractorApi
import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.utils.Qualities
open class VidhideExtractor : ExtractorApi() {
override var name = "VidHide"
override var mainUrl = "https://vidhide.com"
override val requiresReferer = false
override suspend fun getUrl(url: String, referer: String?): List<ExtractorLink>? {
val response = app.get(
url, referer = referer ?: "$mainUrl/", interceptor = WebViewResolver(
Regex("""master\.m3u8""")
)
)
val sources = mutableListOf<ExtractorLink>()
if (response.url.contains("m3u8"))
sources.add(
ExtractorLink(
source = name,
name = name,
url = response.url,
referer = referer ?: "$mainUrl/",
quality = Qualities.Unknown.value,
isM3u8 = true
)
)
return sources
}
}

View file

@ -10,8 +10,8 @@ import com.lagradost.cloudstream3.utils.M3u8Helper
import javax.crypto.Cipher import javax.crypto.Cipher
import javax.crypto.spec.SecretKeySpec import javax.crypto.spec.SecretKeySpec
// Code found in https://github.com/Claudemirovsky/worstsource-keys // Code found in https://github.com/KillerDogeEmpire/vidplay-keys
// special credits to @Claudemirovsky for providing key // special credits to @KillerDogeEmpire for providing key
class MyCloud : Vidplay() { class MyCloud : Vidplay() {
override val name = "MyCloud" override val name = "MyCloud"
@ -27,7 +27,7 @@ open class Vidplay : ExtractorApi() {
override val mainUrl = "https://vidplay.site" override val mainUrl = "https://vidplay.site"
override val requiresReferer = true override val requiresReferer = true
open val key = open val key =
"https://raw.githubusercontent.com/Claudemirovsky/worstsource-keys/keys/keys.json" "https://raw.githubusercontent.com/KillerDogeEmpire/vidplay-keys/keys/keys.json"
override suspend fun getUrl( override suspend fun getUrl(
url: String, url: String,

View file

@ -70,19 +70,18 @@ open class YoutubeExtractor : ExtractorApi() {
} }
} }
ytVideos[url]?.mapNotNull { ytVideos[url]?.mapNotNull {
if (it.isVideoOnly || it.height <= 0) return@mapNotNull null if (it.isVideoOnly() || it.height <= 0) return@mapNotNull null
ExtractorLink( ExtractorLink(
this.name, this.name,
this.name, this.name,
it.url ?: return@mapNotNull null, it.content ?: return@mapNotNull null,
"", "",
it.height it.height
) )
}?.forEach(callback) }?.forEach(callback)
ytVideosSubtitles[url]?.mapNotNull { ytVideosSubtitles[url]?.mapNotNull {
SubtitleFile(it.languageTag ?: return@mapNotNull null, it.url ?: return@mapNotNull null) SubtitleFile(it.languageTag ?: return@mapNotNull null, it.content ?: return@mapNotNull null)
}?.forEach(subtitleCallback) }?.forEach(subtitleCallback)
} }
} }

View file

@ -2,6 +2,8 @@ package com.lagradost.cloudstream3.network
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.net.http.SslError import android.net.http.SslError
import android.os.Handler
import android.os.Looper
import android.webkit.* import android.webkit.*
import com.lagradost.cloudstream3.AcraApplication import com.lagradost.cloudstream3.AcraApplication
import com.lagradost.cloudstream3.AcraApplication.Companion.context import com.lagradost.cloudstream3.AcraApplication.Companion.context
@ -27,15 +29,26 @@ import java.net.URI
* @param additionalUrls this will make resolveUsingWebView also return all other requests matching the list of Regex. * @param additionalUrls this will make resolveUsingWebView also return all other requests matching the list of Regex.
* @param userAgent if null then will use the default user agent * @param userAgent if null then will use the default user agent
* @param useOkhttp will try to use the okhttp client as much as possible, but this might cause some requests to fail. Disable for cloudflare. * @param useOkhttp will try to use the okhttp client as much as possible, but this might cause some requests to fail. Disable for cloudflare.
* @param script pass custom js to execute
* @param scriptCallback will be called with the result from custom js
* */ * */
class WebViewResolver( class WebViewResolver(
val interceptUrl: Regex, val interceptUrl: Regex,
val additionalUrls: List<Regex> = emptyList(), val additionalUrls: List<Regex> = emptyList(),
val userAgent: String? = USER_AGENT, val userAgent: String? = USER_AGENT,
val useOkhttp: Boolean = true val useOkhttp: Boolean = true,
val script: String? = null,
val scriptCallback: ((String) -> Unit)? = null
) : ) :
Interceptor { Interceptor {
constructor(
interceptUrl: Regex,
additionalUrls: List<Regex> = emptyList(),
userAgent: String? = USER_AGENT,
useOkhttp: Boolean = true
) : this(interceptUrl, additionalUrls, userAgent, useOkhttp, null, null)
companion object { companion object {
var webViewUserAgent: String? = null var webViewUserAgent: String? = null
@ -136,6 +149,14 @@ class WebViewResolver(
val webViewUrl = request.url.toString() val webViewUrl = request.url.toString()
println("Loading WebView URL: $webViewUrl") println("Loading WebView URL: $webViewUrl")
if (script != null) {
val handler = Handler(Looper.getMainLooper())
handler.post {
view.evaluateJavascript("$script")
{ scriptCallback?.invoke(it) }
}
}
if (interceptUrl.containsMatchIn(webViewUrl)) { if (interceptUrl.containsMatchIn(webViewUrl)) {
fixedRequest = request.toRequest()?.also { fixedRequest = request.toRequest()?.also {
requestCallBack(it) requestCallBack(it)

View file

@ -81,6 +81,7 @@ class HomeScrollAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
binding.homeScrollPreviewTags.apply { binding.homeScrollPreviewTags.apply {
text = card.tags?.joinToString("") ?: "" text = card.tags?.joinToString("") ?: ""
isGone = card.tags.isNullOrEmpty() isGone = card.tags.isNullOrEmpty()
maxLines = 2
} }
binding.homeScrollPreviewTitle.text = card.name binding.homeScrollPreviewTitle.text = card.name
} }

View file

@ -102,6 +102,8 @@ abstract class AbstractPlayerFragment(
throw NotImplementedError() throw NotImplementedError()
} }
open fun playerStatusChanged(){}
open fun playerDimensionsLoaded(width: Int, height: Int) { open fun playerDimensionsLoaded(width: Int, height: Int) {
throw NotImplementedError() throw NotImplementedError()
} }
@ -431,6 +433,7 @@ abstract class AbstractPlayerFragment(
is StatusEvent -> { is StatusEvent -> {
updateIsPlaying(wasPlaying = event.wasPlaying, isPlaying = event.isPlaying) updateIsPlaying(wasPlaying = event.wasPlaying, isPlaying = event.isPlaying)
playerStatusChanged()
} }
is PositionEvent -> { is PositionEvent -> {

View file

@ -1480,7 +1480,6 @@ open class FullScreenPlayer : AbstractPlayerFragment() {
playerGoBack.setOnClickListener { playerGoBack.setOnClickListener {
activity?.popCurrentPage() activity?.popCurrentPage()
activity?.showSystemUI()
} }
playerSourcesBtt.setOnClickListener { playerSourcesBtt.setOnClickListener {

View file

@ -146,6 +146,12 @@ class GeneratorPlayer : FullScreenPlayer() {
} }
} }
override fun playerStatusChanged() {
if(player.getIsPlaying()){
viewModel.forceClearCache = false
}
}
private fun noSubtitles(): Boolean { private fun noSubtitles(): Boolean {
return setSubtitles(null) return setSubtitles(null)
} }
@ -913,10 +919,15 @@ class GeneratorPlayer : FullScreenPlayer() {
override fun playerError(exception: Throwable) { override fun playerError(exception: Throwable) {
Log.i(TAG, "playerError = $currentSelectedLink") Log.i(TAG, "playerError = $currentSelectedLink")
if(!hasNextMirror()){
viewModel.forceClearCache = true
}
super.playerError(exception) super.playerError(exception)
} }
private fun noLinksFound() { private fun noLinksFound() {
viewModel.forceClearCache = true
showToast(R.string.no_links_found_toast, Toast.LENGTH_SHORT) showToast(R.string.no_links_found_toast, Toast.LENGTH_SHORT)
activity?.popCurrentPage() activity?.popCurrentPage()
} }

View file

@ -45,6 +45,8 @@ class PlayerGeneratorViewModel : ViewModel() {
*/ */
private var currentLoadingEpisodeId: Int? = null private var currentLoadingEpisodeId: Int? = null
var forceClearCache = false
fun setSubtitleYear(year: Int?) { fun setSubtitleYear(year: Int?) {
_currentSubtitleYear.postValue(year) _currentSubtitleYear.postValue(year)
} }
@ -168,7 +170,7 @@ class PlayerGeneratorViewModel : ViewModel() {
} }
} }
fun loadLinks(clearCache: Boolean = false, type: LoadType = LoadType.InApp) { fun loadLinks(type: LoadType = LoadType.InApp) {
Log.i(TAG, "loadLinks") Log.i(TAG, "loadLinks")
currentJob?.cancel() currentJob?.cancel()
@ -183,7 +185,7 @@ class PlayerGeneratorViewModel : ViewModel() {
// load more data // load more data
_loadingLinks.postValue(Resource.Loading()) _loadingLinks.postValue(Resource.Loading())
val loadingState = safeApiCall { val loadingState = safeApiCall {
generator?.generateLinks(type = type, clearCache = clearCache, callback = { generator?.generateLinks(type = type, clearCache = forceClearCache, callback = {
currentLinks.add(it) currentLinks.add(it)
// Clone to prevent ConcurrentModificationException // Clone to prevent ConcurrentModificationException
normalSafeApiCall { normalSafeApiCall {

View file

@ -2,6 +2,7 @@ package com.lagradost.cloudstream3.ui.player
import android.util.Log import android.util.Log
import com.lagradost.cloudstream3.APIHolder.getApiFromNameNull import com.lagradost.cloudstream3.APIHolder.getApiFromNameNull
import com.lagradost.cloudstream3.APIHolder.unixTime
import com.lagradost.cloudstream3.LoadResponse import com.lagradost.cloudstream3.LoadResponse
import com.lagradost.cloudstream3.ui.APIRepository import com.lagradost.cloudstream3.ui.APIRepository
import com.lagradost.cloudstream3.ui.result.ResultEpisode import com.lagradost.cloudstream3.ui.result.ResultEpisode
@ -10,6 +11,12 @@ import com.lagradost.cloudstream3.utils.ExtractorUri
import kotlin.math.max import kotlin.math.max
import kotlin.math.min import kotlin.math.min
data class Cache(
val linkCache: MutableSet<ExtractorLink>,
val subtitleCache: MutableSet<SubtitleData>,
var lastCachedTimestamp: Long = unixTime
)
class RepoLinkGenerator( class RepoLinkGenerator(
private val episodes: List<ResultEpisode>, private val episodes: List<ResultEpisode>,
private var currentIndex: Int = 0, private var currentIndex: Int = 0,
@ -17,7 +24,7 @@ class RepoLinkGenerator(
) : IGenerator { ) : IGenerator {
companion object { companion object {
const val TAG = "RepoLink" const val TAG = "RepoLink"
val cache: HashMap<Pair<String, Int>, Pair<MutableSet<ExtractorLink>, MutableSet<SubtitleData>>> = val cache: HashMap<Pair<String, Int>, Cache> =
hashMapOf() hashMapOf()
} }
@ -76,10 +83,10 @@ class RepoLinkGenerator(
val index = currentIndex val index = currentIndex
val current = episodes.getOrNull(index + offset) ?: return false val current = episodes.getOrNull(index + offset) ?: return false
val (currentLinkCache, currentSubsCache) = if (clearCache) { val (currentLinkCache, currentSubsCache, lastCachedTimestamp) = if (clearCache) {
Pair(mutableSetOf(), mutableSetOf()) Cache(mutableSetOf(), mutableSetOf(), unixTime)
} else { } else {
cache[current.apiName to current.id] ?: Pair(mutableSetOf(), mutableSetOf()) cache[current.apiName to current.id] ?: Cache(mutableSetOf(), mutableSetOf(), unixTime)
} }
//val currentLinkCache = if (clearCache) mutableSetOf() else linkCache[index].toMutableSet() //val currentLinkCache = if (clearCache) mutableSetOf() else linkCache[index].toMutableSet()
@ -89,6 +96,12 @@ class RepoLinkGenerator(
val currentSubsUrls = mutableSetOf<String>() // makes all subs urls unique val currentSubsUrls = mutableSetOf<String>() // makes all subs urls unique
val currentSubsNames = mutableSetOf<String>() // makes all subs names unique val currentSubsNames = mutableSetOf<String>() // makes all subs names unique
val invalidateCache = unixTime - lastCachedTimestamp > 60 * 20 // 20 minutes
if(invalidateCache){
currentLinkCache.clear()
currentSubsCache.clear()
}
currentLinkCache.filter { allowedTypes.contains(it.type) }.forEach { link -> currentLinkCache.filter { allowedTypes.contains(it.type) }.forEach { link ->
currentLinks.add(link.url) currentLinks.add(link.url)
callback(link to null) callback(link to null)
@ -147,7 +160,7 @@ class RepoLinkGenerator(
} }
} }
) )
cache[Pair(current.apiName, current.id)] = Pair(currentLinkCache, currentSubsCache) cache[Pair(current.apiName, current.id)] = Cache(currentLinkCache, currentSubsCache, unixTime)
return result return result
} }

View file

@ -160,7 +160,7 @@ class PluginsViewModel : ViewModel() {
PluginManager.downloadPlugin( PluginManager.downloadPlugin(
activity, activity,
metadata.url, metadata.url,
metadata.name, metadata.internalName,
repo, repo,
isEnabled isEnabled
) to message ) to message
@ -257,4 +257,4 @@ class PluginsViewModel : ViewModel() {
false to downloadedPlugins.filterTvTypes().filterLang().sortByQuery(currentQuery) false to downloadedPlugins.filterTvTypes().filterLang().sortByQuery(currentQuery)
) )
} }
} }

View file

@ -3,18 +3,24 @@ package com.lagradost.cloudstream3.utils
class Event<T> { class Event<T> {
private val observers = mutableSetOf<(T) -> Unit>() private val observers = mutableSetOf<(T) -> Unit>()
val size : Int get() = observers.size val size: Int get() = observers.size
operator fun plusAssign(observer: (T) -> Unit) { operator fun plusAssign(observer: (T) -> Unit) {
observers.add(observer) synchronized(observers) {
observers.add(observer)
}
} }
operator fun minusAssign(observer: (T) -> Unit) { operator fun minusAssign(observer: (T) -> Unit) {
observers.remove(observer) synchronized(observers) {
observers.remove(observer)
}
} }
operator fun invoke(value: T) { operator fun invoke(value: T) {
for (observer in observers) synchronized(observers) {
observer(value) for (observer in observers)
observer(value)
}
} }
} }

View file

@ -103,6 +103,7 @@ import com.lagradost.cloudstream3.extractors.Odnoklassniki
import com.lagradost.cloudstream3.extractors.TauVideo import com.lagradost.cloudstream3.extractors.TauVideo
import com.lagradost.cloudstream3.extractors.SibNet import com.lagradost.cloudstream3.extractors.SibNet
import com.lagradost.cloudstream3.extractors.ContentX import com.lagradost.cloudstream3.extractors.ContentX
import com.lagradost.cloudstream3.extractors.EmturbovidExtractor
import com.lagradost.cloudstream3.extractors.Hotlinger import com.lagradost.cloudstream3.extractors.Hotlinger
import com.lagradost.cloudstream3.extractors.FourCX import com.lagradost.cloudstream3.extractors.FourCX
import com.lagradost.cloudstream3.extractors.HDMomPlayer import com.lagradost.cloudstream3.extractors.HDMomPlayer
@ -115,6 +116,7 @@ import com.lagradost.cloudstream3.extractors.TRsTX
import com.lagradost.cloudstream3.extractors.VidMoxy import com.lagradost.cloudstream3.extractors.VidMoxy
import com.lagradost.cloudstream3.extractors.PixelDrain import com.lagradost.cloudstream3.extractors.PixelDrain
import com.lagradost.cloudstream3.extractors.MailRu import com.lagradost.cloudstream3.extractors.MailRu
import com.lagradost.cloudstream3.extractors.Mediafire
import com.lagradost.cloudstream3.extractors.OkRuSSL import com.lagradost.cloudstream3.extractors.OkRuSSL
import com.lagradost.cloudstream3.extractors.OkRuHTTP import com.lagradost.cloudstream3.extractors.OkRuHTTP
import com.lagradost.cloudstream3.extractors.Okrulink import com.lagradost.cloudstream3.extractors.Okrulink
@ -153,6 +155,7 @@ import com.lagradost.cloudstream3.extractors.StreamSB9
import com.lagradost.cloudstream3.extractors.StreamTape import com.lagradost.cloudstream3.extractors.StreamTape
import com.lagradost.cloudstream3.extractors.StreamTapeNet import com.lagradost.cloudstream3.extractors.StreamTapeNet
import com.lagradost.cloudstream3.extractors.StreamTapeXyz import com.lagradost.cloudstream3.extractors.StreamTapeXyz
import com.lagradost.cloudstream3.extractors.StreamWishExtractor
import com.lagradost.cloudstream3.extractors.StreamhideCom import com.lagradost.cloudstream3.extractors.StreamhideCom
import com.lagradost.cloudstream3.extractors.StreamhideTo import com.lagradost.cloudstream3.extractors.StreamhideTo
import com.lagradost.cloudstream3.extractors.Streamhub2 import com.lagradost.cloudstream3.extractors.Streamhub2
@ -181,6 +184,7 @@ import com.lagradost.cloudstream3.extractors.VideoVard
import com.lagradost.cloudstream3.extractors.VideovardSX import com.lagradost.cloudstream3.extractors.VideovardSX
import com.lagradost.cloudstream3.extractors.Vidgomunime import com.lagradost.cloudstream3.extractors.Vidgomunime
import com.lagradost.cloudstream3.extractors.Vidgomunimesb import com.lagradost.cloudstream3.extractors.Vidgomunimesb
import com.lagradost.cloudstream3.extractors.VidhideExtractor
import com.lagradost.cloudstream3.extractors.Vidmoly import com.lagradost.cloudstream3.extractors.Vidmoly
import com.lagradost.cloudstream3.extractors.Vidmolyme import com.lagradost.cloudstream3.extractors.Vidmolyme
import com.lagradost.cloudstream3.extractors.Vido import com.lagradost.cloudstream3.extractors.Vido
@ -214,6 +218,7 @@ import com.lagradost.cloudstream3.extractors.Ztreamhub
import com.lagradost.cloudstream3.mvvm.logError import com.lagradost.cloudstream3.mvvm.logError
import com.lagradost.cloudstream3.mvvm.normalSafeApiCall import com.lagradost.cloudstream3.mvvm.normalSafeApiCall
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import me.xdrop.fuzzywuzzy.FuzzySearch
import org.jsoup.Jsoup import org.jsoup.Jsoup
import java.net.URL import java.net.URL
import java.util.UUID import java.util.UUID
@ -598,6 +603,18 @@ suspend fun loadExtractor(
} }
} }
// this is to match mirror domains - like example.com, example.net
for (extractor in extractorApis) {
if (FuzzySearch.partialRatio(
extractor.mainUrl,
currentUrl
) > 80
) {
extractor.getSafeUrl(currentUrl, referer, subtitleCallback, callback)
return true
}
}
return false return false
} }
@ -819,6 +836,7 @@ val extractorApis: MutableList<ExtractorApi> = arrayListOf(
Gdriveplayer(), Gdriveplayer(),
DatabaseGdrive(), DatabaseGdrive(),
DatabaseGdrive2(), DatabaseGdrive2(),
Mediafire(),
YoutubeExtractor(), YoutubeExtractor(),
YoutubeShortLinkExtractor(), YoutubeShortLinkExtractor(),
@ -840,6 +858,9 @@ val extractorApis: MutableList<ExtractorApi> = arrayListOf(
Rabbitstream(), Rabbitstream(),
Dokicloud(), Dokicloud(),
Megacloud(), Megacloud(),
VidhideExtractor(),
StreamWishExtractor(),
EmturbovidExtractor()
) )

View file

@ -191,7 +191,7 @@ class InAppUpdater {
Update( Update(
shouldUpdate, shouldUpdate,
foundAsset.browser_download_url, foundAsset.browser_download_url,
tagResponse.github_object.sha, tagResponse.github_object.sha.take(10),
found.body, found.body,
found.node_id found.node_id
) )
@ -293,7 +293,13 @@ class InAppUpdater {
update.updateVersion update.updateVersion
) )
) )
builder.setMessage("${update.changelog}")
val logRegex = Regex("\\[(.*?)\\]\\((.*?)\\)")
val sanitizedChangelog = update.changelog?.replace(logRegex) { matchResult ->
matchResult.groupValues[1]
} // Sanitized because it looks cluttered
builder.setMessage(sanitizedChangelog)
val context = this val context = this
builder.apply { builder.apply {

View file

@ -35,7 +35,9 @@ import androidx.core.graphics.blue
import androidx.core.graphics.drawable.toBitmapOrNull import androidx.core.graphics.drawable.toBitmapOrNull
import androidx.core.graphics.green import androidx.core.graphics.green
import androidx.core.graphics.red import androidx.core.graphics.red
import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsCompat
import androidx.core.view.WindowInsetsControllerCompat
import androidx.core.view.marginBottom import androidx.core.view.marginBottom
import androidx.core.view.marginLeft import androidx.core.view.marginLeft
import androidx.core.view.marginRight import androidx.core.view.marginRight
@ -57,6 +59,7 @@ import com.google.android.material.chip.Chip
import com.google.android.material.chip.ChipDrawable import com.google.android.material.chip.ChipDrawable
import com.google.android.material.chip.ChipGroup import com.google.android.material.chip.ChipGroup
import com.lagradost.cloudstream3.CommonActivity.activity import com.lagradost.cloudstream3.CommonActivity.activity
import com.lagradost.cloudstream3.MainActivity
import com.lagradost.cloudstream3.R import com.lagradost.cloudstream3.R
import com.lagradost.cloudstream3.mvvm.logError import com.lagradost.cloudstream3.mvvm.logError
import com.lagradost.cloudstream3.ui.result.UiImage import com.lagradost.cloudstream3.ui.result.UiImage
@ -87,8 +90,9 @@ object UIHelper {
if (view == null) return if (view == null) return
view.removeAllViews() view.removeAllViews()
val context = view.context ?: return val context = view.context ?: return
val maxTags = tags.take(10) // Limited because they are too much
tags.forEach { tag -> maxTags.forEach { tag ->
val chip = Chip(context) val chip = Chip(context)
val chipDrawable = ChipDrawable.createFromAttributes( val chipDrawable = ChipDrawable.createFromAttributes(
context, context,
@ -180,9 +184,7 @@ object UIHelper {
try { try {
if (this is FragmentActivity) { if (this is FragmentActivity) {
val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as? NavHostFragment? val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as? NavHostFragment?
navHostFragment?.navController?.let { navHostFragment?.navController?.navigate(navigation, arguments)
it.navigate(navigation, arguments)
}
} }
} catch (t: Throwable) { } catch (t: Throwable) {
logError(t) logError(t)
@ -402,17 +404,16 @@ object UIHelper {
// Enables regular immersive mode. // Enables regular immersive mode.
// For "lean back" mode, remove SYSTEM_UI_FLAG_IMMERSIVE. // For "lean back" mode, remove SYSTEM_UI_FLAG_IMMERSIVE.
// Or for "sticky immersive," replace it with SYSTEM_UI_FLAG_IMMERSIVE_STICKY // Or for "sticky immersive," replace it with SYSTEM_UI_FLAG_IMMERSIVE_STICKY
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { /** BUGGED AF **/
/*if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
if (window.insetsController != null) { WindowCompat.setDecorFitsSystemWindows(window, false)
WindowInsetsControllerCompat(window, View(this)).let { controller ->
window!!.insetsController?.hide(WindowInsetsCompat.Type.systemBars()) controller.hide(WindowInsetsCompat.Type.systemBars())
window!!.insetsController?.systemBarsBehavior = controller.systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
} }
} }*/
else {
@Suppress("DEPRECATION") @Suppress("DEPRECATION")
window.decorView.systemUiVisibility = ( window.decorView.systemUiVisibility = (
View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
@ -425,7 +426,7 @@ object UIHelper {
or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
or View.SYSTEM_UI_FLAG_FULLSCREEN or View.SYSTEM_UI_FLAG_FULLSCREEN
) )
} //}
} }
fun FragmentActivity.popCurrentPage() { fun FragmentActivity.popCurrentPage() {
@ -496,13 +497,13 @@ object UIHelper {
} }
fun Activity.changeStatusBarState(hide: Boolean): Int { fun Activity.changeStatusBarState(hide: Boolean): Int {
@Suppress("DEPRECATION")
return if (hide) { return if (hide) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
window.insetsController?.hide(WindowInsets.Type.statusBars()) window.insetsController?.hide(WindowInsets.Type.statusBars())
} else { } else {
@Suppress("DEPRECATION")
window.setFlags( window.setFlags(
WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN WindowManager.LayoutParams.FLAG_FULLSCREEN
@ -525,17 +526,16 @@ object UIHelper {
// except for the ones that make the content appear under the system bars. // except for the ones that make the content appear under the system bars.
fun Activity.showSystemUI() { fun Activity.showSystemUI() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { /*if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
if (window.insetsController != null) { WindowCompat.setDecorFitsSystemWindows(window, true)
window!!.insetsController?.show(WindowInsetsCompat.Type.systemBars()) WindowInsetsControllerCompat(window, View(this)).show(WindowInsetsCompat.Type.systemBars())
}
} else { } else {*/ /** WINDOW COMPAT IS BUGGY DUE TO FU*KED UP PLAYER AND TRAILERS **/
@Suppress("DEPRECATION") Suppress("DEPRECATION")
window.decorView.systemUiVisibility = window.decorView.systemUiVisibility =
(View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN) (View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN)
} //}
changeStatusBarState(isEmulatorSettings()) changeStatusBarState(isEmulatorSettings())
} }

View file

@ -210,7 +210,7 @@
<string name="episode_action_play_in_format">مشي بـ\"%s\"</string> <string name="episode_action_play_in_format">مشي بـ\"%s\"</string>
<string name="episode_action_download_subtitle">نزل الترجمة</string> <string name="episode_action_download_subtitle">نزل الترجمة</string>
<string name="dont_show_again">ما تفرجيا بعد مرة</string> <string name="dont_show_again">ما تفرجيا بعد مرة</string>
<string name="video_buffer_clear_settings">فضّي التخزين المؤقت للصور والڤيديوات</string> <string name="video_buffer_clear_settings">فضّي التخزين الموقت للصور والڤيديوات</string>
<string name="video_skip_op">أفي المقدمة</string> <string name="video_skip_op">أفي المقدمة</string>
<string name="watch_quality_pref">الجودة المفضلة (Wi-Fi)</string> <string name="watch_quality_pref">الجودة المفضلة (Wi-Fi)</string>
<string name="cartoons_singular">رسوم مُتَحَرِكة</string> <string name="cartoons_singular">رسوم مُتَحَرِكة</string>
@ -260,7 +260,7 @@
<string name="add_site_pref">نسوخ موقع (clone site)</string> <string name="add_site_pref">نسوخ موقع (clone site)</string>
<string name="random_button_settings">زر العشوائي</string> <string name="random_button_settings">زر العشوائي</string>
<string name="resize_fill">مدو</string> <string name="resize_fill">مدو</string>
<string name="random_button_settings_desc">فرجي زر \"عشوائي\" على الصفحة الرئيسية</string> <string name="random_button_settings_desc">فرجي زر \"عشوائي\" بالصفحة الرئيسية وبصفحة الرفّ</string>
<string name="pref_category_ui_features">الميزات</string> <string name="pref_category_ui_features">الميزات</string>
<string name="display_subbed_dubbed_settings">فرجي أنمي المدبلج-المترجم</string> <string name="display_subbed_dubbed_settings">فرجي أنمي المدبلج-المترجم</string>
<string name="pref_category_backup">النسخ الإحتياطي</string> <string name="pref_category_backup">النسخ الإحتياطي</string>
@ -595,4 +595,5 @@
<string name="rotate_video">برومو</string> <string name="rotate_video">برومو</string>
<string name="auto_rotate_video_desc">غير إتجاه الشاشة أوتوماتيكيًا حسب شكل الڤيديو</string> <string name="auto_rotate_video_desc">غير إتجاه الشاشة أوتوماتيكيًا حسب شكل الڤيديو</string>
<string name="links_reloaded_toast">رجع نعمل لاود لاللينك</string> <string name="links_reloaded_toast">رجع نعمل لاود لاللينك</string>
<string name="copyTitle">نعمل كَپي للعنوان!</string>
</resources> </resources>

View file

@ -283,7 +283,7 @@
<string name="legal_notice_text" translatable="false">Any legal issues regarding the content on this application should be taken up with the actual file hosts and providers themselves as we are not affiliated with them. In case of copyright infringement, please directly contact the responsible parties or the streaming websites. The app is purely for educational and personal use. CloudStream 3 does not host any content on the app, and has no control over what media is put up or taken down. CloudStream 3 functions like any other search engine, such as Google. CloudStream 3 does not host, upload or manage any videos, films or content. It simply crawls, aggregates and displayes links in a convenient, user-friendly interface. It merely scrapes 3rd-party websites that are publicly accessable via any regular web browser. It is the responsibility of user to avoid any actions that might violate the laws governing his/her locality. Use CloudStream 3 at your own risk.</string> <string name="legal_notice_text" translatable="false">Any legal issues regarding the content on this application should be taken up with the actual file hosts and providers themselves as we are not affiliated with them. In case of copyright infringement, please directly contact the responsible parties or the streaming websites. The app is purely for educational and personal use. CloudStream 3 does not host any content on the app, and has no control over what media is put up or taken down. CloudStream 3 functions like any other search engine, such as Google. CloudStream 3 does not host, upload or manage any videos, films or content. It simply crawls, aggregates and displayes links in a convenient, user-friendly interface. It merely scrapes 3rd-party websites that are publicly accessable via any regular web browser. It is the responsibility of user to avoid any actions that might violate the laws governing his/her locality. Use CloudStream 3 at your own risk.</string>
<string name="category_general">عام</string> <string name="category_general">عام</string>
<string name="random_button_settings">زر العشوائي</string> <string name="random_button_settings">زر العشوائي</string>
<string name="random_button_settings_desc">إظهار زر العشوائي على الصفحة الرئيسية</string> <string name="random_button_settings_desc">إظهار زر عشوائي على الصفحة الرئيسية والمكتبة</string>
<string name="provider_lang_settings">لغات المزود</string> <string name="provider_lang_settings">لغات المزود</string>
<string name="app_layout">واجهة التطبيق</string> <string name="app_layout">واجهة التطبيق</string>
<string name="preferred_media_settings">المحتوى المفضل</string> <string name="preferred_media_settings">المحتوى المفضل</string>
@ -623,4 +623,5 @@
<string name="auto_rotate_video">الدوران التلقائي</string> <string name="auto_rotate_video">الدوران التلقائي</string>
<string name="rotate_video">تدوير</string> <string name="rotate_video">تدوير</string>
<string name="auto_rotate_video_desc">تمكين التبديل التلقائي لاتجاه الشاشة بناءً على اتجاه الفيديو</string> <string name="auto_rotate_video_desc">تمكين التبديل التلقائي لاتجاه الشاشة بناءً على اتجاه الفيديو</string>
<string name="copyTitle">تم نسخ العنوان!</string>
</resources> </resources>

View file

@ -265,7 +265,7 @@
<string name="legal_notice_text" translatable="false">Jakékoli právní otázky týkající se obsahu této aplikace je třeba řešit se samotnými hostiteli a poskytovateli souborů, protože s nimi nejsme nijak spojeni. V případě porušení autorských práv se obraťte přímo na odpovědné strany nebo na webové stránky, na kterých se streamování odehrává. Aplikace je určena výhradně pro vzdělávací a osobní účely. CloudStream 3 v aplikaci nehostuje žádný obsah a nemá žádnou kontrolu nad tím, jaká média jsou v aplikaci umístěna nebo odstraněna. CloudStream 3 funguje jako jakýkoli jiný vyhledávač, například Google. Služba CloudStream 3 nehostuje, nenahrává ani nespravuje žádná videa, filmy ani obsah. Pouze vyhledává, agreguje a zobrazuje odkazy v pohodlném, uživatelsky přívětivém rozhraní. Pouze shromažďuje webové stránky třetích stran, které jsou veřejně přístupné prostřednictvím jakéhokoli běžného webového prohlížeče. Je odpovědností uživatele, aby se vyvaroval jakýchkoli akcí, které by mohly porušovat zákony platné v jeho lokalitě. Použijte CloudStream 3 na vlastní nebezpečí.</string> <string name="legal_notice_text" translatable="false">Jakékoli právní otázky týkající se obsahu této aplikace je třeba řešit se samotnými hostiteli a poskytovateli souborů, protože s nimi nejsme nijak spojeni. V případě porušení autorských práv se obraťte přímo na odpovědné strany nebo na webové stránky, na kterých se streamování odehrává. Aplikace je určena výhradně pro vzdělávací a osobní účely. CloudStream 3 v aplikaci nehostuje žádný obsah a nemá žádnou kontrolu nad tím, jaká média jsou v aplikaci umístěna nebo odstraněna. CloudStream 3 funguje jako jakýkoli jiný vyhledávač, například Google. Služba CloudStream 3 nehostuje, nenahrává ani nespravuje žádná videa, filmy ani obsah. Pouze vyhledává, agreguje a zobrazuje odkazy v pohodlném, uživatelsky přívětivém rozhraní. Pouze shromažďuje webové stránky třetích stran, které jsou veřejně přístupné prostřednictvím jakéhokoli běžného webového prohlížeče. Je odpovědností uživatele, aby se vyvaroval jakýchkoli akcí, které by mohly porušovat zákony platné v jeho lokalitě. Použijte CloudStream 3 na vlastní nebezpečí.</string>
<string name="category_general">Obecné</string> <string name="category_general">Obecné</string>
<string name="random_button_settings">Náhodné tlačítko</string> <string name="random_button_settings">Náhodné tlačítko</string>
<string name="random_button_settings_desc">Zobrazit na domovské stránce náhodné tlačítko</string> <string name="random_button_settings_desc">Zobrazit na domovské stránce a v knihovně náhodné tlačítko</string>
<string name="provider_lang_settings">Jazyk poskytovatelů</string> <string name="provider_lang_settings">Jazyk poskytovatelů</string>
<string name="app_layout">Rozložení aplikace</string> <string name="app_layout">Rozložení aplikace</string>
<string name="preferred_media_settings">Preferovaná média</string> <string name="preferred_media_settings">Preferovaná média</string>
@ -615,4 +615,5 @@
<string name="auto_rotate_video">Automatické otáčení</string> <string name="auto_rotate_video">Automatické otáčení</string>
<string name="rotate_video">Otočení</string> <string name="rotate_video">Otočení</string>
<string name="auto_rotate_video_desc">Zapnout automatické otáčení obrazovky v závislosti na orientaci videa</string> <string name="auto_rotate_video_desc">Zapnout automatické otáčení obrazovky v závislosti na orientaci videa</string>
<string name="copyTitle">Název zkopírován!</string>
</resources> </resources>

View file

@ -585,4 +585,8 @@
\n \n
\nWollen sie dieses Element trotzdem hinzufügen, das existierende ersetzen oder diese Aktion abbrechen?</string> \nWollen sie dieses Element trotzdem hinzufügen, das existierende ersetzen oder diese Aktion abbrechen?</string>
<string name="links_reloaded_toast">Links wurden neu geladen</string> <string name="links_reloaded_toast">Links wurden neu geladen</string>
<string name="rotate_video">Drehen</string>
<string name="rotate_video_desc">Zeige einen Umschalter für Bildschirmorientierung an</string>
<string name="auto_rotate_video">Automatisch drehen</string>
<string name="copyTitle">Titel kopiert!</string>
</resources> </resources>

View file

@ -305,7 +305,7 @@
<string name="pref_category_looks">Aspecto</string> <string name="pref_category_looks">Aspecto</string>
<string name="pref_category_ui_features">Características</string> <string name="pref_category_ui_features">Características</string>
<string name="random_button_settings">Botón aleatorio</string> <string name="random_button_settings">Botón aleatorio</string>
<string name="random_button_settings_desc">Mostrar el botón aleatorio en la página de inicio</string> <string name="random_button_settings_desc">Mostrar el botón aleatorio en la página de inicio y en la biblioteca</string>
<string name="account">Cuenta</string> <string name="account">Cuenta</string>
<string name="logout">Cerrar sesión</string> <string name="logout">Cerrar sesión</string>
<string name="switch_account">Cambiar cuenta</string> <string name="switch_account">Cambiar cuenta</string>
@ -591,4 +591,5 @@
<string name="auto_rotate_video">Giro automático</string> <string name="auto_rotate_video">Giro automático</string>
<string name="rotate_video">Girar</string> <string name="rotate_video">Girar</string>
<string name="auto_rotate_video_desc">Activar el cambio automático de la orientación de la pantalla en función de la orientación del vídeo</string> <string name="auto_rotate_video_desc">Activar el cambio automático de la orientación de la pantalla en función de la orientación del vídeo</string>
<string name="copyTitle">¡Título copiado!</string>
</resources> </resources>

View file

@ -94,7 +94,7 @@
<string name="sort_copy">Kopiraj</string> <string name="sort_copy">Kopiraj</string>
<string name="sort_close">Zatvori</string> <string name="sort_close">Zatvori</string>
<string name="sort_clear">Očisti</string> <string name="sort_clear">Očisti</string>
<string name="sort_save">Sačuvaj</string> <string name="sort_save">Spremi</string>
<string name="player_speed">Brzina playera</string> <string name="player_speed">Brzina playera</string>
<string name="subtitles_settings">Postavke titlova</string> <string name="subtitles_settings">Postavke titlova</string>
<string name="subs_text_color">Boja teksta</string> <string name="subs_text_color">Boja teksta</string>
@ -298,7 +298,7 @@
<string name="legal_notice_text" translatable="false">Any legal issues regarding the content on this application should be taken up with the actual file hosts and providers themselves as we are not affiliated with them. In case of copyright infringement, please directly contact the responsible parties or the streaming websites. The app is purely for educational and personal use. CloudStream 3 does not host any content on the app, and has no control over what media is put up or taken down. CloudStream 3 functions like any other search engine, such as Google. CloudStream 3 does not host, upload or manage any videos, films or content. It simply crawls, aggregates and displayes links in a convenient, user-friendly interface. It merely scrapes 3rd-party websites that are publicly accessable via any regular web browser. It is the responsibility of user to avoid any actions that might violate the laws governing his/her locality. Use CloudStream 3 at your own risk.</string> <string name="legal_notice_text" translatable="false">Any legal issues regarding the content on this application should be taken up with the actual file hosts and providers themselves as we are not affiliated with them. In case of copyright infringement, please directly contact the responsible parties or the streaming websites. The app is purely for educational and personal use. CloudStream 3 does not host any content on the app, and has no control over what media is put up or taken down. CloudStream 3 functions like any other search engine, such as Google. CloudStream 3 does not host, upload or manage any videos, films or content. It simply crawls, aggregates and displayes links in a convenient, user-friendly interface. It merely scrapes 3rd-party websites that are publicly accessable via any regular web browser. It is the responsibility of user to avoid any actions that might violate the laws governing his/her locality. Use CloudStream 3 at your own risk.</string>
<string name="category_general">Općenito</string> <string name="category_general">Općenito</string>
<string name="random_button_settings">Random gumb</string> <string name="random_button_settings">Random gumb</string>
<string name="random_button_settings_desc">Prikaži gumb za slučajni odabir reprodukcija na početnoj stranici</string> <string name="random_button_settings_desc">Prikaži gumb za slučajni odabir reprodukcija na početnoj stranici i biblioteci</string>
<string name="provider_lang_settings">Jezici pružatelja usluga</string> <string name="provider_lang_settings">Jezici pružatelja usluga</string>
<string name="app_layout">Izgled aplikacije</string> <string name="app_layout">Izgled aplikacije</string>
<string name="preferred_media_settings">Preferirani mediji</string> <string name="preferred_media_settings">Preferirani mediji</string>
@ -609,4 +609,12 @@
<string name="skip_startup_account_select_pref">Preskoči odabir računa pri pokretanju</string> <string name="skip_startup_account_select_pref">Preskoči odabir računa pri pokretanju</string>
<string name="manage_accounts">Upravljanje računima</string> <string name="manage_accounts">Upravljanje računima</string>
<string name="edit_account">Uredi račun</string> <string name="edit_account">Uredi račun</string>
<string name="links_reloaded_toast">Linkovi ponovno učitani</string>
<string name="rotate_video">Rotiraj</string>
<string name="rotate_video_desc">Prikaži gumb za prebacivanje orijentacije zaslona</string>
<string name="auto_rotate_video_desc">Omogućuje automatsko mijenjanje orijentacije zaslona na temelju orijentacije videa</string>
<string name="auto_rotate_video">Automatsko rotiranje</string>
<string name="copyTitle">Naslov je kopiran!</string>
<string name="rotate_video_key">rotiraj_video_tipka</string>
<string name="auto_rotate_video_key">automatski_rotiraj_video_tipka</string>
</resources> </resources>

View file

@ -219,4 +219,27 @@
<string name="subs_auto_select_language">言語の自動選択</string> <string name="subs_auto_select_language">言語の自動選択</string>
<string name="error_loading_links_toast">リンクの読み込みエラー</string> <string name="error_loading_links_toast">リンクの読み込みエラー</string>
<string name="enter_pin">137905</string> <string name="enter_pin">137905</string>
<string name="links_reloaded_toast">リンクがリロードされました</string>
<string name="pref_disable_acra">自動バグ報告を無効にする</string>
<string name="player_speed">プレーヤーの速度</string>
<string name="subtitles_settings">字幕設定</string>
<string name="app_dubbed_text">ダブ</string>
<string name="app_subbed_text">サブ</string>
<string name="torrent_no_plot">説明が見つかりません</string>
<string name="swipe_to_change_settings">スワイプして設定を変更します</string>
<string name="subs_outline_color">輪郭の色</string>
<string name="subs_subtitle_elevation">字幕の標高</string>
<string name="benene_count_text">%d ベネネスが開発者に与えられました</string>
<string name="vpn_might_be_needed">このプロバイダーが正しく動作するには VPN が必要になる可能性があります</string>
<string name="vpn_torrent">このプロバイダーは torrent です、VPN をお勧めします</string>
<string name="player_size_settings">プレーヤーのサイズ変更ボタン</string>
<string name="player_size_settings_des">黒い境界線を削除します</string>
<string name="player_subtitles_settings_des">プレーヤーの字幕設定</string>
<string name="chromecast_subtitles_settings">Chromecastの字幕</string>
<string name="chromecast_subtitles_settings_des">Chromecastの字幕設定</string>
<string name="eigengraumode_settings_des">プレーヤーに速度オプションを追加します</string>
<string name="swipe_to_seek_settings">スワイプして探す</string>
<string name="autoplay_next_settings">次のエピソードを自動再生する</string>
<string name="autoplay_next_settings_des">現在のエピソードが終了したら次のエピソードを開始する</string>
<string name="subs_hold_to_reset_to_default">長押しするとデフォルトにリセットされます</string>
</resources> </resources>

View file

@ -1,2 +1,88 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources/> <resources>
<string name="player_speed_text_format" formatted="true">गति (%.2fx)</string>
<string name="home_next_random_img_des">अर्को अनियमित</string>
<string name="preview_background_img_des">पृष्ठभूमि देखाउनुहोस्</string>
<string name="next_episode_time_hour_format" formatted="true">%1$dh %2$dm</string>
<string name="search_poster_img_des">पोस्टर</string>
<string name="go_back_img_des">पछाडी जाउ</string>
<string name="episode_poster_img_des">एपिसोडको पोस्टर</string>
<string name="home_change_provider_img_des">प्रोवाइडर परिवर्तन गर्नुहोस्</string>
<string name="rated_format" formatted="true">रेटिंग: %.1f</string>
<string name="next_episode_time_day_format" formatted="true">%1$dd %2$dh %3$dm</string>
<string name="next_episode_time_min_format" formatted="true">%dm</string>
<string name="result_poster_img_des">विज्ञापन</string>
<string name="home_main_poster_img_des">मुख्य पोस्टर</string>
<string name="app_dub_sub_episode_text_format" formatted="true">%1$s Ep %2$d</string>
<string name="cast_format" formatted="true">अभिनेता:%s</string>
<string name="new_update_format" formatted="true">नयाँ अपडेट भेटियो!
\n%1$s -&gt; %2$s</string>
<string name="filler" formatted="true">फिलर</string>
<string name="duration_format" formatted="true">%d मिनेट</string>
<string name="app_name">क्लाउडस्ट्रीम</string>
<string name="play_with_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_site" formatted="true">%s खोज्नुहोस्…</string>
<string name="episode_more_options_des">थप विकल्पहरू</string>
<string name="result_tags">विधाहरू</string>
<string name="result_share">सेयर गर्नुहोस्</string>
<string name="result_open_in_browser">ब्राउजरमा खाेल्नुहाेस्</string>
<string name="browser">ब्राउजर</string>
<string name="skip_loading">लोड गर्न छोड्नुहोस्</string>
<string name="loading">लोड हुँदै…</string>
<string name="type_on_hold">होल्डमा भएको</string>
<string name="type_dropped">अधुरै छाडेको</string>
<string name="type_plan_to_watch">हेर्ने योजना</string>
<string name="play_movie_button">चलचित्र प्ले गर्नुहोस्</string>
<string name="play_trailer_button">ट्रेलर प्ले गर्नुहोस्</string>
<string name="play_livestream_button">लाइभस्ट्रिम प्ले गर्नुहोस्</string>
<string name="pick_subtitle">उपशीर्षक</string>
<string name="reload_error">पुनः प्रयास गर्नुहोस…</string>
<string name="go_back">पछाडि जानुहोस्</string>
<string name="play_episode">एपिसोड प्ले गर्नुहोस्</string>
<string name="download">डाउनलोड</string>
<string name="downloaded">डाउनलोड भयो</string>
<string name="downloading">डाउनलोड हुदैछ</string>
<string name="download_paused">डाउनलोड रोकियो</string>
<string name="download_started">डाउनलोड सुरु भयो</string>
<string name="download_failed">डाउनलोड असफल भयो</string>
<string name="download_canceled">डाउनलोड रद्द गरियो</string>
<string name="download_done">डाउनलोड भयो</string>
<string name="update_started">अपडेट सुरु</string>
<string name="stream">स्ट्रिम</string>
<string name="error_loading_links_toast">लिङ्क लोड गर्दा त्रुटि भयो</string>
<string name="links_reloaded_toast">लिङ्कहरू रिलोड गरियो</string>
<string name="download_storage_text">भित्री स्टोरेज</string>
<string name="app_dubbed_text">Dub</string>
<string name="app_subbed_text">Sub</string>
<string name="popup_delete_file">फाइल मेट्नुहोस्</string>
<string name="popup_play_file">फाइल प्ले गर्नुहोस्</string>
<string name="popup_resume_download">डाउनलोड सुचारु गर्नुहोस्</string>
<string name="popup_pause_download">डाउनलोड रोक्नुहोस्</string>
<string name="home_more_info">थप जानकारी</string>
<string name="home_expanded_hide">लुकाउनुहोस्</string>
<string name="home_play">प्ले</string>
<string name="home_info">जानकारी</string>
<string name="filter_bookmarks">बुकमार्कहरू फिल्टर गर्नुहोस्</string>
<string name="error_bookmarks_text">बुकमार्कहरू</string>
<string name="action_remove_from_bookmarks">हटाउनुहोस्</string>
<string name="action_add_to_bookmarks">हेरेको स्थिति राख्नुहोस्</string>
<string name="sort_copy">कपी</string>
<string name="sort_close">बन्द</string>
<string name="sort_clear">खाली गर्नुहोस्</string>
<string name="sort_save">सेव</string>
<string name="next_episode_format" formatted="true">एपिसोड %d रिलीज हुने समय</string>
<string name="no_data">डाटा छैन</string>
<string name="next_episode">अर्को एपिसोड</string>
<string name="type_watching">हेर्दै गरेको</string>
<string name="type_completed">पुरा भएको</string>
<string name="type_re_watching">पुन: हेर्दै</string>
<string name="play_torrent_button">स्ट्रिम टोरेन्ट</string>
<string name="pick_source">स्रोतहरू</string>
<string name="pref_disable_acra">स्वचालित बग रिपोर्टिङ असक्षम गर्नुहोस्</string>
<string name="sort_apply">लागू गर्नुहोस्</string>
</resources>

View file

@ -532,4 +532,11 @@
\nLaster ikke inn noen utvidelser ved oppstart til filen er fjernet.</string> \nLaster ikke inn noen utvidelser ved oppstart til filen er fjernet.</string>
<string name="empty_library_no_accounts_message">Biblioteket ditt er tomt :( <string name="empty_library_no_accounts_message">Biblioteket ditt er tomt :(
\nLogg inn på en bibliotekkonto eller legg til programmer i ditt lokale bibliotek.</string> \nLogg inn på en bibliotekkonto eller legg til programmer i ditt lokale bibliotek.</string>
<string name="edit">Rediger</string>
<string name="profiles">Profiler</string>
<string name="favorites_list_name">Favoritter</string>
<string name="lock_profile">Lås profil</string>
<string name="use">Bruk</string>
<string name="help">Hjelp</string>
<string name="profile_background_des">Profilbakgrunn</string>
</resources> </resources>

View file

@ -158,4 +158,5 @@
<string name="next_episode">ପରବର୍ତ୍ତୀ ଅଧ୍ୟାୟ</string> <string name="next_episode">ପରବର୍ତ୍ତୀ ଅଧ୍ୟାୟ</string>
<string name="no_data">କୌଣସି ତଥ୍ୟ ନାହିଁ</string> <string name="no_data">କୌଣସି ତଥ୍ୟ ନାହିଁ</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 ଅ %2$d</string>
<string name="video_skip_op">ଆଦ୍ୟ ବାଦ୍ ଦିଅ</string>
</resources> </resources>

View file

@ -421,12 +421,12 @@
<string name="pref_category_looks">Oтoбpaжeниe</string> <string name="pref_category_looks">Oтoбpaжeниe</string>
<string name="trailer">Трейлер</string> <string name="trailer">Трейлер</string>
<string name="single_plugin_disabled" formatted="true">%s (отключено)</string> <string name="single_plugin_disabled" formatted="true">%s (отключено)</string>
<string name="next">Следующий</string> <string name="next">Далее</string>
<string name="blank_repo_message">В CloudStream по умолчанию не установлены сайты. Вам необходимо установить сайты из репозиториев. <string name="blank_repo_message">В CloudStream по умолчанию не установлены сайты. Вам необходимо установить сайты из репозиториев.
\n \n
\nИз-за безмозглой DMCA-атаки со стороны Sky UK Limited 🤮 мы не можем привязать сайт репозитория в приложении. \nИз-за безмозглой жалобы DMCA от Sky UK Limited 🤮 мы не можем привязать сайт репозитория в приложении.
\n \n
\nПрисоединяйтесь к нашему Discord или ищите в интернете.</string> \nПрисоединяйтесь к нашему Discord-серверу или найдите в интернете.</string>
<string name="error_invalid_data">Недопустимые данные</string> <string name="error_invalid_data">Недопустимые данные</string>
<string name="resolution_and_title">Разрешение и название</string> <string name="resolution_and_title">Разрешение и название</string>
<string name="previous">Предыдущий</string> <string name="previous">Предыдущий</string>
@ -551,4 +551,5 @@
\nБудет иметь общий приоритет видео 10. \nБудет иметь общий приоритет видео 10.
\n \n
\nПРИМЕЧАНИЕ. Если сумма равна 10 или более, плеер автоматически пропустит загрузку при загрузке этой ссылки!</string> \nПРИМЕЧАНИЕ. Если сумма равна 10 или более, плеер автоматически пропустит загрузку при загрузке этой ссылки!</string>
<string name="links_reloaded_toast">Ссылки перезагружены</string>
</resources> </resources>

View file

@ -13,7 +13,7 @@
<string name="search_poster_img_des">Affisch</string> <string name="search_poster_img_des">Affisch</string>
<string name="no_data">Ingen Data</string> <string name="no_data">Ingen Data</string>
<string name="episode_more_options_des">Mer Instälningar</string> <string name="episode_more_options_des">Mer Instälningar</string>
<string name="go_back_img_des">Gå tillbacka</string> <string name="go_back_img_des">Gå tillbaka</string>
<string name="next_episode">Nästa avsnitt</string> <string name="next_episode">Nästa avsnitt</string>
<string name="result_poster_img_des">Affisch</string> <string name="result_poster_img_des">Affisch</string>
<string name="result_tags">Genrer</string> <string name="result_tags">Genrer</string>
@ -24,8 +24,8 @@
<string name="type_watching">Tittar på</string> <string name="type_watching">Tittar på</string>
<string name="type_on_hold">Pausad</string> <string name="type_on_hold">Pausad</string>
<string name="type_completed">Avslutad</string> <string name="type_completed">Avslutad</string>
<string name="type_dropped">Dropped</string> <string name="type_dropped">Släppt</string>
<string name="type_plan_to_watch">Plannerad</string> <string name="type_plan_to_watch">Planerad</string>
<string name="play_movie_button">Spela Upp</string> <string name="play_movie_button">Spela Upp</string>
<string name="play_torrent_button">Strömma Torrent</string> <string name="play_torrent_button">Strömma Torrent</string>
<string name="pick_source">Källor</string> <string name="pick_source">Källor</string>
@ -39,10 +39,10 @@
<string name="app_dubbed_text">Dub</string> <string name="app_dubbed_text">Dub</string>
<string name="app_subbed_text">Sub</string> <string name="app_subbed_text">Sub</string>
<string name="popup_delete_file">Ta bort</string> <string name="popup_delete_file">Ta bort</string>
<string name="popup_play_file">Spela upp</string> <string name="popup_play_file">Spela upp fil</string>
<string name="pref_disable_acra">Inaktivera automatisk felrapportering</string> <string name="pref_disable_acra">Inaktivera automatisk felrapportering</string>
<string name="home_more_info">Mer information</string> <string name="home_more_info">Mer information</string>
<string name="home_expanded_hide">Hide</string> <string name="home_expanded_hide">Göm</string>
<string name="home_main_poster_img_des">@string/result_poster_img_des</string> <string name="home_main_poster_img_des">@string/result_poster_img_des</string>
<string name="home_play">Spela upp</string> <string name="home_play">Spela upp</string>
<string name="home_info">Info</string> <string name="home_info">Info</string>
@ -64,10 +64,10 @@
<string name="subs_font">Font</string> <string name="subs_font">Font</string>
<string name="search_provider_text_providers">Sök med följande leverantörer</string> <string name="search_provider_text_providers">Sök med följande leverantörer</string>
<string name="search_provider_text_types">Sök med följande filmtyper</string> <string name="search_provider_text_types">Sök med följande filmtyper</string>
<string name="benene_count_text">%d Bananer donerade till utvecklarna</string> <string name="benene_count_text">%d bananer donerade till utvecklarna</string>
<string name="benene_count_text_none">Inga bananer givna</string> <string name="benene_count_text_none">Inga bananer givna</string>
<string name="subs_auto_select_language">Automatisk val av undertextspråk</string> <string name="subs_auto_select_language">Automatisk val av undertextspråk</string>
<string name="subs_download_languages">Automatisk nerladdaning av språk</string> <string name="subs_download_languages">Automatisk nedladdning av språk</string>
<string name="subs_hold_to_reset_to_default">Håll inne för att återställa till standard</string> <string name="subs_hold_to_reset_to_default">Håll inne för att återställa till standard</string>
<string name="continue_watching">Fortsätt titta</string> <string name="continue_watching">Fortsätt titta</string>
<string name="action_remove_watching">Ta bort</string> <string name="action_remove_watching">Ta bort</string>
@ -297,7 +297,7 @@
<string name="referer">Referer</string> <string name="referer">Referer</string>
<string name="next">Nästa</string> <string name="next">Nästa</string>
<string name="subtitle_offset_hint">1000 ms</string> <string name="subtitle_offset_hint">1000 ms</string>
<string name="add_site_summary">Lägga till en klon av en befintlig webbplats med en annan webbadress.</string> <string name="add_site_summary">Lägga till en klon av en befintlig webbplats med en annan webbadress</string>
<string name="error_invalid_id">Ogiltigt ID</string> <string name="error_invalid_id">Ogiltigt ID</string>
<string name="error_invalid_url">Ogiltig webbadress</string> <string name="error_invalid_url">Ogiltig webbadress</string>
<string name="video_ram_description">Orsakar krascher om inställningen är för hög på enheter med lågt minne, t.ex. Android TV.</string> <string name="video_ram_description">Orsakar krascher om inställningen är för hög på enheter med lågt minne, t.ex. Android TV.</string>
@ -403,7 +403,7 @@
<string name="restart">Starta om</string> <string name="restart">Starta om</string>
<string name="category_provider_test">Testa leverantörer</string> <string name="category_provider_test">Testa leverantörer</string>
<string name="watch_quality_pref_data">Föredragen videokvalitet (Mobildata)</string> <string name="watch_quality_pref_data">Föredragen videokvalitet (Mobildata)</string>
<string name="random_button_settings_desc">Visa en slumpknapp på förstasidan</string> <string name="random_button_settings_desc">Visa slumpmässig knapp på förstasidan och biblioteket</string>
<string name="is_adult">18+</string> <string name="is_adult">18+</string>
<string name="audio_tracks">Ljudspår</string> <string name="audio_tracks">Ljudspår</string>
<string name="livestreams">Direktsändningar</string> <string name="livestreams">Direktsändningar</string>
@ -433,4 +433,163 @@
<string name="help">Hjälp</string> <string name="help">Hjälp</string>
<string name="qualities">Kvalitet</string> <string name="qualities">Kvalitet</string>
<string name="stream">Ström</string> <string name="stream">Ström</string>
<string name="repository_name_hint">Databasens namn</string>
<string name="batch_download_nothing_to_download_format" formatted="true">All %s har redan laddats ner</string>
<string name="download_all_plugins_from_repo">Ladda ner alla tillägg från den här databasen?</string>
<string name="safe_mode_title">Felsäkert läge på</string>
<string name="apply_on_restart">Applicera vid omstart</string>
<string name="player_settings_play_in_app">Intern spelare</string>
<string name="quality_cam_hd">Kamera HD</string>
<string name="plugin_downloaded">Tillägg nedladdad</string>
<string name="repository_url_hint">Lager URL</string>
<string name="batch_download_start_format" formatted="true">Börjat hämta %1$d %2$s…</string>
<string name="bottom_title_settings">Affisch titel plats</string>
<string name="player_loaded_subtitles" formatted="true">Laddat %s</string>
<string name="actor_main">Huvudsaklig</string>
<string name="actor_supporting">Stödjande</string>
<string name="actor_background">Bakgrund</string>
<string name="view_public_repositories_button_short">Offentlig lista</string>
<string name="extension_language">Språk</string>
<string name="extension_install_first">Installera tillägget först</string>
<string name="player_pref">Önskad videospelare</string>
<string name="android_tv_interface_on_seek_settings">Spelare visas - Sök förlopp</string>
<string name="android_tv_interface_on_seek_settings_summary">Sök förlopp som används när spelaren är synlig</string>
<string name="start">Starta</string>
<string name="stop">Stopp</string>
<string name="revert">Återställ</string>
<string name="subscription_deleted">Avslutat prenumerationen på %s</string>
<string name="subscription_episode_released">Avsnitt %d släppt!</string>
<string name="empty_library_logged_in_message">Den här listan är tom. Försök byta till en annan.</string>
<string name="plugin_deleted">Tillägg borttagen</string>
<string name="plugin_loaded">Tillägg laddade</string>
<string name="plugin_singular">Tillägg</string>
<string name="backup_frequency">Säkerhetskopierings antal</string>
<string name="episode_sync_settings">Uppdatera visnings förlopp</string>
<string name="automatic_plugin_download_mode_title">Välj läge för att filtrera nedladdning av plugins</string>
<string name="extension_version">Utgåva</string>
<string name="extension_status">Status</string>
<string name="enter_pin">Ange PIN-kod</string>
<string name="enter_pin_with_name" formatted="true">Ange PIN-kod för %s</string>
<string name="enter_current_pin">Ange aktuell PIN-kod</string>
<string name="lock_profile">Lås profil</string>
<string name="pin_error_incorrect">Felaktig PIN-kod. Försök igen.</string>
<string name="pin_error_length">PIN-koden måste vara fyra tecken</string>
<string name="select_an_account">Välj ett konto</string>
<string name="manage_accounts">Hantera konton</string>
<string name="edit_account">Redigera konto</string>
<string name="logged_account" formatted="true">Loggat in som %s</string>
<string name="skip_startup_account_select_pref">Hoppa över val av konto vid start</string>
<string name="auto_rotate_video_key">auto_rotera_video_nyckel</string>
<string name="jsdelivr_proxy_summary">Förbi passera blockering av GitHub genom att använda jsDelivr. Kan göra att uppdateringar försenas med några dagar.</string>
<string name="pref_category_actions">Funktion</string>
<string name="preferred_media_settings">Önskad media</string>
<string name="bottom_title_settings_des">Lägg titeln under affischen</string>
<string name="added_sync_format" formatted="true">Tillagt %s</string>
<string name="add_sync">Lägg till spårning</string>
<string name="sync_score">Betygsatt</string>
<string name="disable">Inaktivera</string>
<string name="quality_webrip">Web</string>
<string name="poster_image">Affischbild</string>
<string name="preferred_media_subtext">Vad vill du se</string>
<string name="add_repository">Lägg till databas</string>
<string name="plugins_updated" formatted="true">Uppdaterade %d tillägg</string>
<string name="batch_download_finish_format" formatted="true">Nedladdat %1$d %2$s</string>
<string name="plugins_disabled" formatted="true">Inaktiverad: %d</string>
<string name="plugins_not_downloaded" formatted="true">Ej hämtad: %d</string>
<string name="view_public_repositories_button">Visa community databaser</string>
<string name="skip_type_mixed_op">Blandad inledning</string>
<string name="skip_type_format" formatted="true">Skippa %s</string>
<string name="blank_repo_message">CloudStream har inga webbplatser installerade som standard. Du måste installera webbplatserna från databaser.
\n
\nPå grund av en hjärnlös DMCA-borttagning av Sky UK Limited kan vi inte länka databaser på denna applikation.
\n
\nGå med i vår Discord eller sök online.</string>
<string name="select_library">Välj bibliotek</string>
<string name="empty_library_no_accounts_message">Ditt bibliotek är tomt :(
\nLogga in på ett bibliotekskonto eller lägg till program i ditt lokala bibliotek.</string>
<string name="enable_skip_op_from_database_des">Visa hoppa över popups för introduktion/eftertexter</string>
<string name="action_remove_from_watched">Ta bort från sett</string>
<string name="safe_mode_file">Fil i säkertläge hittades!
\nLaddar inte några tillägg vid start tills filen har tagits bort.</string>
<string name="subscription_in_progress_notification">Uppdaterar prenumererade program</string>
<string name="subscription_list_name">Prenumererad</string>
<string name="action_subscribe">Prenumerera</string>
<string name="unable_to_inflate">UI kunde inte skapas korrekt, detta är en MASSIV BUG och bör rapporteras omedelbart %s</string>
<string name="already_voted">Du har redan röstat</string>
<string name="action_unsubscribe">Avprenumerera</string>
<string name="action_add_to_favorites">Lägg till i favoriter</string>
<string name="duplicate_add">Lägg till</string>
<string name="duplicate_title">Potentiell Dublett Hittad</string>
<string name="action_remove_from_favorites">Ta bort från favoriter</string>
<string name="duplicate_replace">Ersätt</string>
<string name="duplicate_replace_all">Ersätt alla</string>
<string name="filler" formatted="true">Filler</string>
<string name="pref_category_bypass">Förbikoppla ISP</string>
<string name="quality_cam_rip">Kamera</string>
<string name="quality_cam">Kamera</string>
<string name="safe_mode_description">Alla tillägg stängdes av på grund av en krasch för att hjälpa dig hitta den som orsakar problem.</string>
<string name="extension_size">Storlek</string>
<string name="extension_authors">Författarna</string>
<string name="extension_types">Stödd</string>
<string name="no_plugins_found_error">Inga tillägg hittades i databasen</string>
<string name="no_repository_found_error">Databasen hittades inte, kontrollera URL:n och prova VPN</string>
<string name="batch_download">Flerfils nedladdning</string>
<string name="plugin">Tillägg</string>
<string name="plugins_downloaded" formatted="true">Hämtat: %d</string>
<string name="extension_rating" formatted="true">Betyg: %s</string>
<string name="clipboard_too_large">För mycket text. Det gick inte att spara till urklipp.</string>
<string name="quality_hq">Hög kvalite</string>
<string name="upload_sync">Synka</string>
<string name="skip_type_ed">Slutet</string>
<string name="skip_type_mixed_ed">Blandad avslut</string>
<string name="subscription_new">Prenumererar på %s</string>
<string name="safe_mode_crash_info">Visa krasch info</string>
<string name="hls_playlist">HLS spellista</string>
<string name="plugin_load_fail" formatted="true">Kunde inte ladda %s</string>
<string name="skip_type_op">Inledning</string>
<string name="skip_type_recap">Sammanfattning</string>
<string name="pref_category_gestures">Gester</string>
<string name="authenticated_user" formatted="true">%s autentiserad</string>
<string name="extras">Statister</string>
<string name="network_adress_example">Länka till strömmen</string>
<string name="delete_repository">Radera databasen</string>
<string name="profile_background_des">Profil bakgrund</string>
<string name="quality_workprint">WP</string>
<string name="auto_rotate_video">Auto rotera</string>
<string name="rotate_video">Rotera</string>
<string name="rotate_video_desc">Visa en växlingsknapp för skärmorientering</string>
<string name="auto_rotate_video_desc">Aktivera automatisk växling av skärmorientering baserat på videoorientering</string>
<string name="links_reloaded_toast">Länkar omladdade</string>
<string name="android_tv_interface_off_seek_settings">Spelare dold - Sökförlopp</string>
<string name="quality_blueray">Blu-ray</string>
<string name="delete_repository_plugins">Detta kommer också att ta bort alla tillägg för databasen</string>
<string name="setup_extensions_subtext">Ladda ner listan över webbplatser du vill använda</string>
<string name="single_plugin_disabled" formatted="true">%s (Inaktiverad)</string>
<string name="extension_description">Beskrivning</string>
<string name="skip_type_creddits">Eftertexter</string>
<string name="skip_type_intro">Introduktion</string>
<string name="favorites_list_name">Favoriter</string>
<string name="set_default">Ange standard</string>
<string name="favorite_removed">%s togs bort från favoriter</string>
<string name="favorite_added">%s har lagts till i favoriter</string>
<string name="use_default_account">Använd standard konto</string>
<string name="rotate_video_key">rotera_video_nyckel</string>
<string name="pin">PIN-kod</string>
<string name="android_tv_interface_off_seek_settings_summary">Sök mängden som används när spelaren är dold</string>
<string name="duplicate_message_multiple" formatted="true">Det verkar som om ett potentiellt duplicerat objekt redan finns i ditt bibliotek:
\n
\n\'%s.\'
\n
\nVill du lägga till det här objektet ändå, ersätta det befintliga eller avbryta åtgärden?</string>
<string name="duplicate_message_single" formatted="true">Det verkar som om ett potentiellt duplicerat objekt redan finns i ditt bibliotek: \'%s.\'
\n
\nVill du lägga till det här objektet ändå, ersätta det befintliga eller avbryta åtgärden?</string>
<string name="quality_profile_help">Här kan du ändra hur källorna ska sorteras, om en video har högre prioritet visas den högre upp i källvalet. Summan av källprioriteten och kvalitetsprioriteten är videoprioriteten.
\n
\nKälla A: 3
\nKvalitet B: 7
\nKommer att ha en kombinerad videoprioritet på 10.
\n
\nOBS: Om summan är 10 eller mer kommer spelaren automatiskt att hoppa över laddningen när den länken laddas!</string>
<string name="copyTitle">Titel kopierad!</string>
</resources> </resources>

View file

@ -308,7 +308,7 @@
<string name="legal_notice_text" translatable="false">Any legal issues regarding the content on this application should be taken up with the actual file hosts and providers themselves as we are not affiliated with them. In case of copyright infringement, please directly contact the responsible parties or the streaming websites. The app is purely for educational and personal use. CloudStream 3 does not host any content on the app, and has no control over what media is put up or taken down. CloudStream 3 functions like any other search engine, such as Google. CloudStream 3 does not host, upload or manage any videos, films or content. It simply crawls, aggregates and displayes links in a convenient, user-friendly interface. It merely scrapes 3rd-party websites that are publicly accessable via any regular web browser. It is the responsibility of user to avoid any actions that might violate the laws governing his/her locality. Use CloudStream 3 at your own risk.</string> <string name="legal_notice_text" translatable="false">Any legal issues regarding the content on this application should be taken up with the actual file hosts and providers themselves as we are not affiliated with them. In case of copyright infringement, please directly contact the responsible parties or the streaming websites. The app is purely for educational and personal use. CloudStream 3 does not host any content on the app, and has no control over what media is put up or taken down. CloudStream 3 functions like any other search engine, such as Google. CloudStream 3 does not host, upload or manage any videos, films or content. It simply crawls, aggregates and displayes links in a convenient, user-friendly interface. It merely scrapes 3rd-party websites that are publicly accessable via any regular web browser. It is the responsibility of user to avoid any actions that might violate the laws governing his/her locality. Use CloudStream 3 at your own risk.</string>
<string name="category_general">Genel</string> <string name="category_general">Genel</string>
<string name="random_button_settings">Rastgele İçerik</string> <string name="random_button_settings">Rastgele İçerik</string>
<string name="random_button_settings_desc">Ana sayfada rastgele bir film veya dizi seçen bir tuş göster</string> <string name="random_button_settings_desc">Anasayfada ve Kütüphanede rastgele düğmesini göster</string>
<string name="provider_lang_settings">Sağlayıcı dilleri</string> <string name="provider_lang_settings">Sağlayıcı dilleri</string>
<string name="app_layout">Uygulama düzeni</string> <string name="app_layout">Uygulama düzeni</string>
<string name="preferred_media_settings">Tercih edilen medya</string> <string name="preferred_media_settings">Tercih edilen medya</string>
@ -638,4 +638,5 @@
<string name="rotate_video">Döndür</string> <string name="rotate_video">Döndür</string>
<string name="auto_rotate_video_desc">Video yönüne göre ekran yönünün otomatik olarak değişmesini sağla</string> <string name="auto_rotate_video_desc">Video yönüne göre ekran yönünün otomatik olarak değişmesini sağla</string>
<string name="links_reloaded_toast">Bağlantılar Yeniden Yüklendi</string> <string name="links_reloaded_toast">Bağlantılar Yeniden Yüklendi</string>
<string name="copyTitle">Başlık kopyalandı!</string>
</resources> </resources>

View file

@ -282,7 +282,7 @@
<string name="pref_category_ui_features">Особливості</string> <string name="pref_category_ui_features">Особливості</string>
<string name="category_general">Загальне</string> <string name="category_general">Загальне</string>
<string name="random_button_settings">Випадкова кнопка</string> <string name="random_button_settings">Випадкова кнопка</string>
<string name="random_button_settings_desc">Показувати кнопку на Головній сторінці, яка вибирає випадковий фільм чи серіал</string> <string name="random_button_settings_desc">Показувати кнопку на Головній сторінці та в Бібліотеці, яка вибирає випадковий фільм чи серіал</string>
<string name="provider_lang_settings">Мови постачальника</string> <string name="provider_lang_settings">Мови постачальника</string>
<string name="app_layout">Макет застосунку</string> <string name="app_layout">Макет застосунку</string>
<string name="preferred_media_settings">Бажані медіа</string> <string name="preferred_media_settings">Бажані медіа</string>
@ -591,4 +591,5 @@
<string name="auto_rotate_video_key">auto_rotate_video_key</string> <string name="auto_rotate_video_key">auto_rotate_video_key</string>
<string name="auto_rotate_video">Автоповорот</string> <string name="auto_rotate_video">Автоповорот</string>
<string name="auto_rotate_video_desc">Ввімкнути автоматичний поворот екрана на основі орієнтації відео</string> <string name="auto_rotate_video_desc">Ввімкнути автоматичний поворот екрана на основі орієнтації відео</string>
<string name="copyTitle">Назву скопійовано!</string>
</resources> </resources>

View file

@ -309,7 +309,7 @@
<string name="legal_notice_text" translatable="false">Any legal issues regarding the content on this application should be taken up with the actual file hosts and providers themselves as we are not affiliated with them. In case of copyright infringement, please directly contact the responsible parties or the streaming websites. The app is purely for educational and personal use. CloudStream 3 does not host any content on the app, and has no control over what media is put up or taken down. CloudStream 3 functions like any other search engine, such as Google. CloudStream 3 does not host, upload or manage any videos, films or content. It simply crawls, aggregates and displayes links in a convenient, user-friendly interface. It merely scrapes 3rd-party websites that are publicly accessable via any regular web browser. It is the responsibility of user to avoid any actions that might violate the laws governing his/her locality. Use CloudStream 3 at your own risk.</string> <string name="legal_notice_text" translatable="false">Any legal issues regarding the content on this application should be taken up with the actual file hosts and providers themselves as we are not affiliated with them. In case of copyright infringement, please directly contact the responsible parties or the streaming websites. The app is purely for educational and personal use. CloudStream 3 does not host any content on the app, and has no control over what media is put up or taken down. CloudStream 3 functions like any other search engine, such as Google. CloudStream 3 does not host, upload or manage any videos, films or content. It simply crawls, aggregates and displayes links in a convenient, user-friendly interface. It merely scrapes 3rd-party websites that are publicly accessable via any regular web browser. It is the responsibility of user to avoid any actions that might violate the laws governing his/her locality. Use CloudStream 3 at your own risk.</string>
<string name="category_general">通用</string> <string name="category_general">通用</string>
<string name="random_button_settings">随机按钮</string> <string name="random_button_settings">随机按钮</string>
<string name="random_button_settings_desc">在主页中显示随机按钮</string> <string name="random_button_settings_desc">在主页和库中显示随机按钮</string>
<string name="provider_lang_settings">片源语言</string> <string name="provider_lang_settings">片源语言</string>
<string name="app_layout">应用布局</string> <string name="app_layout">应用布局</string>
<string name="preferred_media_settings">首选类型</string> <string name="preferred_media_settings">首选类型</string>
@ -592,4 +592,22 @@
\n注意如果总和为 10 或更多,则加载该链接时播放器将自动跳过加载!</string> \n注意如果总和为 10 或更多,则加载该链接时播放器将自动跳过加载!</string>
<string name="qualities">质量</string> <string name="qualities">质量</string>
<string name="profile_background_des">个人资料背景</string> <string name="profile_background_des">个人资料背景</string>
<string name="pin">PIN</string>
<string name="links_reloaded_toast">链接已重新加载</string>
<string name="disable">禁用</string>
<string name="pin_error_incorrect">PIN码不正确请再试一次。</string>
<string name="pin_error_length">PIN码必须为4个字符</string>
<string name="select_an_account">选择一个账户</string>
<string name="manage_accounts">账户管理</string>
<string name="action_subscribe">订阅</string>
<string name="action_unsubscribe">取消订阅</string>
<string name="duplicate_add">添加</string>
<string name="duplicate_replace">替换</string>
<string name="duplicate_replace_all">替换全部</string>
<string name="no_plugins_found_error">仓库中未找到插件</string>
<string name="rotate_video">旋转</string>
<string name="auto_rotate_video">自动旋转</string>
<string name="logged_account" formatted="true">以%s的身份登录</string>
<string name="use_default_account">使用默认账户</string>
<string name="automatic_plugin_download_mode_title">选择过滤插件的下载模式</string>
</resources> </resources>

View file

@ -67,6 +67,8 @@
<string name="enable_nsfw_on_providers_key" translatable="false">enable_nsfw_on_providers_key</string> <string name="enable_nsfw_on_providers_key" translatable="false">enable_nsfw_on_providers_key</string>
<string name="skip_startup_account_select_key" translatable="false">skip_startup_account_select_key</string> <string name="skip_startup_account_select_key" translatable="false">skip_startup_account_select_key</string>
<string name="enable_skip_op_from_database" translatable="false">enable_skip_op_from_database</string> <string name="enable_skip_op_from_database" translatable="false">enable_skip_op_from_database</string>
<string name="rotate_video_key" translatable="false">rotate_video_key</string>
<string name="auto_rotate_video_key" translatable="false">auto_rotate_video_key</string>
<!-- FORMAT MIGHT TRANSLATE, WILL CAUSE CRASH IF APPLIED WRONG --> <!-- FORMAT MIGHT TRANSLATE, WILL CAUSE CRASH IF APPLIED WRONG -->
<string name="extra_info_format" formatted="true" translatable="false">%d %s | %s</string> <string name="extra_info_format" formatted="true" translatable="false">%d %s | %s</string>
<string name="storage_size_format" formatted="true" translatable="false">%s • %s</string> <string name="storage_size_format" formatted="true" translatable="false">%s • %s</string>
@ -736,9 +738,7 @@
<string name="skip_startup_account_select_pref">Skip account selection at startup</string> <string name="skip_startup_account_select_pref">Skip account selection at startup</string>
<string name="use_default_account">Use Default Account</string> <string name="use_default_account">Use Default Account</string>
<string name="rotate_video">Rotate</string> <string name="rotate_video">Rotate</string>
<string name="rotate_video_key">rotate_video_key</string>
<string name="rotate_video_desc">Display a toggle button for screen orientation</string> <string name="rotate_video_desc">Display a toggle button for screen orientation</string>
<string name="auto_rotate_video_key">auto_rotate_video_key</string>
<string name="auto_rotate_video_desc">Enable automatic switching of screen orientation based on video orientation</string> <string name="auto_rotate_video_desc">Enable automatic switching of screen orientation based on video orientation</string>
<string name="auto_rotate_video">Auto rotate</string> <string name="auto_rotate_video">Auto rotate</string>
</resources> </resources>

View file

@ -5,8 +5,8 @@ buildscript {
mavenCentral() mavenCentral()
} }
dependencies { dependencies {
classpath("com.android.tools.build:gradle:8.1.4") classpath("com.android.tools.build:gradle:8.2.1")
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.21") classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.22")
classpath("org.jetbrains.dokka:dokka-gradle-plugin:1.9.10") classpath("org.jetbrains.dokka:dokka-gradle-plugin:1.9.10")
// NOTE: Do not place your application dependencies here; they belong // NOTE: Do not place your application dependencies here; they belong
@ -22,7 +22,7 @@ allprojects {
} }
plugins { plugins {
id("com.google.devtools.ksp") version "1.9.21-1.0.15" apply false id("com.google.devtools.ksp") version "1.9.22-1.0.16" apply false
} }
tasks.register<Delete>("clean") { tasks.register<Delete>("clean") {

View file

@ -0,0 +1 @@
- Dodan je dnevnik promjena!

View file

@ -0,0 +1,10 @@
CloudStream-3 omogućuje emitiranje i preuzimanje filmova, TV serija i animea.
Aplikacija ne koristi oglase i analitike te
podržava stranice s trailerima, filmovima i više, npr.
Oznake
Preuzimanja titlova
Chromecast podrška

View file

@ -0,0 +1 @@
Emitirajte i preuzmite filmove, TV serije i anime.

View file

@ -0,0 +1 @@
CloudStream

View file

@ -0,0 +1 @@
- Ändringslogg tillagd!

View file

@ -0,0 +1,10 @@
CloudStream-3 låter dig streama och ladda ner filmer, TV-serier och anime.
Appen levereras utan annonser och analyser och
stöder flera trailer- och film webbplatser och mer, t.ex.
Bokmärken
Nedladdning av undertexter
Stöd för Chromecast

View file

@ -0,0 +1 @@
Streama och ladda ner filmer, TV serier och anime.

View file

@ -0,0 +1 @@
CloudStream

View file

@ -19,6 +19,5 @@ android.useAndroidX=true
# android.enableJetifier=true # android.enableJetifier=true
# Kotlin code style for this project: "official" or "obsolete": # Kotlin code style for this project: "official" or "obsolete":
kotlin.code.style=official kotlin.code.style=official
android.defaults.buildfeatures.buildconfig=true
android.nonTransitiveRClass=false android.nonTransitiveRClass=false
android.nonFinalResIds=false android.nonFinalResIds=false

View file

@ -1,6 +1,6 @@
#Fri Apr 30 17:11:15 CEST 2021 #Fri Apr 30 17:11:15 CEST 2021
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionUrl=https\://services.gradle.org/distributions/gradle-8.1-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip
distributionPath=wrapper/dists distributionPath=wrapper/dists
zipStorePath=wrapper/dists zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME