mirror of
https://github.com/recloudstream/cloudstream.git
synced 2024-08-15 01:53:11 +00:00
Merge branch 'recloudstream:master' into extractor
This commit is contained in:
commit
c9204cf439
29 changed files with 729 additions and 101 deletions
|
@ -5,7 +5,7 @@ You can find the list of community-maintained extension repositories [here
|
|||
](https://recloudstream.github.io/repos/)
|
||||
|
||||
|
||||
[](https://discord.gg/5Hus6fM)
|
||||
[](https://discord.gg/5Hus6fM)
|
||||
|
||||
***Features:***
|
||||
+ **AdFree**, No ads whatsoever
|
||||
|
@ -21,6 +21,7 @@ You can find the list of community-maintained extension repositories [here
|
|||
|
||||
***The list of supported languages:***
|
||||
* 🇱🇧 Arabic
|
||||
* 🇭🇷 Croatian
|
||||
* 🇨🇿 Czech
|
||||
* 🇳🇱 Dutch
|
||||
* 🇬🇧 English
|
||||
|
|
|
@ -64,4 +64,24 @@ fun OkHttpClient.Builder.addAdGuardDns() = (
|
|||
"94.140.14.140",
|
||||
"94.140.14.141",
|
||||
)
|
||||
))
|
||||
))
|
||||
|
||||
fun OkHttpClient.Builder.addDNSWatchDns() = (
|
||||
addGenericDns(
|
||||
"https://resolver2.dns.watch/dns-query",
|
||||
// https://dns.watch/
|
||||
listOf(
|
||||
"84.200.69.80",
|
||||
"84.200.70.40",
|
||||
)
|
||||
))
|
||||
|
||||
fun OkHttpClient.Builder.addQuad9Dns() = (
|
||||
addGenericDns(
|
||||
"https://dns.quad9.net/dns-query",
|
||||
// https://www.quad9.net/service/service-addresses-and-features
|
||||
listOf(
|
||||
"9.9.9.9",
|
||||
"149.112.112.112",
|
||||
)
|
||||
))
|
|
@ -36,6 +36,8 @@ fun Requests.initClient(context: Context): OkHttpClient {
|
|||
2 -> addCloudFlareDns()
|
||||
// 3 -> addOpenDns()
|
||||
4 -> addAdGuardDns()
|
||||
5 -> addDNSWatchDns()
|
||||
6 -> addQuad9Dns()
|
||||
}
|
||||
}
|
||||
// Needs to be build as otherwise the other builders will change this object
|
||||
|
|
|
@ -339,9 +339,7 @@ object PluginManager {
|
|||
}
|
||||
plugins[filePath] = pluginInstance
|
||||
classLoaders[loader] = pluginInstance
|
||||
if (data.url != null) { // TODO: make this cleaner
|
||||
urlPlugins[data.url] = pluginInstance
|
||||
}
|
||||
urlPlugins[data.url ?: filePath] = pluginInstance
|
||||
pluginInstance.load(activity)
|
||||
Log.i(TAG, "Loaded plugin ${data.internalName} successfully")
|
||||
currentlyLoading = null
|
||||
|
@ -382,6 +380,7 @@ object PluginManager {
|
|||
classLoaders.values.removeIf { v -> v == plugin }
|
||||
|
||||
plugins.remove(absolutePath)
|
||||
urlPlugins.values.removeIf { v -> v == plugin }
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -1,11 +1,15 @@
|
|||
package com.lagradost.cloudstream3.plugins
|
||||
|
||||
import android.util.Log
|
||||
import android.widget.Toast
|
||||
import com.lagradost.cloudstream3.AcraApplication.Companion.context
|
||||
import com.lagradost.cloudstream3.AcraApplication.Companion.getKey
|
||||
import com.lagradost.cloudstream3.AcraApplication.Companion.setKey
|
||||
import com.lagradost.cloudstream3.R
|
||||
import java.security.MessageDigest
|
||||
import com.lagradost.cloudstream3.app
|
||||
import com.lagradost.cloudstream3.utils.Coroutines.ioSafe
|
||||
import com.lagradost.cloudstream3.utils.Coroutines.main
|
||||
|
||||
object VotingApi { // please do not cheat the votes lol
|
||||
private const val LOGKEY = "VotingApi"
|
||||
|
@ -33,10 +37,13 @@ object VotingApi { // please do not cheat the votes lol
|
|||
}
|
||||
|
||||
fun SitePlugin.getVoteType(): VoteType {
|
||||
if (repositoryUrl == null) return VoteType.NONE
|
||||
return getVoteType(url)
|
||||
}
|
||||
|
||||
fun SitePlugin.canVote(): Boolean {
|
||||
return canVote(this.url)
|
||||
}
|
||||
|
||||
// Plugin url to Int
|
||||
private val votesCache = mutableMapOf<String, Int>()
|
||||
|
||||
|
@ -62,7 +69,18 @@ object VotingApi { // please do not cheat the votes lol
|
|||
app.get(url)
|
||||
}
|
||||
|
||||
fun canVote(pluginUrl: String): Boolean {
|
||||
if (!PluginManager.urlPlugins.contains(pluginUrl)) return false
|
||||
return true
|
||||
}
|
||||
|
||||
suspend fun vote(pluginUrl: String, requestType: VoteType): Int {
|
||||
if (!canVote(pluginUrl)) {
|
||||
main {
|
||||
Toast.makeText(context, R.string.extension_install_first, Toast.LENGTH_SHORT).show()
|
||||
}
|
||||
return getVotes(pluginUrl)
|
||||
}
|
||||
val savedType: VoteType = getKey("cs3-votes/${transformUrl(pluginUrl)}") ?: VoteType.NONE
|
||||
var newType: VoteType = requestType
|
||||
var changeValue = 0
|
||||
|
|
|
@ -13,7 +13,8 @@ class AbstractSubtitleEntities {
|
|||
var epNumber: Int? = null,
|
||||
var seasonNumber: Int? = null,
|
||||
var year: Int? = null,
|
||||
var isHearingImpaired: Boolean = false
|
||||
var isHearingImpaired: Boolean = false,
|
||||
var headers: Map<String, String> = emptyMap()
|
||||
)
|
||||
|
||||
data class SubtitleSearch(
|
||||
|
|
|
@ -4,6 +4,7 @@ import android.util.Log
|
|||
import com.lagradost.cloudstream3.TvType
|
||||
import com.lagradost.cloudstream3.app
|
||||
import com.lagradost.cloudstream3.imdbUrlToIdNullable
|
||||
import com.lagradost.cloudstream3.network.CloudflareKiller
|
||||
import com.lagradost.cloudstream3.subtitles.AbstractSubApi
|
||||
import com.lagradost.cloudstream3.subtitles.AbstractSubtitleEntities
|
||||
import com.lagradost.cloudstream3.utils.SubtitleHelper
|
||||
|
@ -19,6 +20,8 @@ class IndexSubtitleApi : AbstractSubApi {
|
|||
|
||||
override fun logOut() {}
|
||||
|
||||
private val interceptor = CloudflareKiller()
|
||||
|
||||
companion object {
|
||||
const val host = "https://indexsubtitle.com"
|
||||
const val TAG = "INDEXSUBS"
|
||||
|
@ -122,12 +125,13 @@ class IndexSubtitleApi : AbstractSubApi {
|
|||
type = if (seasonNum > 0) TvType.TvSeries else TvType.Movie,
|
||||
epNumber = epNum,
|
||||
seasonNumber = seasonNum,
|
||||
year = yearNum
|
||||
year = yearNum,
|
||||
headers = interceptor.getCookieHeaders(link).toMap()
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
val document = app.get("$host/?search=$queryText").document
|
||||
val document = app.get("$host/?search=$queryText", interceptor = interceptor).document
|
||||
|
||||
document.select("div.my-3.p-3 div.media").map { block ->
|
||||
if (seasonNum > 0) {
|
||||
|
@ -159,7 +163,7 @@ class IndexSubtitleApi : AbstractSubApi {
|
|||
val urlItem = fixUrl(
|
||||
it.selectFirst("a")!!.attr("href")
|
||||
)
|
||||
val itemDoc = app.get(urlItem).document
|
||||
val itemDoc = app.get(urlItem, interceptor = interceptor).document
|
||||
val id = imdbUrlToIdNullable(
|
||||
itemDoc.selectFirst("div.d-flex span.badge.badge-primary")?.parent()
|
||||
?.attr("href")
|
||||
|
@ -198,7 +202,7 @@ class IndexSubtitleApi : AbstractSubApi {
|
|||
val results = mutableListOf<AbstractSubtitleEntities.SubtitleEntity>()
|
||||
|
||||
urlItems.forEach { url ->
|
||||
val request = app.get(url)
|
||||
val request = app.get(url, interceptor = interceptor)
|
||||
if (request.isSuccessful) {
|
||||
request.document.select("div.my-3.p-3 div.media").map { block ->
|
||||
if (block.select("span.d-block span[data-original-title=Language]").text()
|
||||
|
@ -231,7 +235,7 @@ class IndexSubtitleApi : AbstractSubApi {
|
|||
val seasonNum = data.seasonNumber
|
||||
val epNum = data.epNumber
|
||||
|
||||
val req = app.get(data.data)
|
||||
val req = app.get(data.data, interceptor = interceptor)
|
||||
|
||||
if (req.isSuccessful) {
|
||||
val document = req.document
|
||||
|
|
|
@ -4,10 +4,12 @@ import android.os.Bundle
|
|||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.webkit.JavascriptInterface
|
||||
import android.webkit.WebResourceRequest
|
||||
import android.webkit.WebView
|
||||
import android.webkit.WebViewClient
|
||||
import androidx.fragment.app.Fragment
|
||||
import androidx.fragment.app.FragmentActivity
|
||||
import androidx.navigation.fragment.findNavController
|
||||
import com.lagradost.cloudstream3.R
|
||||
import com.lagradost.cloudstream3.network.WebViewResolver
|
||||
|
@ -46,6 +48,7 @@ class WebviewFragment : Fragment() {
|
|||
return super.shouldOverrideUrlLoading(view, request)
|
||||
}
|
||||
}
|
||||
web_view.addJavascriptInterface(RepoApi(activity), "RepoApi")
|
||||
web_view.settings.javaScriptEnabled = true
|
||||
web_view.settings.domStorageEnabled = true
|
||||
|
||||
|
@ -69,4 +72,11 @@ class WebviewFragment : Fragment() {
|
|||
putString(WEBVIEW_URL, webViewUrl)
|
||||
}
|
||||
}
|
||||
|
||||
private class RepoApi(val activity: FragmentActivity?) {
|
||||
@JavascriptInterface
|
||||
fun installRepo(repoUrl: String) {
|
||||
activity?.loadRepository(repoUrl)
|
||||
}
|
||||
}
|
||||
}
|
|
@ -20,6 +20,7 @@ import com.google.android.exoplayer2.ui.SubtitleView
|
|||
import com.google.android.exoplayer2.upstream.DataSource
|
||||
import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory
|
||||
import com.google.android.exoplayer2.upstream.DefaultHttpDataSource
|
||||
import com.google.android.exoplayer2.upstream.HttpDataSource
|
||||
import com.google.android.exoplayer2.upstream.cache.CacheDataSource
|
||||
import com.google.android.exoplayer2.upstream.cache.LeastRecentlyUsedCacheEvictor
|
||||
import com.google.android.exoplayer2.upstream.cache.SimpleCache
|
||||
|
@ -442,7 +443,14 @@ class CS3IPlayer : IPlayer {
|
|||
|
||||
var requestSubtitleUpdate: (() -> Unit)? = null
|
||||
|
||||
private fun createOnlineSource(link: ExtractorLink): DataSource.Factory {
|
||||
private fun createOnlineSource(headers: Map<String, String>): HttpDataSource.Factory {
|
||||
val source = OkHttpDataSource.Factory(app.baseClient).setUserAgent(USER_AGENT)
|
||||
return source.apply {
|
||||
setDefaultRequestProperties(headers)
|
||||
}
|
||||
}
|
||||
|
||||
private fun createOnlineSource(link: ExtractorLink): HttpDataSource.Factory {
|
||||
val provider = getApiFromNameNull(link.source)
|
||||
val interceptor = provider?.getVideoInterceptor(link)
|
||||
|
||||
|
@ -813,7 +821,8 @@ class CS3IPlayer : IPlayer {
|
|||
// See setPreferredTextLanguage
|
||||
it.language!!,
|
||||
SubtitleOrigin.EMBEDDED_IN_VIDEO,
|
||||
it.sampleMimeType ?: MimeTypes.APPLICATION_SUBRIP
|
||||
it.sampleMimeType ?: MimeTypes.APPLICATION_SUBRIP,
|
||||
emptyMap()
|
||||
)
|
||||
}
|
||||
|
||||
|
@ -981,9 +990,10 @@ class CS3IPlayer : IPlayer {
|
|||
|
||||
val mediaItem = getMediaItem(MimeTypes.VIDEO_MP4, data.uri)
|
||||
val offlineSourceFactory = context.createOfflineSource()
|
||||
val onlineSourceFactory = createOnlineSource(emptyMap())
|
||||
|
||||
val (subSources, activeSubtitles) = getSubSources(
|
||||
onlineSourceFactory = offlineSourceFactory,
|
||||
onlineSourceFactory = onlineSourceFactory,
|
||||
offlineSourceFactory = offlineSourceFactory,
|
||||
subtitleHelper,
|
||||
)
|
||||
|
@ -997,7 +1007,7 @@ class CS3IPlayer : IPlayer {
|
|||
}
|
||||
|
||||
private fun getSubSources(
|
||||
onlineSourceFactory: DataSource.Factory?,
|
||||
onlineSourceFactory: HttpDataSource.Factory?,
|
||||
offlineSourceFactory: DataSource.Factory?,
|
||||
subHelper: PlayerSubtitleHelper,
|
||||
): Pair<List<SingleSampleMediaSource>, List<SubtitleData>> {
|
||||
|
@ -1021,7 +1031,10 @@ class CS3IPlayer : IPlayer {
|
|||
SubtitleOrigin.URL -> {
|
||||
if (onlineSourceFactory != null) {
|
||||
activeSubtitles.add(sub)
|
||||
SingleSampleMediaSource.Factory(onlineSourceFactory)
|
||||
SingleSampleMediaSource.Factory(onlineSourceFactory.apply {
|
||||
if (sub.headers.isNotEmpty())
|
||||
this.setDefaultRequestProperties(sub.headers)
|
||||
})
|
||||
.createMediaSource(subConfig, C.TIME_UNSET)
|
||||
} else {
|
||||
null
|
||||
|
|
|
@ -84,7 +84,8 @@ class DownloadFileGenerator(
|
|||
realName.ifBlank { ctx.getString(R.string.default_subtitles) },
|
||||
file.second.toString(),
|
||||
SubtitleOrigin.DOWNLOADED_FILE,
|
||||
name.toSubtitleMimeType()
|
||||
name.toSubtitleMimeType(),
|
||||
emptyMap()
|
||||
)
|
||||
)
|
||||
}
|
||||
|
|
|
@ -399,7 +399,8 @@ class GeneratorPlayer : FullScreenPlayer() {
|
|||
name = getName(currentSubtitle, true),
|
||||
url = url,
|
||||
origin = SubtitleOrigin.URL,
|
||||
mimeType = url.toSubtitleMimeType()
|
||||
mimeType = url.toSubtitleMimeType(),
|
||||
headers = currentSubtitle.headers
|
||||
)
|
||||
runOnMainThread {
|
||||
addAndSelectSubtitles(subtitle)
|
||||
|
@ -483,7 +484,8 @@ class GeneratorPlayer : FullScreenPlayer() {
|
|||
name,
|
||||
uri.toString(),
|
||||
SubtitleOrigin.DOWNLOADED_FILE,
|
||||
name.toSubtitleMimeType()
|
||||
name.toSubtitleMimeType(),
|
||||
emptyMap()
|
||||
)
|
||||
|
||||
addAndSelectSubtitles(subtitleData)
|
||||
|
|
|
@ -29,12 +29,14 @@ enum class SubtitleOrigin {
|
|||
/**
|
||||
* @param name To be displayed in the player
|
||||
* @param url Url for the subtitle, when EMBEDDED_IN_VIDEO this variable is used as the real backend language
|
||||
* @param headers if empty it will use the base onlineDataSource headers else only the specified headers
|
||||
* */
|
||||
data class SubtitleData(
|
||||
val name: String,
|
||||
val url: String,
|
||||
val origin: SubtitleOrigin,
|
||||
val mimeType: String,
|
||||
val headers: Map<String, String>
|
||||
)
|
||||
|
||||
class PlayerSubtitleHelper {
|
||||
|
@ -71,7 +73,8 @@ class PlayerSubtitleHelper {
|
|||
name = subtitleFile.lang,
|
||||
url = subtitleFile.url,
|
||||
origin = SubtitleOrigin.URL,
|
||||
mimeType = subtitleFile.url.toSubtitleMimeType()
|
||||
mimeType = subtitleFile.url.toSubtitleMimeType(),
|
||||
headers = emptyMap()
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -409,6 +409,11 @@ class ResultViewModel2 : ViewModel() {
|
|||
private const val EPISODE_RANGE_SIZE = 20
|
||||
private const val EPISODE_RANGE_OVERLOAD = 30
|
||||
|
||||
private fun List<SeasonData>?.getSeason(season: Int?): SeasonData? {
|
||||
if (season == null) return null
|
||||
return this?.firstOrNull { it.season == season }
|
||||
}
|
||||
|
||||
private fun filterName(name: String?): String? {
|
||||
if (name == null) return null
|
||||
Regex("[eE]pisode [0-9]*(.*)").find(name)?.groupValues?.get(1)?.let {
|
||||
|
@ -1476,11 +1481,18 @@ class ResultViewModel2 : ViewModel() {
|
|||
if (isMovie || currentSeasons.size <= 1) null else
|
||||
when (indexer.season) {
|
||||
0 -> txt(R.string.no_season)
|
||||
else -> txt(
|
||||
R.string.season_format,
|
||||
txt(R.string.season),
|
||||
indexer.season
|
||||
) //TODO FIX DISPLAYNAME
|
||||
else -> {
|
||||
val seasonNames = (currentResponse as? EpisodeResponse)?.seasonNames
|
||||
val seasonData =
|
||||
seasonNames.getSeason(indexer.season)
|
||||
val suffix = seasonData?.name?.let { " $it" } ?: ""
|
||||
txt(
|
||||
R.string.season_format,
|
||||
txt(R.string.season),
|
||||
seasonData?.displaySeason ?: indexer.season,
|
||||
suffix
|
||||
)
|
||||
}
|
||||
}
|
||||
)
|
||||
)
|
||||
|
@ -1578,6 +1590,7 @@ class ResultViewModel2 : ViewModel() {
|
|||
val id = mainId + episode + idIndex * 1000000
|
||||
if (!existingEpisodes.contains(episode)) {
|
||||
existingEpisodes.add(id)
|
||||
val seasonData = loadResponse.seasonNames.getSeason(i.season)
|
||||
val eps =
|
||||
buildResultEpisode(
|
||||
loadResponse.name,
|
||||
|
@ -1585,7 +1598,7 @@ class ResultViewModel2 : ViewModel() {
|
|||
i.posterUrl,
|
||||
episode,
|
||||
null,
|
||||
i.season,
|
||||
seasonData?.displaySeason ?: i.season,
|
||||
i.data,
|
||||
loadResponse.apiName,
|
||||
id,
|
||||
|
@ -1621,7 +1634,7 @@ class ResultViewModel2 : ViewModel() {
|
|||
existingEpisodes.add(id)
|
||||
val seasonIndex = episode.season?.minus(1)
|
||||
val currentSeason =
|
||||
loadResponse.seasonNames?.getOrNull(seasonIndex ?: -1)
|
||||
loadResponse.seasonNames.getSeason(episode.season)
|
||||
|
||||
val ep =
|
||||
buildResultEpisode(
|
||||
|
@ -1630,7 +1643,7 @@ class ResultViewModel2 : ViewModel() {
|
|||
episode.posterUrl,
|
||||
episodeIndex,
|
||||
seasonIndex,
|
||||
currentSeason?.season ?: episode.season,
|
||||
currentSeason?.displaySeason ?: episode.season,
|
||||
episode.data,
|
||||
loadResponse.apiName,
|
||||
id,
|
||||
|
@ -1731,10 +1744,19 @@ class ResultViewModel2 : ViewModel() {
|
|||
_dubSubSelections.postValue(dubSelection.map { txt(it) to it })
|
||||
if (loadResponse is EpisodeResponse) {
|
||||
_seasonSelections.postValue(seasonsSelection.map { seasonNumber ->
|
||||
val seasonData = loadResponse.seasonNames.getSeason(seasonNumber)
|
||||
val fixedSeasonNumber = seasonData?.displaySeason ?: seasonNumber
|
||||
val suffix = seasonData?.name?.let { " $it" } ?: ""
|
||||
|
||||
val name =
|
||||
/*loadResponse.seasonNames?.firstOrNull { it.season == seasonNumber }?.name?.let { seasonData ->
|
||||
txt(seasonData)
|
||||
} ?:*/txt(R.string.season_format, txt(R.string.season), seasonNumber) //TODO FIX
|
||||
} ?:*/txt(
|
||||
R.string.season_format,
|
||||
txt(R.string.season),
|
||||
fixedSeasonNumber,
|
||||
suffix
|
||||
)
|
||||
name to seasonNumber
|
||||
})
|
||||
}
|
||||
|
|
|
@ -78,6 +78,7 @@ val appLanguages = arrayListOf(
|
|||
Triple("", "Chinese", "zh"),
|
||||
Triple("\uD83C\uDDEE\uD83C\uDDE9", "Indonesian", "in"),
|
||||
Triple("", "Czech", "cs"),
|
||||
Triple("", "Croatian", "hr"),
|
||||
).sortedBy { it.second } //ye, we go alphabetical, so ppl don't put their lang on top
|
||||
|
||||
class SettingsGeneral : PreferenceFragmentCompat() {
|
||||
|
|
|
@ -183,7 +183,6 @@ class PluginAdapter(
|
|||
}"
|
||||
)
|
||||
}
|
||||
|
||||
}
|
||||
} else {
|
||||
itemView.action_settings?.isVisible = false
|
||||
|
@ -217,10 +216,8 @@ class PluginAdapter(
|
|||
itemView.lang_icon.text = "${getFlagFromIso(metadata.language)} ${fromTwoLettersToLanguage(metadata.language)}"
|
||||
}
|
||||
|
||||
if (isLocal) {
|
||||
itemView.ext_votes?.isVisible = false
|
||||
} else {
|
||||
itemView.ext_votes?.isVisible = false
|
||||
itemView.ext_votes?.isVisible = false
|
||||
if (!isLocal) {
|
||||
ioSafe {
|
||||
metadata.getVotes().main {
|
||||
itemView.ext_votes?.setText(txt(R.string.extension_rating, prettyCount(it)))
|
||||
|
|
|
@ -11,6 +11,8 @@ import com.lagradost.cloudstream3.utils.UIHelper.setImage
|
|||
import com.lagradost.cloudstream3.utils.UIHelper.toPx
|
||||
import kotlinx.android.synthetic.main.fragment_plugin_details.*
|
||||
import android.text.format.Formatter.formatFileSize
|
||||
import android.util.Log
|
||||
import androidx.core.view.isVisible
|
||||
import com.lagradost.cloudstream3.plugins.VotingApi
|
||||
import com.lagradost.cloudstream3.plugins.VotingApi.getVoteType
|
||||
import com.lagradost.cloudstream3.plugins.VotingApi.getVotes
|
||||
|
@ -19,9 +21,11 @@ import com.lagradost.cloudstream3.utils.Coroutines.ioSafe
|
|||
import com.lagradost.cloudstream3.utils.Coroutines.main
|
||||
import com.lagradost.cloudstream3.utils.UIHelper.colorFromAttribute
|
||||
import com.lagradost.cloudstream3.AcraApplication.Companion.openBrowser
|
||||
import com.lagradost.cloudstream3.utils.SubtitleHelper
|
||||
import com.lagradost.cloudstream3.plugins.PluginManager
|
||||
import com.lagradost.cloudstream3.plugins.VotingApi.canVote
|
||||
import com.lagradost.cloudstream3.utils.SubtitleHelper.fromTwoLettersToLanguage
|
||||
import com.lagradost.cloudstream3.utils.SubtitleHelper.getFlagFromIso
|
||||
import kotlinx.android.synthetic.main.repository_item.view.*
|
||||
|
||||
|
||||
class PluginDetailsFragment(val data: PluginViewData) : BottomSheetDialogFragment() {
|
||||
|
@ -80,7 +84,35 @@ class PluginDetailsFragment(val data: PluginViewData) : BottomSheetDialogFragmen
|
|||
if (metadata.repositoryUrl != null) {
|
||||
openBrowser(metadata.repositoryUrl)
|
||||
}
|
||||
}
|
||||
|
||||
if (!metadata.canVote()) {
|
||||
downvote.alpha = .6f
|
||||
upvote.alpha = .6f
|
||||
}
|
||||
|
||||
if (data.isDownloaded) {
|
||||
// On local plugins page the filepath is provided instead of url.
|
||||
val plugin = PluginManager.urlPlugins[metadata.url] ?: PluginManager.plugins[metadata.url]
|
||||
if (plugin?.openSettings != null && context != null) {
|
||||
action_settings?.isVisible = true
|
||||
action_settings.setOnClickListener {
|
||||
try {
|
||||
plugin.openSettings!!.invoke(requireContext())
|
||||
} catch (e: Throwable) {
|
||||
Log.e(
|
||||
"PluginAdapter",
|
||||
"Failed to open ${metadata.name} settings: ${
|
||||
Log.getStackTraceString(e)
|
||||
}"
|
||||
)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
action_settings?.isVisible = false
|
||||
}
|
||||
} else {
|
||||
action_settings?.isVisible = false
|
||||
}
|
||||
|
||||
upvote.setOnClickListener {
|
||||
|
|
|
@ -43,11 +43,24 @@
|
|||
android:textStyle="normal"
|
||||
tools:text="Hello world" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/action_settings"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:layout_marginStart="16dp"
|
||||
android:background="?attr/selectableItemBackgroundBorderless"
|
||||
android:contentDescription="@string/title_settings"
|
||||
android:visibility="gone"
|
||||
app:srcCompat="@drawable/ic_baseline_tune_24"
|
||||
tools:visibility="visible" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/github_btn"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_vertical|end"
|
||||
android:layout_marginStart="16dp"
|
||||
android:background="?attr/selectableItemBackgroundBorderless"
|
||||
android:src="@drawable/ic_github_logo" />
|
||||
</LinearLayout>
|
||||
|
|
|
@ -210,7 +210,6 @@
|
|||
</string>
|
||||
|
||||
<string name="season">Staffel</string>
|
||||
<string name="season_format">%s %d</string>
|
||||
<string name="no_season">Keine Staffel</string>
|
||||
<string name="episode">Episode</string>
|
||||
<string name="episodes">Episoden</string>
|
||||
|
|
|
@ -14,21 +14,6 @@
|
|||
<item>@id/cast_button_type_forward_30_seconds</item>
|
||||
</array>
|
||||
|
||||
<array name="dns_pref">
|
||||
<item>@string/none</item>
|
||||
<item>Google</item>
|
||||
<item>Cloudflare</item>
|
||||
<!-- <item>OpenDns</item>-->
|
||||
<item>AdGuard</item>
|
||||
</array>
|
||||
<array name="dns_pref_values">
|
||||
<item>0</item>
|
||||
<item>1</item>
|
||||
<item>2</item>
|
||||
<!-- <item>3</item>-->
|
||||
<item>4</item>
|
||||
</array>
|
||||
|
||||
<array name="media_type_pref">
|
||||
<item>Todos</item>
|
||||
<item>Películas y TV</item>
|
||||
|
|
547
app/src/main/res/values-hr/strings.xml
Normal file
547
app/src/main/res/values-hr/strings.xml
Normal file
|
@ -0,0 +1,547 @@
|
|||
<!--https://newbedev.com/concatenate-multiple-strings-in-xml-->
|
||||
<resources>
|
||||
<!-- FORMAT MIGHT TRANSLATE, WILL CAUSE CRASH IF APPLIED WRONG -->
|
||||
<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="download_size_format" formatted="true" translatable="false">%s / %s</string>
|
||||
<string name="episode_name_format" formatted="true" translatable="false">%s %s</string>
|
||||
<string name="ffw_text_format" formatted="true" translatable="false">+%d</string>
|
||||
<string name="rew_text_format" formatted="true" translatable="false">-%d</string>
|
||||
<string name="ffw_text_regular_format" formatted="true" translatable="false">%d</string>
|
||||
<string name="rew_text_regular_format" formatted="true" translatable="false">%d</string>
|
||||
<string name="rating_format" formatted="true" translatable="false">%.1f/10.0</string>
|
||||
<string name="year_format" formatted="true" translatable="false">%d</string>
|
||||
<string name="app_dub_sub_episode_text_format" formatted="true">%s Ep %d</string>
|
||||
<string name="cast_format" formatted="true">Cast: %s</string>
|
||||
<string name="next_episode_format" formatted="true">Epizoda %d će izaći</string>
|
||||
<string name="next_episode_time_day_format" formatted="true">%dd %dh %dm</string>
|
||||
<string name="next_episode_time_hour_format" formatted="true">%dh %dm</string>
|
||||
<string name="next_episode_time_min_format" formatted="true">%dm</string>
|
||||
|
||||
<!-- IS NOT NEEDED TO TRANSLATE AS THEY ARE ONLY USED FOR SCREEN READERS AND WONT SHOW UP TO NORMAL USERS -->
|
||||
<string name="result_poster_img_des">Poster</string>
|
||||
<string name="search_poster_img_des">@string/result_poster_img_des</string>
|
||||
<string name="episode_poster_img_des">Episode Poster</string>
|
||||
<string name="home_main_poster_img_des">Main Poster</string>
|
||||
<string name="home_next_random_img_des">Next Random</string>
|
||||
<string name="go_back_img_des">Go back</string>
|
||||
<string name="home_change_provider_img_des">Change Provider</string>
|
||||
<string name="preview_background_img_des">Preview Background</string>
|
||||
|
||||
<!-- TRANSLATE, BUT DON'T FORGET FORMAT -->
|
||||
<string name="player_speed_text_format" formatted="true">Brzina (%.2fx)</string>
|
||||
<string name="rated_format" formatted="true">Ocijenjeno: %.1f</string>
|
||||
<string name="new_update_format" formatted="true">Pronađeno novo ažuriranje!\n%s -> %s</string>
|
||||
<string name="filler" formatted="true">Umetak</string>
|
||||
<string name="duration_format" formatted="true">%d min</string>
|
||||
|
||||
<string name="app_name">CloudStream</string>
|
||||
<string name="play_with_app_name">Otvori s CloudStream-om</string>
|
||||
<string name="title_home">Početna stranica</string>
|
||||
<string name="title_search">Pretraži</string>
|
||||
<string name="title_downloads">Preuzimanja</string>
|
||||
<string name="title_settings">Postavke</string>
|
||||
|
||||
<string name="search_hint">Pretraži...</string>
|
||||
<string name="search_hint_site" formatted="true">Pretraži %s…</string>
|
||||
|
||||
<string name="no_data">Nema podataka</string>
|
||||
<string name="episode_more_options_des">Više postavki</string>
|
||||
<string name="next_episode">Sljedeća epizoda</string>
|
||||
<string name="result_tags">Žanrovi</string>
|
||||
<string name="result_share">Podijeli</string>
|
||||
<string name="result_open_in_browser">Otvori u pregledniku</string>
|
||||
<string name="skip_loading">Preskoči učitavanje</string>
|
||||
<string name="loading">Učitavanje...</string>
|
||||
|
||||
<string name="type_watching">Gledam</string>
|
||||
<string name="type_on_hold">Na čekanju</string>
|
||||
<string name="type_completed">Dovršeno</string>
|
||||
<string name="type_dropped">Ispušteno</string>
|
||||
<string name="type_plan_to_watch">Planiram pogledati</string>
|
||||
<string name="type_none">Ništa</string>
|
||||
<string name="type_re_watching">Ponovno gledam</string>
|
||||
|
||||
<string name="play_movie_button">Pokreni Film</string>
|
||||
<string name="play_livestream_button">Pokreni LiveStream</string>
|
||||
<string name="play_torrent_button">Pokreni Torrent</string>
|
||||
<string name="pick_source">Izvori</string>
|
||||
<string name="pick_subtitle">Titlovi</string>
|
||||
<string name="reload_error">Ponovno pokušaj povezivanje…</string>
|
||||
<string name="go_back">Idi natrag</string>
|
||||
<string name="play_episode">Pokreni Epizodu</string>
|
||||
<!--<string name="need_storage">Allow to download episodes</string>-->
|
||||
|
||||
<string name="download">Preuzmi</string>
|
||||
<string name="downloaded">Preuzeto</string>
|
||||
<string name="downloading">Trenutno preuzimam</string>
|
||||
<string name="download_paused">Preuzimanje pauzirano</string>
|
||||
<string name="download_started">Preuzimanje započeto</string>
|
||||
<string name="download_failed">Preuzimanje nije uspjelo</string>
|
||||
<string name="download_canceled">Preuzimanje otkazano</string>
|
||||
<string name="download_done">Preuzimanje dovršeno</string>
|
||||
<string name="stream">Stream</string>
|
||||
|
||||
<string name="error_loading_links_toast">Pogreška pri učitavanju veza</string>
|
||||
<string name="download_storage_text">Unutarnja pohrana</string>
|
||||
|
||||
<string name="app_dubbed_text">Dub</string>
|
||||
<string name="app_subbed_text">Sub</string>
|
||||
|
||||
<string name="popup_delete_file">Izbriši datoteku</string>
|
||||
<string name="popup_play_file">Otvori datoteku</string>
|
||||
<string name="popup_resume_download">Nastavi preuzimanje</string>
|
||||
<string name="popup_pause_download">Pauziraj preuzimanje</string>
|
||||
|
||||
<string name="pref_disable_acra">Onemogući automatsko izvješćivanje o bugovima</string>
|
||||
<string name="home_more_info">Više informacija</string>
|
||||
<string name="home_expanded_hide">Sakrij</string>
|
||||
<string name="home_play">Pokreni</string>
|
||||
<string name="home_info">Informacije</string>
|
||||
<string name="filter_bookmarks">Filtriraj oznake</string>
|
||||
<string name="error_bookmarks_text">Oznake</string>
|
||||
<string name="action_remove_from_bookmarks">Makni</string>
|
||||
<string name="action_add_to_bookmarks">Postavi status gledanja</string>
|
||||
<string name="sort_apply">Primijeni</string>
|
||||
<string name="sort_cancel">Poništi</string>
|
||||
<string name="sort_copy">Kopiraj</string>
|
||||
<string name="sort_close">Zatvori</string>
|
||||
<string name="sort_clear">Očisti</string>
|
||||
<string name="sort_save">Sačuvaj</string>
|
||||
|
||||
<string name="player_speed">Brzina playera</string>
|
||||
|
||||
<string name="subtitles_settings">Postavke titlova</string>
|
||||
<string name="subs_text_color">Boja teksta</string>
|
||||
<string name="subs_outline_color">Boja obruba</string>
|
||||
<string name="subs_background_color">Pozadinska boja</string>
|
||||
<string name="subs_window_color">Boja prozora</string>
|
||||
<string name="subs_edge_type">Tip ruba</string>
|
||||
<string name="subs_subtitle_elevation">Visina titlova</string>
|
||||
<string name="subs_font">Font</string>
|
||||
<string name="subs_font_size">Veličina fonta</string>
|
||||
|
||||
<string name="search_provider_text_providers">Pretraži s uslugama</string>
|
||||
<string name="search_provider_text_types">Pretraži s tipovima</string>
|
||||
|
||||
<string name="benene_count_text">%d banana dano developerima</string>
|
||||
<string name="benene_count_text_none">Nisi dao ni jednu bananu</string>
|
||||
|
||||
<string name="subs_auto_select_language">Automatski odabir jezika</string>
|
||||
<string name="subs_download_languages">Preuzmi jezike</string>
|
||||
<string name="subs_subtitle_languages">Jezik titlova</string>
|
||||
<string name="subs_hold_to_reset_to_default">Držite za vraćanje na zadane postavke</string>
|
||||
<string name="subs_import_text" formatted="true">Uvezi fontove tako da ih postavite u %s</string>
|
||||
<string name="continue_watching">Nastavi gledati</string>
|
||||
|
||||
<string name="action_remove_watching">Makni</string>
|
||||
<string name="action_open_watching">Više informacija</string>
|
||||
<string name="action_open_play">@string/home_play </string>
|
||||
|
||||
<string name="vpn_might_be_needed">Za ispravan rad ovog pružatelja usluga može biti potreban VPN</string>
|
||||
<string name="vpn_torrent">Ovaj pružatelj usluga je torrent, preporučuje se VPN</string>
|
||||
|
||||
<string name="provider_info_meta">Stranica ne daje metapodatke, učitavanje videozapisa neće uspjeti ako ne postoji na stranici.</string>
|
||||
|
||||
<string name="torrent_plot">Opis</string>
|
||||
<string name="normal_no_plot">Plot nije pronađen</string>
|
||||
<string name="torrent_no_plot">Opis nije pronađen</string>
|
||||
|
||||
<string name="show_log_cat">Pokaži logmačku 🐈</string>
|
||||
|
||||
<string name="picture_in_picture">Picture-in-picture</string>
|
||||
<string name="picture_in_picture_des">Nastavlja reprodukciju u minijaturnom playeru povrh drugih aplikacija</string>
|
||||
<string name="player_size_settings">Gumb za promjenu veličine playera</string>
|
||||
<string name="player_size_settings_des">Ukloni crne rubove</string>
|
||||
<string name="player_subtitles_settings">Titlovi</string>
|
||||
<string name="player_subtitles_settings_des">Postavke titlova playera</string>
|
||||
<string name="chromecast_subtitles_settings">Chromecast Titlovi</string>
|
||||
<string name="chromecast_subtitles_settings_des">Postavke Chromecast titlova</string>
|
||||
|
||||
<string name="eigengraumode_settings">Eigengravy način</string>
|
||||
<string name="eigengraumode_settings_des">Dodaje opciju brzine u playeru</string>
|
||||
<string name="swipe_to_seek_settings">Prijeđi prstom za traženje</string>
|
||||
<string name="swipe_to_seek_settings_des">Prijeđi prstom ulijevo ili udesno za kontrolu vremena u videoplayeru</string>
|
||||
<string name="swipe_to_change_settings">Klizni za promjenu postavki</string>
|
||||
<string name="swipe_to_change_settings_des">Prijeđi prstom ulijevo ili udesno za promjenu svjetline ili glasnoće</string>
|
||||
|
||||
<string name="autoplay_next_settings">Automatski započni sljedeću epizodu</string>
|
||||
<string name="autoplay_next_settings_des">Započne sljedeću epizodu kad trenutna završi</string>
|
||||
|
||||
<string name="double_tap_to_seek_settings">Dodirni dvaput za traženje</string>
|
||||
<string name="double_tap_to_pause_settings">Dodirni dvaput za pauziranje</string>
|
||||
<string name="double_tap_to_seek_amount_settings">Iznos traženja u playeru</string>
|
||||
<string name="double_tap_to_seek_settings_des">Dvaput dodirni desnu ili lijevu stranu ekrana za pomicanje naprijed ili natrag
|
||||
</string>
|
||||
<string name="double_tap_to_pause_settings_des">Dodirni u sredini za pauziranje</string>
|
||||
<string name="use_system_brightness_settings">Koristi svijetlinu u sustavu</string>
|
||||
<string name="use_system_brightness_settings_des">Koristi svjetlinu sustava u playeru aplikacija umjesto tamnog
|
||||
preklopa
|
||||
</string>
|
||||
|
||||
<string name="episode_sync_settings">Ažuriraj napredak gledanja</string>
|
||||
<string name="episode_sync_settings_des">Automatski sinkroniziraj svoj trenutni napredak u epizodi</string>
|
||||
|
||||
<string name="restore_settings">Vraćanje podataka iz sigurnosne kopije</string>
|
||||
|
||||
<string name="backup_settings">Sigurnosna kopija podataka</string>
|
||||
<string name="restore_success">Učitana datoteka sigurnosne kopije</string>
|
||||
<string name="restore_failed_format" formatted="true">Vraćanje podataka iz datoteke nije uspjelo %s</string>
|
||||
<string name="backup_success">Uspješno pohranjeni podaci</string>
|
||||
<string name="backup_failed">Nedostaju dozvole za pohranu, pokušaj ponovo</string>
|
||||
<string name="backup_failed_error_format">Pogreška pri sigurnosnom kopiranju %s</string>
|
||||
|
||||
<string name="search">Pretraži</string>
|
||||
<string name="category_account">Računi</string>
|
||||
<string name="category_updates">Ažuriranja i sigurnosne kopije</string>
|
||||
|
||||
<string name="settings_info">Informacije</string>
|
||||
<string name="advanced_search">Napredno pretraživanje</string>
|
||||
<string name="advanced_search_des">Daje rezultate pretraživanja odvojene prema pružatelju usluga</string>
|
||||
<string name="bug_report_settings_off">Šalje samo podatke o padovima aplikacije</string>
|
||||
<string name="bug_report_settings_on">Ne šalje podatke</string>
|
||||
<string name="show_fillers_settings">Prikaži dodatnu epizodu za anime</string>
|
||||
<string name="show_trailers_settings">Prikaži trailere</string>
|
||||
<string name="kitsu_settings">Prikaži postere iz kitsua</string>
|
||||
<string name="pref_filter_search_quality">Sakrij odabranu kvalitetu videozapisa u rezultatima pretraživanja</string>
|
||||
|
||||
<string name="automatic_plugin_updates">Automatsko ažuriranje dodataka</string>
|
||||
<string name="updates_settings">Prikaži ažuriranja aplikacije</string>
|
||||
<string name="updates_settings_des">Automatski traži nova ažuriranja pri pokretanju aplikacije</string>
|
||||
<string name="uprereleases_settings">Ažuriranje na predizdanja</string>
|
||||
<string name="uprereleases_settings_des">Tražite ažuriranja prije izdanja umjesto samo potpunih izdanja</string>
|
||||
<string name="github">Github</string>
|
||||
<string name="lightnovel">Aplikacija za romane od istih developera</string>
|
||||
<string name="anim">Anime aplikacija od istih developera</string>
|
||||
<string name="discord">Uđi u naš Discord</string>
|
||||
<string name="benene">Daj bananu developerima</string>
|
||||
<string name="benene_des">Dana banana</string>
|
||||
|
||||
<string name="app_language">Jezik aplikacije</string>
|
||||
|
||||
<string name="no_chromecast_support_toast">Ovaj pružatelj usluga nema podršku za Chromecast</string>
|
||||
<string name="no_links_found_toast">Nisu pronađene veze</string>
|
||||
<string name="copy_link_toast">Veza je kopirana u međuspremnik</string>
|
||||
<string name="play_episode_toast">Pokreni epizodu</string>
|
||||
<string name="subs_default_reset_toast">Vrati na zadanu vrijednost</string>
|
||||
<string name="acra_report_toast">Nažalost, aplikacija se srušila. Anonimno izvješće o bugu bit će poslano developerima
|
||||
</string>
|
||||
|
||||
<string name="season">Sezona</string>
|
||||
<string name="no_season">Nema sezone</string>
|
||||
<string name="episode">Epizoda</string>
|
||||
<string name="episodes">Epizode</string>
|
||||
<string name="episodes_range">%d-%d</string>
|
||||
<string name="episode_format" formatted="true">%d %s</string>
|
||||
<string name="season_short">S</string>
|
||||
<string name="episode_short">E</string>
|
||||
<string name="no_episodes_found">Nisu pronađene epizode</string>
|
||||
|
||||
<string name="delete_file">Izbriši datoteku</string>
|
||||
<string name="delete">Izbriši</string>
|
||||
<string name="pause">Pauziraj</string>
|
||||
<string name="resume">Nastavi</string>
|
||||
<string name="go_back_30">-30</string>
|
||||
<string name="go_forward_30">+30</string>
|
||||
<string name="delete_message" formatted="true">Ovo će trajno izbrisati %s\nJeste li sigurni?</string>
|
||||
<string name="resume_time_left" formatted="true">%dm\npreostalo</string>
|
||||
|
||||
|
||||
<string name="status_ongoing">U tijeku</string>
|
||||
<string name="status_completed">Završeno</string>
|
||||
<string name="status">Status</string>
|
||||
<string name="year">Godina</string>
|
||||
<string name="rating">Ocjena</string>
|
||||
<string name="duration">Trajanje</string>
|
||||
<string name="site">Stranica</string>
|
||||
<string name="synopsis">Sinopsis</string>
|
||||
|
||||
<string name="queued">u redu čekanja</string>
|
||||
<string name="no_subtitles">Nema titlova</string>
|
||||
<string name="default_subtitles">Zadano</string>
|
||||
|
||||
<string name="free_storage">Slobodno</string>
|
||||
<string name="used_storage">Iskorišteno</string>
|
||||
<string name="app_storage">Aplikacija</string>
|
||||
|
||||
<!--plural-->
|
||||
<string name="movies">Filmovi</string>
|
||||
<string name="tv_series">TV Serije</string>
|
||||
<string name="cartoons">Crtići</string>
|
||||
<string name="anime">Anime</string>
|
||||
<string name="torrent">Torrenti</string>
|
||||
<string name="documentaries">Dokumentarci</string>
|
||||
<string name="ova">OVA</string>
|
||||
<string name="asian_drama">Azijske drame</string>
|
||||
<string name="livestreams">Livestreamovi</string>
|
||||
<string name="nsfw">NSFW</string>
|
||||
<string name="others">Ostali</string>
|
||||
|
||||
<!--singular-->
|
||||
<string name="movies_singular">Film</string>
|
||||
<string name="tv_series_singular">Serija</string>
|
||||
<string name="cartoons_singular">Crtić</string>
|
||||
<string name="anime_singular">@string/anime</string>
|
||||
<string name="ova_singular">@string/ova</string>
|
||||
<string name="torrent_singular">Torrent</string>
|
||||
<string name="documentaries_singular">Dokumentarac</string>
|
||||
<string name="asian_drama_singular">Azijska drama</string>
|
||||
<string name="live_singular">Livestream</string>
|
||||
<string name="nsfw_singular">NSFW</string>
|
||||
<string name="other_singular">Video</string>
|
||||
|
||||
<string name="source_error">Greška u izvoru</string>
|
||||
<string name="remote_error">Pogreška remote-a</string>
|
||||
<string name="render_error">Pogreška renderera</string>
|
||||
<string name="unexpected_error">Neočekivana pogreška playera</string>
|
||||
<string name="storage_error">Pogreška preuzimanja, provjeri dozvole za pohranu</string>
|
||||
|
||||
<string name="episode_action_chromecast_episode">Chromecast epizoda</string>
|
||||
<string name="episode_action_chromecast_mirror">Chromecast mirror</string>
|
||||
<string name="episode_action_play_in_app">Pokreni u aplikaciji</string>
|
||||
<string name="episode_action_play_in_vlc">Pokreni u VLC-u</string>
|
||||
<string name="episode_action_play_in_browser">Pokreni u pregledniku</string>
|
||||
<string name="episode_action_copy_link">Kopiraj poveznicu</string>
|
||||
<string name="episode_action_auto_download">Automatsko preuzimanje</string>
|
||||
<string name="episode_action_download_mirror">Preuzmi zrcalo</string>
|
||||
<string name="episode_action_reload_links">Ponovno učitaj poveznice</string>
|
||||
<string name="episode_action_download_subtitle">Preuzmi titlove</string>
|
||||
|
||||
<string name="show_hd">Oznaka kvalitete</string>
|
||||
<string name="show_dub">Oznaka sinkronizacije</string>
|
||||
<string name="show_sub">Oznaka titlova</string>
|
||||
<string name="show_title">Naslov</string>
|
||||
<string name="poster_ui_settings">Uključi/isključi elemente korisničkog sučelja na posteru</string>
|
||||
|
||||
<string name="no_update_found">Nije pronađeno ažuriranje</string>
|
||||
<string name="check_for_update">Provjeri ažuriranja</string>
|
||||
|
||||
<string name="video_lock">Zaključaj</string>
|
||||
<string name="video_aspect_ratio_resize">Promijeni veličinu</string>
|
||||
<string name="video_source">Izvor</string>
|
||||
<string name="video_skip_op">Preskoči OP</string>
|
||||
|
||||
<string name="dont_show_again">Ne prikazuj više</string>
|
||||
<string name="skip_update">Preskoči ovo ažuriranje</string>
|
||||
<string name="update">Ažuriraj</string>
|
||||
<string name="watch_quality_pref">Preferirana kvaliteta streama</string>
|
||||
<string name="limit_title">Maksimalni broj znakova u naslovu video playera</string>
|
||||
<string name="limit_title_rez">Rezolucija video playera</string>
|
||||
|
||||
<string name="video_buffer_size_settings">Veličina video međuspremnika</string>
|
||||
<string name="video_buffer_length_settings">Duljina video međuspremnika</string>
|
||||
<string name="video_buffer_disk_settings">Video predmemorija na disku</string>
|
||||
<string name="video_buffer_clear_settings">Očisti predmemoriju videa i slika</string>
|
||||
|
||||
<string name="video_ram_description">Izazvat će nasumična rušenja ako se postavi previsoko. Nemojte mijenjati ako imate malu količinu RAM-a kao što je Android TV ili stari telefon</string>
|
||||
<string name="video_disk_description">Može uzrokovati probleme na sustavima s malo prostora za pohranu kao što su Android TV uređaji ako postavite previsoko</string>
|
||||
|
||||
<string name="dns_pref">DNS preko HTTPS-a</string>
|
||||
<string name="dns_pref_summary">Korisno za zaobilaženje blokada ISP-a</string>
|
||||
|
||||
<string name="add_site_pref">Kloniraj web stranicu</string>
|
||||
<string name="remove_site_pref">Ukloni web stranicu</string>
|
||||
<string name="add_site_summary">Dodajt klon postojeće web-lokacije s drugim url-om</string>
|
||||
|
||||
<string name="download_path_pref">Put preuzimanja</string>
|
||||
|
||||
<string name="nginx_url_pref">Nginx server url</string>
|
||||
|
||||
<string name="display_subbed_dubbed_settings">Prikaži sinkronizirani anime ili s titlovima</string>
|
||||
|
||||
<string name="resize_fit">Prilagodi zaslonu</string>
|
||||
<string name="resize_fill">Rastegni</string>
|
||||
<string name="resize_zoom">Zoom</string>
|
||||
|
||||
<string name="legal_notice">Odricanje</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="random_button_settings">Random gumb</string>
|
||||
<string name="random_button_settings_desc">Prikaži random gumb na početnoj stranici</string>
|
||||
<string name="provider_lang_settings">Jezici pružatelja usluga</string>
|
||||
<string name="app_layout">Izgled aplikacije</string>
|
||||
<string name="preferred_media_settings">Preferirani mediji</string>
|
||||
<string name="enable_nsfw_on_providers">Omogući NSFW na podržanim pružateljima usluga</string>
|
||||
<string name="subtitles_encoding">Kodiranje titlova</string>
|
||||
<string name="category_providers">Pružatelji usluga</string>
|
||||
<string name="category_ui">Izgled</string>
|
||||
|
||||
<string name="automatic">Auto</string>
|
||||
<string name="tv_layout">TV izgled</string>
|
||||
<string name="phone_layout">Izgled za telefone</string>
|
||||
<string name="emulator_layout">Izgled za emulatore</string>
|
||||
|
||||
<string name="primary_color_settings">Primarna boja</string>
|
||||
<string name="app_theme_settings">Tema aplikacije</string>
|
||||
<string name="bottom_title_settings">Mjesto naslova postera</string>
|
||||
<string name="bottom_title_settings_des">Stavi naslov ispod postera</string>
|
||||
|
||||
|
||||
<!-- account stuff -->
|
||||
<string name="example_password">lozinka123</string>
|
||||
<string name="example_username">MojeCoolIme</string>
|
||||
<string name="example_email">bok@svijete.com</string>
|
||||
<string name="example_ip">127.0.0.1</string>
|
||||
<string name="example_site_name">MojaCoolStranica</string>
|
||||
<string name="example_site_url">primjer.com</string>
|
||||
<string name="example_lang_name">Šifra jezika (en)</string>
|
||||
|
||||
<string name="login_format" formatted="true">%s %s</string>
|
||||
<string name="account">račun</string>
|
||||
<string name="logout">Odjava</string>
|
||||
<string name="login">Prijava</string>
|
||||
<string name="switch_account">Promijeni račun</string>
|
||||
<string name="add_account">Dodaj račun</string>
|
||||
<string name="create_account">Napravi račun</string>
|
||||
<string name="add_sync">Dodaj tracking</string>
|
||||
<string name="added_sync_format" formatted="true">Dodano %s</string>
|
||||
<string name="upload_sync">Sinkroniziraj</string>
|
||||
<string name="sync_score">Ocijenjeno</string>
|
||||
<string name="sync_score_format" formatted="true">%d / 10</string>
|
||||
<string name="sync_total_episodes_none">/??</string>
|
||||
<string name="sync_total_episodes_some" formatted="true">/%d</string>
|
||||
<string name="authenticated_user" formatted="true">Autentičnost %s</string>
|
||||
<string name="authenticated_user_fail" formatted="true">Provjera autentičnosti nije uspjela %s</string>
|
||||
|
||||
<!-- ============ -->
|
||||
<string name="none">Nijedan</string>
|
||||
<string name="normal">Normal</string>
|
||||
<string name="all">Sve</string>
|
||||
<string name="max">Maksimalno</string>
|
||||
<string name="min">Minimalno</string>
|
||||
<string name="subtitles_outline">Obrub</string>
|
||||
<string name="subtitles_depressed">Depresivno</string>
|
||||
<string name="subtitles_shadow">Sjena</string>
|
||||
<string name="subtitles_raised">Podignuto</string>
|
||||
<string name="subtitle_offset">Sinkroniziraj titlove</string>
|
||||
<string name="subtitle_offset_hint">1000ms</string>
|
||||
<string name="subtitle_offset_title">Kašnjenje titlova</string>
|
||||
<string name="subtitle_offset_extra_hint_later_format">Koristi ovo ako su titlovi prikazani %dms prerano</string>
|
||||
<string name="subtitle_offset_extra_hint_before_format">Koristite ovo ako se titlovi prikazuju %dms prekasno</string>
|
||||
<string name="subtitle_offset_extra_hint_none_format">Nema kašnjenja titlova</string>
|
||||
|
||||
<!--
|
||||
Example text (pangram) can optionally be translated; if you do, include all the letters in the alphabet,
|
||||
see:
|
||||
https://en.wikipedia.org/w/index.php?title=Pangram&oldid=225849300
|
||||
https://en.wikipedia.org/wiki/The_quick_brown_fox_jumps_over_the_lazy_dog
|
||||
-->
|
||||
<string name="subtitles_example_text">The quick brown fox jumps over the lazy dog</string>
|
||||
|
||||
<string name="recommended">Preporučeno</string>
|
||||
<string name="player_loaded_subtitles" formatted="true">Učitano %s</string>
|
||||
<string name="player_load_subtitles">Učitaj iz datoteke</string>
|
||||
<string name="player_load_subtitles_online">Učitaj sa interneta</string>
|
||||
<string name="downloaded_file">Preuzeta datoteka</string>
|
||||
<string name="actor_main">Glavno</string>
|
||||
<string name="actor_supporting">Podupiranje</string>
|
||||
<string name="actor_background">Pozadina</string>
|
||||
|
||||
<string name="home_source">Izvor</string>
|
||||
<string name="home_random">Random</string>
|
||||
|
||||
<string name="coming_soon">Dolazi uskoro…</string>
|
||||
|
||||
<string name="quality_cam">Cam</string>
|
||||
<string name="quality_cam_rip">Cam</string>
|
||||
<string name="quality_cam_hd">Cam</string>
|
||||
<string name="quality_hq">HQ</string>
|
||||
<string name="quality_hd">HD</string>
|
||||
<string name="quality_ts">TS</string>
|
||||
<string name="quality_tc">TC</string>
|
||||
<string name="quality_blueray">BlueRay</string>
|
||||
<string name="quality_workprint">WP</string>
|
||||
<string name="quality_dvd">DVD</string>
|
||||
<string name="quality_4k">4K</string>
|
||||
<string name="quality_sd">SD</string>
|
||||
<string name="quality_uhd">UHD</string>
|
||||
<string name="quality_hdr">HDR</string>
|
||||
<string name="quality_sdr">SDR</string>
|
||||
<string name="quality_webrip">Web</string>
|
||||
|
||||
<string name="poster_image">Slika postera</string>
|
||||
<string name="category_player">Player</string>
|
||||
<string name="resolution_and_title">Rezolucija i naslov</string>
|
||||
<string name="title">Naslov</string>
|
||||
<string name="resolution">Rezolucija</string>
|
||||
<string name="error_invalid_id">Nevažeći ID</string>
|
||||
<string name="error_invalid_data">Nevažeći podaci</string>
|
||||
<string name="error_invalid_url">Nevažeći URL</string>
|
||||
<string name="error">Greška</string>
|
||||
<string name="subtitles_remove_captions">Ukloni titlove iz titlova</string>
|
||||
<string name="subtitles_remove_bloat">Ukloni reklame iz titlova</string>
|
||||
<string name="subtitles_filter_lang">Filtriraj po željenom jeziku medija</string>
|
||||
<string name="extras">Extras</string>
|
||||
<string name="trailer">Trailer</string>
|
||||
<string name="network_adress_example">Veza na stream</string>
|
||||
<string name="referer">Upućivač</string>
|
||||
<string name="next">Sljedeće</string>
|
||||
<string name="provider_languages_tip">Gledaj videozapise na ovim jezicima</string>
|
||||
<string name="previous">Prethodno</string>
|
||||
<string name="skip_setup">Preskoči postavljanje</string>
|
||||
<string name="app_layout_subtext">Promijeni izgled aplikacije kako bi odgovarao vašem uređaju</string>
|
||||
<string name="crash_reporting_title">Izvještavanje o rušenju</string>
|
||||
<string name="preferred_media_subtext">Što želite vidjeti</string>
|
||||
<string name="setup_done">Gotovo</string>
|
||||
<string name="extensions">Ekstenzije</string>
|
||||
<string name="add_repository">Dodaj repository</string>
|
||||
<string name="repository_name_hint">Ime repositorya</string>
|
||||
<string name="repository_url_hint">URL Repositorija</string>
|
||||
<string name="plugin_loaded">Dodatak je učitan</string>
|
||||
<string name="plugin_deleted">Dodatak je izbrisan</string>
|
||||
<string name="plugin_load_fail" formatted="true">Učitavanje nije uspjelo %s</string>
|
||||
<string name="is_adult">18+</string>
|
||||
<string name="batch_download_start_format" formatted="true">Započelo preuzimanje %d %s</string>
|
||||
<string name="batch_download_finish_format" formatted="true">Preuzeto %d %s uspješno</string>
|
||||
<string name="batch_download_nothing_to_download_format" formatted="true">Sve %s je već preuzeto</string>
|
||||
<string name="batch_download">Skupno preuzimanje</string>
|
||||
<string name="plugin_singular">plugin</string>
|
||||
<string name="plugin">plugins</string>
|
||||
<string name="delete_repository_plugins">Ovo će također izbrisati sve dodatke spremišta</string>
|
||||
<string name="delete_repository">Izbriši repository</string>
|
||||
<string name="setup_extensions_subtext">Preuzmi popis stranica koje želite koristiti</string>
|
||||
<string name="plugins_downloaded" formatted="true">Preuzeto: %d</string>
|
||||
<string name="plugins_disabled" formatted="true">Onemogućeno: %d</string>
|
||||
<string name="plugins_not_downloaded" formatted="true">Nije preuzeto: %d</string>
|
||||
<string name="blank_repo_message">Dodaj spremište za instaliranje ekstenzija web mjesta</string>
|
||||
<string name="view_public_repositories_button">Pregledajte repozitorije zajednice</string>
|
||||
<string name="view_public_repositories_button_short">Javni popis</string>
|
||||
<string name="uppercase_all_subtitles">Svi titlovi pisani velikim slovima</string>
|
||||
|
||||
<string name="download_all_plugins_from_repo">Preuzeti sve dodatke iz ovog repozitorija?</string>
|
||||
<string name="single_plugin_disabled" formatted="true">%s (Onemogućeno)</string>
|
||||
<string name="tracks">Zapis</string>
|
||||
<string name="audio_tracks">Audio zapis</string>
|
||||
<string name="video_tracks">Video zapis</string>
|
||||
<string name="apply_on_restart">Primijeni na restart</string>
|
||||
|
||||
<string name="safe_mode_title">Siguran način rada omogućen</string>
|
||||
<string name="safe_mode_description">Došlo je do nepopravljivog pada i automatski smo onemogućili sva proširenja, tako da možete pronaći i ukloniti proširenje koje uzrokuje probleme.</string>
|
||||
<string name="safe_mode_crash_info">Pogledajte podatke o padu</string>
|
||||
|
||||
<string name="extension_rating" formatted="true">Ocjena: %s</string>
|
||||
<string name="extension_description">Opis</string>
|
||||
<string name="extension_version">Verzija</string>
|
||||
<string name="extension_status">Status</string>
|
||||
<string name="extension_size">Veličina</string>
|
||||
<string name="extension_authors">Autori</string>
|
||||
<string name="extension_types">Podržano</string>
|
||||
<string name="extension_language">Jezik</string>
|
||||
|
||||
<string name="hls_playlist">HLS Playlista</string>
|
||||
</resources>
|
|
@ -208,7 +208,6 @@
|
|||
<string name="acra_report_toast">Sorry, de applicatie is gecrasht. Er wordt een anoniem bugrapport naar de ontwikkelaars gestuurd </string>
|
||||
|
||||
<string name="season">Seizoen</string>
|
||||
<string name="season_format">%s %d</string>
|
||||
<string name="no_season">Geen seizoen</string>
|
||||
<string name="episode">Aflevering</string>
|
||||
<string name="episodes">afleveringen</string>
|
||||
|
|
|
@ -14,21 +14,6 @@
|
|||
<item>@id/cast_button_type_forward_30_seconds</item>
|
||||
</array>
|
||||
|
||||
<array name="dns_pref">
|
||||
<item>@string/none</item>
|
||||
<item>Google</item>
|
||||
<item>Cloudflare</item>
|
||||
<!-- <item>OpenDns</item>-->
|
||||
<item>AdGuard</item>
|
||||
</array>
|
||||
<array name="dns_pref_values">
|
||||
<item>0</item>
|
||||
<item>1</item>
|
||||
<item>2</item>
|
||||
<!-- <item>3</item>-->
|
||||
<item>4</item>
|
||||
</array>
|
||||
|
||||
<string-array name="extension_statuses">
|
||||
<item>Nie działa</item>
|
||||
<!-- "Ok" is usually capitalized as "OK". Ok android studio 🤓-->
|
||||
|
|
|
@ -454,4 +454,5 @@
|
|||
<string name="extension_authors">Autorzy</string>
|
||||
<string name="extension_types">Wspierane</string>
|
||||
<string name="extension_language">Język</string>
|
||||
<string name="extension_install_first">Najpierw zainstaluj rozszerzenie</string>
|
||||
</resources>
|
||||
|
|
|
@ -14,21 +14,6 @@
|
|||
<item>@id/cast_button_type_forward_30_seconds</item>
|
||||
</array>
|
||||
|
||||
<array name="dns_pref">
|
||||
<item>@string/none</item>
|
||||
<item>Google</item>
|
||||
<item>Cloudflare</item>
|
||||
<!-- <item>OpenDns</item>-->
|
||||
<item>AdGuard</item>
|
||||
</array>
|
||||
<array name="dns_pref_values">
|
||||
<item>0</item>
|
||||
<item>1</item>
|
||||
<item>2</item>
|
||||
<!-- <item>3</item>-->
|
||||
<item>4</item>
|
||||
</array>
|
||||
|
||||
<array name="media_type_pref">
|
||||
<item>Hepsi</item>
|
||||
<item>Film ve Dizi</item>
|
||||
|
|
|
@ -14,21 +14,6 @@
|
|||
<item>@id/cast_button_type_forward_30_seconds</item>
|
||||
</array>
|
||||
|
||||
<array name="dns_pref">
|
||||
<item>@string/none</item>
|
||||
<item>Google</item>
|
||||
<item>Cloudflare</item>
|
||||
<!-- <item>OpenDns</item>-->
|
||||
<item>AdGuard</item>
|
||||
</array>
|
||||
<array name="dns_pref_values">
|
||||
<item>0</item>
|
||||
<item>1</item>
|
||||
<item>2</item>
|
||||
<!-- <item>3</item>-->
|
||||
<item>4</item>
|
||||
</array>
|
||||
|
||||
<array name="media_type_pref">
|
||||
<item>Tất cả</item>
|
||||
<item>Phim lẻ và Phim bộ</item>
|
||||
|
|
|
@ -221,7 +221,6 @@
|
|||
|
||||
|
||||
<string name="season">Mùa</string>
|
||||
<string name="season_format">%s %d</string>
|
||||
<string name="no_season">Không có mùa nào</string>
|
||||
<string name="episode">Tập</string>
|
||||
<string name="episodes">Tập</string>
|
||||
|
|
|
@ -231,7 +231,6 @@
|
|||
</string>
|
||||
|
||||
<string name="season">季</string>
|
||||
<string name="season_format">%s %d</string>
|
||||
<string name="no_season">无季</string>
|
||||
<string name="episode">集</string>
|
||||
<string name="episodes">集</string>
|
||||
|
|
|
@ -20,6 +20,8 @@
|
|||
<item>Cloudflare</item>
|
||||
<!-- <item>OpenDns</item>-->
|
||||
<item>AdGuard</item>
|
||||
<item>DNS.WATCH</item>
|
||||
<item>Quad9</item>
|
||||
</array>
|
||||
<array name="dns_pref_values">
|
||||
<item>0</item>
|
||||
|
@ -27,6 +29,8 @@
|
|||
<item>2</item>
|
||||
<!-- <item>3</item>-->
|
||||
<item>4</item>
|
||||
<item>5</item>
|
||||
<item>6</item>
|
||||
</array>
|
||||
|
||||
<array name="limit_title_rez_pref_names">
|
||||
|
|
|
@ -290,7 +290,7 @@
|
|||
</string>
|
||||
|
||||
<string name="season">Season</string>
|
||||
<string name="season_format">%s %d</string>
|
||||
<string name="season_format">%s %d%s</string>
|
||||
<string name="no_season">No Season</string>
|
||||
<string name="episode">Episode</string>
|
||||
<string name="episodes">Episodes</string>
|
||||
|
@ -624,6 +624,7 @@
|
|||
<string name="extension_authors">Authors</string>
|
||||
<string name="extension_types">Supported</string>
|
||||
<string name="extension_language">Language</string>
|
||||
<string name="extension_install_first">Install the extension first</string>
|
||||
|
||||
<string name="hls_playlist">HLS Playlist</string>
|
||||
</resources>
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue