Merge branch 'master' of https://github.com/recloudstream/cloudstream into content_ratings

# Conflicts:
#	app/src/main/java/com/lagradost/cloudstream3/MainAPI.kt
This commit is contained in:
Luna712 2023-11-01 14:14:10 -06:00
commit a287f9aa28
88 changed files with 1606 additions and 596 deletions

View file

@ -50,14 +50,15 @@ android {
} }
} }
// https://developer.android.com/about/versions/14/behavior-changes-14#safer-dynamic-code-loading compileSdk = 34
compileSdk = 33 // android 14 is fucked
buildToolsVersion = "34.0.0" buildToolsVersion = "34.0.0"
defaultConfig { defaultConfig {
applicationId = "com.lagradost.cloudstream3" applicationId = "com.lagradost.cloudstream3"
minSdk = 21 minSdk = 21
targetSdk = 33
// https://developer.android.com/about/versions/14/behavior-changes-14#safer-dynamic-code-loading
targetSdk = 33 // android 14 is fucked
versionCode = 62 versionCode = 62
versionName = "4.2.1" versionName = "4.2.1"
@ -157,18 +158,16 @@ dependencies {
implementation("androidx.test.ext:junit-ktx:1.1.5") implementation("androidx.test.ext:junit-ktx:1.1.5")
testImplementation("org.json:json:20230618") testImplementation("org.json:json:20230618")
implementation("androidx.core:core-ktx:1.10.1") // need 34 for higher implementation("androidx.core:core-ktx:1.12.0")
implementation("androidx.appcompat:appcompat:1.6.1") // need target 32 for 1.5.0 implementation("androidx.appcompat:appcompat:1.6.1")
// dont change this to 1.6.0 it looks ugly af implementation("com.google.android.material:material:1.10.0")
implementation("com.google.android.material:material:1.5.0")
implementation("androidx.constraintlayout:constraintlayout:2.1.4") implementation("androidx.constraintlayout:constraintlayout:2.1.4")
// need 34 for higher implementation("androidx.navigation:navigation-fragment-ktx:2.7.4")
implementation("androidx.navigation:navigation-fragment-ktx:2.6.0") implementation("androidx.navigation:navigation-ui-ktx:2.7.4")
implementation("androidx.navigation:navigation-ui-ktx:2.6.0") implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.6.2")
implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.6.1") implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2")
implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1")
testImplementation("junit:junit:4.13.2") testImplementation("junit:junit:4.13.2")
androidTestImplementation("androidx.test.ext:junit:1.1.5") androidTestImplementation("androidx.test.ext:junit:1.1.5")
@ -180,7 +179,7 @@ dependencies {
// DONT UPDATE, WILL CRASH ANDROID TV ???? // DONT UPDATE, WILL CRASH ANDROID TV ????
implementation("com.fasterxml.jackson.module:jackson-module-kotlin:2.13.1") implementation("com.fasterxml.jackson.module:jackson-module-kotlin:2.13.1")
implementation("androidx.preference:preference-ktx:1.2.0") implementation("androidx.preference:preference-ktx:1.2.1")
implementation("com.github.bumptech.glide:glide:4.13.1") implementation("com.github.bumptech.glide:glide:4.13.1")
kapt("com.github.bumptech.glide:compiler:4.13.1") kapt("com.github.bumptech.glide:compiler:4.13.1")

View file

@ -19,6 +19,7 @@ import com.lagradost.cloudstream3.databinding.FragmentSearchBinding
import com.lagradost.cloudstream3.databinding.FragmentSearchTvBinding import com.lagradost.cloudstream3.databinding.FragmentSearchTvBinding
import com.lagradost.cloudstream3.databinding.HomeResultGridBinding import com.lagradost.cloudstream3.databinding.HomeResultGridBinding
import com.lagradost.cloudstream3.databinding.HomepageParentBinding import com.lagradost.cloudstream3.databinding.HomepageParentBinding
import com.lagradost.cloudstream3.databinding.HomepageParentEmulatorBinding
import com.lagradost.cloudstream3.databinding.HomepageParentTvBinding import com.lagradost.cloudstream3.databinding.HomepageParentTvBinding
import com.lagradost.cloudstream3.databinding.PlayerCustomLayoutBinding import com.lagradost.cloudstream3.databinding.PlayerCustomLayoutBinding
import com.lagradost.cloudstream3.databinding.PlayerCustomLayoutTvBinding import com.lagradost.cloudstream3.databinding.PlayerCustomLayoutTvBinding
@ -119,8 +120,9 @@ class ExampleInstrumentedTest {
// testAllLayouts<HomeScrollViewBinding>(activity, R.layout.home_scroll_view, R.layout.home_scroll_view_tv) // testAllLayouts<HomeScrollViewBinding>(activity, R.layout.home_scroll_view, R.layout.home_scroll_view_tv)
// testAllLayouts<HomeScrollViewTvBinding>(activity, R.layout.home_scroll_view, R.layout.home_scroll_view_tv) // testAllLayouts<HomeScrollViewTvBinding>(activity, R.layout.home_scroll_view, R.layout.home_scroll_view_tv)
testAllLayouts<HomepageParentTvBinding>(activity, R.layout.homepage_parent_tv, R.layout.homepage_parent) testAllLayouts<HomepageParentTvBinding>(activity, R.layout.homepage_parent_tv, R.layout.homepage_parent_emulator, R.layout.homepage_parent)
testAllLayouts<HomepageParentBinding>(activity, R.layout.homepage_parent_tv, R.layout.homepage_parent) testAllLayouts<HomepageParentEmulatorBinding>(activity, R.layout.homepage_parent_tv, R.layout.homepage_parent_emulator, R.layout.homepage_parent)
testAllLayouts<HomepageParentBinding>(activity, R.layout.homepage_parent_tv, R.layout.homepage_parent_emulator, R.layout.homepage_parent)
testAllLayouts<FragmentLibraryTvBinding>(activity, R.layout.fragment_library_tv, R.layout.fragment_library) testAllLayouts<FragmentLibraryTvBinding>(activity, R.layout.fragment_library_tv, R.layout.fragment_library)
testAllLayouts<FragmentLibraryBinding>(activity, R.layout.fragment_library_tv, R.layout.fragment_library) testAllLayouts<FragmentLibraryBinding>(activity, R.layout.fragment_library_tv, R.layout.fragment_library)

View file

@ -96,12 +96,6 @@
android:launchMode="singleTask" android:launchMode="singleTask"
android:resizeableActivity="true" android:resizeableActivity="true"
android:supportsPictureInPicture="true"> android:supportsPictureInPicture="true">
<intent-filter android:exported="true">
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.LEANBACK_LAUNCHER" />
</intent-filter>
<!-- cloudstreamplayer://encodedUrl?name=Dune --> <!-- cloudstreamplayer://encodedUrl?name=Dune -->
<intent-filter> <intent-filter>
@ -165,6 +159,22 @@
</intent-filter> </intent-filter>
</activity> </activity>
<activity
android:name=".ui.account.AccountSelectActivity"
android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|keyboard|keyboardHidden|navigation"
android:exported="true"
android:resizeableActivity="true">
<intent-filter android:exported="true">
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.LEANBACK_LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity <activity
android:name=".ui.EasterEggMonke" android:name=".ui.EasterEggMonke"
android:exported="true" /> android:exported="true" />

View file

@ -1247,6 +1247,18 @@ interface LoadResponse {
return this.syncData[aniListIdPrefix] return this.syncData[aniListIdPrefix]
} }
fun LoadResponse.getImdbId(): String? {
return normalSafeApiCall {
SimklApi.readIdFromString(this.syncData[simklIdPrefix])?.get(SimklApi.Companion.SyncServices.Imdb)
}
}
fun LoadResponse.getTMDbId(): String? {
return normalSafeApiCall {
SimklApi.readIdFromString(this.syncData[simklIdPrefix])?.get(SimklApi.Companion.SyncServices.Tmdb)
}
}
fun LoadResponse.addMalId(id: Int?) { fun LoadResponse.addMalId(id: Int?) {
this.syncData[malIdPrefix] = (id ?: return).toString() this.syncData[malIdPrefix] = (id ?: return).toString()
this.addSimklId(SimklApi.Companion.SyncServices.Mal, id.toString()) this.addSimklId(SimklApi.Companion.SyncServices.Mal, id.toString())
@ -1454,6 +1466,15 @@ interface EpisodeResponse {
var nextAiring: NextAiring? var nextAiring: NextAiring?
var seasonNames: List<SeasonData>? var seasonNames: List<SeasonData>?
fun getLatestEpisodes(): Map<DubStatus, Int?> fun getLatestEpisodes(): Map<DubStatus, Int?>
/** Count all episodes in all previous seasons up until this episode to get a total count.
* Example:
* Season 1: 10 episodes.
* Season 2: 6 episodes.
*
* getTotalEpisodeIndex(episode = 3, season = 2) -> 10 + 3 = 13
* */
fun getTotalEpisodeIndex(episode: Int, season: Int): Int
} }
@JvmName("addSeasonNamesString") @JvmName("addSeasonNamesString")
@ -1565,6 +1586,12 @@ data class AnimeLoadResponse(
}.toMap() }.toMap()
} }
override fun getTotalEpisodeIndex(episode: Int, season: Int): Int {
return this.episodes.maxOf { (_, episodes) ->
episodes.count { ((it.season ?: Int.MIN_VALUE) < season) && it.season != 0 }
} + episode
}
/** /**
* Secondary constructor for backwards compatibility without contentRating. * Secondary constructor for backwards compatibility without contentRating.
* Remove this constructor after there is a new stable release and extensions are updated to support contentRating. * Remove this constructor after there is a new stable release and extensions are updated to support contentRating.
@ -1867,6 +1894,12 @@ data class TvSeriesLoadResponse(
return mapOf(DubStatus.None to max) return mapOf(DubStatus.None to max)
} }
override fun getTotalEpisodeIndex(episode: Int, season: Int): Int {
return episodes.count {
(it.season ?: Int.MIN_VALUE) < season && it.season != 0
} + episode
}
/** /**
* Secondary constructor for backwards compatibility without contentRating. * Secondary constructor for backwards compatibility without contentRating.
* Remove this constructor after there is a new stable release and extensions are updated to support contentRating. * Remove this constructor after there is a new stable release and extensions are updated to support contentRating.

View file

@ -662,7 +662,7 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener {
val isAtHome = val isAtHome =
navController?.currentDestination?.matchDestination(R.id.navigation_home) == true navController?.currentDestination?.matchDestination(R.id.navigation_home) == true
if (isAtHome && isTrueTvSettings()) { if (isAtHome && isTvSettings()) {
showConfirmExitDialog() showConfirmExitDialog()
} else { } else {
super.onBackPressed() super.onBackPressed()
@ -1306,7 +1306,7 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener {
this@MainActivity.getString(R.string.action_add_to_bookmarks), this@MainActivity.getString(R.string.action_add_to_bookmarks),
showApply = false, showApply = false,
{}) { {}) {
viewModel.updateWatchStatus(WatchType.values()[it]) viewModel.updateWatchStatus(WatchType.values()[it], this@MainActivity)
} }
} }

View file

@ -1,73 +0,0 @@
package com.lagradost.cloudstream3.metaproviders
import com.lagradost.cloudstream3.*
import com.lagradost.cloudstream3.LoadResponse.Companion.addAniListId
import com.lagradost.cloudstream3.LoadResponse.Companion.addTrailer
import com.lagradost.cloudstream3.syncproviders.AccountManager.Companion.aniListApi
import com.lagradost.cloudstream3.syncproviders.SyncAPI
import com.lagradost.cloudstream3.syncproviders.providers.AniListApi
import com.lagradost.cloudstream3.syncproviders.providers.MALApi
import com.lagradost.cloudstream3.utils.SyncUtil
// wont be implemented
class MultiAnimeProvider : MainAPI() {
override var name = "MultiAnime"
override var lang = "en"
override val usesWebView = true
override val supportedTypes = setOf(TvType.Anime)
private val syncApi: SyncAPI = aniListApi
private val syncUtilType by lazy {
when (syncApi) {
is AniListApi -> "anilist"
is MALApi -> "myanimelist"
else -> throw ErrorLoadingException("Invalid Api")
}
}
private val validApis
get() =
synchronized(APIHolder.apis) {
APIHolder.apis.filter {
it.lang == this.lang && it::class.java != this::class.java && it.supportedTypes.contains(
TvType.Anime
)
}
}
private fun filterName(name: String): String {
return Regex("""[^a-zA-Z0-9-]""").replace(name, "")
}
override suspend fun search(query: String): List<SearchResponse>? {
return syncApi.search(query)?.map {
AnimeSearchResponse(it.name, it.url, this.name, TvType.Anime, it.posterUrl)
}
}
override suspend fun load(url: String): LoadResponse? {
return syncApi.getResult(url)?.let { res ->
val data = SyncUtil.getUrlsFromId(res.id, syncUtilType).amap { url ->
validApis.firstOrNull { api -> url.startsWith(api.mainUrl) }?.load(url)
}.filterNotNull()
val type =
if (data.any { it.type == TvType.AnimeMovie }) TvType.AnimeMovie else TvType.Anime
newAnimeLoadResponse(
res.title ?: throw ErrorLoadingException("No Title found"),
url,
type
) {
posterUrl = res.posterUrl
plot = res.synopsis
tags = res.genres
rating = res.publicScore
addTrailer(res.trailers)
addAniListId(res.id.toIntOrNull())
recommendations = res.recommendations
}
}
}
}

View file

@ -8,7 +8,7 @@ import com.lagradost.cloudstream3.syncproviders.SyncIdName
import com.lagradost.cloudstream3.ui.WatchType import com.lagradost.cloudstream3.ui.WatchType
import com.lagradost.cloudstream3.ui.library.ListSorting import com.lagradost.cloudstream3.ui.library.ListSorting
import com.lagradost.cloudstream3.ui.result.txt import com.lagradost.cloudstream3.ui.result.txt
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTvSettings import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTrueTvSettings
import com.lagradost.cloudstream3.utils.Coroutines.ioWork import com.lagradost.cloudstream3.utils.Coroutines.ioWork
import com.lagradost.cloudstream3.utils.DataStoreHelper.getAllFavorites import com.lagradost.cloudstream3.utils.DataStoreHelper.getAllFavorites
import com.lagradost.cloudstream3.utils.DataStoreHelper.getAllSubscriptions import com.lagradost.cloudstream3.utils.DataStoreHelper.getAllSubscriptions
@ -71,14 +71,14 @@ class LocalList : SyncAPI {
}?.distinctBy { it.first } ?: return null }?.distinctBy { it.first } ?: return null
val list = ioWork { val list = ioWork {
val isTv = isTvSettings() val isTrueTv = isTrueTvSettings()
val baseMap = WatchType.values().filter { it != WatchType.NONE }.associate { val baseMap = WatchType.values().filter { it != WatchType.NONE }.associate {
// None is not something to display // None is not something to display
it.stringRes to emptyList<SyncAPI.LibraryItem>() it.stringRes to emptyList<SyncAPI.LibraryItem>()
} + mapOf( } + mapOf(
R.string.favorites_list_name to emptyList() R.string.favorites_list_name to emptyList()
) + if (!isTv) { ) + if (!isTrueTv) {
mapOf( mapOf(
R.string.subscription_list_name to emptyList() R.string.subscription_list_name to emptyList()
) )
@ -96,8 +96,8 @@ class LocalList : SyncAPI {
it.toLibraryItem() it.toLibraryItem()
}) })
// Don't show subscriptions or favorites on TV // Don't show subscriptions on TV
val result = if (isTv) { val result = if (isTrueTv) {
baseMap + watchStatusMap + favoritesMap baseMap + watchStatusMap + favoritesMap
} else { } else {
val subscriptionsMap = mapOf(R.string.subscription_list_name to getAllSubscriptions().mapNotNull { val subscriptionsMap = mapOf(R.string.subscription_list_name to getAllSubscriptions().mapNotNull {

View file

@ -203,7 +203,7 @@ class SimklApi(index: Int) : AccountManager(index), SyncAPI {
} }
/** Read the id string to get all other ids */ /** Read the id string to get all other ids */
private fun readIdFromString(idString: String?): Map<SyncServices, String> { fun readIdFromString(idString: String?): Map<SyncServices, String> {
return tryParseJson(idString) ?: return emptyMap() return tryParseJson(idString) ?: return emptyMap()
} }
@ -376,6 +376,8 @@ class SimklApi(index: Int) : AccountManager(index), SyncAPI {
private var status: Int? = null, private var status: Int? = null,
private var addEpisodes: Pair<List<MediaObject.Season>?, List<MediaObject.Season.Episode>?>? = null, private var addEpisodes: Pair<List<MediaObject.Season>?, List<MediaObject.Season.Episode>?>? = null,
private var removeEpisodes: Pair<List<MediaObject.Season>?, List<MediaObject.Season.Episode>?>? = null, private var removeEpisodes: Pair<List<MediaObject.Season>?, List<MediaObject.Season.Episode>?>? = null,
// Required for knowing if the status should be overwritten
private var onList: Boolean = false
) { ) {
fun interceptor(interceptor: Interceptor) = apply { this.interceptor = interceptor } fun interceptor(interceptor: Interceptor) = apply { this.interceptor = interceptor }
fun apiUrl(url: String) = apply { this.url = url } fun apiUrl(url: String) = apply { this.url = url }
@ -387,6 +389,7 @@ class SimklApi(index: Int) : AccountManager(index), SyncAPI {
} }
fun status(newStatus: Int?, oldStatus: Int?) = apply { fun status(newStatus: Int?, oldStatus: Int?) = apply {
onList = oldStatus != null
// Only set status if its new // Only set status if its new
if (newStatus != oldStatus) { if (newStatus != oldStatus) {
this.status = newStatus this.status = newStatus
@ -412,6 +415,11 @@ class SimklApi(index: Int) : AccountManager(index), SyncAPI {
// Do not add episodes if there is no change // Do not add episodes if there is no change
if (newEpisodes > (oldEpisodes ?: 0)) { if (newEpisodes > (oldEpisodes ?: 0)) {
this.addEpisodes = getEpisodes(allEpisodes.take(newEpisodes)) this.addEpisodes = getEpisodes(allEpisodes.take(newEpisodes))
// Set to watching if episodes are added and there is no current status
if (!onList) {
status = SimklListStatusType.Watching.value
}
} }
if ((oldEpisodes ?: 0) > newEpisodes) { if ((oldEpisodes ?: 0) > newEpisodes) {
this.removeEpisodes = getEpisodes(allEpisodes.drop(newEpisodes)) this.removeEpisodes = getEpisodes(allEpisodes.drop(newEpisodes))
@ -431,6 +439,28 @@ class SimklApi(index: Int) : AccountManager(index), SyncAPI {
interceptor = interceptor interceptor = interceptor
).isSuccessful ).isSuccessful
} else { } else {
val statusResponse = status?.let { setStatus ->
val newStatus =
SimklListStatusType.values()
.firstOrNull { it.value == setStatus }?.originalName
?: SimklListStatusType.Watching.originalName!!
app.post(
"${this.url}/sync/add-to-list",
json = StatusRequest(
shows = listOf(
StatusMediaObject(
null,
null,
ids,
newStatus,
)
), movies = emptyList()
),
interceptor = interceptor
).isSuccessful
} ?: true
val episodeRemovalResponse = removeEpisodes?.let { (seasons, episodes) -> val episodeRemovalResponse = removeEpisodes?.let { (seasons, episodes) ->
app.post( app.post(
"${this.url}/sync/history/remove", "${this.url}/sync/history/remove",
@ -472,28 +502,6 @@ class SimklApi(index: Int) : AccountManager(index), SyncAPI {
true true
} }
val statusResponse = status?.let { setStatus ->
val newStatus =
SimklListStatusType.values()
.firstOrNull { it.value == setStatus }?.originalName
?: SimklListStatusType.Watching.originalName!!
app.post(
"${this.url}/sync/add-to-list",
json = StatusRequest(
shows = listOf(
StatusMediaObject(
null,
null,
ids,
newStatus,
)
), movies = emptyList()
),
interceptor = interceptor
).isSuccessful
} ?: true
statusResponse && episodeRemovalResponse && historyResponse statusResponse && episodeRemovalResponse && historyResponse
} }
} }

View file

@ -55,7 +55,6 @@ class WhoIsWatchingAdapter(
editCallBack = editCallBack, editCallBack = editCallBack,
) )
override fun onBindViewHolder(holder: WhoIsWatchingHolder, position: Int) = override fun onBindViewHolder(holder: WhoIsWatchingHolder, position: Int) =
holder.bind(currentList.getOrNull(position)) holder.bind(currentList.getOrNull(position))
@ -70,10 +69,15 @@ class WhoIsWatchingAdapter(
fun bind(card: DataStoreHelper.Account?) { fun bind(card: DataStoreHelper.Account?) {
when (binding) { when (binding) {
is WhoIsWatchingAccountBinding -> binding.apply { is WhoIsWatchingAccountBinding -> binding.apply {
if(card == null) return@apply if (card == null) return@apply
outline.isVisible = card.keyIndex == DataStoreHelper.selectedKeyIndex outline.isVisible = card.keyIndex == DataStoreHelper.selectedKeyIndex
profileText.text = card.name profileText.text = card.name
profileImageBackground.setImage(card.image) profileImageBackground.setImage(card.image)
// Handle the lock indicator
val isLocked = card.lockPin != null
lockIcon.isVisible = isLocked
root.setOnClickListener { root.setOnClickListener {
selectCallBack(card) selectCallBack(card)
} }

View file

@ -0,0 +1,64 @@
package com.lagradost.cloudstream3.ui.account
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.core.view.isVisible
import androidx.recyclerview.widget.RecyclerView
import com.lagradost.cloudstream3.databinding.AccountListItemBinding
import com.lagradost.cloudstream3.ui.result.setImage
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTvSettings
import com.lagradost.cloudstream3.utils.DataStoreHelper
class AccountAdapter(
private val accounts: List<DataStoreHelper.Account>,
private val onItemClick: (DataStoreHelper.Account) -> Unit
) : RecyclerView.Adapter<AccountAdapter.AccountViewHolder>() {
inner class AccountViewHolder(private val binding: AccountListItemBinding) :
RecyclerView.ViewHolder(binding.root) {
fun bind(account: DataStoreHelper.Account) {
val isLastUsedAccount = account.keyIndex == DataStoreHelper.selectedKeyIndex
binding.accountName.text = account.name
binding.accountImage.setImage(account.image)
binding.lockIcon.isVisible = account.lockPin != null
binding.outline.isVisible = isLastUsedAccount
if (isTvSettings()) {
binding.root.isFocusableInTouchMode = true
if (isLastUsedAccount) {
binding.root.requestFocus()
}
}
binding.root.setOnClickListener {
onItemClick(account)
}
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AccountViewHolder {
val binding = AccountListItemBinding.inflate(
LayoutInflater.from(parent.context), parent, false
)
if (isTvSettings()) {
val layoutParams = binding.root.layoutParams as RecyclerView.LayoutParams
val marginInDp = 5 // Set the margin to 5dp
val marginInPixels = (marginInDp * parent.resources.displayMetrics.density).toInt()
layoutParams.setMargins(marginInPixels, marginInPixels, marginInPixels, marginInPixels)
binding.root.layoutParams = layoutParams
}
return AccountViewHolder(binding)
}
override fun onBindViewHolder(holder: AccountViewHolder, position: Int) {
holder.bind(accounts[position])
}
override fun getItemCount(): Int {
return accounts.size
}
}

View file

@ -0,0 +1,115 @@
package com.lagradost.cloudstream3.ui.account
import android.content.Context
import android.text.Editable
import android.text.TextWatcher
import android.view.LayoutInflater
import android.view.View
import android.view.inputmethod.EditorInfo
import android.view.inputmethod.InputMethodManager
import android.widget.TextView
import androidx.annotation.StringRes
import androidx.appcompat.app.AlertDialog
import com.lagradost.cloudstream3.R
import com.lagradost.cloudstream3.databinding.LockPinDialogBinding
import com.lagradost.cloudstream3.utils.UIHelper.dismissSafe
object AccountDialog {
// TODO add account creation dialog to allow creating accounts directly from AccountSelectActivity
fun showPinInputDialog(
context: Context,
currentPin: String?,
editAccount: Boolean,
callback: (String?) -> Unit
) {
fun TextView.visibleWithText(@StringRes textRes: Int) {
visibility = View.VISIBLE
setText(textRes)
}
fun View.isVisible() = visibility == View.VISIBLE
val binding = LockPinDialogBinding.inflate(LayoutInflater.from(context))
val isPinSet = currentPin != null
val isNewPin = editAccount && !isPinSet
val isEditPin = editAccount && isPinSet
val titleRes = if (isEditPin) R.string.enter_current_pin else R.string.enter_pin
val dialog = AlertDialog.Builder(context, R.style.AlertDialogCustom)
.setView(binding.root)
.setTitle(titleRes)
.setNegativeButton(R.string.cancel) { _, _ ->
callback.invoke(null)
}
.setOnCancelListener {
callback.invoke(null)
}
.setOnDismissListener {
if (binding.pinEditTextError.isVisible()) {
callback.invoke(null)
}
}
.create()
var isPinValid = false
binding.pinEditText.addTextChangedListener(object : TextWatcher {
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
val enteredPin = s.toString()
val isEnteredPinValid = enteredPin.length == 4
if (isEnteredPinValid) {
if (isPinSet) {
if (enteredPin != currentPin) {
binding.pinEditTextError.visibleWithText(R.string.pin_error_incorrect)
binding.pinEditText.text = null
isPinValid = false
} else {
binding.pinEditTextError.visibility = View.GONE
isPinValid = true
callback.invoke(enteredPin)
dialog.dismissSafe()
}
} else {
binding.pinEditTextError.visibility = View.GONE
isPinValid = true
}
} else if (isNewPin) {
binding.pinEditTextError.visibleWithText(R.string.pin_error_length)
isPinValid = false
}
}
override fun afterTextChanged(s: Editable?) {}
})
// Detect IME_ACTION_DONE
binding.pinEditText.setOnEditorActionListener { _, actionId, _ ->
if (actionId == EditorInfo.IME_ACTION_DONE && isPinValid) {
val enteredPin = binding.pinEditText.text.toString()
callback.invoke(enteredPin)
dialog.dismissSafe()
}
true
}
// We don't want to accidentally have the dialog dismiss when clicking outside of it.
// That is what the cancel button is for.
dialog.setCanceledOnTouchOutside(false)
dialog.show()
// Auto focus on PIN input and show keyboard
binding.pinEditText.requestFocus()
binding.pinEditText.postDelayed({
val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.showSoftInput(binding.pinEditText, InputMethodManager.SHOW_IMPLICIT)
}, 200)
}
}

View file

@ -0,0 +1,92 @@
package com.lagradost.cloudstream3.ui.account
import android.content.Intent
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.lagradost.cloudstream3.CommonActivity
import com.lagradost.cloudstream3.CommonActivity.loadThemes
import com.lagradost.cloudstream3.MainActivity
import com.lagradost.cloudstream3.R
import com.lagradost.cloudstream3.databinding.ActivityAccountSelectBinding
import com.lagradost.cloudstream3.databinding.ActivityAccountSelectTvBinding
import com.lagradost.cloudstream3.ui.account.AccountDialog.showPinInputDialog
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTvSettings
import com.lagradost.cloudstream3.utils.DataStoreHelper
import com.lagradost.cloudstream3.utils.DataStoreHelper.getAccounts
import com.lagradost.cloudstream3.utils.UIHelper.colorFromAttribute
class AccountSelectActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val accounts = getAccounts(this@AccountSelectActivity)
// Don't show account selection if there is only
// one account that exists
if (accounts.count() <= 1) {
navigateToMainActivity()
return
}
CommonActivity.init(this)
loadThemes(this)
window.navigationBarColor = colorFromAttribute(R.attr.primaryBlackBackground)
val binding = if (isTvSettings()) {
ActivityAccountSelectTvBinding.inflate(layoutInflater)
} else ActivityAccountSelectBinding.inflate(layoutInflater)
setContentView(binding.root)
val recyclerView: RecyclerView = binding.root.findViewById(R.id.account_recycler_view)
val adapter = AccountAdapter(accounts) { selectedAccount ->
// Handle the selected account
onAccountSelected(selectedAccount)
}
recyclerView.adapter = adapter
recyclerView.layoutManager = if (isTvSettings()) {
LinearLayoutManager(this)
} else GridLayoutManager(this, 2)
}
private fun onAccountSelected(selectedAccount: DataStoreHelper.Account) {
if (selectedAccount.lockPin != null) {
// The selected account has a PIN set, prompt the user to enter the PIN
showPinInputDialog(this@AccountSelectActivity, selectedAccount.lockPin, false) { pin ->
if (pin == null) return@showPinInputDialog
// Pin is correct, proceed to main activity
setAccount(selectedAccount)
navigateToMainActivity()
}
} else {
// No PIN set for the selected account, proceed to main activity
setAccount(selectedAccount)
navigateToMainActivity()
}
}
private fun setAccount(account: DataStoreHelper.Account) {
// Don't reload if it is the same account
if (DataStoreHelper.selectedKeyIndex == account.keyIndex) {
return
}
DataStoreHelper.selectedKeyIndex = account.keyIndex
MainActivity.bookmarksUpdatedEvent(true)
MainActivity.reloadHomeEvent(true)
}
private fun navigateToMainActivity() {
val mainIntent = Intent(this, MainActivity::class.java)
startActivity(mainIntent)
finish() // Finish the account selection activity
}
}

View file

@ -15,7 +15,8 @@ import com.lagradost.cloudstream3.ui.result.FOCUS_SELF
import com.lagradost.cloudstream3.ui.result.setLinearListLayout import com.lagradost.cloudstream3.ui.result.setLinearListLayout
import com.lagradost.cloudstream3.ui.search.SearchClickCallback import com.lagradost.cloudstream3.ui.search.SearchClickCallback
import com.lagradost.cloudstream3.ui.search.SearchFragment.Companion.filterSearchResponse import com.lagradost.cloudstream3.ui.search.SearchFragment.Companion.filterSearchResponse
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTvSettings import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isEmulatorSettings
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTrueTvSettings
import com.lagradost.cloudstream3.utils.AppUtils.isRecyclerScrollable import com.lagradost.cloudstream3.utils.AppUtils.isRecyclerScrollable
class LoadClickCallback( class LoadClickCallback(
@ -34,11 +35,13 @@ open class ParentItemAdapter(
) : RecyclerView.Adapter<RecyclerView.ViewHolder>() { ) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
val root = LayoutInflater.from(parent.context).inflate( val layoutResId = when {
if (isTvSettings()) R.layout.homepage_parent_tv else R.layout.homepage_parent, isTrueTvSettings() -> R.layout.homepage_parent_tv
parent, parent.context.isEmulatorSettings() -> R.layout.homepage_parent_emulator
false else -> R.layout.homepage_parent
) }
val root = LayoutInflater.from(parent.context).inflate(layoutResId, parent, false)
val binding = HomepageParentBinding.bind(root) val binding = HomepageParentBinding.bind(root)
@ -234,7 +237,7 @@ open class ParentItemAdapter(
}) })
//(recyclerView.adapter as HomeChildItemAdapter).notifyDataSetChanged() //(recyclerView.adapter as HomeChildItemAdapter).notifyDataSetChanged()
if (!isTvSettings()) { if (!isTrueTvSettings()) {
title.setOnClickListener { title.setOnClickListener {
moreInfoClickCallback.invoke(expand) moreInfoClickCallback.invoke(expand)
} }

View file

@ -35,6 +35,7 @@ import com.lagradost.cloudstream3.ui.result.setLinearListLayout
import com.lagradost.cloudstream3.ui.search.SEARCH_ACTION_LOAD import com.lagradost.cloudstream3.ui.search.SEARCH_ACTION_LOAD
import com.lagradost.cloudstream3.ui.search.SEARCH_ACTION_SHOW_METADATA import com.lagradost.cloudstream3.ui.search.SEARCH_ACTION_SHOW_METADATA
import com.lagradost.cloudstream3.ui.search.SearchClickCallback import com.lagradost.cloudstream3.ui.search.SearchClickCallback
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isEmulatorSettings
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTvSettings import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTvSettings
import com.lagradost.cloudstream3.utils.DataStoreHelper import com.lagradost.cloudstream3.utils.DataStoreHelper
import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showBottomDialog import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showBottomDialog
@ -81,6 +82,28 @@ class HomeParentItemAdapterPreview(
parent, parent,
false false
) else FragmentHomeHeadBinding.inflate(inflater, parent, false) ) else FragmentHomeHeadBinding.inflate(inflater, parent, false)
if (binding is FragmentHomeHeadTvBinding && parent.context.isEmulatorSettings()) {
binding.homeBookmarkParentItemMoreInfo.isVisible = true
val marginInDp = 50
val density = binding.horizontalScrollChips.context.resources.displayMetrics.density
val marginInPixels = (marginInDp * density).toInt()
val params = binding.horizontalScrollChips.layoutParams as ViewGroup.MarginLayoutParams
params.marginEnd = marginInPixels
binding.horizontalScrollChips.layoutParams = params
binding.homeWatchParentItemTitle.setCompoundDrawablesWithIntrinsicBounds(
null,
null,
ContextCompat.getDrawable(
parent.context,
R.drawable.ic_baseline_arrow_forward_24
),
null
)
}
HeaderViewHolder( HeaderViewHolder(
binding, binding,
viewModel, viewModel,
@ -355,21 +378,25 @@ class HomeParentItemAdapterPreview(
showApply = false, showApply = false,
{}) { {}) {
val newValue = WatchType.values()[it] val newValue = WatchType.values()[it]
homePreviewBookmark.setCompoundDrawablesWithIntrinsicBounds(
null,
ContextCompat.getDrawable(
homePreviewBookmark.context,
newValue.iconRes
),
null,
null
)
homePreviewBookmark.setText(newValue.stringRes)
ResultViewModel2.updateWatchStatus( ResultViewModel2().updateWatchStatus(
item, newValue,
newValue fab.context,
) item
) { statusChanged: Boolean ->
if (!statusChanged) return@updateWatchStatus
homePreviewBookmark.setCompoundDrawablesWithIntrinsicBounds(
null,
ContextCompat.getDrawable(
homePreviewBookmark.context,
newValue.iconRes
),
null,
null
)
homePreviewBookmark.setText(newValue.stringRes)
}
} }
} }
} }
@ -553,12 +580,19 @@ class HomeParentItemAdapterPreview(
resumeHolder.isVisible = resumeWatching.isNotEmpty() resumeHolder.isVisible = resumeWatching.isNotEmpty()
resumeAdapter.updateList(resumeWatching) resumeAdapter.updateList(resumeWatching)
if (binding is FragmentHomeHeadBinding) { if (
binding.homeWatchParentItemTitle.setOnClickListener { binding is FragmentHomeHeadBinding ||
binding is FragmentHomeHeadTvBinding &&
binding.root.context.isEmulatorSettings()
) {
val title = (binding as? FragmentHomeHeadBinding)?.homeWatchParentItemTitle
?: (binding as? FragmentHomeHeadTvBinding)?.homeWatchParentItemTitle
title?.setOnClickListener {
viewModel.popup( viewModel.popup(
HomeViewModel.ExpandableHomepageList( HomeViewModel.ExpandableHomepageList(
HomePageList( HomePageList(
binding.homeWatchParentItemTitle.text.toString(), title.text.toString(),
resumeWatching, resumeWatching,
false false
), 1, false ), 1, false
@ -576,8 +610,15 @@ class HomeParentItemAdapterPreview(
bookmarkHolder.isVisible = visible bookmarkHolder.isVisible = visible
bookmarkAdapter.updateList(list) bookmarkAdapter.updateList(list)
if (binding is FragmentHomeHeadBinding) { if (
binding.homeBookmarkParentItemTitle.setOnClickListener { binding is FragmentHomeHeadBinding ||
binding is FragmentHomeHeadTvBinding &&
binding.root.context.isEmulatorSettings()
) {
val title = (binding as? FragmentHomeHeadBinding)?.homeBookmarkParentItemTitle
?: (binding as? FragmentHomeHeadTvBinding)?.homeBookmarkParentItemTitle
title?.setOnClickListener {
val items = toggleList.map { it.first }.filter { it.isChecked } val items = toggleList.map { it.first }.filter { it.isChecked }
if (items.isEmpty()) return@setOnClickListener // we don't want to show an empty dialog if (items.isEmpty()) return@setOnClickListener // we don't want to show an empty dialog
val textSum = items val textSum = items

View file

@ -40,7 +40,6 @@ import com.lagradost.cloudstream3.utils.AppUtils.loadResult
import com.lagradost.cloudstream3.utils.Coroutines.ioSafe import com.lagradost.cloudstream3.utils.Coroutines.ioSafe
import com.lagradost.cloudstream3.utils.DOWNLOAD_HEADER_CACHE import com.lagradost.cloudstream3.utils.DOWNLOAD_HEADER_CACHE
import com.lagradost.cloudstream3.utils.DataStoreHelper import com.lagradost.cloudstream3.utils.DataStoreHelper
import com.lagradost.cloudstream3.utils.DataStoreHelper.deleteAllBookmarkedData
import com.lagradost.cloudstream3.utils.DataStoreHelper.deleteAllResumeStateIds import com.lagradost.cloudstream3.utils.DataStoreHelper.deleteAllResumeStateIds
import com.lagradost.cloudstream3.utils.DataStoreHelper.getAllResumeStateIds import com.lagradost.cloudstream3.utils.DataStoreHelper.getAllResumeStateIds
import com.lagradost.cloudstream3.utils.DataStoreHelper.getAllWatchStateIds import com.lagradost.cloudstream3.utils.DataStoreHelper.getAllWatchStateIds
@ -102,11 +101,6 @@ class HomeViewModel : ViewModel() {
loadStoredData() loadStoredData()
} }
fun deleteBookmarks() {
deleteAllBookmarkedData()
loadStoredData()
}
var repo: APIRepository? = null var repo: APIRepository? = null
private val _apiName = MutableLiveData<String>() private val _apiName = MutableLiveData<String>()

View file

@ -62,7 +62,7 @@ const val LIBRARY_FOLDER = "library_folder"
enum class LibraryOpenerType(@StringRes val stringRes: Int) { enum class LibraryOpenerType(@StringRes val stringRes: Int) {
Default(R.string.default_subtitles), // TODO FIX AFTER MERGE Default(R.string.action_default),
Provider(R.string.none), Provider(R.string.none),
Browser(R.string.browser), Browser(R.string.browser),
Search(R.string.search), Search(R.string.search),

View file

@ -1023,7 +1023,7 @@ class GeneratorPlayer : FullScreenPlayer() {
ctx.getString(R.string.episode_sync_enabled_key), true ctx.getString(R.string.episode_sync_enabled_key), true
) )
) maxEpisodeSet = meta.episode ) maxEpisodeSet = meta.episode
sync.modifyMaxEpisode(meta.episode) sync.modifyMaxEpisode(meta.totalEpisodeIndex ?: meta.episode)
} }
} }

View file

@ -47,7 +47,9 @@ data class ResultEpisode(
/** /**
* Conveys if the episode itself is marked as watched * Conveys if the episode itself is marked as watched
**/ **/
val videoWatchState: VideoWatchState val videoWatchState: VideoWatchState,
/** Sum of all previous season episode counts + episode */
val totalEpisodeIndex: Int? = null,
) )
fun ResultEpisode.getRealPosition(): Long { fun ResultEpisode.getRealPosition(): Long {
@ -82,6 +84,7 @@ fun buildResultEpisode(
isFiller: Boolean? = null, isFiller: Boolean? = null,
tvType: TvType, tvType: TvType,
parentId: Int, parentId: Int,
totalEpisodeIndex: Int? = null,
): ResultEpisode { ): ResultEpisode {
val posDur = getViewPos(id) val posDur = getViewPos(id)
val videoWatchState = getVideoWatchState(id) ?: VideoWatchState.None val videoWatchState = getVideoWatchState(id) ?: VideoWatchState.None
@ -103,7 +106,8 @@ fun buildResultEpisode(
isFiller, isFiller,
tvType, tvType,
parentId, parentId,
videoWatchState videoWatchState,
totalEpisodeIndex
) )
} }

View file

@ -17,7 +17,6 @@ import android.view.animation.DecelerateInterpolator
import android.widget.AbsListView import android.widget.AbsListView
import android.widget.ArrayAdapter import android.widget.ArrayAdapter
import android.widget.Toast import android.widget.Toast
import androidx.appcompat.app.AlertDialog
import androidx.core.view.isGone import androidx.core.view.isGone
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.core.widget.NestedScrollView import androidx.core.widget.NestedScrollView
@ -66,6 +65,7 @@ import com.lagradost.cloudstream3.utils.AppUtils.openBrowser
import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showBottomDialog import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showBottomDialog
import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showBottomDialogInstant import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showBottomDialogInstant
import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showBottomDialogText
import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showDialog import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showDialog
import com.lagradost.cloudstream3.utils.UIHelper import com.lagradost.cloudstream3.utils.UIHelper
import com.lagradost.cloudstream3.utils.UIHelper.colorFromAttribute import com.lagradost.cloudstream3.utils.UIHelper.colorFromAttribute
@ -430,34 +430,36 @@ open class ResultFragmentPhone : FullScreenPlayer() {
} }
}) })
resultSubscribe.setOnClickListener { resultSubscribe.setOnClickListener {
val isSubscribed = viewModel.toggleSubscriptionStatus(context) { newStatus: Boolean? ->
viewModel.toggleSubscriptionStatus() ?: return@setOnClickListener if (newStatus == null) return@toggleSubscriptionStatus
val message = if (isSubscribed) { val message = if (newStatus) {
// Kinda icky to have this here, but it works. // Kinda icky to have this here, but it works.
SubscriptionWorkManager.enqueuePeriodicWork(context) SubscriptionWorkManager.enqueuePeriodicWork(context)
R.string.subscription_new R.string.subscription_new
} else { } else {
R.string.subscription_deleted R.string.subscription_deleted
}
val name = (viewModel.page.value as? Resource.Success)?.value?.title
?: txt(R.string.no_data).asStringNull(context) ?: ""
CommonActivity.showToast(txt(message, name), Toast.LENGTH_SHORT)
} }
val name = (viewModel.page.value as? Resource.Success)?.value?.title
?: txt(R.string.no_data).asStringNull(context) ?: ""
CommonActivity.showToast(txt(message, name), Toast.LENGTH_SHORT)
} }
resultFavorite.setOnClickListener { resultFavorite.setOnClickListener {
val isFavorite = viewModel.toggleFavoriteStatus(context) { newStatus: Boolean? ->
viewModel.toggleFavoriteStatus() ?: return@setOnClickListener if (newStatus == null) return@toggleFavoriteStatus
val message = if (isFavorite) { val message = if (newStatus) {
R.string.favorite_added R.string.favorite_added
} else { } else {
R.string.favorite_removed R.string.favorite_removed
}
val name = (viewModel.page.value as? Resource.Success)?.value?.title
?: txt(R.string.no_data).asStringNull(context) ?: ""
CommonActivity.showToast(txt(message, name), Toast.LENGTH_SHORT)
} }
val name = (viewModel.page.value as? Resource.Success)?.value?.title
?: txt(R.string.no_data).asStringNull(context) ?: ""
CommonActivity.showToast(txt(message, name), Toast.LENGTH_SHORT)
} }
mediaRouteButton.apply { mediaRouteButton.apply {
val chromecastSupport = api?.hasChromecastSupport == true val chromecastSupport = api?.hasChromecastSupport == true
@ -682,14 +684,13 @@ open class ResultFragmentPhone : FullScreenPlayer() {
resultPoster.setImage(d.posterImage) resultPoster.setImage(d.posterImage)
resultPosterBackground.setImage(d.posterBackgroundImage) resultPosterBackground.setImage(d.posterBackgroundImage)
resultDescription.setTextHtml(d.plotText) resultDescription.setTextHtml(d.plotText)
resultDescription.setOnClickListener { view -> resultDescription.setOnClickListener {
// todo bottom view? activity?.let { activity ->
view.context?.let { ctx -> activity.showBottomDialogText(
val builder: AlertDialog.Builder = d.titleText.asString(activity),
AlertDialog.Builder(ctx, R.style.AlertDialogCustom) d.plotText.asString(activity).html(),
builder.setMessage(d.plotText.asString(ctx).html()) {}
.setTitle(d.plotHeaderText.asString(ctx)) )
.show()
} }
} }
@ -885,16 +886,11 @@ open class ResultFragmentPhone : FullScreenPlayer() {
setRecommendations(recommendations, null) setRecommendations(recommendations, null)
} }
observe(viewModel.episodeSynopsis) { description -> observe(viewModel.episodeSynopsis) { description ->
// TODO bottom dialog activity?.let { activity ->
view.context?.let { ctx -> activity.showBottomDialogText(
val builder: AlertDialog.Builder = activity.getString(R.string.synopsis),
AlertDialog.Builder(ctx, R.style.AlertDialogCustom) description.html()
builder.setMessage(description.html()) ) { viewModel.releaseEpisodeSynopsis() }
.setTitle(R.string.synopsis)
.setOnDismissListener {
viewModel.releaseEpisodeSynopsis()
}
.show()
} }
} }
context?.let { ctx -> context?.let { ctx ->
@ -972,7 +968,7 @@ open class ResultFragmentPhone : FullScreenPlayer() {
fab.context.getString(R.string.action_add_to_bookmarks), fab.context.getString(R.string.action_add_to_bookmarks),
showApply = false, showApply = false,
{}) { {}) {
viewModel.updateWatchStatus(WatchType.values()[it]) viewModel.updateWatchStatus(WatchType.values()[it], context)
} }
} }
} }

View file

@ -28,6 +28,7 @@ import com.lagradost.cloudstream3.databinding.FragmentResultTvBinding
import com.lagradost.cloudstream3.mvvm.Resource import com.lagradost.cloudstream3.mvvm.Resource
import com.lagradost.cloudstream3.mvvm.observe import com.lagradost.cloudstream3.mvvm.observe
import com.lagradost.cloudstream3.mvvm.observeNullable import com.lagradost.cloudstream3.mvvm.observeNullable
import com.lagradost.cloudstream3.services.SubscriptionWorkManager
import com.lagradost.cloudstream3.ui.WatchType import com.lagradost.cloudstream3.ui.WatchType
import com.lagradost.cloudstream3.ui.download.DownloadButtonSetup import com.lagradost.cloudstream3.ui.download.DownloadButtonSetup
import com.lagradost.cloudstream3.ui.player.ExtractorLinkGenerator import com.lagradost.cloudstream3.ui.player.ExtractorLinkGenerator
@ -37,6 +38,7 @@ import com.lagradost.cloudstream3.ui.result.ResultFragment.updateUIEvent
import com.lagradost.cloudstream3.ui.search.SEARCH_ACTION_FOCUSED import com.lagradost.cloudstream3.ui.search.SEARCH_ACTION_FOCUSED
import com.lagradost.cloudstream3.ui.search.SearchAdapter import com.lagradost.cloudstream3.ui.search.SearchAdapter
import com.lagradost.cloudstream3.ui.search.SearchHelper import com.lagradost.cloudstream3.ui.search.SearchHelper
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isEmulatorSettings
import com.lagradost.cloudstream3.utils.AppUtils.getNameFull import com.lagradost.cloudstream3.utils.AppUtils.getNameFull
import com.lagradost.cloudstream3.utils.AppUtils.html import com.lagradost.cloudstream3.utils.AppUtils.html
import com.lagradost.cloudstream3.utils.AppUtils.isRtl import com.lagradost.cloudstream3.utils.AppUtils.isRtl
@ -287,7 +289,8 @@ class ResultFragmentTv : Fragment() {
resultResumeSeries, resultResumeSeries,
resultPlayTrailer, resultPlayTrailer,
resultBookmarkButton, resultBookmarkButton,
resultFavoriteButton resultFavoriteButton,
resultSubscribeButton
) )
for (requestView in views) { for (requestView in views) {
if (!requestView.isVisible) continue if (!requestView.isVisible) continue
@ -429,6 +432,7 @@ class ResultFragmentTv : Fragment() {
binding?.resultEpisodesShow, binding?.resultEpisodesShow,
binding?.resultBookmarkButton, binding?.resultBookmarkButton,
binding?.resultFavoriteButton, binding?.resultFavoriteButton,
binding?.resultSubscribeButton,
).firstOrNull { ).firstOrNull {
it?.isVisible == true it?.isVisible == true
} }
@ -531,7 +535,7 @@ class ResultFragmentTv : Fragment() {
view.context.getString(R.string.action_add_to_bookmarks), view.context.getString(R.string.action_add_to_bookmarks),
showApply = false, showApply = false,
{}) { {}) {
viewModel.updateWatchStatus(WatchType.values()[it]) viewModel.updateWatchStatus(WatchType.values()[it], context)
} }
} }
} }
@ -557,17 +561,58 @@ class ResultFragmentTv : Fragment() {
setIconResource(drawable) setIconResource(drawable)
setText(text) setText(text)
setOnClickListener { setOnClickListener {
val isFavorite = viewModel.toggleFavoriteStatus() ?: return@setOnClickListener viewModel.toggleFavoriteStatus(context) { newStatus: Boolean? ->
if (newStatus == null) return@toggleFavoriteStatus
val message = if (isFavorite) { val message = if (newStatus) {
R.string.favorite_added R.string.favorite_added
} else { } else {
R.string.favorite_removed R.string.favorite_removed
}
val name = (viewModel.page.value as? Resource.Success)?.value?.title
?: txt(R.string.no_data).asStringNull(context) ?: ""
CommonActivity.showToast(txt(message, name), Toast.LENGTH_SHORT)
} }
}
}
}
val name = (viewModel.page.value as? Resource.Success)?.value?.title observeNullable(viewModel.subscribeStatus) { isSubscribed ->
?: txt(R.string.no_data).asStringNull(context) ?: "" binding?.resultSubscribeButton?.apply {
CommonActivity.showToast(txt(message, name), Toast.LENGTH_SHORT) isVisible = isSubscribed != null && context.isEmulatorSettings()
if (isSubscribed == null) return@observeNullable
val drawable = if (isSubscribed) {
R.drawable.ic_baseline_notifications_active_24
} else {
R.drawable.baseline_notifications_none_24
}
val text = if (isSubscribed) {
R.string.action_unsubscribe
} else {
R.string.action_subscribe
}
setIconResource(drawable)
setText(text)
setOnClickListener {
viewModel.toggleSubscriptionStatus(context) { newStatus: Boolean? ->
if (newStatus == null) return@toggleSubscriptionStatus
val message = if (newStatus) {
// Kinda icky to have this here, but it works.
SubscriptionWorkManager.enqueuePeriodicWork(context)
R.string.subscription_new
} else {
R.string.subscription_deleted
}
val name = (viewModel.page.value as? Resource.Success)?.value?.title
?: txt(R.string.no_data).asStringNull(context) ?: ""
CommonActivity.showToast(txt(message, name), Toast.LENGTH_SHORT)
}
} }
} }
} }
@ -575,6 +620,7 @@ class ResultFragmentTv : Fragment() {
observeNullable(viewModel.movie) { data -> observeNullable(viewModel.movie) { data ->
binding?.apply { binding?.apply {
resultPlayMovie.isVisible = data is Resource.Success resultPlayMovie.isVisible = data is Resource.Success
resultPlaySeries.isVisible = data == null
seriesHolder.isVisible = data == null seriesHolder.isVisible = data == null
resultEpisodesShow.isVisible = data == null resultEpisodesShow.isVisible = data == null
@ -805,12 +851,14 @@ class ResultFragmentTv : Fragment() {
R.drawable.profile_bg_red, R.drawable.profile_bg_red,
R.drawable.profile_bg_teal R.drawable.profile_bg_teal
).random() ).random()
//Change poster crop area to 20% from Top
backgroundPoster.cropYCenterOffsetPct = 0.20F
backgroundPoster.setImage( backgroundPoster.setImage(
d.posterBackgroundImage ?: UiImage.Drawable(error), d.posterBackgroundImage ?: UiImage.Drawable(error),
radius = 0, radius = 0,
errorImageDrawable = error errorImageDrawable = error
) )
resultComingSoon.isVisible = d.comingSoon resultComingSoon.isVisible = d.comingSoon
resultDataHolder.isGone = d.comingSoon resultDataHolder.isGone = d.comingSoon
UIHelper.populateChips(resultTag, d.tags) UIHelper.populateChips(resultTag, d.tags)

View file

@ -7,6 +7,8 @@ import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.util.Log import android.util.Log
import android.widget.Toast import android.widget.Toast
import androidx.annotation.MainThread
import androidx.appcompat.app.AlertDialog
import androidx.core.content.FileProvider import androidx.core.content.FileProvider
import androidx.core.net.toUri import androidx.core.net.toUri
import androidx.lifecycle.LiveData import androidx.lifecycle.LiveData
@ -31,6 +33,7 @@ import com.lagradost.cloudstream3.mvvm.*
import com.lagradost.cloudstream3.syncproviders.AccountManager import com.lagradost.cloudstream3.syncproviders.AccountManager
import com.lagradost.cloudstream3.syncproviders.SyncAPI import com.lagradost.cloudstream3.syncproviders.SyncAPI
import com.lagradost.cloudstream3.syncproviders.providers.Kitsu import com.lagradost.cloudstream3.syncproviders.providers.Kitsu
import com.lagradost.cloudstream3.syncproviders.providers.SimklApi
import com.lagradost.cloudstream3.ui.APIRepository import com.lagradost.cloudstream3.ui.APIRepository
import com.lagradost.cloudstream3.ui.WatchType import com.lagradost.cloudstream3.ui.WatchType
import com.lagradost.cloudstream3.ui.download.DOWNLOAD_NAVIGATE_TO import com.lagradost.cloudstream3.ui.download.DOWNLOAD_NAVIGATE_TO
@ -45,22 +48,37 @@ import com.lagradost.cloudstream3.utils.*
import com.lagradost.cloudstream3.utils.AppUtils.getNameFull import com.lagradost.cloudstream3.utils.AppUtils.getNameFull
import com.lagradost.cloudstream3.utils.AppUtils.isAppInstalled import com.lagradost.cloudstream3.utils.AppUtils.isAppInstalled
import com.lagradost.cloudstream3.utils.AppUtils.isConnectedToChromecast import com.lagradost.cloudstream3.utils.AppUtils.isConnectedToChromecast
import com.lagradost.cloudstream3.utils.AppUtils.setDefaultFocus
import com.lagradost.cloudstream3.utils.CastHelper.startCast import com.lagradost.cloudstream3.utils.CastHelper.startCast
import com.lagradost.cloudstream3.utils.Coroutines.ioSafe import com.lagradost.cloudstream3.utils.Coroutines.ioSafe
import com.lagradost.cloudstream3.utils.Coroutines.ioWork import com.lagradost.cloudstream3.utils.Coroutines.ioWork
import com.lagradost.cloudstream3.utils.Coroutines.ioWorkSafe import com.lagradost.cloudstream3.utils.Coroutines.ioWorkSafe
import com.lagradost.cloudstream3.utils.Coroutines.main import com.lagradost.cloudstream3.utils.Coroutines.main
import com.lagradost.cloudstream3.utils.DataStoreHelper.deleteBookmarkedData
import com.lagradost.cloudstream3.utils.DataStoreHelper.getAllBookmarkedData
import com.lagradost.cloudstream3.utils.DataStoreHelper.getAllFavorites
import com.lagradost.cloudstream3.utils.DataStoreHelper.getAllSubscriptions
import com.lagradost.cloudstream3.utils.DataStoreHelper.getBookmarkedData
import com.lagradost.cloudstream3.utils.DataStoreHelper.getDub import com.lagradost.cloudstream3.utils.DataStoreHelper.getDub
import com.lagradost.cloudstream3.utils.DataStoreHelper.getFavoritesData import com.lagradost.cloudstream3.utils.DataStoreHelper.getFavoritesData
import com.lagradost.cloudstream3.utils.DataStoreHelper.getLastWatched
import com.lagradost.cloudstream3.utils.DataStoreHelper.getResultEpisode import com.lagradost.cloudstream3.utils.DataStoreHelper.getResultEpisode
import com.lagradost.cloudstream3.utils.DataStoreHelper.getResultSeason import com.lagradost.cloudstream3.utils.DataStoreHelper.getResultSeason
import com.lagradost.cloudstream3.utils.DataStoreHelper.getResultWatchState import com.lagradost.cloudstream3.utils.DataStoreHelper.getResultWatchState
import com.lagradost.cloudstream3.utils.DataStoreHelper.getSubscribedData
import com.lagradost.cloudstream3.utils.DataStoreHelper.getVideoWatchState
import com.lagradost.cloudstream3.utils.DataStoreHelper.getViewPos import com.lagradost.cloudstream3.utils.DataStoreHelper.getViewPos
import com.lagradost.cloudstream3.utils.DataStoreHelper.removeFavoritesData import com.lagradost.cloudstream3.utils.DataStoreHelper.removeFavoritesData
import com.lagradost.cloudstream3.utils.DataStoreHelper.removeSubscribedData
import com.lagradost.cloudstream3.utils.DataStoreHelper.setBookmarkedData
import com.lagradost.cloudstream3.utils.DataStoreHelper.setDub import com.lagradost.cloudstream3.utils.DataStoreHelper.setDub
import com.lagradost.cloudstream3.utils.DataStoreHelper.setFavoritesData import com.lagradost.cloudstream3.utils.DataStoreHelper.setFavoritesData
import com.lagradost.cloudstream3.utils.DataStoreHelper.setResultEpisode import com.lagradost.cloudstream3.utils.DataStoreHelper.setResultEpisode
import com.lagradost.cloudstream3.utils.DataStoreHelper.setResultSeason import com.lagradost.cloudstream3.utils.DataStoreHelper.setResultSeason
import com.lagradost.cloudstream3.utils.DataStoreHelper.setResultWatchState
import com.lagradost.cloudstream3.utils.DataStoreHelper.setSubscribedData
import com.lagradost.cloudstream3.utils.DataStoreHelper.setVideoWatchState
import com.lagradost.cloudstream3.utils.DataStoreHelper.updateSubscribedData
import com.lagradost.cloudstream3.utils.UIHelper.navigate import com.lagradost.cloudstream3.utils.UIHelper.navigate
import kotlinx.coroutines.* import kotlinx.coroutines.*
import java.io.File import java.io.File
@ -114,6 +132,18 @@ data class ResultData(
val plotHeaderText: UiText, val plotHeaderText: UiText,
) )
data class CheckDuplicateData(
val name: String,
val year: Int?,
val syncData: Map<String, String>?
)
enum class LibraryListType {
BOOKMARKS,
FAVORITES,
SUBSCRIPTIONS
}
fun txt(status: DubStatus?): UiText? { fun txt(status: DubStatus?): UiText? {
return txt( return txt(
when (status) { when (status) {
@ -443,33 +473,6 @@ class ResultViewModel2 : ViewModel() {
return this?.firstOrNull { it.season == season } return this?.firstOrNull { it.season == season }
} }
fun updateWatchStatus(currentResponse: LoadResponse, status: WatchType) {
val currentId = currentResponse.getId()
val currentWatchType = getResultWatchState(currentId)
DataStoreHelper.setResultWatchState(currentId, status.internalId)
val current = DataStoreHelper.getBookmarkedData(currentId)
val currentTime = System.currentTimeMillis()
DataStoreHelper.setBookmarkedData(
currentId,
DataStoreHelper.BookmarkedData(
currentId,
current?.bookmarkedTime ?: currentTime,
currentTime,
currentResponse.name,
currentResponse.url,
currentResponse.apiName,
currentResponse.type,
currentResponse.posterUrl,
currentResponse.year
)
)
if (currentWatchType != status) {
MainActivity.bookmarksUpdatedEvent(true)
}
}
private fun filterName(name: String?): String? { private fun filterName(name: String?): String? {
if (name == null) return null if (name == null) return null
Regex("[eE]pisode [0-9]*(.*)").find(name)?.groupValues?.get(1)?.let { Regex("[eE]pisode [0-9]*(.*)").find(name)?.groupValues?.get(1)?.let {
@ -824,9 +827,77 @@ class ResultViewModel2 : ViewModel() {
val selectPopup: LiveData<SelectPopup?> = _selectPopup val selectPopup: LiveData<SelectPopup?> = _selectPopup
fun updateWatchStatus(status: WatchType) { fun updateWatchStatus(
updateWatchStatus(currentResponse ?: return, status) status: WatchType,
_watchStatus.postValue(status) context: Context?,
loadResponse: LoadResponse? = null,
statusChangedCallback: ((statusChanged: Boolean) -> Unit)? = null
) {
val response = loadResponse ?: currentResponse ?: return
val currentId = response.getId()
val currentStatus = getResultWatchState(currentId)
// If the current status is "NONE" and the new status is not "NONE",
// fetch the bookmarked data to check for duplicates, otherwise set this
// to an empty list, so that we don't show the duplicate warning dialog,
// but we still want to update the current bookmark and refresh the data anyway.
val bookmarkedData = if (currentStatus == WatchType.NONE && status != WatchType.NONE) {
getAllBookmarkedData()
} else emptyList()
checkAndWarnDuplicates(
context,
LibraryListType.BOOKMARKS,
CheckDuplicateData(
name = response.name,
year = response.year,
syncData = response.syncData,
),
bookmarkedData
) { shouldContinue: Boolean, duplicateIds: List<Int?> ->
if (!shouldContinue) return@checkAndWarnDuplicates
if (duplicateIds.isNotEmpty()) {
duplicateIds.forEach { duplicateId ->
deleteBookmarkedData(duplicateId)
}
}
setResultWatchState(currentId, status.internalId)
// We don't need to store if WatchType.NONE.
// The key is removed in setResultWatchState, we don't want to
// re-add it again here if it was just removed.
if (status != WatchType.NONE) {
val current = getBookmarkedData(currentId)
setBookmarkedData(
currentId,
DataStoreHelper.BookmarkedData(
current?.bookmarkedTime ?: unixTimeMS,
currentId,
unixTimeMS,
response.name,
response.url,
response.apiName,
response.type,
response.posterUrl,
response.year,
response.syncData
)
)
}
if (currentStatus != status) {
MainActivity.bookmarksUpdatedEvent(true)
}
_watchStatus.postValue(status)
statusChangedCallback?.invoke(true)
}
} }
private fun startChromecast( private fun startChromecast(
@ -841,73 +912,255 @@ class ResultViewModel2 : ViewModel() {
} }
/** /**
* @return true if the new status is Subscribed, false if not. Null if not possible to subscribe. * Toggles the subscription status of an item.
**/ *
fun toggleSubscriptionStatus(): Boolean? { * @param context The context to use for operations.
val isSubscribed = _subscribeStatus.value ?: return null * @param statusChangedCallback A callback that is invoked when the subscription status changes.
val response = currentResponse ?: return null * It provides the new subscription status (true if subscribed, false if unsubscribed, null if action was canceled).
if (response !is EpisodeResponse) return null */
fun toggleSubscriptionStatus(
context: Context?,
statusChangedCallback: ((newStatus: Boolean?) -> Unit)? = null
) {
val isSubscribed = _subscribeStatus.value ?: return
val response = currentResponse ?: return
if (response !is EpisodeResponse) return
val currentId = response.getId() val currentId = response.getId()
if (isSubscribed) { if (isSubscribed) {
DataStoreHelper.removeSubscribedData(currentId) removeSubscribedData(currentId)
statusChangedCallback?.invoke(false)
_subscribeStatus.postValue(false)
} else { } else {
val current = DataStoreHelper.getSubscribedData(currentId) checkAndWarnDuplicates(
context,
LibraryListType.SUBSCRIPTIONS,
CheckDuplicateData(
name = response.name,
year = response.year,
syncData = response.syncData,
),
getAllSubscriptions(),
) { shouldContinue: Boolean, duplicateIds: List<Int?> ->
if (!shouldContinue) {
statusChangedCallback?.invoke(null)
return@checkAndWarnDuplicates
}
DataStoreHelper.setSubscribedData( if (duplicateIds.isNotEmpty()) {
currentId, duplicateIds.forEach { duplicateId ->
DataStoreHelper.SubscribedData( removeSubscribedData(duplicateId)
}
}
val current = getSubscribedData(currentId)
setSubscribedData(
currentId, currentId,
current?.bookmarkedTime ?: unixTimeMS, DataStoreHelper.SubscribedData(
unixTimeMS, current?.subscribedTime ?: unixTimeMS,
response.getLatestEpisodes(), response.getLatestEpisodes(),
response.name, currentId,
response.url, unixTimeMS,
response.apiName, response.name,
response.type, response.url,
response.posterUrl, response.apiName,
response.year response.type,
response.posterUrl,
response.year,
response.syncData
)
) )
)
}
_subscribeStatus.postValue(!isSubscribed) _subscribeStatus.postValue(true)
return !isSubscribed
statusChangedCallback?.invoke(true)
}
}
} }
/** /**
* @return true if added to favorites, false if not. Null if not possible to favorite. * Toggles the favorite status of an item.
**/ *
fun toggleFavoriteStatus(): Boolean? { * @param context The context to use.
val isFavorite = _favoriteStatus.value ?: return null * @param statusChangedCallback A callback that is invoked when the favorite status changes.
val response = currentResponse ?: return null * It provides the new favorite status (true if added to favorites, false if removed, null if action was canceled).
*/
fun toggleFavoriteStatus(
context: Context?,
statusChangedCallback: ((newStatus: Boolean?) -> Unit)? = null
) {
val isFavorite = _favoriteStatus.value ?: return
val response = currentResponse ?: return
val currentId = response.getId() val currentId = response.getId()
if (isFavorite) { if (isFavorite) {
removeFavoritesData(currentId) removeFavoritesData(currentId)
statusChangedCallback?.invoke(false)
_favoriteStatus.postValue(false)
} else { } else {
val current = getFavoritesData(currentId) checkAndWarnDuplicates(
context,
LibraryListType.FAVORITES,
CheckDuplicateData(
name = response.name,
year = response.year,
syncData = response.syncData,
),
getAllFavorites(),
) { shouldContinue: Boolean, duplicateIds: List<Int?> ->
if (!shouldContinue) {
statusChangedCallback?.invoke(null)
return@checkAndWarnDuplicates
}
setFavoritesData( if (duplicateIds.isNotEmpty()) {
currentId, duplicateIds.forEach { duplicateId ->
DataStoreHelper.FavoritesData( removeFavoritesData(duplicateId)
}
}
val current = getFavoritesData(currentId)
setFavoritesData(
currentId, currentId,
current?.favoritesTime ?: unixTimeMS, DataStoreHelper.FavoritesData(
unixTimeMS, current?.favoritesTime ?: unixTimeMS,
response.name, currentId,
response.url, unixTimeMS,
response.apiName, response.name,
response.type, response.url,
response.posterUrl, response.apiName,
response.year response.type,
response.posterUrl,
response.year,
response.syncData
)
) )
)
_favoriteStatus.postValue(true)
statusChangedCallback?.invoke(true)
}
}
}
@MainThread
private fun checkAndWarnDuplicates(
context: Context?,
listType: LibraryListType,
checkDuplicateData: CheckDuplicateData,
data: List<DataStoreHelper.LibrarySearchResponse>,
checkDuplicatesCallback: (shouldContinue: Boolean, duplicateIds: List<Int?>) -> Unit
) {
val whitespaceRegex = "\\s+".toRegex()
fun normalizeString(input: String): String {
/**
* Trim the input string and replace consecutive spaces with a single space.
* This covers some edge-cases where the title does not match exactly across providers,
* and one provider has the title with an extra whitespace. This is minor enough that
* it should still match in this case.
*/
return input.trim().replace(whitespaceRegex, " ")
} }
_favoriteStatus.postValue(!isFavorite) val syncData = checkDuplicateData.syncData
return !isFavorite
val imdbId = getImdbIdFromSyncData(syncData)
val tmdbId = getTMDbIdFromSyncData(syncData)
val malId = syncData?.get(AccountManager.malApi.idPrefix)
val aniListId = syncData?.get(AccountManager.aniListApi.idPrefix)
val normalizedName = normalizeString(checkDuplicateData.name)
val year = checkDuplicateData.year
val duplicateEntries = data.filter { it: DataStoreHelper.LibrarySearchResponse ->
val librarySyncData = it.syncData
val checks = listOf(
{ imdbId != null && getImdbIdFromSyncData(librarySyncData) == imdbId },
{ tmdbId != null && getTMDbIdFromSyncData(librarySyncData) == tmdbId },
{ malId != null && librarySyncData?.get(AccountManager.malApi.idPrefix) == malId },
{ aniListId != null && librarySyncData?.get(AccountManager.aniListApi.idPrefix) == aniListId },
{ normalizedName == normalizeString(it.name) && year == it.year }
)
checks.any { it() }
}
if (duplicateEntries.isEmpty() || context == null) {
checkDuplicatesCallback.invoke(true, emptyList())
return
}
val replaceMessage = if (duplicateEntries.size > 1) {
R.string.duplicate_replace_all
} else R.string.duplicate_replace
val message = if (duplicateEntries.size == 1) {
val list = when (listType) {
LibraryListType.BOOKMARKS -> getResultWatchState(duplicateEntries[0].id ?: 0).stringRes
LibraryListType.FAVORITES -> R.string.favorites_list_name
LibraryListType.SUBSCRIPTIONS -> R.string.subscription_list_name
}
context.getString(R.string.duplicate_message_single,
"${normalizeString(duplicateEntries[0].name)} (${context.getString(list)}) — ${duplicateEntries[0].apiName}"
)
} else {
val bulletPoints = duplicateEntries.joinToString("\n") {
val list = when (listType) {
LibraryListType.BOOKMARKS -> getResultWatchState(it.id ?: 0).stringRes
LibraryListType.FAVORITES -> R.string.favorites_list_name
LibraryListType.SUBSCRIPTIONS -> R.string.subscription_list_name
}
"${it.apiName}: ${normalizeString(it.name)} (${context.getString(list)})"
}
context.getString(R.string.duplicate_message_multiple, bulletPoints)
}
val builder: AlertDialog.Builder = AlertDialog.Builder(context)
val dialogClickListener =
DialogInterface.OnClickListener { _, which ->
when (which) {
DialogInterface.BUTTON_POSITIVE -> {
checkDuplicatesCallback.invoke(true, emptyList())
}
DialogInterface.BUTTON_NEGATIVE -> {
checkDuplicatesCallback.invoke(false, emptyList())
}
DialogInterface.BUTTON_NEUTRAL -> {
checkDuplicatesCallback.invoke(true, duplicateEntries.map { it.id })
}
}
}
builder.setTitle(R.string.duplicate_title)
.setMessage(message)
.setPositiveButton(R.string.duplicate_add, dialogClickListener)
.setNegativeButton(R.string.duplicate_cancel, dialogClickListener)
.setNeutralButton(replaceMessage, dialogClickListener)
.show().setDefaultFocus()
}
private fun getImdbIdFromSyncData(syncData: Map<String, String>?): String? {
return normalSafeApiCall {
SimklApi.readIdFromString(
syncData?.get(AccountManager.simklApi.idPrefix)
)[SimklApi.Companion.SyncServices.Imdb]
}
}
private fun getTMDbIdFromSyncData(syncData: Map<String, String>?): String? {
return normalSafeApiCall {
SimklApi.readIdFromString(
syncData?.get(AccountManager.simklApi.idPrefix)
)[SimklApi.Companion.SyncServices.Tmdb]
}
} }
private fun startChromecast( private fun startChromecast(
@ -1261,7 +1514,7 @@ class ResultViewModel2 : ViewModel() {
// Do not add mark as watched on movies // Do not add mark as watched on movies
if (!listOf(TvType.Movie, TvType.AnimeMovie).contains(click.data.tvType)) { if (!listOf(TvType.Movie, TvType.AnimeMovie).contains(click.data.tvType)) {
val isWatched = val isWatched =
DataStoreHelper.getVideoWatchState(click.data.id) == VideoWatchState.Watched getVideoWatchState(click.data.id) == VideoWatchState.Watched
val watchedText = if (isWatched) R.string.action_remove_from_watched val watchedText = if (isWatched) R.string.action_remove_from_watched
else R.string.action_mark_as_watched else R.string.action_mark_as_watched
@ -1510,12 +1763,12 @@ class ResultViewModel2 : ViewModel() {
ACTION_MARK_AS_WATCHED -> { ACTION_MARK_AS_WATCHED -> {
val isWatched = val isWatched =
DataStoreHelper.getVideoWatchState(click.data.id) == VideoWatchState.Watched getVideoWatchState(click.data.id) == VideoWatchState.Watched
if (isWatched) { if (isWatched) {
DataStoreHelper.setVideoWatchState(click.data.id, VideoWatchState.None) setVideoWatchState(click.data.id, VideoWatchState.None)
} else { } else {
DataStoreHelper.setVideoWatchState(click.data.id, VideoWatchState.Watched) setVideoWatchState(click.data.id, VideoWatchState.Watched)
} }
// Kinda dirty to reload all episodes :( // Kinda dirty to reload all episodes :(
@ -1724,7 +1977,7 @@ class ResultViewModel2 : ViewModel() {
list.subList(start, end).map { list.subList(start, end).map {
val posDur = getViewPos(it.id) val posDur = getViewPos(it.id)
val watchState = val watchState =
DataStoreHelper.getVideoWatchState(it.id) ?: VideoWatchState.None getVideoWatchState(it.id) ?: VideoWatchState.None
it.copy( it.copy(
position = posDur?.position ?: 0, position = posDur?.position ?: 0,
duration = posDur?.duration ?: 0, duration = posDur?.duration ?: 0,
@ -1785,8 +2038,8 @@ class ResultViewModel2 : ViewModel() {
private fun postSubscription(loadResponse: LoadResponse) { private fun postSubscription(loadResponse: LoadResponse) {
if (loadResponse.isEpisodeBased()) { if (loadResponse.isEpisodeBased()) {
val id = loadResponse.getId() val id = loadResponse.getId()
val data = DataStoreHelper.getSubscribedData(id) val data = getSubscribedData(id)
DataStoreHelper.updateSubscribedData(id, data, loadResponse as? EpisodeResponse) updateSubscribedData(id, data, loadResponse as? EpisodeResponse)
val isSubscribed = data != null val isSubscribed = data != null
_subscribeStatus.postValue(isSubscribed) _subscribeStatus.postValue(isSubscribed)
} }
@ -1964,6 +2217,10 @@ class ResultViewModel2 : ViewModel() {
val id = val id =
mainId + episode + idIndex * 1_000_000 + (i.season?.times(10_000) mainId + episode + idIndex * 1_000_000 + (i.season?.times(10_000)
?: 0) ?: 0)
val totalIndex =
i.season?.let { season -> loadResponse.getTotalEpisodeIndex(episode, season) }
if (!existingEpisodes.contains(id)) { if (!existingEpisodes.contains(id)) {
existingEpisodes.add(id) existingEpisodes.add(id)
val seasonData = loadResponse.seasonNames.getSeason(i.season) val seasonData = loadResponse.seasonNames.getSeason(i.season)
@ -1983,7 +2240,8 @@ class ResultViewModel2 : ViewModel() {
i.description, i.description,
fillers.getOrDefault(episode, false), fillers.getOrDefault(episode, false),
loadResponse.type, loadResponse.type,
mainId mainId,
totalIndex
) )
val season = eps.seasonIndex ?: 0 val season = eps.seasonIndex ?: 0
@ -2012,6 +2270,9 @@ class ResultViewModel2 : ViewModel() {
val seasonData = val seasonData =
loadResponse.seasonNames.getSeason(episode.season) loadResponse.seasonNames.getSeason(episode.season)
val totalIndex =
episode.season?.let { season -> loadResponse.getTotalEpisodeIndex(episodeIndex, season) }
val ep = val ep =
buildResultEpisode( buildResultEpisode(
loadResponse.name, loadResponse.name,
@ -2028,7 +2289,8 @@ class ResultViewModel2 : ViewModel() {
episode.description, episode.description,
null, null,
loadResponse.type, loadResponse.type,
mainId mainId,
totalIndex
) )
val season = ep.seasonIndex ?: 0 val season = ep.seasonIndex ?: 0
@ -2059,7 +2321,8 @@ class ResultViewModel2 : ViewModel() {
null, null,
null, null,
loadResponse.type, loadResponse.type,
mainId mainId,
null
) )
) )
} }
@ -2081,7 +2344,8 @@ class ResultViewModel2 : ViewModel() {
null, null,
null, null,
loadResponse.type, loadResponse.type,
mainId mainId,
null
) )
) )
} }
@ -2103,7 +2367,8 @@ class ResultViewModel2 : ViewModel() {
null, null,
null, null,
loadResponse.type, loadResponse.type,
mainId mainId,
null
) )
) )
} }
@ -2164,13 +2429,13 @@ class ResultViewModel2 : ViewModel() {
postResume() postResume()
} }
fun postResume() { private fun postResume() {
_resumeWatching.postValue(resume()) _resumeWatching.postValue(resume())
} }
private fun resume(): ResumeWatchingStatus? { private fun resume(): ResumeWatchingStatus? {
val correctId = currentId ?: return null val correctId = currentId ?: return null
val resume = DataStoreHelper.getLastWatched(correctId) val resume = getLastWatched(correctId)
val resumeParentId = resume?.parentId val resumeParentId = resume?.parentId
if (resumeParentId != correctId) return null // is null or smth went wrong with getLastWatched if (resumeParentId != correctId) return null // is null or smth went wrong with getLastWatched
val resumeId = resume.episodeId ?: return null// invalid episode id val resumeId = resume.episodeId ?: return null// invalid episode id

View file

@ -583,7 +583,7 @@ object AppUtils {
//private val viewModel: ResultViewModel by activityViewModels() //private val viewModel: ResultViewModel by activityViewModels()
private fun getResultsId(): Int { private fun getResultsId(): Int {
return if (isTrueTvSettings()) { return if (isTvSettings()) {
R.id.global_to_navigation_results_tv R.id.global_to_navigation_results_tv
} else { } else {
R.id.global_to_navigation_results_phone R.id.global_to_navigation_results_phone

View file

@ -6,6 +6,7 @@ import android.text.Editable
import android.view.LayoutInflater import android.view.LayoutInflater
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import androidx.core.view.isGone import androidx.core.view.isGone
import androidx.core.view.isVisible
import androidx.core.widget.doOnTextChanged import androidx.core.widget.doOnTextChanged
import com.fasterxml.jackson.annotation.JsonProperty import com.fasterxml.jackson.annotation.JsonProperty
import com.google.android.material.bottomsheet.BottomSheetDialog import com.google.android.material.bottomsheet.BottomSheetDialog
@ -26,8 +27,8 @@ import com.lagradost.cloudstream3.syncproviders.AccountManager
import com.lagradost.cloudstream3.syncproviders.SyncAPI import com.lagradost.cloudstream3.syncproviders.SyncAPI
import com.lagradost.cloudstream3.ui.WatchType import com.lagradost.cloudstream3.ui.WatchType
import com.lagradost.cloudstream3.ui.WhoIsWatchingAdapter import com.lagradost.cloudstream3.ui.WhoIsWatchingAdapter
import com.lagradost.cloudstream3.ui.account.AccountDialog.showPinInputDialog
import com.lagradost.cloudstream3.ui.library.ListSorting import com.lagradost.cloudstream3.ui.library.ListSorting
import com.lagradost.cloudstream3.ui.result.FOCUS_SELF
import com.lagradost.cloudstream3.ui.result.UiImage import com.lagradost.cloudstream3.ui.result.UiImage
import com.lagradost.cloudstream3.ui.result.VideoWatchState import com.lagradost.cloudstream3.ui.result.VideoWatchState
import com.lagradost.cloudstream3.ui.result.setImage import com.lagradost.cloudstream3.ui.result.setImage
@ -136,6 +137,8 @@ object DataStoreHelper {
val customImage: String? = null, val customImage: String? = null,
@JsonProperty("defaultImageIndex") @JsonProperty("defaultImageIndex")
val defaultImageIndex: Int, val defaultImageIndex: Int,
@JsonProperty("lockPin")
val lockPin: String? = null,
) { ) {
val image: UiImage val image: UiImage
get() = customImage?.let { UiImage.Image(it) } ?: UiImage.Drawable( get() = customImage?.let { UiImage.Image(it) } ?: UiImage.Drawable(
@ -230,36 +233,86 @@ object DataStoreHelper {
binding.profilePic.setImage(account.image) binding.profilePic.setImage(account.image)
binding.profilePic.setOnClickListener { binding.profilePic.setOnClickListener {
// rolls the image forwards once // Roll the image forwards once
currentEditAccount = currentEditAccount =
currentEditAccount.copy(defaultImageIndex = (currentEditAccount.defaultImageIndex + 1) % profileImages.size) currentEditAccount.copy(defaultImageIndex = (currentEditAccount.defaultImageIndex + 1) % profileImages.size)
binding.profilePic.setImage(currentEditAccount.image) binding.profilePic.setImage(currentEditAccount.image)
} }
binding.applyBtt.setOnClickListener { binding.applyBtt.setOnClickListener {
val currentAccounts = accounts.toMutableList() if (currentEditAccount.lockPin != null) {
// Ask for the current PIN
val overrideIndex = showPinInputDialog(context, currentEditAccount.lockPin, false) { pin ->
currentAccounts.indexOfFirst { it.keyIndex == currentEditAccount.keyIndex } if (pin == null) return@showPinInputDialog
// PIN is correct, proceed to update the account
// if an account is found that has the same keyIndex then override that one, if not then append it performAccountUpdate(currentEditAccount)
if (overrideIndex != -1) { dialog.dismissSafe()
currentAccounts[overrideIndex] = currentEditAccount }
} else { } else {
currentAccounts.add(currentEditAccount) // No lock PIN set, proceed to update the account
performAccountUpdate(currentEditAccount)
dialog.dismissSafe()
} }
// Save the current homepage for new accounts
val currentHomePage = DataStoreHelper.currentHomePage
// set the new default account as well as add the key for the new account
setAccount(currentEditAccount, false)
DataStoreHelper.currentHomePage = currentHomePage
accounts = currentAccounts.toTypedArray()
dialog.dismissSafe()
} }
// Handle setting or changing the PIN
if (currentEditAccount.keyIndex == getDefaultAccount(context).keyIndex) {
binding.lockProfileCheckbox.isVisible = false
if (currentEditAccount.lockPin != null) {
currentEditAccount = currentEditAccount.copy(lockPin = null)
}
}
var canSetPin = true
binding.lockProfileCheckbox.isChecked = currentEditAccount.lockPin != null
binding.lockProfileCheckbox.setOnCheckedChangeListener { _, isChecked ->
if (isChecked) {
if (canSetPin) {
showPinInputDialog(context, null, true) { pin ->
if (pin == null) {
binding.lockProfileCheckbox.isChecked = false
return@showPinInputDialog
}
currentEditAccount = currentEditAccount.copy(lockPin = pin)
}
}
} else {
if (currentEditAccount.lockPin != null) {
// Ask for the current PIN
showPinInputDialog(context, currentEditAccount.lockPin, true) { pin ->
if (pin == null || pin != currentEditAccount.lockPin) {
canSetPin = false
binding.lockProfileCheckbox.isChecked = true
} else {
currentEditAccount = currentEditAccount.copy(lockPin = null)
}
}
}
}
}
canSetPin = true
}
private fun performAccountUpdate(account: Account) {
val currentAccounts = accounts.toMutableList()
val overrideIndex = currentAccounts.indexOfFirst { it.keyIndex == account.keyIndex }
if (overrideIndex != -1) {
currentAccounts[overrideIndex] = account
} else {
currentAccounts.add(account)
}
val currentHomePage = this.currentHomePage
setAccount(account, false)
this.currentHomePage = currentHomePage
accounts = currentAccounts.toTypedArray()
} }
private fun getDefaultAccount(context: Context): Account { private fun getDefaultAccount(context: Context): Account {
@ -272,10 +325,18 @@ object DataStoreHelper {
} }
} }
fun getAccounts(context: Context): List<Account> {
return accounts.toMutableList().apply {
val item = getDefaultAccount(context)
remove(item)
add(0, item)
}
}
fun showWhoIsWatching(context: Context) { fun showWhoIsWatching(context: Context) {
val binding: WhoIsWatchingBinding = WhoIsWatchingBinding.inflate( val binding: WhoIsWatchingBinding = WhoIsWatchingBinding.inflate(LayoutInflater.from(context))
LayoutInflater.from(context) val builder = BottomSheetDialog(context)
) builder.setContentView(binding.root)
val showAccount = accounts.toMutableList().apply { val showAccount = accounts.toMutableList().apply {
val item = getDefaultAccount(context) val item = getDefaultAccount(context)
@ -283,22 +344,25 @@ object DataStoreHelper {
add(0, item) add(0, item)
} }
val builder =
BottomSheetDialog(context)
builder.setContentView(binding.root)
val accountName = context.getString(R.string.account) val accountName = context.getString(R.string.account)
binding.profilesRecyclerview.setLinearListLayout( binding.profilesRecyclerview.setLinearListLayout(isHorizontal = true)
isHorizontal = true,
nextUp = FOCUS_SELF,
nextDown = FOCUS_SELF,
nextLeft = FOCUS_SELF,
nextRight = FOCUS_SELF
)
binding.profilesRecyclerview.adapter = WhoIsWatchingAdapter( binding.profilesRecyclerview.adapter = WhoIsWatchingAdapter(
selectCallBack = { account -> selectCallBack = { account ->
setAccount(account, true) // Check if the selected account has a lock PIN set
builder.dismissSafe() if (account.lockPin != null) {
// Prompt for the lock pin
showPinInputDialog(context, account.lockPin, false) { pin ->
if (pin == null) return@showPinInputDialog
// Pin is correct, unlock the profile
setAccount(account, true)
builder.dismissSafe()
}
} else {
// No lock PIN set, directly set the account
setAccount(account, true)
builder.dismissSafe()
}
}, },
addAccountCallback = { addAccountCallback = {
val currentAccounts = accounts val currentAccounts = accounts
@ -334,7 +398,6 @@ object DataStoreHelper {
builder.show() builder.show()
} }
data class PosDur( data class PosDur(
@JsonProperty("position") val position: Long, @JsonProperty("position") val position: Long,
@JsonProperty("duration") val duration: Long @JsonProperty("duration") val duration: Long
@ -352,20 +415,35 @@ object DataStoreHelper {
/** /**
* Used to display notifications on new episodes and posters in library. * Used to display notifications on new episodes and posters in library.
**/ **/
data class SubscribedData( abstract class LibrarySearchResponse(
@JsonProperty("id") override var id: Int?, @JsonProperty("id") override var id: Int?,
@JsonProperty("subscribedTime") val bookmarkedTime: Long, @JsonProperty("latestUpdatedTime") open val latestUpdatedTime: Long,
@JsonProperty("latestUpdatedTime") val latestUpdatedTime: Long,
@JsonProperty("lastSeenEpisodeCount") val lastSeenEpisodeCount: Map<DubStatus, Int?>,
@JsonProperty("name") override val name: String, @JsonProperty("name") override val name: String,
@JsonProperty("url") override val url: String, @JsonProperty("url") override val url: String,
@JsonProperty("apiName") override val apiName: String, @JsonProperty("apiName") override val apiName: String,
@JsonProperty("type") override var type: TvType? = null, @JsonProperty("type") override var type: TvType?,
@JsonProperty("posterUrl") override var posterUrl: String?, @JsonProperty("posterUrl") override var posterUrl: String?,
@JsonProperty("year") val year: Int?, @JsonProperty("year") open val year: Int?,
@JsonProperty("quality") override var quality: SearchQuality? = null, @JsonProperty("syncData") open val syncData: Map<String, String>?,
@JsonProperty("posterHeaders") override var posterHeaders: Map<String, String>? = null, @JsonProperty("quality") override var quality: SearchQuality?,
) : SearchResponse { @JsonProperty("posterHeaders") override var posterHeaders: Map<String, String>?
) : SearchResponse
data class SubscribedData(
@JsonProperty("subscribedTime") val subscribedTime: Long,
@JsonProperty("lastSeenEpisodeCount") val lastSeenEpisodeCount: Map<DubStatus, Int?>,
override var id: Int?,
override val latestUpdatedTime: Long,
override val name: String,
override val url: String,
override val apiName: String,
override var type: TvType?,
override var posterUrl: String?,
override val year: Int?,
override val syncData: Map<String, String>? = null,
override var quality: SearchQuality? = null,
override var posterHeaders: Map<String, String>? = null
) : LibrarySearchResponse(id, latestUpdatedTime, name, url, apiName, type, posterUrl, year, syncData, quality, posterHeaders) {
fun toLibraryItem(): SyncAPI.LibraryItem? { fun toLibraryItem(): SyncAPI.LibraryItem? {
return SyncAPI.LibraryItem( return SyncAPI.LibraryItem(
name, name,
@ -381,18 +459,19 @@ object DataStoreHelper {
} }
data class BookmarkedData( data class BookmarkedData(
@JsonProperty("id") override var id: Int?,
@JsonProperty("bookmarkedTime") val bookmarkedTime: Long, @JsonProperty("bookmarkedTime") val bookmarkedTime: Long,
@JsonProperty("latestUpdatedTime") val latestUpdatedTime: Long, override var id: Int?,
@JsonProperty("name") override val name: String, override val latestUpdatedTime: Long,
@JsonProperty("url") override val url: String, override val name: String,
@JsonProperty("apiName") override val apiName: String, override val url: String,
@JsonProperty("type") override var type: TvType? = null, override val apiName: String,
@JsonProperty("posterUrl") override var posterUrl: String?, override var type: TvType?,
@JsonProperty("year") val year: Int?, override var posterUrl: String?,
@JsonProperty("quality") override var quality: SearchQuality? = null, override val year: Int?,
@JsonProperty("posterHeaders") override var posterHeaders: Map<String, String>? = null, override val syncData: Map<String, String>? = null,
) : SearchResponse { override var quality: SearchQuality? = null,
override var posterHeaders: Map<String, String>? = null
) : LibrarySearchResponse(id, latestUpdatedTime, name, url, apiName, type, posterUrl, year, syncData, quality, posterHeaders) {
fun toLibraryItem(id: String): SyncAPI.LibraryItem { fun toLibraryItem(id: String): SyncAPI.LibraryItem {
return SyncAPI.LibraryItem( return SyncAPI.LibraryItem(
name, name,
@ -408,18 +487,19 @@ object DataStoreHelper {
} }
data class FavoritesData( data class FavoritesData(
@JsonProperty("id") override var id: Int?,
@JsonProperty("favoritesTime") val favoritesTime: Long, @JsonProperty("favoritesTime") val favoritesTime: Long,
@JsonProperty("latestUpdatedTime") val latestUpdatedTime: Long, override var id: Int?,
@JsonProperty("name") override val name: String, override val latestUpdatedTime: Long,
@JsonProperty("url") override val url: String, override val name: String,
@JsonProperty("apiName") override val apiName: String, override val url: String,
@JsonProperty("type") override var type: TvType? = null, override val apiName: String,
@JsonProperty("posterUrl") override var posterUrl: String?, override var type: TvType?,
@JsonProperty("year") val year: Int?, override var posterUrl: String?,
@JsonProperty("quality") override var quality: SearchQuality? = null, override val year: Int?,
@JsonProperty("posterHeaders") override var posterHeaders: Map<String, String>? = null, override val syncData: Map<String, String>? = null,
) : SearchResponse { override var quality: SearchQuality? = null,
override var posterHeaders: Map<String, String>? = null
) : LibrarySearchResponse(id, latestUpdatedTime, name, url, apiName, type, posterUrl, year, syncData, quality, posterHeaders) {
fun toLibraryItem(): SyncAPI.LibraryItem? { fun toLibraryItem(): SyncAPI.LibraryItem? {
return SyncAPI.LibraryItem( return SyncAPI.LibraryItem(
name, name,
@ -466,15 +546,9 @@ object DataStoreHelper {
removeKeys(folder) removeKeys(folder)
} }
fun deleteAllBookmarkedData() {
val folder1 = "$currentAccount/$RESULT_WATCH_STATE"
val folder2 = "$currentAccount/$RESULT_WATCH_STATE_DATA"
removeKeys(folder1)
removeKeys(folder2)
}
fun deleteBookmarkedData(id: Int?) { fun deleteBookmarkedData(id: Int?) {
if (id == null) return if (id == null) return
AccountManager.localListApi.requireLibraryRefresh = true
removeKey("$currentAccount/$RESULT_WATCH_STATE", id.toString()) removeKey("$currentAccount/$RESULT_WATCH_STATE", id.toString())
removeKey("$currentAccount/$RESULT_WATCH_STATE_DATA", id.toString()) removeKey("$currentAccount/$RESULT_WATCH_STATE_DATA", id.toString())
} }
@ -572,6 +646,12 @@ object DataStoreHelper {
return getKey("$currentAccount/$RESULT_WATCH_STATE_DATA", id.toString()) return getKey("$currentAccount/$RESULT_WATCH_STATE_DATA", id.toString())
} }
fun getAllBookmarkedData(): List<BookmarkedData> {
return getKeys("$currentAccount/$RESULT_WATCH_STATE_DATA")?.mapNotNull {
getKey(it)
} ?: emptyList()
}
fun getAllSubscriptions(): List<SubscribedData> { fun getAllSubscriptions(): List<SubscribedData> {
return getKeys("$currentAccount/$RESULT_SUBSCRIBED_STATE_DATA")?.mapNotNull { return getKeys("$currentAccount/$RESULT_SUBSCRIBED_STATE_DATA")?.mapNotNull {
getKey(it) getKey(it)

View file

@ -0,0 +1,94 @@
package com.lagradost.cloudstream3.utils
//Reference: https://stackoverflow.com/a/29055283
import android.content.Context
import android.graphics.Matrix
import android.graphics.drawable.Drawable
import android.util.AttributeSet
class PercentageCropImageView : androidx.appcompat.widget.AppCompatImageView {
private var mCropYCenterOffsetPct: Float? = null
private var mCropXCenterOffsetPct: Float? = null
constructor(context: Context?) : super(context!!)
constructor(context: Context?, attrs: AttributeSet?) : super(context!!, attrs)
constructor(
context: Context?, attrs: AttributeSet?,
defStyle: Int
) : super(context!!, attrs, defStyle)
var cropYCenterOffsetPct: Float
get() = mCropYCenterOffsetPct!!
set(cropYCenterOffsetPct) {
require(cropYCenterOffsetPct <= 1.0) { "Value too large: Must be <= 1.0" }
mCropYCenterOffsetPct = cropYCenterOffsetPct
}
var cropXCenterOffsetPct: Float
get() = mCropXCenterOffsetPct!!
set(cropXCenterOffsetPct) {
require(cropXCenterOffsetPct <= 1.0) { "Value too large: Must be <= 1.0" }
mCropXCenterOffsetPct = cropXCenterOffsetPct
}
private fun myConfigureBounds() {
if (this.scaleType == ScaleType.MATRIX) {
val d = this.drawable
if (d != null) {
val dWidth = d.intrinsicWidth
val dHeight = d.intrinsicHeight
val m = Matrix()
val vWidth = width - this.paddingLeft - this.paddingRight
val vHeight = height - this.paddingTop - this.paddingBottom
val scale: Float
var dx = 0f
var dy = 0f
if (dWidth * vHeight > vWidth * dHeight) {
val cropXCenterOffsetPct =
if (mCropXCenterOffsetPct != null) mCropXCenterOffsetPct!!.toFloat() else 0.5f
scale = vHeight.toFloat() / dHeight.toFloat()
dx = (vWidth - dWidth * scale) * cropXCenterOffsetPct
} else {
val cropYCenterOffsetPct =
if (mCropYCenterOffsetPct != null) mCropYCenterOffsetPct!!.toFloat() else 0f
scale = vWidth.toFloat() / dWidth.toFloat()
dy = (vHeight - dHeight * scale) * cropYCenterOffsetPct
}
m.setScale(scale, scale)
m.postTranslate((dx + 0.5f).toInt().toFloat(), (dy + 0.5f).toInt().toFloat())
this.imageMatrix = m
}
}
}
// These 3 methods call configureBounds in ImageView.java class, which
// adjusts the matrix in a call to center_crop (android's built-in
// scaling and centering crop method). We also want to trigger
// in the same place, but using our own matrix, which is then set
// directly at line 588 of ImageView.java and then copied over
// as the draw matrix at line 942 of ImageView.java
override fun setFrame(l: Int, t: Int, r: Int, b: Int): Boolean {
val changed = super.setFrame(l, t, r, b)
myConfigureBounds()
return changed
}
override fun setImageDrawable(d: Drawable?) {
super.setImageDrawable(d)
myConfigureBounds()
}
override fun setImageResource(resId: Int) {
super.setImageResource(resId)
myConfigureBounds()
}
// In case you can change the ScaleType in code you have to call redraw()
//fullsizeImageView.setScaleType(ScaleType.FIT_CENTER);
//fullsizeImageView.redraw();
fun redraw() {
val d = this.drawable
if (d != null) {
// Force toggle to recalculate our bounds
setImageDrawable(null)
setImageDrawable(d)
}
}
}

View file

@ -2,14 +2,12 @@ package com.lagradost.cloudstream3.utils
import android.app.Activity import android.app.Activity
import android.app.Dialog import android.app.Dialog
import android.text.Spanned
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.widget.AbsListView import android.widget.AbsListView
import android.widget.ArrayAdapter import android.widget.ArrayAdapter
import android.widget.EditText
import android.widget.ImageView
import android.widget.LinearLayout import android.widget.LinearLayout
import android.widget.ListView
import android.widget.TextView import android.widget.TextView
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import androidx.core.view.isGone import androidx.core.view.isGone
@ -19,7 +17,10 @@ import androidx.core.view.marginRight
import androidx.core.view.marginTop import androidx.core.view.marginTop
import com.google.android.material.bottomsheet.BottomSheetDialog import com.google.android.material.bottomsheet.BottomSheetDialog
import com.lagradost.cloudstream3.R import com.lagradost.cloudstream3.R
import com.lagradost.cloudstream3.databinding.BottomInputDialogBinding
import com.lagradost.cloudstream3.databinding.BottomSelectionDialogBinding import com.lagradost.cloudstream3.databinding.BottomSelectionDialogBinding
import com.lagradost.cloudstream3.databinding.BottomTextDialogBinding
import com.lagradost.cloudstream3.databinding.OptionsPopupTvBinding
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTvSettings import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTvSettings
import com.lagradost.cloudstream3.utils.UIHelper.dismissSafe import com.lagradost.cloudstream3.utils.UIHelper.dismissSafe
import com.lagradost.cloudstream3.utils.UIHelper.popupMenuNoIconsAndNoStringRes import com.lagradost.cloudstream3.utils.UIHelper.popupMenuNoIconsAndNoStringRes
@ -54,14 +55,14 @@ object SingleSelectionHelper {
if (this == null) return if (this == null) return
if (isTvSettings()) { if (isTvSettings()) {
val builder = val binding = OptionsPopupTvBinding.inflate(layoutInflater)
AlertDialog.Builder(this, R.style.AlertDialogCustom) val dialog = AlertDialog.Builder(this, R.style.AlertDialogCustom)
.setView(R.layout.options_popup_tv) .setView(binding.root)
.create()
val dialog = builder.create()
dialog.show() dialog.show()
dialog.findViewById<ListView>(R.id.listview1)?.let { listView -> binding.listview1.let { listView ->
listView.choiceMode = AbsListView.CHOICE_MODE_SINGLE listView.choiceMode = AbsListView.CHOICE_MODE_SINGLE
listView.adapter = listView.adapter =
ArrayAdapter<String>(this, R.layout.sort_bottom_single_choice_color).apply { ArrayAdapter<String>(this, R.layout.sort_bottom_single_choice_color).apply {
@ -74,7 +75,7 @@ object SingleSelectionHelper {
} }
} }
dialog.findViewById<ImageView>(R.id.imageView)?.apply { binding.imageView.apply {
isGone = poster.isNullOrEmpty() isGone = poster.isNullOrEmpty()
setImage(poster) setImage(poster)
} }
@ -105,12 +106,12 @@ object SingleSelectionHelper {
if (this == null) return if (this == null) return
val realShowApply = showApply || isMultiSelect val realShowApply = showApply || isMultiSelect
val listView = binding.listview1//.findViewById<ListView>(R.id.listview1)!! val listView = binding.listview1
val textView = binding.text1//.findViewById<TextView>(R.id.text1)!! val textView = binding.text1
val applyButton = binding.applyBtt//.findViewById<TextView>(R.id.apply_btt) val applyButton = binding.applyBtt
val cancelButton = binding.cancelBtt//findViewById<TextView>(R.id.cancel_btt) val cancelButton = binding.cancelBtt
val applyHolder = val applyHolder =
binding.applyBttHolder//.findViewById<LinearLayout>(R.id.apply_btt_holder) binding.applyBttHolder
applyHolder.isVisible = realShowApply applyHolder.isVisible = realShowApply
if (!realShowApply) { if (!realShowApply) {
@ -173,8 +174,8 @@ object SingleSelectionHelper {
} }
} }
private fun Activity?.showInputDialog( private fun Activity?.showInputDialog(
binding: BottomInputDialogBinding,
dialog: Dialog, dialog: Dialog,
value: String, value: String,
name: String, name: String,
@ -184,11 +185,11 @@ object SingleSelectionHelper {
) { ) {
if (this == null) return if (this == null) return
val inputView = dialog.findViewById<EditText>(R.id.nginx_text_input)!! val inputView = binding.nginxTextInput
val textView = dialog.findViewById<TextView>(R.id.text1)!! val textView = binding.text1
val applyButton = dialog.findViewById<TextView>(R.id.apply_btt)!! val applyButton = binding.applyBtt
val cancelButton = dialog.findViewById<TextView>(R.id.cancel_btt)!! val cancelButton = binding.cancelBtt
val applyHolder = dialog.findViewById<LinearLayout>(R.id.apply_btt_holder)!! val applyHolder = binding.applyBttHolder
applyHolder.isVisible = true applyHolder.isVisible = true
textView.text = name textView.text = name
@ -350,11 +351,17 @@ object SingleSelectionHelper {
dismissCallback: () -> Unit, dismissCallback: () -> Unit,
callback: (String) -> Unit, callback: (String) -> Unit,
) { ) {
val builder = BottomSheetDialog(this) // probably the stuff at the bottom val builder = BottomSheetDialog(this)
builder.setContentView(R.layout.bottom_input_dialog) // input layout
val binding: BottomInputDialogBinding = BottomInputDialogBinding.inflate(
LayoutInflater.from(this)
)
builder.setContentView(binding.root)
builder.show() builder.show()
showInputDialog( showInputDialog(
binding,
builder, builder,
value, value,
name, name,
@ -363,4 +370,24 @@ object SingleSelectionHelper {
dismissCallback dismissCallback
) )
} }
fun Activity.showBottomDialogText(
title: String,
text: Spanned,
dismissCallback: () -> Unit
) {
val binding = BottomTextDialogBinding.inflate(layoutInflater)
val dialog = BottomSheetDialog(this)
dialog.setContentView(binding.root)
binding.dialogTitle.text = title
binding.dialogText.text = text
dialog.setOnDismissListener {
dismissCallback.invoke()
}
dialog.show()
}
} }

View file

@ -178,9 +178,10 @@ object UIHelper {
fun Activity?.navigate(@IdRes navigation: Int, arguments: Bundle? = null) { fun Activity?.navigate(@IdRes navigation: Int, arguments: Bundle? = null) {
try { try {
if (this is FragmentActivity) { if (this is FragmentActivity) {
(supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as? NavHostFragment?)?.navController?.navigate( val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as? NavHostFragment?
navigation, arguments navHostFragment?.navController?.let {
) it.navigate(navigation, arguments)
}
} }
} catch (t: Throwable) { } catch (t: Throwable) {
logError(t) logError(t)

View file

@ -0,0 +1,56 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/card_view"
android:layout_width="110dp"
android:layout_height="110dp"
android:animateLayoutChanges="true"
android:backgroundTint="?attr/primaryGrayBackground"
android:foreground="?attr/selectableItemBackground"
app:cardCornerRadius="@dimen/rounded_image_radius"
android:layout_margin="10dp"
android:focusable="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintDimensionRatio="1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHeight_percent="0.4"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:id="@+id/account_image"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:alpha="0.4"
android:contentDescription="@string/profile_background_des"
android:scaleType="centerCrop" />
<View
android:id="@+id/outline"
tools:visibility="visible"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/outline_card"
android:visibility="gone" />
<ImageView
android:id="@+id/lock_icon"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="top|end"
android:layout_margin="4dp"
android:src="@drawable/video_locked"
android:visibility="gone" />
<TextView
android:id="@+id/account_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:padding="10dp"
android:textSize="16sp" />
</androidx.cardview.widget.CardView>

View file

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:background="?attr/primaryBlackBackground"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingTop="36dp"
android:gravity="center">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/select_an_account"
android:textSize="24sp"
android:textStyle="bold"
android:layout_marginTop="16dp"
android:layout_marginBottom="16dp" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/account_recycler_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:paddingLeft="16dp"
android:paddingRight="16dp" />
</LinearLayout>

View file

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:background="?attr/primaryBlackBackground"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingTop="36dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:textAlignment="center"
android:text="@string/select_an_account"
android:textSize="24sp"
android:textStyle="bold"
android:layout_marginTop="16dp"
android:layout_marginBottom="16dp" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/account_recycler_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16dp" />
</LinearLayout>

View file

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/dialog_title"
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
android:layout_marginTop="20dp"
android:layout_marginBottom="10dp"
android:textStyle="bold"
android:textSize="20sp"
android:textColor="?attr/textColor"
android:layout_width="match_parent"
android:layout_rowWeight="1"
tools:text="Test"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/dialog_text"
android:textAppearance="?android:attr/textAppearanceListItem"
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
android:paddingTop="10dp"
android:requiresFadingEdge="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_rowWeight="1" />
</LinearLayout>

View file

@ -9,7 +9,7 @@
android:layout_margin="5dp" android:layout_margin="5dp"
android:foreground="@drawable/outline_drawable" android:foreground="@drawable/outline_drawable"
app:cardBackgroundColor="@color/transparent" app:cardBackgroundColor="@color/transparent"
android:focusable="true"
app:cardCornerRadius="@dimen/rounded_image_radius" app:cardCornerRadius="@dimen/rounded_image_radius"
app:cardElevation="0dp"> app:cardElevation="0dp">

View file

@ -92,15 +92,7 @@
android:layout_height="100dp" android:layout_height="100dp"
android:layout_gravity="bottom" android:layout_gravity="bottom"
android:gravity="center" android:gravity="center"
android:orientation="vertical"> android:orientation="horizontal">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:orientation="horizontal"
android:padding="20dp">
<TextView <TextView
android:id="@+id/home_preview_bookmark" android:id="@+id/home_preview_bookmark"
@ -139,7 +131,7 @@
app:drawableTint="?attr/white" app:drawableTint="?attr/white"
app:drawableTopCompat="@drawable/ic_outline_info_24" app:drawableTopCompat="@drawable/ic_outline_info_24"
app:tint="?attr/white" /> app:tint="?attr/white" />
</LinearLayout>
</LinearLayout> </LinearLayout>
</FrameLayout> </FrameLayout>

View file

@ -232,7 +232,9 @@
android:layout_marginStart="@dimen/navbar_width" android:layout_marginStart="@dimen/navbar_width"
android:layout_marginEnd="0dp" android:layout_marginEnd="0dp"
android:padding="12dp" android:padding="12dp"
android:text="@string/continue_watching" /> android:text="@string/continue_watching"
android:background="?android:attr/selectableItemBackground"
app:drawableTint="?attr/white" />
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/home_watch_child_recyclerview" android:id="@+id/home_watch_child_recyclerview"
@ -258,7 +260,15 @@
android:visibility="gone" android:visibility="gone"
tools:visibility="visible"> tools:visibility="visible">
<FrameLayout
android:id="@+id/home_bookmark_parent_item_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?android:attr/selectableItemBackground">
<HorizontalScrollView <HorizontalScrollView
android:id="@+id/horizontal_scroll_chips"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:fadingEdge="horizontal" android:fadingEdge="horizontal"
@ -344,6 +354,18 @@
</com.google.android.material.chip.ChipGroup> </com.google.android.material.chip.ChipGroup>
</HorizontalScrollView> </HorizontalScrollView>
<ImageView
android:id="@+id/home_bookmark_parent_item_more_info"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="end"
android:layout_marginEnd="12dp"
android:contentDescription="@string/home_more_info"
android:src="@drawable/ic_baseline_arrow_forward_24"
android:visibility="gone"
app:drawableTint="?attr/white" />
</FrameLayout>
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/home_bookmarked_child_recyclerview" android:id="@+id/home_bookmarked_child_recyclerview"
android:layout_width="wrap_content" android:layout_width="wrap_content"

View file

@ -140,6 +140,7 @@
android:layout_gravity="end" android:layout_gravity="end"
android:background="@drawable/player_button_tv_attr_no_bg" android:background="@drawable/player_button_tv_attr_no_bg"
android:contentDescription="@string/account" android:contentDescription="@string/account"
android:focusable="true"
android:nextFocusLeft="@id/home_preview_search_button" android:nextFocusLeft="@id/home_preview_search_button"
android:nextFocusRight="@id/home_switch_account" android:nextFocusRight="@id/home_switch_account"
android:nextFocusDown="@id/home_change_api" android:nextFocusDown="@id/home_change_api"

View file

@ -130,14 +130,15 @@ https://developer.android.com/design/ui/tv/samples/jet-fit
android:layout_height="250dp" android:layout_height="250dp"
android:visibility="visible"> android:visibility="visible">
<ImageView <com.lagradost.cloudstream3.utils.PercentageCropImageView
android:id="@+id/background_poster" android:id="@+id/background_poster"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="275dp" android:layout_height="275dp"
android:layout_gravity="center" android:layout_gravity="center"
android:alpha="0.8" android:alpha="0.8"
android:scaleType="centerCrop" android:scaleType="matrix"
tools:src="@drawable/profile_bg_dark_blue" /> tools:src="@drawable/profile_bg_dark_blue" >
</com.lagradost.cloudstream3.utils.PercentageCropImageView>
<ImageView <ImageView
android:layout_width="match_parent" android:layout_width="match_parent"
@ -324,19 +325,30 @@ https://developer.android.com/design/ui/tv/samples/jet-fit
style="@style/ResultButtonTV" style="@style/ResultButtonTV"
android:nextFocusRight="@id/result_description" android:nextFocusRight="@id/result_description"
android:nextFocusUp="@id/result_bookmark_button" android:nextFocusUp="@id/result_bookmark_button"
android:nextFocusDown="@id/result_episodes_show" android:nextFocusDown="@id/result_subscribe_button"
android:text="@string/action_add_to_favorites" android:text="@string/action_add_to_favorites"
android:visibility="visible" android:visibility="visible"
app:icon="@drawable/ic_baseline_favorite_border_24" /> app:icon="@drawable/ic_baseline_favorite_border_24" />
<com.google.android.material.button.MaterialButton
android:id="@+id/result_subscribe_button"
style="@style/ResultButtonTV"
android:nextFocusRight="@id/result_description"
android:nextFocusUp="@id/result_favorite_button"
android:nextFocusDown="@id/result_episodes_show"
android:text="@string/action_subscribe"
android:visibility="visible"
app:icon="@drawable/ic_baseline_favorite_border_24" />
<com.google.android.material.button.MaterialButton <com.google.android.material.button.MaterialButton
android:id="@+id/result_episodes_show" android:id="@+id/result_episodes_show"
style="@style/ResultButtonTV" style="@style/ResultButtonTV"
android:nextFocusRight="@id/redirect_to_episodes" android:nextFocusRight="@id/redirect_to_episodes"
android:nextFocusUp="@id/result_favorite_button" android:nextFocusUp="@id/result_subscribe_button"
android:nextFocusDown="@id/result_cast_items" android:nextFocusDown="@id/result_cast_items"
android:text="@string/episodes" android:text="@string/episodes"
@ -424,6 +436,7 @@ https://developer.android.com/design/ui/tv/samples/jet-fit
android:fadingEdgeLength="30dp" android:fadingEdgeLength="30dp"
android:foreground="@drawable/outline_drawable" android:foreground="@drawable/outline_drawable"
android:maxLines="7" android:maxLines="7"
android:focusable="true"
android:nextFocusUp="@id/result_back" android:nextFocusUp="@id/result_back"
android:nextFocusDown="@id/result_bookmark_button" android:nextFocusDown="@id/result_bookmark_button"
android:padding="5dp" android:padding="5dp"

View file

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/home_child_more_info"
style="@style/WatchHeaderText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/navbar_width"
android:layout_marginEnd="0dp"
android:padding="12dp"
tools:text="@string/continue_watching"
app:drawableRightCompat="@drawable/ic_baseline_arrow_forward_24"
app:drawableTint="?attr/white"
android:background="?android:attr/selectableItemBackground"
android:contentDescription="@string/home_more_info"/>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/home_child_recyclerview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clipToPadding="false"
android:descendantFocusability="afterDescendants"
android:nextFocusUp="@id/home_child_more_info"
android:orientation="horizontal"
android:paddingStart="@dimen/navbar_width"
android:paddingEnd="5dp"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
tools:listitem="@layout/home_result_grid" />
</LinearLayout>

View file

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="16dp">
<EditText
android:id="@+id/pinEditText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:hint="@string/pin"
android:inputType="numberPassword"
android:maxLength="4" />
<TextView
android:id="@+id/pinEditTextError"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:visibility="gone" />
</LinearLayout>

View file

@ -35,6 +35,15 @@
android:background="@drawable/outline_card" android:background="@drawable/outline_card"
android:visibility="gone" /> android:visibility="gone" />
<ImageView
android:id="@+id/lock_icon"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="top|end"
android:layout_margin="4dp"
android:src="@drawable/video_locked"
android:visibility="gone" />
<TextView <TextView
android:id="@+id/profile_text" android:id="@+id/profile_text"
tools:text="@string/mobile_data" tools:text="@string/mobile_data"

View file

@ -77,6 +77,12 @@
android:textColorHint="?attr/grayTextColor" android:textColorHint="?attr/grayTextColor"
tools:ignore="LabelFor" /> tools:ignore="LabelFor" />
<CheckBox
android:id="@+id/lockProfileCheckbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/lock_profile" />
<androidx.cardview.widget.CardView <androidx.cardview.widget.CardView
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"

View file

@ -74,12 +74,10 @@
<string name="popup_resume_download">ማውረድ ቀጥል</string> <string name="popup_resume_download">ማውረድ ቀጥል</string>
<string name="subs_text_color">የጽሑፍ ቀለም</string> <string name="subs_text_color">የጽሑፍ ቀለም</string>
<string name="type_completed">የተጠናቀቀ</string> <string name="type_completed">የተጠናቀቀ</string>
<string name="type_none">ምንም</string>
<string name="play_trailer_button">የፊልም ማስታወቂያ አጫውት</string> <string name="play_trailer_button">የፊልም ማስታወቂያ አጫውት</string>
<string name="play_livestream_button">የቀጥታ ስርጭት አጫውት</string> <string name="play_livestream_button">የቀጥታ ስርጭት አጫውት</string>
<string name="popup_play_file">ፋይል አጫውት</string> <string name="popup_play_file">ፋይል አጫውት</string>
<string name="type_re_watching">እንደገና በማየት ላይ</string> <string name="type_re_watching">እንደገና በማየት ላይ</string>
<string name="sort_cancel">ሰርዝ</string>
<string name="go_back">ወደ ኋላ መመለሻ</string> <string name="go_back">ወደ ኋላ መመለሻ</string>
<string name="home_info">መረጃ</string> <string name="home_info">መረጃ</string>
<string name="sort_save">ያስቀምጡ</string> <string name="sort_save">ያስቀምጡ</string>

View file

@ -36,7 +36,6 @@
<string name="type_completed">مكتمل</string> <string name="type_completed">مكتمل</string>
<string name="type_dropped">مهمل</string> <string name="type_dropped">مهمل</string>
<string name="type_plan_to_watch">أخطط لمشاهدته</string> <string name="type_plan_to_watch">أخطط لمشاهدته</string>
<string name="type_none">لا شيء</string>
<string name="type_re_watching">إعادة المشاهدة</string> <string name="type_re_watching">إعادة المشاهدة</string>
<string name="play_movie_button">مشاهدة الفيلم</string> <string name="play_movie_button">مشاهدة الفيلم</string>
<string name="play_livestream_button">تشغيل بث حي</string> <string name="play_livestream_button">تشغيل بث حي</string>
@ -74,7 +73,6 @@
<string name="action_remove_from_bookmarks">ازالة</string> <string name="action_remove_from_bookmarks">ازالة</string>
<string name="action_add_to_bookmarks">إعداد حالة المشاهدة</string> <string name="action_add_to_bookmarks">إعداد حالة المشاهدة</string>
<string name="sort_apply">تطبيق</string> <string name="sort_apply">تطبيق</string>
<string name="sort_cancel">إلغاء</string>
<string name="sort_copy">نسخ</string> <string name="sort_copy">نسخ</string>
<string name="sort_close">إغلاق</string> <string name="sort_close">إغلاق</string>
<string name="sort_clear">مسح</string> <string name="sort_clear">مسح</string>
@ -180,6 +178,7 @@
<string name="no_episodes_found">لم يتم العثور على أي حلقات</string> <string name="no_episodes_found">لم يتم العثور على أي حلقات</string>
<string name="delete_file">حذف الملف</string> <string name="delete_file">حذف الملف</string>
<string name="delete">حذف</string> <string name="delete">حذف</string>
<string name="cancel">إلغاء</string>
<string name="pause">إيقاف مؤقت</string> <string name="pause">إيقاف مؤقت</string>
<string name="resume">إستئناف</string> <string name="resume">إستئناف</string>
<string name="go_back_30">-٣٠</string> <string name="go_back_30">-٣٠</string>
@ -198,7 +197,7 @@
<string name="synopsis">القصة</string> <string name="synopsis">القصة</string>
<string name="queued">في قائمة الانتظار</string> <string name="queued">في قائمة الانتظار</string>
<string name="no_subtitles">الترجمة ليست موجودة</string> <string name="no_subtitles">الترجمة ليست موجودة</string>
<string name="default_subtitles">الإفتراضي</string> <string name="action_default">الإفتراضي</string>
<string name="free_storage">فارغ</string> <string name="free_storage">فارغ</string>
<string name="used_storage">مستخدم</string> <string name="used_storage">مستخدم</string>
<string name="app_storage">التطبيق</string> <string name="app_storage">التطبيق</string>
@ -581,7 +580,6 @@
<string name="unable_to_inflate">تعذر إنشاء واجهة المستخدم بشكل صحيح ، وهذا خطأ كبير ويجب الإبلاغ عنه على الفور %s</string> <string name="unable_to_inflate">تعذر إنشاء واجهة المستخدم بشكل صحيح ، وهذا خطأ كبير ويجب الإبلاغ عنه على الفور %s</string>
<string name="automatic_plugin_download_mode_title">حدد الوضع لتصفية تنزيل المكونات الإضافية</string> <string name="automatic_plugin_download_mode_title">حدد الوضع لتصفية تنزيل المكونات الإضافية</string>
<string name="disable">تعطيل</string> <string name="disable">تعطيل</string>
<string name="default_account">@string/default_subtitles</string>
<string name="no_plugins_found_error">لا توجد اضافة في المستودع</string> <string name="no_plugins_found_error">لا توجد اضافة في المستودع</string>
<string name="no_repository_found_error">المستودع لم يتم العثور عليه، تحقق من العنوان اوجرب شبكة افتراضية خاصة(vpn)</string> <string name="no_repository_found_error">المستودع لم يتم العثور عليه، تحقق من العنوان اوجرب شبكة افتراضية خاصة(vpn)</string>
<string name="already_voted">لقد صوتت بالفعل</string> <string name="already_voted">لقد صوتت بالفعل</string>

View file

@ -34,7 +34,6 @@
<string name="result_tags">الأنواع</string> <string name="result_tags">الأنواع</string>
<string name="download_paused">توقف التنزيل</string> <string name="download_paused">توقف التنزيل</string>
<string name="type_plan_to_watch">خطط للمشاهدة</string> <string name="type_plan_to_watch">خطط للمشاهدة</string>
<string name="type_none">لا يوجد</string>
<string name="type_re_watching">إعادة المشاهدة</string> <string name="type_re_watching">إعادة المشاهدة</string>
<string name="new_update_format" formatted="true">!تم العثور على تحديث جديد <string name="new_update_format" formatted="true">!تم العثور على تحديث جديد
\n%s-&gt;%s</string> \n%s-&gt;%s</string>
@ -125,6 +124,7 @@
<string name="season">موسم</string> <string name="season">موسم</string>
<string name="copy_link_toast">تم نسخ الرابط إلى الحافظة</string> <string name="copy_link_toast">تم نسخ الرابط إلى الحافظة</string>
<string name="delete">مسح</string> <string name="delete">مسح</string>
<string name="cancel">الغي</string>
<string name="pause">وقف</string> <string name="pause">وقف</string>
<string name="update_notification_downloading">جارٍ تنزيل تحديث التطبيق…</string> <string name="update_notification_downloading">جارٍ تنزيل تحديث التطبيق…</string>
<string name="subs_default_reset_toast">إعادة التعيين إلى القيمة العادية</string> <string name="subs_default_reset_toast">إعادة التعيين إلى القيمة العادية</string>
@ -208,7 +208,6 @@
<string name="popup_resume_download">استئناف تحميل</string> <string name="popup_resume_download">استئناف تحميل</string>
<string name="home_info">معلومات</string> <string name="home_info">معلومات</string>
<string name="popup_pause_download">وقفة التحميل</string> <string name="popup_pause_download">وقفة التحميل</string>
<string name="sort_cancel">الغي</string>
<string name="sort_save">احفظ</string> <string name="sort_save">احفظ</string>
<string name="subtitles_settings">إعدادات الترجمة</string> <string name="subtitles_settings">إعدادات الترجمة</string>
<string name="subs_text_color">لون الخط</string> <string name="subs_text_color">لون الخط</string>

View file

@ -41,7 +41,6 @@
<string name="type_completed">Завършено</string> <string name="type_completed">Завършено</string>
<string name="type_dropped">Изпуснат</string> <string name="type_dropped">Изпуснат</string>
<string name="type_plan_to_watch">План за гледане</string> <string name="type_plan_to_watch">План за гледане</string>
<string name="type_none">Нито един</string>
<string name="type_re_watching">Повторно гледане</string> <string name="type_re_watching">Повторно гледане</string>
<string name="play_movie_button">Пускане на филм</string> <string name="play_movie_button">Пускане на филм</string>
<string name="play_livestream_button">Възпроизвеждане на живо</string> <string name="play_livestream_button">Възпроизвеждане на живо</string>
@ -78,7 +77,6 @@
<string name="action_remove_from_bookmarks">Премахване</string> <string name="action_remove_from_bookmarks">Премахване</string>
<string name="action_add_to_bookmarks">Задайте статус на гледане</string> <string name="action_add_to_bookmarks">Задайте статус на гледане</string>
<string name="sort_apply">Приложи</string> <string name="sort_apply">Приложи</string>
<string name="sort_cancel">Отказ</string>
<string name="sort_copy">Копирай</string> <string name="sort_copy">Копирай</string>
<string name="sort_close">Затвори</string> <string name="sort_close">Затвори</string>
<string name="sort_clear">Изчисти</string> <string name="sort_clear">Изчисти</string>
@ -187,6 +185,7 @@
<string name="no_episodes_found">Няма намерени епизоди</string> <string name="no_episodes_found">Няма намерени епизоди</string>
<string name="delete_file">Изтрий файла</string> <string name="delete_file">Изтрий файла</string>
<string name="delete">Изтрий</string> <string name="delete">Изтрий</string>
<string name="cancel">Отказ</string>
<string name="pause">Пауза</string> <string name="pause">Пауза</string>
<string name="resume">Продължи</string> <string name="resume">Продължи</string>
<string name="go_back_30">-30</string> <string name="go_back_30">-30</string>
@ -205,7 +204,7 @@
<string name="synopsis">Синопсис</string> <string name="synopsis">Синопсис</string>
<string name="queued">На опашката</string> <string name="queued">На опашката</string>
<string name="no_subtitles">Без субтитри</string> <string name="no_subtitles">Без субтитри</string>
<string name="default_subtitles">По подразбиране</string> <string name="action_default">По подразбиране</string>
<string name="free_storage">Безплатно</string> <string name="free_storage">Безплатно</string>
<string name="used_storage">Използвано</string> <string name="used_storage">Използвано</string>
<string name="app_storage">Приложения</string> <string name="app_storage">Приложения</string>

View file

@ -43,7 +43,6 @@
<string name="type_completed">শেষ</string> <string name="type_completed">শেষ</string>
<string name="type_dropped">বাদ</string> <string name="type_dropped">বাদ</string>
<string name="type_plan_to_watch">দেখার ইচ্ছায়</string> <string name="type_plan_to_watch">দেখার ইচ্ছায়</string>
<string name="type_none">কোন কিছুই না</string>
<string name="type_re_watching">পুনরায় দেখা হচ্ছে</string> <string name="type_re_watching">পুনরায় দেখা হচ্ছে</string>
<string name="play_torrent_button">টরেন্ট স্ট্রিম করুন</string> <string name="play_torrent_button">টরেন্ট স্ট্রিম করুন</string>
<string name="pick_source">উৎসসমূহ</string> <string name="pick_source">উৎসসমূহ</string>
@ -72,7 +71,6 @@
<string name="action_remove_from_bookmarks">বাদ দিন</string> <string name="action_remove_from_bookmarks">বাদ দিন</string>
<string name="action_add_to_bookmarks">বুকমার্ক করুন</string> <string name="action_add_to_bookmarks">বুকমার্ক করুন</string>
<string name="sort_apply">প্রয়োগ করুন</string> <string name="sort_apply">প্রয়োগ করুন</string>
<string name="sort_cancel">বাদ দিন</string>
<string name="sort_copy">কপি করুন</string> <string name="sort_copy">কপি করুন</string>
<string name="sort_close">বন্ধ করুন</string> <string name="sort_close">বন্ধ করুন</string>
<string name="sort_clear">মুছুন</string> <string name="sort_clear">মুছুন</string>

View file

@ -44,7 +44,6 @@
<string name="type_completed">Completado</string> <string name="type_completed">Completado</string>
<string name="type_dropped">Deixado</string> <string name="type_dropped">Deixado</string>
<string name="type_plan_to_watch">Planejando assistir</string> <string name="type_plan_to_watch">Planejando assistir</string>
<string name="type_none">Nenhum</string>
<string name="type_re_watching">Reassistindo</string> <string name="type_re_watching">Reassistindo</string>
<string name="play_movie_button">Assistir Filme</string> <string name="play_movie_button">Assistir Filme</string>
<string name="play_torrent_button">Transmitir Torrent</string> <string name="play_torrent_button">Transmitir Torrent</string>
@ -81,7 +80,6 @@
<string name="action_remove_from_bookmarks">Remover</string> <string name="action_remove_from_bookmarks">Remover</string>
<string name="action_add_to_bookmarks">Selecionar marcador</string> <string name="action_add_to_bookmarks">Selecionar marcador</string>
<string name="sort_apply">Aplicar</string> <string name="sort_apply">Aplicar</string>
<string name="sort_cancel">Cancelar</string>
<string name="sort_copy">Copiar</string> <string name="sort_copy">Copiar</string>
<string name="sort_close">Fechar</string> <string name="sort_close">Fechar</string>
<string name="sort_clear">Limpar</string> <string name="sort_clear">Limpar</string>
@ -185,6 +183,7 @@
<string name="no_episodes_found">Nenhum Episódio encontrado</string> <string name="no_episodes_found">Nenhum Episódio encontrado</string>
<string name="delete_file">Apagar Arquivo</string> <string name="delete_file">Apagar Arquivo</string>
<string name="delete">Deletar</string> <string name="delete">Deletar</string>
<string name="cancel">Cancelar</string>
<string name="pause">Pausar</string> <string name="pause">Pausar</string>
<string name="resume">Retomar</string> <string name="resume">Retomar</string>
<string name="go_back_30">-30</string> <string name="go_back_30">-30</string>
@ -203,7 +202,7 @@
<string name="synopsis">Sinopse</string> <string name="synopsis">Sinopse</string>
<string name="queued">Na fila</string> <string name="queued">Na fila</string>
<string name="no_subtitles">Sem Legendas</string> <string name="no_subtitles">Sem Legendas</string>
<string name="default_subtitles">Padrão</string> <string name="action_default">Padrão</string>
<string name="free_storage">Livre</string> <string name="free_storage">Livre</string>
<string name="used_storage">Usado</string> <string name="used_storage">Usado</string>
<string name="app_storage">App</string> <string name="app_storage">App</string>
@ -569,7 +568,6 @@
<string name="wifi">Wi-Fi</string> <string name="wifi">Wi-Fi</string>
<string name="player_settings_play_in_web">Lista de videos da web</string> <string name="player_settings_play_in_web">Lista de videos da web</string>
<string name="unable_to_inflate">A interface de usuário não foi gerada corretamente. Isto se trata de um bug importante e deve ser reportado imediatamente %s</string> <string name="unable_to_inflate">A interface de usuário não foi gerada corretamente. Isto se trata de um bug importante e deve ser reportado imediatamente %s</string>
<string name="default_account">Legendas padrão da conta</string>
<string name="pref_category_ui_features">Características da interface de usuário</string> <string name="pref_category_ui_features">Características da interface de usuário</string>
<string name="category_provider_test">Provedor de teste</string> <string name="category_provider_test">Provedor de teste</string>
<string name="pref_category_player_layout">Layout</string> <string name="pref_category_player_layout">Layout</string>

View file

@ -40,7 +40,6 @@
<string name="type_completed">Dokončeno</string> <string name="type_completed">Dokončeno</string>
<string name="type_dropped">Zahozeno</string> <string name="type_dropped">Zahozeno</string>
<string name="type_plan_to_watch">Plánuji sledovat</string> <string name="type_plan_to_watch">Plánuji sledovat</string>
<string name="type_none">Žádné</string>
<string name="type_re_watching">Opětovné sledování</string> <string name="type_re_watching">Opětovné sledování</string>
<string name="play_movie_button">Přehrát film</string> <string name="play_movie_button">Přehrát film</string>
<string name="play_torrent_button">Streamovat torrent</string> <string name="play_torrent_button">Streamovat torrent</string>
@ -76,7 +75,6 @@
<string name="action_remove_from_bookmarks">Odebrat</string> <string name="action_remove_from_bookmarks">Odebrat</string>
<string name="action_add_to_bookmarks">Nastavit stav sledování</string> <string name="action_add_to_bookmarks">Nastavit stav sledování</string>
<string name="sort_apply">Použít</string> <string name="sort_apply">Použít</string>
<string name="sort_cancel">Zrušit</string>
<string name="sort_copy">Kopírovat</string> <string name="sort_copy">Kopírovat</string>
<string name="sort_close">Zavřít</string> <string name="sort_close">Zavřít</string>
<string name="sort_clear">Vymazat</string> <string name="sort_clear">Vymazat</string>
@ -176,6 +174,7 @@
<string name="no_episodes_found">Nenalezeny žádné epizody</string> <string name="no_episodes_found">Nenalezeny žádné epizody</string>
<string name="delete_file">Smazat soubor</string> <string name="delete_file">Smazat soubor</string>
<string name="delete">Smazat</string> <string name="delete">Smazat</string>
<string name="cancel">Zrušit</string>
<string name="pause">Pozastavit</string> <string name="pause">Pozastavit</string>
<string name="resume">Pokračovat</string> <string name="resume">Pokračovat</string>
<string name="go_back_30">-30</string> <string name="go_back_30">-30</string>
@ -194,7 +193,7 @@
<string name="synopsis">Synopse</string> <string name="synopsis">Synopse</string>
<string name="queued">ve frontě</string> <string name="queued">ve frontě</string>
<string name="no_subtitles">Žádné titulky</string> <string name="no_subtitles">Žádné titulky</string>
<string name="default_subtitles">Výchozí</string> <string name="action_default">Výchozí</string>
<string name="free_storage">Volné</string> <string name="free_storage">Volné</string>
<string name="used_storage">Použito</string> <string name="used_storage">Použito</string>
<string name="app_storage">Aplikace</string> <string name="app_storage">Aplikace</string>
@ -575,6 +574,5 @@
<string name="automatic_plugin_download_mode_title">Výběr režimu pro filtrování stahování doplňků</string> <string name="automatic_plugin_download_mode_title">Výběr režimu pro filtrování stahování doplňků</string>
<string name="no_plugins_found_error">V repozitáři nebyly nalezeny žádné doplňky</string> <string name="no_plugins_found_error">V repozitáři nebyly nalezeny žádné doplňky</string>
<string name="no_repository_found_error">Repozitář nenalezen, zkontrolujte adresu URL a zkuste použít VPN</string> <string name="no_repository_found_error">Repozitář nenalezen, zkontrolujte adresu URL a zkuste použít VPN</string>
<string name="default_account">@string/default_subtitles</string>
<string name="already_voted">Již jste hlasovali</string> <string name="already_voted">Již jste hlasovali</string>
</resources> </resources>

View file

@ -52,7 +52,6 @@
<string name="type_completed">Abgeschlossen</string> <string name="type_completed">Abgeschlossen</string>
<string name="type_dropped">Abgebrochen</string> <string name="type_dropped">Abgebrochen</string>
<string name="type_plan_to_watch">Geplant</string> <string name="type_plan_to_watch">Geplant</string>
<string name="type_none">Nichts</string>
<string name="type_re_watching">Erneut schauen</string> <string name="type_re_watching">Erneut schauen</string>
<string name="play_movie_button">Film abspielen</string> <string name="play_movie_button">Film abspielen</string>
<string name="play_livestream_button">Livestream abspielen</string> <string name="play_livestream_button">Livestream abspielen</string>
@ -89,7 +88,6 @@
<string name="action_remove_from_bookmarks">Entfernen</string> <string name="action_remove_from_bookmarks">Entfernen</string>
<string name="action_add_to_bookmarks">Status setzen</string> <string name="action_add_to_bookmarks">Status setzen</string>
<string name="sort_apply">Anwenden</string> <string name="sort_apply">Anwenden</string>
<string name="sort_cancel">Abbrechen</string>
<string name="sort_copy">Kopieren</string> <string name="sort_copy">Kopieren</string>
<string name="sort_close">Schließen</string> <string name="sort_close">Schließen</string>
<string name="sort_clear">Leeren</string> <string name="sort_clear">Leeren</string>
@ -192,6 +190,7 @@
<string name="episode_short">E</string> <string name="episode_short">E</string>
<string name="no_episodes_found">Keine Episoden gefunden</string> <string name="no_episodes_found">Keine Episoden gefunden</string>
<string name="delete">Löschen</string> <string name="delete">Löschen</string>
<string name="cancel">Abbrechen</string>
<string name="pause">Pause</string> <string name="pause">Pause</string>
<string name="resume">Fortsetzen</string> <string name="resume">Fortsetzen</string>
<string name="go_back_30">-30</string> <string name="go_back_30">-30</string>
@ -210,7 +209,7 @@
<string name="synopsis">Zusammenfassung</string> <string name="synopsis">Zusammenfassung</string>
<string name="queued">In Warteschlange eingereiht</string> <string name="queued">In Warteschlange eingereiht</string>
<string name="no_subtitles">Keine Untertitel</string> <string name="no_subtitles">Keine Untertitel</string>
<string name="default_subtitles">Standard</string> <string name="action_default">Standard</string>
<string name="free_storage">Frei</string> <string name="free_storage">Frei</string>
<string name="used_storage">Belegt</string> <string name="used_storage">Belegt</string>
<string name="app_storage">App</string> <string name="app_storage">App</string>
@ -552,5 +551,4 @@
<string name="no_repository_found_error">Repository nicht gefunden, überprüf die URL und versuch ein VPN</string> <string name="no_repository_found_error">Repository nicht gefunden, überprüf die URL und versuch ein VPN</string>
<string name="unable_to_inflate">Die Benutzeroberfläche konnte nicht korrekt erstellt werden. Dies ist ein SCHWERWIEGENDER FEHLER und sollte sofort gemeldet werden. %s</string> <string name="unable_to_inflate">Die Benutzeroberfläche konnte nicht korrekt erstellt werden. Dies ist ein SCHWERWIEGENDER FEHLER und sollte sofort gemeldet werden. %s</string>
<string name="disable">Deaktivieren</string> <string name="disable">Deaktivieren</string>
<string name="default_account">@string/default_subtitles</string>
</resources> </resources>

View file

@ -23,7 +23,6 @@
<string name="type_completed">Ολοκληρώθηκε</string> <string name="type_completed">Ολοκληρώθηκε</string>
<string name="type_dropped">Διακόπηκε</string> <string name="type_dropped">Διακόπηκε</string>
<string name="type_plan_to_watch">Για παρακολούθηση</string> <string name="type_plan_to_watch">Για παρακολούθηση</string>
<string name="type_none">Τίποτα</string>
<string name="play_movie_button">Αναπαραγωγή ταινίας</string> <string name="play_movie_button">Αναπαραγωγή ταινίας</string>
<string name="play_torrent_button">Μετάδοση Torrent</string> <string name="play_torrent_button">Μετάδοση Torrent</string>
<string name="pick_source">Πηγές</string> <string name="pick_source">Πηγές</string>
@ -58,7 +57,6 @@
<string name="action_remove_from_bookmarks">Αφαίρεση</string> <string name="action_remove_from_bookmarks">Αφαίρεση</string>
<string name="play_episode_toast">Αναπαραγωγή επεισοδίου</string> <string name="play_episode_toast">Αναπαραγωγή επεισοδίου</string>
<string name="sort_apply">Υποβολή</string> <string name="sort_apply">Υποβολή</string>
<string name="sort_cancel">Ακύρωση</string>
<string name="player_speed">Ταχύτητα αναπαραγωγής</string> <string name="player_speed">Ταχύτητα αναπαραγωγής</string>
<string name="subtitles_settings">Ρυθμίσεις υπότιτλων</string> <string name="subtitles_settings">Ρυθμίσεις υπότιτλων</string>
<string name="subs_text_color">Χρώμα κειμένου</string> <string name="subs_text_color">Χρώμα κειμένου</string>
@ -155,6 +153,7 @@
<string name="no_episodes_found">Δεν βρέθηκαν επεισόδια</string> <string name="no_episodes_found">Δεν βρέθηκαν επεισόδια</string>
<string name="delete_file">Διαγραφή αρχείου</string> <string name="delete_file">Διαγραφή αρχείου</string>
<string name="delete">Διαγραφή</string> <string name="delete">Διαγραφή</string>
<string name="cancel">Ακύρωση</string>
<string name="pause">Παύση</string> <string name="pause">Παύση</string>
<string name="resume">Συνέχιση</string> <string name="resume">Συνέχιση</string>
<string name="delete_message" formatted="true">Αυτό θα διαγράψει μόνιμα το %s <string name="delete_message" formatted="true">Αυτό θα διαγράψει μόνιμα το %s
@ -169,7 +168,7 @@
<string name="synopsis">Περίληψη</string> <string name="synopsis">Περίληψη</string>
<string name="queued">προστέθηκε στην ουρά</string> <string name="queued">προστέθηκε στην ουρά</string>
<string name="no_subtitles">Δεν υπάρχουν διαθέσιμοι υπότιτλοι</string> <string name="no_subtitles">Δεν υπάρχουν διαθέσιμοι υπότιτλοι</string>
<string name="default_subtitles">Προεπιλεγμένοι υπότιτλοι</string> <string name="action_default">Προεπιλεγμένοι υπότιτλοι</string>
<string name="free_storage">Ελεύθερος</string> <string name="free_storage">Ελεύθερος</string>
<string name="used_storage">Σε χρήση</string> <string name="used_storage">Σε χρήση</string>
<string name="app_storage">Εφαρμογή</string> <string name="app_storage">Εφαρμογή</string>
@ -547,6 +546,5 @@
<string name="unable_to_inflate">Το UI δεν ήταν σε θέση να δημιουργηθεί σωστά, είναι ένα σφάλμα και θα πρέπει να αναφερθεί αμέσως %s</string> <string name="unable_to_inflate">Το UI δεν ήταν σε θέση να δημιουργηθεί σωστά, είναι ένα σφάλμα και θα πρέπει να αναφερθεί αμέσως %s</string>
<string name="automatic_plugin_download_mode_title">Επιλέξτε κατάσταση για φιλτράρισμα επεκτάσεων για λήψη</string> <string name="automatic_plugin_download_mode_title">Επιλέξτε κατάσταση για φιλτράρισμα επεκτάσεων για λήψη</string>
<string name="disable">Απενεργοποιημένο</string> <string name="disable">Απενεργοποιημένο</string>
<string name="default_account">@string/default_subtitles</string>
<string name="stop">Τέλος</string> <string name="stop">Τέλος</string>
</resources> </resources>

View file

@ -22,7 +22,6 @@
<string name="extension_description">Priskribo</string> <string name="extension_description">Priskribo</string>
<string name="extension_version">Versio</string> <string name="extension_version">Versio</string>
<string name="extension_status">Stato</string> <string name="extension_status">Stato</string>
<string name="sort_cancel">Nuligi</string>
<string name="sort_clear">Forviŝi</string> <string name="sort_clear">Forviŝi</string>
<string name="yes">Jes</string> <string name="yes">Jes</string>
<string name="no">Ne</string> <string name="no">Ne</string>

View file

@ -45,7 +45,7 @@
<string name="player_load_subtitles_online">Cargar desde Internet</string> <string name="player_load_subtitles_online">Cargar desde Internet</string>
<string name="autoplay_next_settings">Reproducir automáticamente episodio siguiente</string> <string name="autoplay_next_settings">Reproducir automáticamente episodio siguiente</string>
<string name="chromecast_subtitles_settings_des">Configuración de subtítulos de Chromecast</string> <string name="chromecast_subtitles_settings_des">Configuración de subtítulos de Chromecast</string>
<string name="default_subtitles">Predeterminado</string> <string name="action_default">Predeterminado</string>
<string name="subtitles_outline">Contorno</string> <string name="subtitles_outline">Contorno</string>
<string name="no_subtitles">Sin Subtítulos</string> <string name="no_subtitles">Sin Subtítulos</string>
<string name="subtitles_raised">Elevado</string> <string name="subtitles_raised">Elevado</string>
@ -138,7 +138,6 @@
<string name="type_completed">Completado</string> <string name="type_completed">Completado</string>
<string name="type_dropped">Descartado</string> <string name="type_dropped">Descartado</string>
<string name="type_plan_to_watch">Planeando ver</string> <string name="type_plan_to_watch">Planeando ver</string>
<string name="type_none">Ninguno</string>
<string name="type_re_watching">Volviendo a mirar</string> <string name="type_re_watching">Volviendo a mirar</string>
<string name="play_movie_button">Reproducir película</string> <string name="play_movie_button">Reproducir película</string>
<string name="play_trailer_button">Reproducir Trailer</string> <string name="play_trailer_button">Reproducir Trailer</string>
@ -167,7 +166,6 @@
<string name="error_bookmarks_text">Marcadores</string> <string name="error_bookmarks_text">Marcadores</string>
<string name="action_remove_from_bookmarks">Remover</string> <string name="action_remove_from_bookmarks">Remover</string>
<string name="action_add_to_bookmarks">Seleccionar estado de visualización</string> <string name="action_add_to_bookmarks">Seleccionar estado de visualización</string>
<string name="sort_cancel">Cancelar</string>
<string name="sort_copy">Copiar</string> <string name="sort_copy">Copiar</string>
<string name="sort_close">Cerrar</string> <string name="sort_close">Cerrar</string>
<string name="sort_clear">Limpiar</string> <string name="sort_clear">Limpiar</string>
@ -256,6 +254,7 @@
<string name="season_short">T</string> <string name="season_short">T</string>
<string name="delete_file">Borrar Archivo</string> <string name="delete_file">Borrar Archivo</string>
<string name="delete">Borrar</string> <string name="delete">Borrar</string>
<string name="cancel">Cancelar</string>
<string name="unexpected_error">Error inesperado del reproductor</string> <string name="unexpected_error">Error inesperado del reproductor</string>
<string name="episode_action_chromecast_episode">Episodio en Chromecast</string> <string name="episode_action_chromecast_episode">Episodio en Chromecast</string>
<string name="episode_action_play_in_app">Reproducir en la aplicación</string> <string name="episode_action_play_in_app">Reproducir en la aplicación</string>
@ -549,7 +548,6 @@
<string name="unable_to_inflate">La interfaz de usuario no se ha podido crear correctamente, se trata de un GRAN BUG y debe ser reportado inmediatamente %s</string> <string name="unable_to_inflate">La interfaz de usuario no se ha podido crear correctamente, se trata de un GRAN BUG y debe ser reportado inmediatamente %s</string>
<string name="automatic_plugin_download_mode_title">Seleccionar modo para filtrar los plugins descargados</string> <string name="automatic_plugin_download_mode_title">Seleccionar modo para filtrar los plugins descargados</string>
<string name="disable">Deshabilitar</string> <string name="disable">Deshabilitar</string>
<string name="default_account">@string/default_subtitles</string>
<string name="no_plugins_found_error">No se encontraron complementos en el repositorio</string> <string name="no_plugins_found_error">No se encontraron complementos en el repositorio</string>
<string name="no_repository_found_error">Repositorio no encontrado, comprueba la URL y prueba la VPN</string> <string name="no_repository_found_error">Repositorio no encontrado, comprueba la URL y prueba la VPN</string>
<string name="already_voted">Ya has votado</string> <string name="already_voted">Ya has votado</string>

View file

@ -22,7 +22,6 @@
<string name="type_completed">Terminé</string> <string name="type_completed">Terminé</string>
<string name="type_dropped">Abandonné</string> <string name="type_dropped">Abandonné</string>
<string name="type_plan_to_watch">À regarder</string> <string name="type_plan_to_watch">À regarder</string>
<string name="type_none">Aucun</string>
<string name="play_movie_button">Lire</string> <string name="play_movie_button">Lire</string>
<string name="play_torrent_button">Streamer le Torrent</string> <string name="play_torrent_button">Streamer le Torrent</string>
<string name="pick_source">Sources</string> <string name="pick_source">Sources</string>
@ -60,7 +59,6 @@
<string name="error_bookmarks_text">Marque-pages</string> <string name="error_bookmarks_text">Marque-pages</string>
<string name="action_remove_from_bookmarks">Supprimer</string> <string name="action_remove_from_bookmarks">Supprimer</string>
<string name="sort_apply">Appliquer</string> <string name="sort_apply">Appliquer</string>
<string name="sort_cancel">Annuler</string>
<string name="player_speed">Vitesse de lecture</string> <string name="player_speed">Vitesse de lecture</string>
<string name="preview_background_img_des">Aperçu de l\'arrière-plan</string> <string name="preview_background_img_des">Aperçu de l\'arrière-plan</string>
<string name="benene">Donner une benene aux devs</string> <string name="benene">Donner une benene aux devs</string>
@ -80,6 +78,7 @@
<string name="episode_short">E</string> <string name="episode_short">E</string>
<string name="delete_file">Supprimer le Fichier</string> <string name="delete_file">Supprimer le Fichier</string>
<string name="delete">Supprimer</string> <string name="delete">Supprimer</string>
<string name="cancel">Annuler</string>
<string name="pause">Pause</string> <string name="pause">Pause</string>
<string name="resume">Reprendre</string> <string name="resume">Reprendre</string>
<string name="delete_message">Cela va supprimer définitivement %s <string name="delete_message">Cela va supprimer définitivement %s
@ -94,7 +93,7 @@
<string name="synopsis">Synopsis</string> <string name="synopsis">Synopsis</string>
<string name="queued">Liste d\'attente</string> <string name="queued">Liste d\'attente</string>
<string name="no_subtitles">Pas de sous-titres</string> <string name="no_subtitles">Pas de sous-titres</string>
<string name="default_subtitles">Défault</string> <string name="action_default">Défault</string>
<string name="free_storage">Libre</string> <string name="free_storage">Libre</string>
<string name="used_storage">Utilisé</string> <string name="used_storage">Utilisé</string>
<string name="app_storage">Application</string> <string name="app_storage">Application</string>
@ -553,5 +552,4 @@
<string name="unable_to_inflate">L\'interface utilisateur n\'a pas pu être créée correctement. Il s\'agit d\'un bogue majeur qui doit être signalé immédiatement %s</string> <string name="unable_to_inflate">L\'interface utilisateur n\'a pas pu être créée correctement. Il s\'agit d\'un bogue majeur qui doit être signalé immédiatement %s</string>
<string name="automatic_plugin_download_mode_title">Sélectionnez le mode pour filtrer le téléchargement des plugins</string> <string name="automatic_plugin_download_mode_title">Sélectionnez le mode pour filtrer le téléchargement des plugins</string>
<string name="profile_background_des">Fond de profil</string> <string name="profile_background_des">Fond de profil</string>
<string name="default_account">@string/default_subtitles</string>
</resources> </resources>

View file

@ -29,13 +29,11 @@
<string name="type_completed">Completado</string> <string name="type_completed">Completado</string>
<string name="type_dropped">Descartado</string> <string name="type_dropped">Descartado</string>
<string name="type_plan_to_watch">Planeando ver</string> <string name="type_plan_to_watch">Planeando ver</string>
<string name="type_none">Ningún</string>
<string name="type_re_watching">Remirando</string> <string name="type_re_watching">Remirando</string>
<string name="error_bookmarks_text">Marcadores</string> <string name="error_bookmarks_text">Marcadores</string>
<string name="action_remove_from_bookmarks">Borrar</string> <string name="action_remove_from_bookmarks">Borrar</string>
<string name="action_add_to_bookmarks">Seleccionar estado de visualización</string> <string name="action_add_to_bookmarks">Seleccionar estado de visualización</string>
<string name="sort_apply">Aplicar</string> <string name="sort_apply">Aplicar</string>
<string name="sort_cancel">Cancelar</string>
<string name="sort_copy">Copiar</string> <string name="sort_copy">Copiar</string>
<string name="sort_close">Cerrar</string> <string name="sort_close">Cerrar</string>
<string name="sort_clear">Limpar</string> <string name="sort_clear">Limpar</string>

View file

@ -49,7 +49,6 @@
<string name="error_bookmarks_text">बुकमार्क्स</string> <string name="error_bookmarks_text">बुकमार्क्स</string>
<string name="action_remove_from_bookmarks">हटाएँ</string> <string name="action_remove_from_bookmarks">हटाएँ</string>
<string name="sort_apply">लागू करें</string> <string name="sort_apply">लागू करें</string>
<string name="sort_cancel">रद्द करें</string>
<string name="player_speed">प्लेयर स्पीड</string> <string name="player_speed">प्लेयर स्पीड</string>
<string name="search_provider_text_providers">प्रोवाइडरों का उपयोग कर खोजें</string> <string name="search_provider_text_providers">प्रोवाइडरों का उपयोग कर खोजें</string>
<string name="search_provider_text_types">प्रकार का उपयोग करके खोजें</string> <string name="search_provider_text_types">प्रकार का उपयोग करके खोजें</string>
@ -91,6 +90,7 @@
<string name="acra_report_toast">क्षमा करें, एप्प क्रैश हो गया है । निर्माताओं को एक अनाम बग रिपोर्ट भेजी जाएगी</string> <string name="acra_report_toast">क्षमा करें, एप्प क्रैश हो गया है । निर्माताओं को एक अनाम बग रिपोर्ट भेजी जाएगी</string>
<string name="delete_file">फ़ाइल डिलीट करें</string> <string name="delete_file">फ़ाइल डिलीट करें</string>
<string name="delete">डिलीट</string> <string name="delete">डिलीट</string>
<string name="cancel">रद्द करें</string>
<string name="pause">रोकें</string> <string name="pause">रोकें</string>
<string name="resume">फिर से चलाएं</string> <string name="resume">फिर से चलाएं</string>
<string name="delete_message">इससे %s स्थायी रूप से हट जाएगा <string name="delete_message">इससे %s स्थायी रूप से हट जाएगा

View file

@ -54,7 +54,6 @@
<string name="type_completed">Dovršeno</string> <string name="type_completed">Dovršeno</string>
<string name="type_dropped">Ispušteno</string> <string name="type_dropped">Ispušteno</string>
<string name="type_plan_to_watch">Planiram pogledati</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="type_re_watching">Ponovno gledam</string>
<string name="play_movie_button">Pokreni Film</string> <string name="play_movie_button">Pokreni Film</string>
<string name="play_livestream_button">Pokreni LiveStream</string> <string name="play_livestream_button">Pokreni LiveStream</string>
@ -92,7 +91,6 @@
<string name="action_remove_from_bookmarks">Ukloni</string> <string name="action_remove_from_bookmarks">Ukloni</string>
<string name="action_add_to_bookmarks">Postavi status gledanja</string> <string name="action_add_to_bookmarks">Postavi status gledanja</string>
<string name="sort_apply">Primijeni</string> <string name="sort_apply">Primijeni</string>
<string name="sort_cancel">Poništi</string>
<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>
@ -200,6 +198,7 @@
<string name="no_episodes_found">Nisu pronađene epizode</string> <string name="no_episodes_found">Nisu pronađene epizode</string>
<string name="delete_file">Izbriši datoteku</string> <string name="delete_file">Izbriši datoteku</string>
<string name="delete">Izbriši</string> <string name="delete">Izbriši</string>
<string name="cancel">Poništi</string>
<string name="pause">Pauziraj</string> <string name="pause">Pauziraj</string>
<string name="resume">Nastavi</string> <string name="resume">Nastavi</string>
<string name="go_back_30">-30</string> <string name="go_back_30">-30</string>
@ -218,7 +217,7 @@
<string name="synopsis">Sinopsis</string> <string name="synopsis">Sinopsis</string>
<string name="queued">u redu čekanja</string> <string name="queued">u redu čekanja</string>
<string name="no_subtitles">Bez titlova</string> <string name="no_subtitles">Bez titlova</string>
<string name="default_subtitles">Zadano</string> <string name="action_default">Zadano</string>
<string name="free_storage">Slobodno</string> <string name="free_storage">Slobodno</string>
<string name="used_storage">Iskorišteno</string> <string name="used_storage">Iskorišteno</string>
<string name="app_storage">Aplikacija</string> <string name="app_storage">Aplikacija</string>
@ -567,7 +566,6 @@
<string name="unable_to_inflate">Nije bilo moguće ispravno izraditi korisničko sučelje. Ovo je ZNAČAJNA GREŠKA i treba se odmah prijaviti %s</string> <string name="unable_to_inflate">Nije bilo moguće ispravno izraditi korisničko sučelje. Ovo je ZNAČAJNA GREŠKA i treba se odmah prijaviti %s</string>
<string name="automatic_plugin_download_mode_title">Odaberi modus za filtriranje preuzimanja dodataka</string> <string name="automatic_plugin_download_mode_title">Odaberi modus za filtriranje preuzimanja dodataka</string>
<string name="disable">Onemogući</string> <string name="disable">Onemogući</string>
<string name="default_account">@string/default_subtitles</string>
<string name="no_plugins_found_error">U repozitoriju nisu pronađeni dodaci</string> <string name="no_plugins_found_error">U repozitoriju nisu pronađeni dodaci</string>
<string name="no_repository_found_error">Repozitorij nije pronađen, provjerite URL i pokušajte koristiti VPN</string> <string name="no_repository_found_error">Repozitorij nije pronađen, provjerite URL i pokušajte koristiti VPN</string>
<string name="quality_profile_help">Ovdje možete promijeniti način na koji su izvori poredani. Ako video ima viši prioritet, pojavit će se više u odabiru izvora. Zbroj prioriteta izvora i prioriteta kvalitete je video prioritet. <string name="quality_profile_help">Ovdje možete promijeniti način na koji su izvori poredani. Ako video ima viši prioritet, pojavit će se više u odabiru izvora. Zbroj prioriteta izvora i prioriteta kvalitete je video prioritet.

View file

@ -20,6 +20,7 @@
<string name="download">Letöltés</string> <string name="download">Letöltés</string>
<string name="search">Keresés</string> <string name="search">Keresés</string>
<string name="delete">Törlés</string> <string name="delete">Törlés</string>
<string name="cancel">Mégse</string>
<string name="pause">Szüneteltetés</string> <string name="pause">Szüneteltetés</string>
<string name="queued">sorba állítva</string> <string name="queued">sorba állítva</string>
<string name="resize_fit">Igazítás</string> <string name="resize_fit">Igazítás</string>
@ -61,7 +62,6 @@
<string name="type_watching">Nézés</string> <string name="type_watching">Nézés</string>
<string name="type_completed">Befejezve</string> <string name="type_completed">Befejezve</string>
<string name="type_plan_to_watch">Később megnézés</string> <string name="type_plan_to_watch">Később megnézés</string>
<string name="type_none">Nincs</string>
<string name="type_re_watching">Újranézés</string> <string name="type_re_watching">Újranézés</string>
<string name="play_movie_button">Film lejátszása</string> <string name="play_movie_button">Film lejátszása</string>
<string name="play_trailer_button">Előzetes lejátszása</string> <string name="play_trailer_button">Előzetes lejátszása</string>
@ -90,7 +90,6 @@
<string name="action_remove_from_bookmarks">Eltávolítás</string> <string name="action_remove_from_bookmarks">Eltávolítás</string>
<string name="action_add_to_bookmarks">Megtekintés állapotának beállítása</string> <string name="action_add_to_bookmarks">Megtekintés állapotának beállítása</string>
<string name="sort_apply">Alkalmazás</string> <string name="sort_apply">Alkalmazás</string>
<string name="sort_cancel">Mégse</string>
<string name="sort_copy">Másolás</string> <string name="sort_copy">Másolás</string>
<string name="sort_close">Bezárás</string> <string name="sort_close">Bezárás</string>
<string name="sort_clear">Törlés</string> <string name="sort_clear">Törlés</string>
@ -162,7 +161,7 @@
<string name="rating">Értékelés</string> <string name="rating">Értékelés</string>
<string name="cartoons">Rajzfilmek</string> <string name="cartoons">Rajzfilmek</string>
<string name="livestreams">Élőadások</string> <string name="livestreams">Élőadások</string>
<string name="default_subtitles">Alapértelmezett</string> <string name="action_default">Alapértelmezett</string>
<string name="movies">Filmek</string> <string name="movies">Filmek</string>
<string name="tv_series">TV sorozat</string> <string name="tv_series">TV sorozat</string>
<string name="anime">Anime</string> <string name="anime">Anime</string>

View file

@ -39,7 +39,6 @@
<string name="type_completed">Selesai</string> <string name="type_completed">Selesai</string>
<string name="type_dropped">Dihentikan</string> <string name="type_dropped">Dihentikan</string>
<string name="type_plan_to_watch">Rencana untuk Menonton</string> <string name="type_plan_to_watch">Rencana untuk Menonton</string>
<string name="type_none">Tidak Ada</string>
<string name="type_re_watching">Menonton Ulang</string> <string name="type_re_watching">Menonton Ulang</string>
<string name="play_movie_button">Putar Movie</string> <string name="play_movie_button">Putar Movie</string>
<string name="play_torrent_button">Streaming Torrent</string> <string name="play_torrent_button">Streaming Torrent</string>
@ -75,7 +74,6 @@
<string name="action_remove_from_bookmarks">Hapus</string> <string name="action_remove_from_bookmarks">Hapus</string>
<string name="action_add_to_bookmarks">Atur status tontonan</string> <string name="action_add_to_bookmarks">Atur status tontonan</string>
<string name="sort_apply">Terapkan</string> <string name="sort_apply">Terapkan</string>
<string name="sort_cancel">Batalkan</string>
<string name="sort_copy">Salin</string> <string name="sort_copy">Salin</string>
<string name="sort_close">Tutup</string> <string name="sort_close">Tutup</string>
<string name="sort_clear">Bersihkan</string> <string name="sort_clear">Bersihkan</string>
@ -174,6 +172,7 @@
<string name="no_episodes_found">Episode Tidak Ditemukan</string> <string name="no_episodes_found">Episode Tidak Ditemukan</string>
<string name="delete_file">Hapus File</string> <string name="delete_file">Hapus File</string>
<string name="delete">Hapus</string> <string name="delete">Hapus</string>
<string name="cancel">Batalkan</string>
<string name="pause">Jeda</string> <string name="pause">Jeda</string>
<string name="resume">Lanjutkan</string> <string name="resume">Lanjutkan</string>
<string name="go_back_30">-30</string> <string name="go_back_30">-30</string>
@ -192,7 +191,7 @@
<string name="synopsis">Sinopsis</string> <string name="synopsis">Sinopsis</string>
<string name="queued">antri</string> <string name="queued">antri</string>
<string name="no_subtitles">Tidak Ada Subtitle</string> <string name="no_subtitles">Tidak Ada Subtitle</string>
<string name="default_subtitles">Default</string> <string name="action_default">Default</string>
<string name="free_storage">Tersedia</string> <string name="free_storage">Tersedia</string>
<string name="used_storage">Terpakai</string> <string name="used_storage">Terpakai</string>
<string name="app_storage">Aplikasi</string> <string name="app_storage">Aplikasi</string>
@ -575,5 +574,4 @@
<string name="no_plugins_found_error">Tidak ada plugin yang ditemukan di repositori</string> <string name="no_plugins_found_error">Tidak ada plugin yang ditemukan di repositori</string>
<string name="no_repository_found_error">Repositori tidak ditemukan, periksa URL dan coba VPN</string> <string name="no_repository_found_error">Repositori tidak ditemukan, periksa URL dan coba VPN</string>
<string name="already_voted">Kamu sudah voting</string> <string name="already_voted">Kamu sudah voting</string>
<string name="default_account">@string/default_subtitles</string>
</resources> </resources>

View file

@ -44,7 +44,6 @@
<string name="type_completed">Completato</string> <string name="type_completed">Completato</string>
<string name="type_dropped">Abbandonato</string> <string name="type_dropped">Abbandonato</string>
<string name="type_plan_to_watch">Da guardare</string> <string name="type_plan_to_watch">Da guardare</string>
<string name="type_none">Nessuno</string>
<string name="type_re_watching">Riguardando</string> <string name="type_re_watching">Riguardando</string>
<string name="play_movie_button">Riproduci film</string> <string name="play_movie_button">Riproduci film</string>
<string name="play_livestream_button">Riproduci Livestream</string> <string name="play_livestream_button">Riproduci Livestream</string>
@ -81,7 +80,6 @@
<string name="action_remove_from_bookmarks">Rimuovi</string> <string name="action_remove_from_bookmarks">Rimuovi</string>
<string name="action_add_to_bookmarks">Imposta stato riproduzione</string> <string name="action_add_to_bookmarks">Imposta stato riproduzione</string>
<string name="sort_apply">Applica</string> <string name="sort_apply">Applica</string>
<string name="sort_cancel">Cancella</string>
<string name="sort_copy">Copia</string> <string name="sort_copy">Copia</string>
<string name="sort_close">Chiudi</string> <string name="sort_close">Chiudi</string>
<string name="sort_clear">Cancella</string> <string name="sort_clear">Cancella</string>
@ -190,6 +188,7 @@
<string name="no_episodes_found">Nessun episodio trovato</string> <string name="no_episodes_found">Nessun episodio trovato</string>
<string name="delete_file">Elimina file</string> <string name="delete_file">Elimina file</string>
<string name="delete">Elimina</string> <string name="delete">Elimina</string>
<string name="cancel">Cancella</string>
<string name="pause">Pausa</string> <string name="pause">Pausa</string>
<string name="resume">Riprendi</string> <string name="resume">Riprendi</string>
<string name="go_back_30">-30</string> <string name="go_back_30">-30</string>
@ -208,7 +207,7 @@
<string name="synopsis">Sinossi</string> <string name="synopsis">Sinossi</string>
<string name="queued">In coda</string> <string name="queued">In coda</string>
<string name="no_subtitles">Nessun sottotiolo</string> <string name="no_subtitles">Nessun sottotiolo</string>
<string name="default_subtitles">Default</string> <string name="action_default">Default</string>
<string name="free_storage">Libero</string> <string name="free_storage">Libero</string>
<string name="used_storage">Usato</string> <string name="used_storage">Usato</string>
<string name="app_storage">App</string> <string name="app_storage">App</string>
@ -572,7 +571,6 @@
<string name="no_repository_found_error">Repository non trovato, controlla l\'URL e prova la VPN</string> <string name="no_repository_found_error">Repository non trovato, controlla l\'URL e prova la VPN</string>
<string name="unable_to_inflate">Non è stato possibile creare correttamente l\'interfaccia utente, questo è un GRANDE BUG e dovrebbe essere segnalato immediatamente %s</string> <string name="unable_to_inflate">Non è stato possibile creare correttamente l\'interfaccia utente, questo è un GRANDE BUG e dovrebbe essere segnalato immediatamente %s</string>
<string name="automatic_plugin_download_mode_title">Seleziona la modalità per filtrare il download dei plugin</string> <string name="automatic_plugin_download_mode_title">Seleziona la modalità per filtrare il download dei plugin</string>
<string name="default_account">@string/default_subtitles</string>
<string name="disable">Disabilita</string> <string name="disable">Disabilita</string>
<string name="already_voted">Hai già votato</string> <string name="already_voted">Hai già votato</string>
</resources> </resources>

View file

@ -66,7 +66,6 @@
<string name="action_remove_from_bookmarks">הסר</string> <string name="action_remove_from_bookmarks">הסר</string>
<string name="action_add_to_bookmarks">הגדר מצב צפייה</string> <string name="action_add_to_bookmarks">הגדר מצב צפייה</string>
<string name="sort_apply">ליישם</string> <string name="sort_apply">ליישם</string>
<string name="sort_cancel">בטל</string>
<string name="sort_copy">העתק</string> <string name="sort_copy">העתק</string>
<string name="sort_close">לסגור</string> <string name="sort_close">לסגור</string>
<string name="sort_clear">נקה</string> <string name="sort_clear">נקה</string>
@ -78,7 +77,6 @@
<string name="type_watching">צופה</string> <string name="type_watching">צופה</string>
<string name="pick_subtitle">כתוביות</string> <string name="pick_subtitle">כתוביות</string>
<string name="type_on_hold">בהמתנה</string> <string name="type_on_hold">בהמתנה</string>
<string name="type_none">ללא</string>
<string name="download">להוריד</string> <string name="download">להוריד</string>
<string name="app_dubbed_text">מדובב</string> <string name="app_dubbed_text">מדובב</string>
<string name="home_more_info">יותר מידע</string> <string name="home_more_info">יותר מידע</string>
@ -146,6 +144,7 @@
<string name="no_episodes_found">לא נמצאו פרקים</string> <string name="no_episodes_found">לא נמצאו פרקים</string>
<string name="delete_file">מחק קובץ</string> <string name="delete_file">מחק קובץ</string>
<string name="delete">מחק</string> <string name="delete">מחק</string>
<string name="cancel">בטל</string>
<string name="pause">השהה</string> <string name="pause">השהה</string>
<string name="resume">המשך</string> <string name="resume">המשך</string>
<string name="go_back_30">-30</string> <string name="go_back_30">-30</string>
@ -159,7 +158,7 @@
<string name="rating">דירוג</string> <string name="rating">דירוג</string>
<string name="year">שנה</string> <string name="year">שנה</string>
<string name="no_subtitles">ללא כתוביות</string> <string name="no_subtitles">ללא כתוביות</string>
<string name="default_subtitles">ברירת מחדל</string> <string name="action_default">ברירת מחדל</string>
<string name="free_storage">חינם</string> <string name="free_storage">חינם</string>
<string name="used_storage">משומש</string> <string name="used_storage">משומש</string>
<string name="tv_series">סדרת טלוויזיה</string> <string name="tv_series">סדרת טלוויזיה</string>
@ -519,7 +518,6 @@
<string name="edit">עריכה</string> <string name="edit">עריכה</string>
<string name="wifi">Wi-Fi</string> <string name="wifi">Wi-Fi</string>
<string name="profile_background_des">רקע הפרופיל</string> <string name="profile_background_des">רקע הפרופיל</string>
<string name="default_account">@string/default_subtitles</string>
<string name="test_log">רשומה</string> <string name="test_log">רשומה</string>
<string name="help">עזרה</string> <string name="help">עזרה</string>
<string name="start">התחלה</string> <string name="start">התחלה</string>

View file

@ -37,7 +37,6 @@
<string name="asian_drama_singular">アジアドラマ</string> <string name="asian_drama_singular">アジアドラマ</string>
<string name="live_singular">ライブ配信</string> <string name="live_singular">ライブ配信</string>
<string name="nsfw_singular">NSFW</string> <string name="nsfw_singular">NSFW</string>
<string name="sort_cancel">キャンセル</string>
<string name="anime">アニメ</string> <string name="anime">アニメ</string>
<string name="video_lock">ロック</string> <string name="video_lock">ロック</string>
<string name="video_source">ソース</string> <string name="video_source">ソース</string>
@ -71,7 +70,6 @@
<string name="home_source">ソース</string> <string name="home_source">ソース</string>
<string name="history">履歴</string> <string name="history">履歴</string>
<string name="result_poster_img_des">ポスター</string> <string name="result_poster_img_des">ポスター</string>
<string name="type_none">なし</string>
<string name="sort_copy">コピー</string> <string name="sort_copy">コピー</string>
<string name="sort_close">閉じる</string> <string name="sort_close">閉じる</string>
<string name="sort_save">保存</string> <string name="sort_save">保存</string>
@ -135,6 +133,7 @@
<string name="pause">一時停止</string> <string name="pause">一時停止</string>
<string name="play_episode_toast">再生エピソード</string> <string name="play_episode_toast">再生エピソード</string>
<string name="delete">削除</string> <string name="delete">削除</string>
<string name="cancel">キャンセル</string>
<string name="start">開始</string> <string name="start">開始</string>
<string name="status">状態</string> <string name="status">状態</string>
<string name="year"></string> <string name="year"></string>
@ -155,7 +154,7 @@
<string name="extension_version">バージョン</string> <string name="extension_version">バージョン</string>
<string name="extension_rating" formatted="true">視聴率 %s</string> <string name="extension_rating" formatted="true">視聴率 %s</string>
<string name="rating">視聴率</string> <string name="rating">視聴率</string>
<string name="default_subtitles">デフォルト</string> <string name="action_default">デフォルト</string>
<string name="download_failed">ダウンロード失敗</string> <string name="download_failed">ダウンロード失敗</string>
<string name="download_started">ダウンロード開始</string> <string name="download_started">ダウンロード開始</string>
<string name="download_done">ダウンロード完了</string> <string name="download_done">ダウンロード完了</string>

View file

@ -32,7 +32,6 @@
<string name="home_info">ಮಾಹಿತಿ</string> <string name="home_info">ಮಾಹಿತಿ</string>
<string name="action_add_to_bookmarks">ಸೆಟ್ ವಾಚ್ ಸ್ಟೇಟಸ್</string> <string name="action_add_to_bookmarks">ಸೆಟ್ ವಾಚ್ ಸ್ಟೇಟಸ್</string>
<string name="sort_apply">ಅನ್ವಯಿಸು</string> <string name="sort_apply">ಅನ್ವಯಿಸು</string>
<string name="sort_cancel">ರದ್ದುಮಾಡು</string>
<string name="subs_subtitle_elevation">ಸಬ್ ಟೈಟಲ್ಸ್ ಎಲೆವಷನ್</string> <string name="subs_subtitle_elevation">ಸಬ್ ಟೈಟಲ್ಸ್ ಎಲೆವಷನ್</string>
<string name="subs_font_size">ಫಾಂಟ್ ಸೈಜ್</string> <string name="subs_font_size">ಫಾಂಟ್ ಸೈಜ್</string>
<string name="subs_subtitle_languages">ಸಬ್ ಟೈಟಲ್ಸ್ ಭಾಷೆ</string> <string name="subs_subtitle_languages">ಸಬ್ ಟೈಟಲ್ಸ್ ಭಾಷೆ</string>
@ -108,7 +107,6 @@
<string name="result_tags">ಪ್ರಕಾರಗಳು</string> <string name="result_tags">ಪ್ರಕಾರಗಳು</string>
<string name="result_open_in_browser">ಬ್ರೌಸರ್ ತೆರೆಯಿರಿ</string> <string name="result_open_in_browser">ಬ್ರೌಸರ್ ತೆರೆಯಿರಿ</string>
<string name="type_on_hold">ಆನ್-ಹೋಲ್ಡ್</string> <string name="type_on_hold">ಆನ್-ಹೋಲ್ಡ್</string>
<string name="type_none">ನನ್</string>
<string name="reload_error">ಸಂಪರ್ಕವನ್ನು ಮರುಪ್ರಯತ್ನಿಸಿ…</string> <string name="reload_error">ಸಂಪರ್ಕವನ್ನು ಮರುಪ್ರಯತ್ನಿಸಿ…</string>
<string name="download_paused">ಡೌನ್‌ಲೋಡ್ ವಿರಾಮಗೊಳಿಸಲಾಗಿದೆ</string> <string name="download_paused">ಡೌನ್‌ಲೋಡ್ ವಿರಾಮಗೊಳಿಸಲಾಗಿದೆ</string>
<string name="download_failed">ಡೌನ್‌ಲೋಡ್ ವಿಫಲವಾಗಿದೆ</string> <string name="download_failed">ಡೌನ್‌ಲೋಡ್ ವಿಫಲವಾಗಿದೆ</string>

View file

@ -35,7 +35,6 @@
<string name="type_completed">시청 완료</string> <string name="type_completed">시청 완료</string>
<string name="type_dropped">포기</string> <string name="type_dropped">포기</string>
<string name="type_plan_to_watch">시청 예정</string> <string name="type_plan_to_watch">시청 예정</string>
<string name="type_none">없음</string>
<string name="type_re_watching">다시보기</string> <string name="type_re_watching">다시보기</string>
<string name="play_movie_button">영화 재생</string> <string name="play_movie_button">영화 재생</string>
<string name="play_trailer_button">예고편 재생</string> <string name="play_trailer_button">예고편 재생</string>
@ -95,7 +94,6 @@
<string name="pref_category_backup">백업</string> <string name="pref_category_backup">백업</string>
<string name="app_dubbed_text">더빙</string> <string name="app_dubbed_text">더빙</string>
<string name="app_subbed_text">자막</string> <string name="app_subbed_text">자막</string>
<string name="sort_cancel">취소</string>
<string name="filter_bookmarks">북마크 필터</string> <string name="filter_bookmarks">북마크 필터</string>
<string name="error_bookmarks_text">북마크</string> <string name="error_bookmarks_text">북마크</string>
<string name="sort_clear">제거</string> <string name="sort_clear">제거</string>
@ -177,7 +175,7 @@
<string name="synopsis">개요</string> <string name="synopsis">개요</string>
<string name="queued">대기중</string> <string name="queued">대기중</string>
<string name="no_subtitles">자막 없음</string> <string name="no_subtitles">자막 없음</string>
<string name="default_subtitles">기본</string> <string name="action_default">기본</string>
<string name="free_storage">남음</string> <string name="free_storage">남음</string>
<string name="used_storage">사용됨</string> <string name="used_storage">사용됨</string>
<string name="app_storage"></string> <string name="app_storage"></string>
@ -352,6 +350,7 @@
<string name="asian_drama_singular">아시아 드라마</string> <string name="asian_drama_singular">아시아 드라마</string>
<string name="season">시즌</string> <string name="season">시즌</string>
<string name="delete">삭제</string> <string name="delete">삭제</string>
<string name="cancel">취소</string>
<string name="season_format">%s %d%s</string> <string name="season_format">%s %d%s</string>
<string name="delete_file">파일 삭제</string> <string name="delete_file">파일 삭제</string>
<string name="pause">일시정지</string> <string name="pause">일시정지</string>

View file

@ -65,6 +65,7 @@
<string name="documentaries">Dokumentika</string> <string name="documentaries">Dokumentika</string>
<string name="play_torrent_button">Transliuoti Torrentą</string> <string name="play_torrent_button">Transliuoti Torrentą</string>
<string name="delete">Ištrinti</string> <string name="delete">Ištrinti</string>
<string name="cancel">Atšaukti</string>
<string name="start">Pradėti</string> <string name="start">Pradėti</string>
<string name="eigengraumode_settings_des">Prideda greičio pasirinkti grotuve</string> <string name="eigengraumode_settings_des">Prideda greičio pasirinkti grotuve</string>
<string name="cartoons_singular">Filmukas</string> <string name="cartoons_singular">Filmukas</string>
@ -95,7 +96,6 @@
<string name="subs_text_color">Teksto spalva</string> <string name="subs_text_color">Teksto spalva</string>
<string name="type_completed">Užbaigta</string> <string name="type_completed">Užbaigta</string>
<string name="use_system_brightness_settings_des">Naudoti sistemos ryškumą programos grotuve vietoj tamsumo</string> <string name="use_system_brightness_settings_des">Naudoti sistemos ryškumą programos grotuve vietoj tamsumo</string>
<string name="type_none">Tuščia</string>
<string name="restore_failed_format" formatted="true">Nepavyko atstatyti duomenis iš failo %s</string> <string name="restore_failed_format" formatted="true">Nepavyko atstatyti duomenis iš failo %s</string>
<string name="play_trailer_button">Paleisti anonsa</string> <string name="play_trailer_button">Paleisti anonsa</string>
<string name="play_livestream_button">Paleisti gyva transliacija</string> <string name="play_livestream_button">Paleisti gyva transliacija</string>
@ -107,7 +107,6 @@
<string name="type_re_watching">Peržiūrima</string> <string name="type_re_watching">Peržiūrima</string>
<string name="result_open_in_browser">Atidaryti Naršyklėje</string> <string name="result_open_in_browser">Atidaryti Naršyklėje</string>
<string name="use_system_brightness_settings">Naudoti sistemos ryškumą</string> <string name="use_system_brightness_settings">Naudoti sistemos ryškumą</string>
<string name="sort_cancel">Atšaukti</string>
<string name="no_data">Nėra duomenų</string> <string name="no_data">Nėra duomenų</string>
<string name="subs_font">Šriftas</string> <string name="subs_font">Šriftas</string>
<string name="redo_setup_process">Perdaryti nustatymo procesą</string> <string name="redo_setup_process">Perdaryti nustatymo procesą</string>

View file

@ -31,7 +31,6 @@
<string name="type_completed">Pabeigts</string> <string name="type_completed">Pabeigts</string>
<string name="type_dropped">Atmests</string> <string name="type_dropped">Atmests</string>
<string name="type_plan_to_watch">Plāno skatīties</string> <string name="type_plan_to_watch">Plāno skatīties</string>
<string name="type_none">Neviena</string>
<string name="type_re_watching">Atkārtoti skatities</string> <string name="type_re_watching">Atkārtoti skatities</string>
<string name="play_movie_button">Palaist Filmu</string> <string name="play_movie_button">Palaist Filmu</string>
<string name="play_trailer_button">Palaist Trelleri</string> <string name="play_trailer_button">Palaist Trelleri</string>
@ -67,7 +66,6 @@
<string name="action_remove_from_bookmarks">Noņemt</string> <string name="action_remove_from_bookmarks">Noņemt</string>
<string name="action_add_to_bookmarks">Ieliec skatīšanās statusu</string> <string name="action_add_to_bookmarks">Ieliec skatīšanās statusu</string>
<string name="sort_apply">Izmantot</string> <string name="sort_apply">Izmantot</string>
<string name="sort_cancel">Atcelt</string>
<string name="sort_copy">Kopēt</string> <string name="sort_copy">Kopēt</string>
<string name="sort_save">Saglabāt</string> <string name="sort_save">Saglabāt</string>
<string name="player_speed">Atskaņošanas ātrums</string> <string name="player_speed">Atskaņošanas ātrums</string>
@ -192,6 +190,7 @@
<string name="no_episodes_found">Epizodes netika atrastas</string> <string name="no_episodes_found">Epizodes netika atrastas</string>
<string name="delete_file">Dzēsti faili</string> <string name="delete_file">Dzēsti faili</string>
<string name="delete">Dzēst</string> <string name="delete">Dzēst</string>
<string name="cancel">Atcelt</string>
<string name="pause">Pauzēt</string> <string name="pause">Pauzēt</string>
<string name="start">Sākt</string> <string name="start">Sākt</string>
<string name="test_failed">Neizdevās</string> <string name="test_failed">Neizdevās</string>
@ -483,7 +482,7 @@
<string name="status_ongoing">Iet</string> <string name="status_ongoing">Iet</string>
<string name="free_storage">Bezmaksas</string> <string name="free_storage">Bezmaksas</string>
<string name="poster_ui_settings">Ieslēgt elementus uz plakātiem</string> <string name="poster_ui_settings">Ieslēgt elementus uz plakātiem</string>
<string name="default_subtitles">Parastais</string> <string name="action_default">Parastais</string>
<string name="no_update_found">Nav atjauninājumi atrasti</string> <string name="no_update_found">Nav atjauninājumi atrasti</string>
<string name="video_buffer_clear_settings">Izdzēst video un bildes atkritne</string> <string name="video_buffer_clear_settings">Izdzēst video un bildes atkritne</string>
<string name="watch_quality_pref_data">Izvēlētā skatīšanās kvalitāte (Mobilie Dati)</string> <string name="watch_quality_pref_data">Izvēlētā skatīšanās kvalitāte (Mobilie Dati)</string>

View file

@ -25,7 +25,6 @@
<string name="type_completed">Завршени</string> <string name="type_completed">Завршени</string>
<string name="type_dropped">Отфрлени</string> <string name="type_dropped">Отфрлени</string>
<string name="type_plan_to_watch">Планирани за гледање</string> <string name="type_plan_to_watch">Планирани за гледање</string>
<string name="type_none">Ништо одбрано</string>
<string name="type_re_watching">Повторно гледање</string> <string name="type_re_watching">Повторно гледање</string>
<string name="play_movie_button">Пушти филм</string> <string name="play_movie_button">Пушти филм</string>
<string name="play_torrent_button">Стримај торент</string> <string name="play_torrent_button">Стримај торент</string>
@ -58,7 +57,6 @@
<string name="error_bookmarks_text">Обележувачи</string> <string name="error_bookmarks_text">Обележувачи</string>
<string name="action_remove_from_bookmarks">Отстрани</string> <string name="action_remove_from_bookmarks">Отстрани</string>
<string name="sort_apply">Активирај</string> <string name="sort_apply">Активирај</string>
<string name="sort_cancel">Откажи</string>
<string name="player_speed">Брзина на плеер</string> <string name="player_speed">Брзина на плеер</string>
<string name="subtitles_settings">Поставки за преводи</string> <string name="subtitles_settings">Поставки за преводи</string>
<string name="subs_text_color">Боја на текстот</string> <string name="subs_text_color">Боја на текстот</string>
@ -133,6 +131,7 @@
<string name="episode_short">Е</string> <string name="episode_short">Е</string>
<string name="delete_file">Избриши датотека</string> <string name="delete_file">Избриши датотека</string>
<string name="delete">Избриши</string> <string name="delete">Избриши</string>
<string name="cancel">Откажи</string>
<string name="pause">Паузирај</string> <string name="pause">Паузирај</string>
<string name="resume">Продолжи</string> <string name="resume">Продолжи</string>
<string name="delete_message">Ова трајно ќе го избрише %s <string name="delete_message">Ова трајно ќе го избрише %s
@ -147,7 +146,7 @@
<string name="synopsis">Крат</string> <string name="synopsis">Крат</string>
<string name="queued">во редица</string> <string name="queued">во редица</string>
<string name="no_subtitles">Нема преводи</string> <string name="no_subtitles">Нема преводи</string>
<string name="default_subtitles">Стандардно</string> <string name="action_default">Стандардно</string>
<string name="free_storage">Слободен простор</string> <string name="free_storage">Слободен простор</string>
<string name="used_storage">Искористен простор</string> <string name="used_storage">Искористен простор</string>
<string name="app_storage">Апликациски простор</string> <string name="app_storage">Апликациски простор</string>

View file

@ -54,7 +54,6 @@
<string name="error_bookmarks_text">ബുക്മാർക്</string> <string name="error_bookmarks_text">ബുക്മാർക്</string>
<string name="action_remove_from_bookmarks">നീക്കം ചെയ്യുക</string> <string name="action_remove_from_bookmarks">നീക്കം ചെയ്യുക</string>
<string name="sort_apply">പ്രയോഗിക്കുക</string> <string name="sort_apply">പ്രയോഗിക്കുക</string>
<string name="sort_cancel">റദ്ദാക്കുക</string>
<string name="player_speed">പ്ലേയർ വേഗത</string> <string name="player_speed">പ്ലേയർ വേഗത</string>
<!-- <string name="subtitles_settings">Subtitle Settings</string> <!-- <string name="subtitles_settings">Subtitle Settings</string>
<string name="subs_text_color">Text Color</string> <string name="subs_text_color">Text Color</string>
@ -121,6 +120,7 @@
<string name="episodes">എപ്പിസോഡുകൾ</string> <string name="episodes">എപ്പിസോഡുകൾ</string>
<string name="delete_file">ഫയൽ ഡിലീറ്റ് ചെയ്യുക</string> <string name="delete_file">ഫയൽ ഡിലീറ്റ് ചെയ്യുക</string>
<string name="delete">ഡിലീറ്റ്</string> <string name="delete">ഡിലീറ്റ്</string>
<string name="cancel">റദ്ദാക്കുക</string>
<string name="pause">നിർത്തുക</string> <string name="pause">നിർത്തുക</string>
<string name="resume">തുടരുക</string> <string name="resume">തുടരുക</string>
<string name="delete_message">സ്ഥിരമായി %sനെ ഡിലീറ്റ് ചെയ്യുക <string name="delete_message">സ്ഥിരമായി %sനെ ഡിലീറ്റ് ചെയ്യുക
@ -135,7 +135,7 @@
<string name="synopsis">സംഗ്രഹം</string> <string name="synopsis">സംഗ്രഹം</string>
<!-- <string name="queued">queued</string> <!-- <string name="queued">queued</string>
<string name="no_subtitles">No Subtitles</string> <string name="no_subtitles">No Subtitles</string>
<string name="default_subtitles">Default</string> --> <string name="action_default">Default</string> -->
<string name="free_storage">ഒഴിവ്</string> <string name="free_storage">ഒഴിവ്</string>
<string name="used_storage">ഉപയോഗത്തിൽ</string> <string name="used_storage">ഉപയോഗത്തിൽ</string>
<string name="app_storage">ആപ്പ്</string> <string name="app_storage">ആപ്പ്</string>
@ -197,7 +197,6 @@
<string name="home_change_provider_img_des">ദാതാവിനെ മാറ്റുക</string> <string name="home_change_provider_img_des">ദാതാവിനെ മാറ്റുക</string>
<string name="loading">ലോഡിംഗ്…</string> <string name="loading">ലോഡിംഗ്…</string>
<string name="browser">ബ്രൗസർ</string> <string name="browser">ബ്രൗസർ</string>
<string name="type_none">ഒന്നുമില്ല</string>
<string name="type_re_watching">വീണ്ടും കാണുക</string> <string name="type_re_watching">വീണ്ടും കാണുക</string>
<string name="stream">സ്ട്രീം</string> <string name="stream">സ്ട്രീം</string>
</resources> </resources>

View file

@ -49,7 +49,6 @@
<string name="open_with">Buka dengan</string> <string name="open_with">Buka dengan</string>
<string name="popup_delete_file">Padam Fail</string> <string name="popup_delete_file">Padam Fail</string>
<string name="result_open_in_browser">Buka Dalam Pelayar</string> <string name="result_open_in_browser">Buka Dalam Pelayar</string>
<string name="sort_cancel">Batal</string>
<string name="no_data">Tiada Data</string> <string name="no_data">Tiada Data</string>
<string name="home_info">Info</string> <string name="home_info">Info</string>
<string name="sort_save">Simpan</string> <string name="sort_save">Simpan</string>

View file

@ -32,7 +32,6 @@
<string name="type_watching">ကြည့်နေသည်</string> <string name="type_watching">ကြည့်နေသည်</string>
<string name="type_completed">ကြည့်ပြီး</string> <string name="type_completed">ကြည့်ပြီး</string>
<string name="type_dropped">ကြည့်ခြင်းရပ်ထားသော</string> <string name="type_dropped">ကြည့်ခြင်းရပ်ထားသော</string>
<string name="type_none">ဘာမျှ</string>
<string name="error_loading_links_toast">လင့်များချိတ်ဆက်ရာတွင်အချို့အယွင်း</string> <string name="error_loading_links_toast">လင့်များချိတ်ဆက်ရာတွင်အချို့အယွင်း</string>
<string name="download_storage_text">ဖုန်း သိုလှောင်ရုံ</string> <string name="download_storage_text">ဖုန်း သိုလှောင်ရုံ</string>
<string name="filter_bookmarks">စာမှတ်များ စစ်ထုတ်မှု</string> <string name="filter_bookmarks">စာမှတ်များ စစ်ထုတ်မှု</string>
@ -127,8 +126,7 @@
<string name="synopsis">အကျဥ်းချုပ်</string> <string name="synopsis">အကျဥ်းချုပ်</string>
<string name="queued">နောက်အစီအစဥ်</string> <string name="queued">နောက်အစီအစဥ်</string>
<string name="no_subtitles">စာတန်းထိုးမထည့်</string> <string name="no_subtitles">စာတန်းထိုးမထည့်</string>
<string name="default_subtitles">ပုံသေ</string> <string name="action_default">ပုံသေ</string>
<string name="default_account">@string/default_subtitles</string>
<string name="free_storage">ကျန်ရှိသော</string> <string name="free_storage">ကျန်ရှိသော</string>
<string name="app_storage">အက်ပ်</string> <string name="app_storage">အက်ပ်</string>
<string name="movies">ရုပ်ရှင်များ</string> <string name="movies">ရုပ်ရှင်များ</string>
@ -253,7 +251,6 @@
<string name="subs_subtitle_languages">စာတန်းထိုး ဘာသာစကား</string> <string name="subs_subtitle_languages">စာတန်းထိုး ဘာသာစကား</string>
<string name="subs_import_text" formatted="true">ဒီမှာနေရာချခြင်းဖြင့်ဖောင့်များကိုသွင်းပါ %s</string> <string name="subs_import_text" formatted="true">ဒီမှာနေရာချခြင်းဖြင့်ဖောင့်များကိုသွင်းပါ %s</string>
<string name="sort_apply">အတည်ပြု</string> <string name="sort_apply">အတည်ပြု</string>
<string name="sort_cancel">ပယ်ဖျက်ရန်</string>
<string name="subtitles_settings">စာတန်းထိုး ပြုပြင်ခြင်း</string> <string name="subtitles_settings">စာတန်းထိုး ပြုပြင်ခြင်း</string>
<string name="subs_text_color">စာသား အရောင်</string> <string name="subs_text_color">စာသား အရောင်</string>
<string name="subs_outline_color">အနားကွပ် အရောင်</string> <string name="subs_outline_color">အနားကွပ် အရောင်</string>
@ -301,6 +298,7 @@
<string name="no_episodes_found">အပိုင်းများမတွေ့ပါ</string> <string name="no_episodes_found">အပိုင်းများမတွေ့ပါ</string>
<string name="delete_file">ဖိုင်ကိုဖျက်ရန်</string> <string name="delete_file">ဖိုင်ကိုဖျက်ရန်</string>
<string name="delete">ဖျက်ရန်</string> <string name="delete">ဖျက်ရန်</string>
<string name="cancel">ပယ်ဖျက်ရန်</string>
<string name="pause">ရပ်ရန်</string> <string name="pause">ရပ်ရန်</string>
<string name="start">စရန်</string> <string name="start">စရန်</string>
<string name="test_failed">မအောင်မြင်ပါ</string> <string name="test_failed">မအောင်မြင်ပါ</string>

View file

@ -44,7 +44,6 @@
<string name="type_completed">Voltooid</string> <string name="type_completed">Voltooid</string>
<string name="type_dropped">Dropped</string> <string name="type_dropped">Dropped</string>
<string name="type_plan_to_watch">Plan om te kijken</string> <string name="type_plan_to_watch">Plan om te kijken</string>
<string name="type_none">Geen</string>
<string name="type_re_watching">Opnieuw kijken</string> <string name="type_re_watching">Opnieuw kijken</string>
<string name="play_movie_button">Film afspelen</string> <string name="play_movie_button">Film afspelen</string>
<string name="play_livestream_button">Livestream afspelen</string> <string name="play_livestream_button">Livestream afspelen</string>
@ -82,7 +81,6 @@
<string name="action_remove_from_bookmarks">Verwijder</string> <string name="action_remove_from_bookmarks">Verwijder</string>
<string name="action_add_to_bookmarks">Zet kijkstatus</string> <string name="action_add_to_bookmarks">Zet kijkstatus</string>
<string name="sort_apply">Toepassen</string> <string name="sort_apply">Toepassen</string>
<string name="sort_cancel">annuleer</string>
<string name="sort_copy">Kopiëren</string> <string name="sort_copy">Kopiëren</string>
<string name="sort_close">Sluit</string> <string name="sort_close">Sluit</string>
<string name="sort_clear">Wissen</string> <string name="sort_clear">Wissen</string>
@ -186,6 +184,7 @@
<string name="no_episodes_found">Geen afleveringen gevonden</string> <string name="no_episodes_found">Geen afleveringen gevonden</string>
<string name="delete_file">Verwijder bestand</string> <string name="delete_file">Verwijder bestand</string>
<string name="delete">Verwijder</string> <string name="delete">Verwijder</string>
<string name="cancel">annuleer</string>
<string name="pause">Pauze</string> <string name="pause">Pauze</string>
<string name="resume">Hervatten</string> <string name="resume">Hervatten</string>
<string name="go_back_30">-30</string> <string name="go_back_30">-30</string>
@ -204,7 +203,7 @@
<string name="synopsis">Korte inhoud</string> <string name="synopsis">Korte inhoud</string>
<string name="queued">wachtrij</string> <string name="queued">wachtrij</string>
<string name="no_subtitles">Geen ondertiteling</string> <string name="no_subtitles">Geen ondertiteling</string>
<string name="default_subtitles">Standaard</string> <string name="action_default">Standaard</string>
<string name="free_storage">Vrij</string> <string name="free_storage">Vrij</string>
<string name="used_storage">Gebruikt</string> <string name="used_storage">Gebruikt</string>
<string name="app_storage">App</string> <string name="app_storage">App</string>
@ -573,6 +572,5 @@
<string name="automatic_plugin_download_mode_title">Selecteer een modus om het downloaden van plug-ins te filteren</string> <string name="automatic_plugin_download_mode_title">Selecteer een modus om het downloaden van plug-ins te filteren</string>
<string name="disable">Uitzetten</string> <string name="disable">Uitzetten</string>
<string name="unable_to_inflate">De gebruikersinterface kon niet correct worden gemaakt, dit is een ERNSTIG PROBLEEM en moet onmiddellijk gerapporteerd worden %s</string> <string name="unable_to_inflate">De gebruikersinterface kon niet correct worden gemaakt, dit is een ERNSTIG PROBLEEM en moet onmiddellijk gerapporteerd worden %s</string>
<string name="default_account">@string/default_subtitles</string>
<string name="already_voted">Je hebt al gestemd</string> <string name="already_voted">Je hebt al gestemd</string>
</resources> </resources>

View file

@ -63,7 +63,6 @@
<string name="action_remove_from_bookmarks">Fjern</string> <string name="action_remove_from_bookmarks">Fjern</string>
<string name="action_add_to_bookmarks">Sett visingstatus</string> <string name="action_add_to_bookmarks">Sett visingstatus</string>
<string name="sort_apply">Bruk</string> <string name="sort_apply">Bruk</string>
<string name="sort_cancel">Avbryt</string>
<string name="sort_copy">Kopier</string> <string name="sort_copy">Kopier</string>
<string name="sort_clear">Tøm</string> <string name="sort_clear">Tøm</string>
<string name="sort_save">Lagre</string> <string name="sort_save">Lagre</string>
@ -113,6 +112,7 @@
<string name="no_episodes_found">Ingen episodar blei funnen</string> <string name="no_episodes_found">Ingen episodar blei funnen</string>
<string name="delete_file">Slett fil</string> <string name="delete_file">Slett fil</string>
<string name="delete">Slett</string> <string name="delete">Slett</string>
<string name="cancel">Avbryt</string>
<string name="pause">Pause</string> <string name="pause">Pause</string>
<string name="resume">Gjenoppta</string> <string name="resume">Gjenoppta</string>
<string name="go_back_30">-30</string> <string name="go_back_30">-30</string>
@ -129,7 +129,7 @@
<string name="synopsis">Om</string> <string name="synopsis">Om</string>
<string name="queued">i kø</string> <string name="queued">i kø</string>
<string name="no_subtitles">Ingen undertekstar</string> <string name="no_subtitles">Ingen undertekstar</string>
<string name="default_subtitles">Standard</string> <string name="action_default">Standard</string>
<string name="used_storage">Brukt</string> <string name="used_storage">Brukt</string>
<string name="app_storage">Program</string> <string name="app_storage">Program</string>
<string name="movies">Filmar</string> <string name="movies">Filmar</string>
@ -166,7 +166,6 @@
<string name="go_back_img_des">Gå tilbake</string> <string name="go_back_img_des">Gå tilbake</string>
<string name="result_tags">Sjangrar</string> <string name="result_tags">Sjangrar</string>
<string name="result_share">Dele</string> <string name="result_share">Dele</string>
<string name="type_none">Ingen</string>
<string name="type_re_watching">Ser om igjen</string> <string name="type_re_watching">Ser om igjen</string>
<string name="update_started">Oppdatering starta</string> <string name="update_started">Oppdatering starta</string>
<string name="popup_resume_download">Fortsett nedlasting</string> <string name="popup_resume_download">Fortsett nedlasting</string>

View file

@ -33,7 +33,6 @@
<string name="type_completed">Fullført</string> <string name="type_completed">Fullført</string>
<string name="type_dropped">Falt</string> <string name="type_dropped">Falt</string>
<string name="type_plan_to_watch">Planlegg å se</string> <string name="type_plan_to_watch">Planlegg å se</string>
<string name="type_none">Ingen</string>
<string name="play_movie_button">Spill filmer</string> <string name="play_movie_button">Spill filmer</string>
<string name="play_torrent_button">Strøm Torrent</string> <string name="play_torrent_button">Strøm Torrent</string>
<string name="pick_source">Kilder</string> <string name="pick_source">Kilder</string>
@ -67,7 +66,6 @@
<string name="error_bookmarks_text">Bokmerker</string> <string name="error_bookmarks_text">Bokmerker</string>
<string name="action_remove_from_bookmarks">Ta bort</string> <string name="action_remove_from_bookmarks">Ta bort</string>
<string name="sort_apply">Søke om</string> <string name="sort_apply">Søke om</string>
<string name="sort_cancel">Avbryt</string>
<string name="player_speed">Spillerhastighet</string> <string name="player_speed">Spillerhastighet</string>
<string name="subtitles_settings">Innstillinger for teksting</string> <string name="subtitles_settings">Innstillinger for teksting</string>
<string name="subs_text_color">Tekstfarge</string> <string name="subs_text_color">Tekstfarge</string>
@ -141,6 +139,7 @@
<string name="episode_short">E</string> <string name="episode_short">E</string>
<string name="delete_file">Slett fil</string> <string name="delete_file">Slett fil</string>
<string name="delete">Slett</string> <string name="delete">Slett</string>
<string name="cancel">Avbryt</string>
<string name="pause">Stopp</string> <string name="pause">Stopp</string>
<string name="resume">Gjenoppta</string> <string name="resume">Gjenoppta</string>
<string name="delete_message">Dette vil slette %s <string name="delete_message">Dette vil slette %s
@ -155,7 +154,7 @@
<string name="synopsis">Om</string> <string name="synopsis">Om</string>
<string name="queued">I kø</string> <string name="queued">I kø</string>
<string name="no_subtitles">Ingen undertekster</string> <string name="no_subtitles">Ingen undertekster</string>
<string name="default_subtitles">Misligholde</string> <string name="action_default">Misligholde</string>
<string name="free_storage">Tilgjengelig</string> <string name="free_storage">Tilgjengelig</string>
<string name="used_storage">Brukt</string> <string name="used_storage">Brukt</string>
<string name="app_storage">applikasjon</string> <string name="app_storage">applikasjon</string>

View file

@ -19,7 +19,6 @@
<string name="player_speed_text_format" formatted="true">ଵେଗ (%.2fଗୁଣ)</string> <string name="player_speed_text_format" formatted="true">ଵେଗ (%.2fଗୁଣ)</string>
<string name="type_dropped">ତ୍ୟାଗିଛନ୍ତି</string> <string name="type_dropped">ତ୍ୟାଗିଛନ୍ତି</string>
<string name="type_plan_to_watch">ଦେଖିବା ପାଇଁ ଇଚ୍ଛୁକ</string> <string name="type_plan_to_watch">ଦେଖିବା ପାଇଁ ଇଚ୍ଛୁକ</string>
<string name="type_none">କିଛି ନାହିଁ</string>
<string name="home_more_info">ଅଧିକ ସୂଚନା</string> <string name="home_more_info">ଅଧିକ ସୂଚନା</string>
<string name="cast_format" formatted="true">ପାତ୍ର: %s</string> <string name="cast_format" formatted="true">ପାତ୍ର: %s</string>
<string name="result_poster_img_des">ପୋଷ୍ଟର୍</string> <string name="result_poster_img_des">ପୋଷ୍ଟର୍</string>
@ -42,7 +41,7 @@
<string name="episode_short"></string> <string name="episode_short"></string>
<string name="episode_poster_img_des">ଅଧ୍ୟାୟର ପୋଷ୍ଟର୍</string> <string name="episode_poster_img_des">ଅଧ୍ୟାୟର ପୋଷ୍ଟର୍</string>
<string name="home_main_poster_img_des">ମୁଖ୍ୟ ପୋଷ୍ଟର୍</string> <string name="home_main_poster_img_des">ମୁଖ୍ୟ ପୋଷ୍ଟର୍</string>
<string name="default_subtitles">ଡିଫଲ୍ଟ</string> <string name="action_default">ଡିଫଲ୍ଟ</string>
<string name="extension_language">ଭାଷା</string> <string name="extension_language">ଭାଷା</string>
<string name="no">ନାହିଁ</string> <string name="no">ନାହିଁ</string>
<string name="extension_description">ଵର୍ଣ୍ଣନା</string> <string name="extension_description">ଵର୍ଣ୍ଣନା</string>

View file

@ -35,7 +35,6 @@
<string name="type_completed">Zakończone</string> <string name="type_completed">Zakończone</string>
<string name="type_dropped">Porzucone</string> <string name="type_dropped">Porzucone</string>
<string name="type_plan_to_watch">Planowane</string> <string name="type_plan_to_watch">Planowane</string>
<string name="type_none">Brak</string>
<string name="type_re_watching">Ponowne oglądanie</string> <string name="type_re_watching">Ponowne oglądanie</string>
<string name="play_movie_button">Odtwórz film</string> <string name="play_movie_button">Odtwórz film</string>
<string name="play_livestream_button">Odtwórz transmisję na żywo</string> <string name="play_livestream_button">Odtwórz transmisję na żywo</string>
@ -72,7 +71,6 @@
<string name="action_remove_from_bookmarks">Usuń</string> <string name="action_remove_from_bookmarks">Usuń</string>
<string name="action_add_to_bookmarks">Ustaw status oglądania</string> <string name="action_add_to_bookmarks">Ustaw status oglądania</string>
<string name="sort_apply">Zastosuj</string> <string name="sort_apply">Zastosuj</string>
<string name="sort_cancel">Anuluj</string>
<string name="sort_copy">Kopiuj</string> <string name="sort_copy">Kopiuj</string>
<string name="sort_close">Zamknij</string> <string name="sort_close">Zamknij</string>
<string name="sort_clear">Wyczyść</string> <string name="sort_clear">Wyczyść</string>
@ -181,6 +179,7 @@
<string name="no_episodes_found">Nie znaleziono odcinków</string> <string name="no_episodes_found">Nie znaleziono odcinków</string>
<string name="delete_file">Usuń plik</string> <string name="delete_file">Usuń plik</string>
<string name="delete">Usuń</string> <string name="delete">Usuń</string>
<string name="cancel">Anuluj</string>
<string name="pause">Wstrzymaj</string> <string name="pause">Wstrzymaj</string>
<string name="resume">Odtwórz</string> <string name="resume">Odtwórz</string>
<string name="go_back_30">-30</string> <string name="go_back_30">-30</string>
@ -199,7 +198,7 @@
<string name="synopsis">Streszczenie</string> <string name="synopsis">Streszczenie</string>
<string name="queued">W kolejce</string> <string name="queued">W kolejce</string>
<string name="no_subtitles">Brak napisów</string> <string name="no_subtitles">Brak napisów</string>
<string name="default_subtitles">Domyślne</string> <string name="action_default">Domyślne</string>
<string name="free_storage">Wolne</string> <string name="free_storage">Wolne</string>
<string name="used_storage">W użyciu</string> <string name="used_storage">W użyciu</string>
<string name="app_storage">Aplikacja</string> <string name="app_storage">Aplikacja</string>
@ -552,7 +551,6 @@
<string name="unable_to_inflate">Nie można było poprawnie utworzyć interfejsu użytkownika, jest to POWAŻNY BŁĄD i należy go natychmiast zgłosić %s</string> <string name="unable_to_inflate">Nie można było poprawnie utworzyć interfejsu użytkownika, jest to POWAŻNY BŁĄD i należy go natychmiast zgłosić %s</string>
<string name="automatic_plugin_download_mode_title">Wybierz tryb filtrowania pobieranych rozszerzeń</string> <string name="automatic_plugin_download_mode_title">Wybierz tryb filtrowania pobieranych rozszerzeń</string>
<string name="disable">Wyłączać</string> <string name="disable">Wyłączać</string>
<string name="default_account">@string/default_subtitles</string>
<string name="no_plugins_found_error">Nie znaleziono żadnych wtyczek w repozytorium</string> <string name="no_plugins_found_error">Nie znaleziono żadnych wtyczek w repozytorium</string>
<string name="already_voted">Już oddano głos</string> <string name="already_voted">Już oddano głos</string>
<string name="no_repository_found_error">Nie znaleziono tego repozytorium, sprawdź adres URL lub spróbuj połączyć się przez VPN</string> <string name="no_repository_found_error">Nie znaleziono tego repozytorium, sprawdź adres URL lub spróbuj połączyć się przez VPN</string>

View file

@ -42,7 +42,6 @@
<string name="type_completed">Concluído</string> <string name="type_completed">Concluído</string>
<string name="type_dropped">Desistido</string> <string name="type_dropped">Desistido</string>
<string name="type_plan_to_watch">Pretendo assistir</string> <string name="type_plan_to_watch">Pretendo assistir</string>
<string name="type_none">Nenhum</string>
<string name="type_re_watching">Reassistindo</string> <string name="type_re_watching">Reassistindo</string>
<string name="play_movie_button">Reproduzir filme</string> <string name="play_movie_button">Reproduzir filme</string>
<string name="play_livestream_button">Reproduzir transmissão ao vivo</string> <string name="play_livestream_button">Reproduzir transmissão ao vivo</string>
@ -78,7 +77,6 @@
<string name="error_bookmarks_text">Marcadores</string> <string name="error_bookmarks_text">Marcadores</string>
<string name="action_remove_from_bookmarks">Remover</string> <string name="action_remove_from_bookmarks">Remover</string>
<string name="sort_apply">Aplicar</string> <string name="sort_apply">Aplicar</string>
<string name="sort_cancel">Cancelar</string>
<string name="sort_copy">Copiar</string> <string name="sort_copy">Copiar</string>
<string name="sort_close">Fechar</string> <string name="sort_close">Fechar</string>
<string name="sort_clear">Limpar</string> <string name="sort_clear">Limpar</string>
@ -182,6 +180,7 @@
<string name="no_episodes_found">Nenhum Episódio encontrado</string> <string name="no_episodes_found">Nenhum Episódio encontrado</string>
<string name="delete_file">Eliminar Ficheiro</string> <string name="delete_file">Eliminar Ficheiro</string>
<string name="delete">Eliminar</string> <string name="delete">Eliminar</string>
<string name="cancel">Cancelar</string>
<string name="pause">Pôr em Pausa</string> <string name="pause">Pôr em Pausa</string>
<string name="resume">Retomar</string> <string name="resume">Retomar</string>
<string name="delete_message" formatted="true">Isto apagará %s permanentemente <string name="delete_message" formatted="true">Isto apagará %s permanentemente
@ -198,7 +197,7 @@
<string name="synopsis">Sinopse</string> <string name="synopsis">Sinopse</string>
<string name="queued">Na fila</string> <string name="queued">Na fila</string>
<string name="no_subtitles">Sem Legendas</string> <string name="no_subtitles">Sem Legendas</string>
<string name="default_subtitles">Padrão</string> <string name="action_default">Padrão</string>
<string name="free_storage">Livre</string> <string name="free_storage">Livre</string>
<string name="used_storage">Usado</string> <string name="used_storage">Usado</string>
<string name="app_storage">App</string> <string name="app_storage">App</string>
@ -548,7 +547,6 @@
\nNOTA: Se a soma for 10 ou mais, o leitor saltará automaticamente o carregamento quando essa ligação for carregada!</string> \nNOTA: Se a soma for 10 ou mais, o leitor saltará automaticamente o carregamento quando essa ligação for carregada!</string>
<string name="automatic_plugin_download_mode_title">Selecionar o modo para filtrar a transferência de plug-ins</string> <string name="automatic_plugin_download_mode_title">Selecionar o modo para filtrar a transferência de plug-ins</string>
<string name="unable_to_inflate">Não foi possível criar corretamente a interface do utilizador, trata-se de um GRANDE BUG e deve ser comunicado imediatamente %s</string> <string name="unable_to_inflate">Não foi possível criar corretamente a interface do utilizador, trata-se de um GRANDE BUG e deve ser comunicado imediatamente %s</string>
<string name="default_account">\@ string/legendas_padrão</string>
<string name="disable">Desativar</string> <string name="disable">Desativar</string>
<string name="no_plugins_found_error">Não foram encontrados plugins no repositório</string> <string name="no_plugins_found_error">Não foram encontrados plugins no repositório</string>
<string name="no_repository_found_error">Repositório não encontrado, verifique o URL e tente a VPN</string> <string name="no_repository_found_error">Repositório não encontrado, verifique o URL e tente a VPN</string>

View file

@ -23,7 +23,6 @@
<string name="type_completed">ahhahooo</string> <string name="type_completed">ahhahooo</string>
<string name="type_dropped">ooooo haa</string> <string name="type_dropped">ooooo haa</string>
<string name="type_plan_to_watch">aaahhuoh</string> <string name="type_plan_to_watch">aaahhuoh</string>
<string name="type_none">aaaghh</string>
<string name="play_movie_button">aaaaa aaaghh</string> <string name="play_movie_button">aaaaa aaaghh</string>
<string name="play_torrent_button">aaaghhaaahhu aaaaa</string> <string name="play_torrent_button">aaaghhaaahhu aaaaa</string>
<string name="pick_source">oha aauuh</string> <string name="pick_source">oha aauuh</string>
@ -51,7 +50,6 @@
<string name="error_bookmarks_text">oouuh ooh</string> <string name="error_bookmarks_text">oouuh ooh</string>
<string name="action_remove_from_bookmarks">aauuh ooh</string> <string name="action_remove_from_bookmarks">aauuh ooh</string>
<string name="sort_apply">oouuhaooo-ahah</string> <string name="sort_apply">oouuhaooo-ahah</string>
<string name="sort_cancel">oooohh</string>
<string name="player_speed">oouuh aauuh oha</string> <string name="player_speed">oouuh aauuh oha</string>
<string name="subtitles_settings">ouuhhhooooooh ooo-ahah</string> <string name="subtitles_settings">ouuhhhooooooh ooo-ahah</string>
<string name="subs_text_color">ohaouuhhh</string> <string name="subs_text_color">ohaouuhhh</string>
@ -122,6 +120,7 @@
<string name="episode_short">A</string> <string name="episode_short">A</string>
<string name="delete_file">ooha ohahaaahoooa ahahooo</string> <string name="delete_file">ooha ohahaaahoooa ahahooo</string>
<string name="delete">oooooah</string> <string name="delete">oooooah</string>
<string name="cancel">oooohh</string>
<string name="delete_message">aahhaaaaaahooo aauuh aaahhuaooo-ahahoooohh aoouuhoohoohooo-ahah %s</string> <string name="delete_message">aahhaaaaaahooo aauuh aaahhuaooo-ahahoooohh aoouuhoohoohooo-ahah %s</string>
<string name="status_ongoing">aaaghhaaaaa</string> <string name="status_ongoing">aaaghhaaaaa</string>
<string name="status_completed">aauuhaauuh</string> <string name="status_completed">aauuhaauuh</string>
@ -133,7 +132,7 @@
<string name="synopsis">aauugghh ohaaauugghh</string> <string name="synopsis">aauugghh ohaaauugghh</string>
<string name="queued">haaouuhhh</string> <string name="queued">haaouuhhh</string>
<string name="no_subtitles">ahaaaaaaaaaahaaaauugghh</string> <string name="no_subtitles">ahaaaaaaaaaahaaaauugghh</string>
<string name="default_subtitles">ahooooh</string> <string name="action_default">ahooooh</string>
<string name="free_storage">ooo-ahahaaaaa</string> <string name="free_storage">ooo-ahahaaaaa</string>
<string name="used_storage">ahhahhh</string> <string name="used_storage">ahhahhh</string>
<string name="app_storage">aauugghh</string> <string name="app_storage">aauugghh</string>

View file

@ -43,7 +43,6 @@
<string name="type_completed">Finalizat</string> <string name="type_completed">Finalizat</string>
<string name="type_dropped">Renunțat</string> <string name="type_dropped">Renunțat</string>
<string name="type_plan_to_watch">Planificare pentru a urmări</string> <string name="type_plan_to_watch">Planificare pentru a urmări</string>
<string name="type_none">Anuleaza</string>
<string name="type_re_watching">Reurmat</string> <string name="type_re_watching">Reurmat</string>
<string name="play_movie_button">Urmărește</string> <string name="play_movie_button">Urmărește</string>
<string name="play_torrent_button">Stream Torrent</string> <string name="play_torrent_button">Stream Torrent</string>
@ -79,7 +78,6 @@
<string name="action_remove_from_bookmarks">Eliminează</string> <string name="action_remove_from_bookmarks">Eliminează</string>
<string name="action_add_to_bookmarks">Adaugă</string> <string name="action_add_to_bookmarks">Adaugă</string>
<string name="sort_apply">Aplică</string> <string name="sort_apply">Aplică</string>
<string name="sort_cancel">Anulează</string>
<string name="sort_copy">Copiază</string> <string name="sort_copy">Copiază</string>
<string name="sort_close">Închide</string> <string name="sort_close">Închide</string>
<string name="sort_clear">Elimină</string> <string name="sort_clear">Elimină</string>
@ -181,6 +179,7 @@
<string name="no_episodes_found">Nu s-au găsit episoade</string> <string name="no_episodes_found">Nu s-au găsit episoade</string>
<string name="delete_file">Ștergeți fișierul</string> <string name="delete_file">Ștergeți fișierul</string>
<string name="delete">Ștergeți</string> <string name="delete">Ștergeți</string>
<string name="cancel">Anulează</string>
<string name="pause">Pauză</string> <string name="pause">Pauză</string>
<string name="resume">Continuă</string> <string name="resume">Continuă</string>
<string name="go_back_30">-30</string> <string name="go_back_30">-30</string>
@ -199,7 +198,7 @@
<string name="synopsis">Rezumat</string> <string name="synopsis">Rezumat</string>
<string name="queued">În coada de așteptare</string> <string name="queued">În coada de așteptare</string>
<string name="no_subtitles">Nu există subtitrare</string> <string name="no_subtitles">Nu există subtitrare</string>
<string name="default_subtitles">Implicit</string> <string name="action_default">Implicit</string>
<string name="free_storage">Liber</string> <string name="free_storage">Liber</string>
<string name="used_storage">Folosit</string> <string name="used_storage">Folosit</string>
<string name="app_storage">Aplicație</string> <string name="app_storage">Aplicație</string>
@ -569,6 +568,5 @@
<string name="use">Utilizați</string> <string name="use">Utilizați</string>
<string name="unable_to_inflate">UI nu a putut fi creată corect, acesta este un BUG MAJOR și trebuie raportat imediat %s</string> <string name="unable_to_inflate">UI nu a putut fi creată corect, acesta este un BUG MAJOR și trebuie raportat imediat %s</string>
<string name="automatic_plugin_download_mode_title">Selectați modul de filtrare a descărcării plugin-urilor</string> <string name="automatic_plugin_download_mode_title">Selectați modul de filtrare a descărcării plugin-urilor</string>
<string name="default_account">@string/default_subtitles</string>
<string name="already_voted">Ați votat deja</string> <string name="already_voted">Ați votat deja</string>
</resources> </resources>

View file

@ -12,6 +12,7 @@
<string name="download_failed">Скачать неудачный</string> <string name="download_failed">Скачать неудачный</string>
<string name="resize_fit">Подогнать</string> <string name="resize_fit">Подогнать</string>
<string name="delete">Удалить</string> <string name="delete">Удалить</string>
<string name="cancel">Отмена</string>
<string name="all">Все</string> <string name="all">Все</string>
<string name="pause">Пауза</string> <string name="pause">Пауза</string>
<string name="cast_format" formatted="true">Актёрский состав: %s</string> <string name="cast_format" formatted="true">Актёрский состав: %s</string>
@ -58,7 +59,6 @@
<string name="type_completed">Завершено</string> <string name="type_completed">Завершено</string>
<string name="type_dropped">Брошенный</string> <string name="type_dropped">Брошенный</string>
<string name="type_plan_to_watch">План посмотреть</string> <string name="type_plan_to_watch">План посмотреть</string>
<string name="type_none">Нет</string>
<string name="type_re_watching">Пересмотрю</string> <string name="type_re_watching">Пересмотрю</string>
<string name="play_movie_button">Смотреть фильм</string> <string name="play_movie_button">Смотреть фильм</string>
<string name="play_trailer_button">Смотреть трейлер</string> <string name="play_trailer_button">Смотреть трейлер</string>
@ -82,7 +82,6 @@
<string name="filter_bookmarks">Фильтр закладки</string> <string name="filter_bookmarks">Фильтр закладки</string>
<string name="error_bookmarks_text">Закладки</string> <string name="error_bookmarks_text">Закладки</string>
<string name="sort_apply">Применить</string> <string name="sort_apply">Применить</string>
<string name="sort_cancel">Отмена</string>
<string name="sort_copy">Копия</string> <string name="sort_copy">Копия</string>
<string name="sort_close">Закрыть</string> <string name="sort_close">Закрыть</string>
<string name="sort_clear">Очистить</string> <string name="sort_clear">Очистить</string>
@ -186,7 +185,7 @@
<string name="rating">Рейтинг</string> <string name="rating">Рейтинг</string>
<string name="duration">Продолжительность</string> <string name="duration">Продолжительность</string>
<string name="no_subtitles">Нет субтитров</string> <string name="no_subtitles">Нет субтитров</string>
<string name="default_subtitles">По умолчанию</string> <string name="action_default">По умолчанию</string>
<string name="app_storage">Приложение</string> <string name="app_storage">Приложение</string>
<string name="anime">Аниме</string> <string name="anime">Аниме</string>
<string name="torrent">Торренты</string> <string name="torrent">Торренты</string>
@ -535,7 +534,6 @@
<string name="edit">Изменить</string> <string name="edit">Изменить</string>
<string name="wifi">Интернет</string> <string name="wifi">Интернет</string>
<string name="profile_background_des">Задний фон профиля</string> <string name="profile_background_des">Задний фон профиля</string>
<string name="default_account">\@строка/обычные_субтитры</string>
<string name="help">Помощь</string> <string name="help">Помощь</string>
<string name="profile_number">Профиль %d</string> <string name="profile_number">Профиль %d</string>
<string name="automatic_plugin_download_mode_title">Выберите режим фильтера плагинов для загрузки</string> <string name="automatic_plugin_download_mode_title">Выберите режим фильтера плагинов для загрузки</string>

View file

@ -33,7 +33,6 @@
<string name="search_hint">Hľadať…</string> <string name="search_hint">Hľadať…</string>
<string name="title_downloads">Sťahovanie</string> <string name="title_downloads">Sťahovanie</string>
<string name="no_data">Žiadne dáta</string> <string name="no_data">Žiadne dáta</string>
<string name="sort_cancel">Zrušiť</string>
<string name="sort_copy">Kopírovať</string> <string name="sort_copy">Kopírovať</string>
<string name="sort_close">Zavrieť</string> <string name="sort_close">Zavrieť</string>
<string name="sort_save">Uložiť</string> <string name="sort_save">Uložiť</string>
@ -60,7 +59,6 @@
<string name="download_canceled">Sťahovanie zrušené</string> <string name="download_canceled">Sťahovanie zrušené</string>
<string name="app_dubbed_text">Dab</string> <string name="app_dubbed_text">Dab</string>
<string name="popup_delete_file">Zmazať súbor</string> <string name="popup_delete_file">Zmazať súbor</string>
<string name="type_none">Žiadny</string>
<string name="app_subbed_text">Tit</string> <string name="app_subbed_text">Tit</string>
<string name="type_re_watching">Opätovné sledovanie</string> <string name="type_re_watching">Opätovné sledovanie</string>
<string name="popup_play_file">Prehrať súbor</string> <string name="popup_play_file">Prehrať súbor</string>
@ -265,7 +263,7 @@
<string name="preferred_media_settings">Preferované médiá</string> <string name="preferred_media_settings">Preferované médiá</string>
<string name="nginx_url_pref">URL servera NGINX</string> <string name="nginx_url_pref">URL servera NGINX</string>
<string name="episode_format" formatted="true">%d %s</string> <string name="episode_format" formatted="true">%d %s</string>
<string name="default_subtitles">Predvolené</string> <string name="action_default">Predvolené</string>
<string name="add_sync">Pridať sledovanie</string> <string name="add_sync">Pridať sledovanie</string>
<string name="no_season">Žiadna sezóna</string> <string name="no_season">Žiadna sezóna</string>
<string name="episode">Epizóda</string> <string name="episode">Epizóda</string>
@ -293,6 +291,7 @@
<string name="year">Rok</string> <string name="year">Rok</string>
<string name="resize_fit">Prispôsobiť obrazovke</string> <string name="resize_fit">Prispôsobiť obrazovke</string>
<string name="delete">Zmazať</string> <string name="delete">Zmazať</string>
<string name="cancel">Zrušiť</string>
<string name="used_storage">Využité</string> <string name="used_storage">Využité</string>
<string name="show_hd">Štítok kvality</string> <string name="show_hd">Štítok kvality</string>
<string name="android_tv_interface_off_seek_settings">Prehrávač skrytý - dĺžka pretočenia</string> <string name="android_tv_interface_off_seek_settings">Prehrávač skrytý - dĺžka pretočenia</string>

View file

@ -10,6 +10,7 @@
<string name="download_failed">Dejintii ma guulaysan</string> <string name="download_failed">Dejintii ma guulaysan</string>
<string name="search">Raadi</string> <string name="search">Raadi</string>
<string name="delete">Tirtir</string> <string name="delete">Tirtir</string>
<string name="cancel">Jooji</string>
<string name="pause">Haki</string> <string name="pause">Haki</string>
<string name="queued">Horran</string> <string name="queued">Horran</string>
<string name="resize_fit">Le-ekaysii shaashadda</string> <string name="resize_fit">Le-ekaysii shaashadda</string>
@ -46,7 +47,6 @@
<string name="type_completed">Dhamaystirmay</string> <string name="type_completed">Dhamaystirmay</string>
<string name="type_dropped">Soo dhacay</string> <string name="type_dropped">Soo dhacay</string>
<string name="type_plan_to_watch">Ku talo jira</string> <string name="type_plan_to_watch">Ku talo jira</string>
<string name="type_none">Midna</string>
<string name="play_movie_button">Daaro filinka</string> <string name="play_movie_button">Daaro filinka</string>
<string name="play_trailer_button">Daar goos-gooska</string> <string name="play_trailer_button">Daar goos-gooska</string>
<string name="subs_window_color">Midabka daaqadda</string> <string name="subs_window_color">Midabka daaqadda</string>
@ -56,7 +56,6 @@
<string name="play_torrent_button">Daalaco toorentiga</string> <string name="play_torrent_button">Daalaco toorentiga</string>
<string name="pick_subtitle">Qrl-hoosaadka</string> <string name="pick_subtitle">Qrl-hoosaadka</string>
<string name="popup_resume_download">Dib u bilow dejinta</string> <string name="popup_resume_download">Dib u bilow dejinta</string>
<string name="sort_cancel">Jooji</string>
<string name="subs_background_color">Midabka dambeedka</string> <string name="subs_background_color">Midabka dambeedka</string>
<string name="pick_source">Xigashooyinka</string> <string name="pick_source">Xigashooyinka</string>
<string name="reload_error">Dib u xidhiidhinaya…</string> <string name="reload_error">Dib u xidhiidhinaya…</string>
@ -202,7 +201,7 @@
<string name="duration">Muddada</string> <string name="duration">Muddada</string>
<string name="used_storage">La isticmaalay</string> <string name="used_storage">La isticmaalay</string>
<string name="no_subtitles">Qrl-hoosaad ma leh</string> <string name="no_subtitles">Qrl-hoosaad ma leh</string>
<string name="default_subtitles">Sidiisaa</string> <string name="action_default">Sidiisaa</string>
<string name="free_storage">Bilaash</string> <string name="free_storage">Bilaash</string>
<string name="app_storage">Appka</string> <string name="app_storage">Appka</string>
<string name="cartoons_singular">Kartoob</string> <string name="cartoons_singular">Kartoob</string>

View file

@ -26,7 +26,6 @@
<string name="type_completed">Avslutad</string> <string name="type_completed">Avslutad</string>
<string name="type_dropped">Dropped</string> <string name="type_dropped">Dropped</string>
<string name="type_plan_to_watch">Plannerad</string> <string name="type_plan_to_watch">Plannerad</string>
<string name="type_none">Ingen</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>
@ -53,7 +52,6 @@
<string name="error_bookmarks_text">Bokmärken</string> <string name="error_bookmarks_text">Bokmärken</string>
<string name="action_remove_from_bookmarks">Ta bort</string> <string name="action_remove_from_bookmarks">Ta bort</string>
<string name="sort_apply">Tillämpa</string> <string name="sort_apply">Tillämpa</string>
<string name="sort_cancel">Avbryt</string>
<string name="player_speed">Spelarhastighet</string> <string name="player_speed">Spelarhastighet</string>
<string name="subtitles_settings">Undertextinställningar</string> <string name="subtitles_settings">Undertextinställningar</string>
<string name="subs_text_color">Textfärg</string> <string name="subs_text_color">Textfärg</string>
@ -125,6 +123,7 @@
<string name="episode_short">A</string> <string name="episode_short">A</string>
<string name="delete_file">Ta bort nerladdad fil</string> <string name="delete_file">Ta bort nerladdad fil</string>
<string name="delete">Ta bort</string> <string name="delete">Ta bort</string>
<string name="cancel">Avbryt</string>
<string name="delete_message">%s kommer att raderas permanent <string name="delete_message">%s kommer att raderas permanent
\nÄr du helt säker\?</string> \nÄr du helt säker\?</string>
<string name="status_ongoing">Pågående</string> <string name="status_ongoing">Pågående</string>
@ -137,7 +136,7 @@
<string name="synopsis">Sammanfattning</string> <string name="synopsis">Sammanfattning</string>
<string name="queued">på kö</string> <string name="queued">på kö</string>
<string name="no_subtitles">Inga undertexter</string> <string name="no_subtitles">Inga undertexter</string>
<string name="default_subtitles">Standard</string> <string name="action_default">Standard</string>
<string name="free_storage">Tillgängligt</string> <string name="free_storage">Tillgängligt</string>
<string name="used_storage">Använtt</string> <string name="used_storage">Använtt</string>
<string name="app_storage">App</string> <string name="app_storage">App</string>

View file

@ -38,7 +38,6 @@
<string name="home_more_info">மேலும் தகவல்கள்</string> <string name="home_more_info">மேலும் தகவல்கள்</string>
<string name="home_expanded_hide">மறை</string> <string name="home_expanded_hide">மறை</string>
<string name="action_remove_from_bookmarks">நீக்கு</string> <string name="action_remove_from_bookmarks">நீக்கு</string>
<string name="sort_cancel">ரத்து செய்க</string>
<string name="sort_clear">நீக்கு</string> <string name="sort_clear">நீக்கு</string>
<string name="sort_save">சேமிக்கவும்</string> <string name="sort_save">சேமிக்கவும்</string>
<string name="subs_text_color">உரை வண்ணம்</string> <string name="subs_text_color">உரை வண்ணம்</string>
@ -63,7 +62,6 @@
<string name="cast_format" formatted="true">நடிகர்கள்: %s</string> <string name="cast_format" formatted="true">நடிகர்கள்: %s</string>
<string name="go_back_img_des">பின் செல்</string> <string name="go_back_img_des">பின் செல்</string>
<string name="title_settings">அமைப்புகள்</string> <string name="title_settings">அமைப்புகள்</string>
<string name="type_none">ஏதும் இல்லை</string>
<string name="loading">ஏற்றுகிறது…</string> <string name="loading">ஏற்றுகிறது…</string>
<string name="type_dropped">கைவிடப்பட்டது</string> <string name="type_dropped">கைவிடப்பட்டது</string>
<string name="download_done">பதிவிறக்கம் முடிந்தது</string> <string name="download_done">பதிவிறக்கம் முடிந்தது</string>

View file

@ -36,7 +36,6 @@
<string name="type_completed">Tapos nang panoorin</string> <string name="type_completed">Tapos nang panoorin</string>
<string name="type_dropped">Ayaw nang panoorin</string> <string name="type_dropped">Ayaw nang panoorin</string>
<string name="type_plan_to_watch">Balak panoorin</string> <string name="type_plan_to_watch">Balak panoorin</string>
<string name="type_none">None</string>
<string name="play_movie_button">I-play ang Movie</string> <string name="play_movie_button">I-play ang Movie</string>
<string name="play_torrent_button">Stream Torrent</string> <string name="play_torrent_button">Stream Torrent</string>
<string name="pick_source">Sources</string> <string name="pick_source">Sources</string>
@ -70,7 +69,6 @@
<string name="error_bookmarks_text">Bookmark</string> <string name="error_bookmarks_text">Bookmark</string>
<string name="action_remove_from_bookmarks">Tanggalin</string> <string name="action_remove_from_bookmarks">Tanggalin</string>
<string name="sort_apply">Kumpirmahin</string> <string name="sort_apply">Kumpirmahin</string>
<string name="sort_cancel">Kanselahin</string>
<string name="player_speed">Bilis ng Playback</string> <string name="player_speed">Bilis ng Playback</string>
<string name="subtitles_settings">Subtitle Setting</string> <string name="subtitles_settings">Subtitle Setting</string>
<string name="subs_text_color">Kulay ng Teksto</string> <string name="subs_text_color">Kulay ng Teksto</string>
@ -144,6 +142,7 @@
<string name="episode_short">E</string> <string name="episode_short">E</string>
<string name="delete_file">Burahin ang file</string> <string name="delete_file">Burahin ang file</string>
<string name="delete">Tanggalin</string> <string name="delete">Tanggalin</string>
<string name="cancel">Kanselahin</string>
<string name="pause">I-pause</string> <string name="pause">I-pause</string>
<string name="resume">I-resume</string> <string name="resume">I-resume</string>
<string name="delete_message">This will permanently delete %s <string name="delete_message">This will permanently delete %s
@ -158,7 +157,7 @@
<string name="synopsis">Sinopsis</string> <string name="synopsis">Sinopsis</string>
<string name="queued">nakapila</string> <string name="queued">nakapila</string>
<string name="no_subtitles">walang subtitles</string> <string name="no_subtitles">walang subtitles</string>
<string name="default_subtitles">Default</string> <string name="action_default">Default</string>
<string name="free_storage">Bakante</string> <string name="free_storage">Bakante</string>
<string name="used_storage">Gamit</string> <string name="used_storage">Gamit</string>
<string name="app_storage">App</string> <string name="app_storage">App</string>

View file

@ -57,7 +57,6 @@
<string name="type_completed">Tamamlandı</string> <string name="type_completed">Tamamlandı</string>
<string name="type_dropped">Bırakıldı</string> <string name="type_dropped">Bırakıldı</string>
<string name="type_plan_to_watch">Planlandı</string> <string name="type_plan_to_watch">Planlandı</string>
<string name="type_none">Hiçbiri</string>
<string name="type_re_watching">Yeniden izleniyor</string> <string name="type_re_watching">Yeniden izleniyor</string>
<string name="play_movie_button">Filmi oynat</string> <string name="play_movie_button">Filmi oynat</string>
<string name="play_livestream_button">Canlı yayını oynat</string> <string name="play_livestream_button">Canlı yayını oynat</string>
@ -96,7 +95,6 @@
<string name="action_remove_from_bookmarks">Kaldır</string> <string name="action_remove_from_bookmarks">Kaldır</string>
<string name="action_add_to_bookmarks">İzleme durumunu ayarla</string> <string name="action_add_to_bookmarks">İzleme durumunu ayarla</string>
<string name="sort_apply">Uygula</string> <string name="sort_apply">Uygula</string>
<string name="sort_cancel">İptal et</string>
<string name="sort_copy">Kopyala</string> <string name="sort_copy">Kopyala</string>
<string name="sort_close">Kapat</string> <string name="sort_close">Kapat</string>
<string name="sort_clear">Temizle</string> <string name="sort_clear">Temizle</string>
@ -205,7 +203,7 @@
<string name="no_episodes_found">Bölüm bulunamadı</string> <string name="no_episodes_found">Bölüm bulunamadı</string>
<string name="delete_file">Dosyayı sil</string> <string name="delete_file">Dosyayı sil</string>
<string name="delete">Sil</string> <string name="delete">Sil</string>
<string name="cancel" translatable="false">@string/sort_cancel</string> <string name="cancel">İptal et</string>
<string name="pause">Durdur</string> <string name="pause">Durdur</string>
<string name="resume">Sürdür</string> <string name="resume">Sürdür</string>
<string name="go_back_30">-30</string> <string name="go_back_30">-30</string>
@ -224,7 +222,7 @@
<string name="synopsis">Özet</string> <string name="synopsis">Özet</string>
<string name="queued">Sıraya alındı</string> <string name="queued">Sıraya alındı</string>
<string name="no_subtitles">Alt yazı yok</string> <string name="no_subtitles">Alt yazı yok</string>
<string name="default_subtitles">Varsayılan</string> <string name="action_default">Varsayılan</string>
<string name="free_storage">Boş</string> <string name="free_storage">Boş</string>
<string name="used_storage">Kullanılan</string> <string name="used_storage">Kullanılan</string>
<string name="app_storage">Uygulama</string> <string name="app_storage">Uygulama</string>

View file

@ -112,9 +112,7 @@
<string name="popup_play_file">Переглянути файл</string> <string name="popup_play_file">Переглянути файл</string>
<string name="home_more_info">Детальніше</string> <string name="home_more_info">Детальніше</string>
<string name="filter_bookmarks">Фільтр закладок</string> <string name="filter_bookmarks">Фільтр закладок</string>
<string name="type_none">Нічого</string> <string name="sort_clear">Очистити</string>
<string name="sort_cancel">Скасувати</string>
<string name="sort_clear">Очистити</string>
<string name="subtitles_settings">Налаштування субтитрів</string> <string name="subtitles_settings">Налаштування субтитрів</string>
<string name="subs_background_color">Колір фону</string> <string name="subs_background_color">Колір фону</string>
<string name="subs_subtitle_elevation">Висота субтитрів</string> <string name="subs_subtitle_elevation">Висота субтитрів</string>
@ -174,6 +172,7 @@
<string name="episode_short">Е</string> <string name="episode_short">Е</string>
<string name="delete_file">Видалити файл</string> <string name="delete_file">Видалити файл</string>
<string name="delete">Видалити</string> <string name="delete">Видалити</string>
<string name="cancel">Скасувати</string>
<string name="resume">Відновити</string> <string name="resume">Відновити</string>
<string name="go_back_30">-30</string> <string name="go_back_30">-30</string>
<string name="delete_message" formatted="true">Це назавжди видалить %s <string name="delete_message" formatted="true">Це назавжди видалить %s
@ -186,7 +185,7 @@
<string name="duration">Тривалість</string> <string name="duration">Тривалість</string>
<string name="queued">у черзі</string> <string name="queued">у черзі</string>
<string name="no_subtitles">Без субтитрів</string> <string name="no_subtitles">Без субтитрів</string>
<string name="default_subtitles">За замовчуванням</string> <string name="action_default">За замовчуванням</string>
<string name="free_storage">Вільно</string> <string name="free_storage">Вільно</string>
<string name="used_storage">Зайнято</string> <string name="used_storage">Зайнято</string>
<string name="app_storage">Застосунок</string> <string name="app_storage">Застосунок</string>
@ -549,7 +548,6 @@
<string name="unable_to_inflate">Не вдалося створити UI коректно, це ВАЖЛИВА ПОМИЛКА, про яку слід негайно повідомити %s</string> <string name="unable_to_inflate">Не вдалося створити UI коректно, це ВАЖЛИВА ПОМИЛКА, про яку слід негайно повідомити %s</string>
<string name="automatic_plugin_download_mode_title">Виберіть режим для фільтрації завантаження плагінів</string> <string name="automatic_plugin_download_mode_title">Виберіть режим для фільтрації завантаження плагінів</string>
<string name="disable">Вимкнути</string> <string name="disable">Вимкнути</string>
<string name="default_account">@string/default_subtitles</string>
<string name="no_repository_found_error">Репозиторій не знайдено, перевірте URL-адресу та спробуйте VPN</string> <string name="no_repository_found_error">Репозиторій не знайдено, перевірте URL-адресу та спробуйте VPN</string>
<string name="no_plugins_found_error">Не знайдено жодних плагінів у репозиторії</string> <string name="no_plugins_found_error">Не знайдено жодних плагінів у репозиторії</string>
<string name="already_voted">Ви вже проголосували</string> <string name="already_voted">Ви вже проголосували</string>

View file

@ -34,7 +34,6 @@
<string name="type_on_hold">معطل</string> <string name="type_on_hold">معطل</string>
<string name="type_dropped">چھوڑ دیا گیا</string> <string name="type_dropped">چھوڑ دیا گیا</string>
<string name="type_plan_to_watch">دیکھنے کا منصوبہ</string> <string name="type_plan_to_watch">دیکھنے کا منصوبہ</string>
<string name="type_none">کوئی نہیں</string>
<string name="type_re_watching">دوبارہ دیکھنا</string> <string name="type_re_watching">دوبارہ دیکھنا</string>
<string name="play_movie_button">مووی لگائے</string> <string name="play_movie_button">مووی لگائے</string>
<string name="play_trailer_button">ٹریلر چلائیں</string> <string name="play_trailer_button">ٹریلر چلائیں</string>
@ -67,7 +66,6 @@
<string name="action_remove_from_bookmarks">ریمو</string> <string name="action_remove_from_bookmarks">ریمو</string>
<string name="action_add_to_bookmarks">واچ اسٹیٹس کو سیٹ کریں</string> <string name="action_add_to_bookmarks">واچ اسٹیٹس کو سیٹ کریں</string>
<string name="sort_apply">لاگو کریں</string> <string name="sort_apply">لاگو کریں</string>
<string name="sort_cancel">منسوخ کریں</string>
<string name="sort_copy">کاپی</string> <string name="sort_copy">کاپی</string>
<string name="sort_close">بند کریں</string> <string name="sort_close">بند کریں</string>
<string name="sort_clear">صاف کریں</string> <string name="sort_clear">صاف کریں</string>
@ -193,6 +191,7 @@
<string name="no_episodes_found">کوئی اقساط نہیں ملی</string> <string name="no_episodes_found">کوئی اقساط نہیں ملی</string>
<string name="delete_file">فائل کو ڈیلیٹ کریں</string> <string name="delete_file">فائل کو ڈیلیٹ کریں</string>
<string name="delete">مٹا دیں</string> <string name="delete">مٹا دیں</string>
<string name="cancel">منسوخ کریں</string>
<string name="pause">توقف</string> <string name="pause">توقف</string>
<string name="resume">از سر نو شروع کریں</string> <string name="resume">از سر نو شروع کریں</string>
<string name="go_back_30">-30</string> <string name="go_back_30">-30</string>
@ -211,7 +210,7 @@
<string name="synopsis">خلاصہ</string> <string name="synopsis">خلاصہ</string>
<string name="queued">قطار میں</string> <string name="queued">قطار میں</string>
<string name="no_subtitles">کوئی سب ٹائٹلز نہیں</string> <string name="no_subtitles">کوئی سب ٹائٹلز نہیں</string>
<string name="default_subtitles">ڈیفالٹ</string> <string name="action_default">ڈیفالٹ</string>
<string name="free_storage">مفت</string> <string name="free_storage">مفت</string>
<string name="used_storage">استعمال شُدہ</string> <string name="used_storage">استعمال شُدہ</string>
<string name="cartoons">کارٹون</string> <string name="cartoons">کارٹون</string>
@ -535,7 +534,6 @@
<string name="edit">ترتیب دیں</string> <string name="edit">ترتیب دیں</string>
<string name="wifi">وائی فائی</string> <string name="wifi">وائی فائی</string>
<string name="profile_background_des">پروفائل پس منظر</string> <string name="profile_background_des">پروفائل پس منظر</string>
<string name="default_account">@string/default_subtitles</string>
<string name="help">مدد</string> <string name="help">مدد</string>
<string name="profile_number">پروفائل %d</string> <string name="profile_number">پروفائل %d</string>
<string name="automatic_plugin_download_mode_title">پلگ انز کو ڈاؤن لوڈ کرنے کے لئے موڈ منتخب کریں</string> <string name="automatic_plugin_download_mode_title">پلگ انز کو ڈاؤن لوڈ کرنے کے لئے موڈ منتخب کریں</string>

View file

@ -45,7 +45,6 @@
<string name="type_completed">Đã xem</string> <string name="type_completed">Đã xem</string>
<string name="type_dropped">Bỏ qua</string> <string name="type_dropped">Bỏ qua</string>
<string name="type_plan_to_watch">Xem sau</string> <string name="type_plan_to_watch">Xem sau</string>
<string name="type_none">Mặc định</string>
<string name="type_re_watching">Xem lại</string> <string name="type_re_watching">Xem lại</string>
<string name="play_movie_button">Xem Ngay</string> <string name="play_movie_button">Xem Ngay</string>
<string name="play_livestream_button">Phát trực tiếp</string> <string name="play_livestream_button">Phát trực tiếp</string>
@ -83,7 +82,6 @@
<string name="action_remove_from_bookmarks">Xóa</string> <string name="action_remove_from_bookmarks">Xóa</string>
<string name="action_add_to_bookmarks">Đặt trạng thái xem</string> <string name="action_add_to_bookmarks">Đặt trạng thái xem</string>
<string name="sort_apply">Áp dụng</string> <string name="sort_apply">Áp dụng</string>
<string name="sort_cancel">Hủy bỏ</string>
<string name="sort_copy">Sao lưu</string> <string name="sort_copy">Sao lưu</string>
<string name="sort_close">Đóng</string> <string name="sort_close">Đóng</string>
<string name="sort_clear">Huỷ bỏ</string> <string name="sort_clear">Huỷ bỏ</string>
@ -190,6 +188,7 @@
<string name="no_episodes_found">Không có tập nào</string> <string name="no_episodes_found">Không có tập nào</string>
<string name="delete_file">Xóa Tệp</string> <string name="delete_file">Xóa Tệp</string>
<string name="delete">Xóa</string> <string name="delete">Xóa</string>
<string name="cancel">Hủy bỏ</string>
<string name="pause">Tạm Dừng</string> <string name="pause">Tạm Dừng</string>
<string name="resume">Tiếp Tục</string> <string name="resume">Tiếp Tục</string>
<string name="go_back_30">-30</string> <string name="go_back_30">-30</string>
@ -208,7 +207,7 @@
<string name="synopsis">Thông tin</string> <string name="synopsis">Thông tin</string>
<string name="queued">Hàng chờ</string> <string name="queued">Hàng chờ</string>
<string name="no_subtitles">Không có phụ đề</string> <string name="no_subtitles">Không có phụ đề</string>
<string name="default_subtitles">Mặc Định</string> <string name="action_default">Mặc Định</string>
<string name="free_storage">Còn trống</string> <string name="free_storage">Còn trống</string>
<string name="used_storage">Đã sử dụng</string> <string name="used_storage">Đã sử dụng</string>
<string name="app_storage">App</string> <string name="app_storage">App</string>
@ -567,5 +566,4 @@
<string name="no_plugins_found_error">Không tìm thấy plugin</string> <string name="no_plugins_found_error">Không tìm thấy plugin</string>
<string name="unable_to_inflate">Không thể khởi tạo UI, đây là một LỖI LỚN và cần được báo cáo ngay lập tức tới %s</string> <string name="unable_to_inflate">Không thể khởi tạo UI, đây là một LỖI LỚN và cần được báo cáo ngay lập tức tới %s</string>
<string name="automatic_plugin_download_mode_title">Chọn chế độ để lọc plugin tải xuống</string> <string name="automatic_plugin_download_mode_title">Chọn chế độ để lọc plugin tải xuống</string>
<string name="default_account">@string/default_subtitles</string>
</resources> </resources>

View file

@ -57,7 +57,6 @@
<string name="type_completed">觀看完畢</string> <string name="type_completed">觀看完畢</string>
<string name="type_dropped">放棄觀看</string> <string name="type_dropped">放棄觀看</string>
<string name="type_plan_to_watch">計畫觀看</string> <string name="type_plan_to_watch">計畫觀看</string>
<string name="type_none"></string>
<string name="type_re_watching">重新觀看</string> <string name="type_re_watching">重新觀看</string>
<string name="play_movie_button">播放電影</string> <string name="play_movie_button">播放電影</string>
<string name="play_livestream_button">播放直播</string> <string name="play_livestream_button">播放直播</string>
@ -96,7 +95,6 @@
<string name="action_remove_from_bookmarks">移除</string> <string name="action_remove_from_bookmarks">移除</string>
<string name="action_add_to_bookmarks">設定觀看狀態</string> <string name="action_add_to_bookmarks">設定觀看狀態</string>
<string name="sort_apply">套用</string> <string name="sort_apply">套用</string>
<string name="sort_cancel">取消</string>
<string name="sort_copy">複製</string> <string name="sort_copy">複製</string>
<string name="sort_close">關閉</string> <string name="sort_close">關閉</string>
<string name="sort_clear">清除</string> <string name="sort_clear">清除</string>
@ -205,7 +203,7 @@
<string name="no_episodes_found">未找到劇集</string> <string name="no_episodes_found">未找到劇集</string>
<string name="delete_file">刪除文件</string> <string name="delete_file">刪除文件</string>
<string name="delete">刪除</string> <string name="delete">刪除</string>
<string name="cancel" translatable="false">@string/sort_cancel</string> <string name="cancel">取消</string>
<string name="pause">暫停</string> <string name="pause">暫停</string>
<string name="resume">繼續</string> <string name="resume">繼續</string>
<string name="go_back_30">-30</string> <string name="go_back_30">-30</string>
@ -224,7 +222,7 @@
<string name="synopsis">簡介</string> <string name="synopsis">簡介</string>
<string name="queued">已加入佇列</string> <string name="queued">已加入佇列</string>
<string name="no_subtitles">無字幕</string> <string name="no_subtitles">無字幕</string>
<string name="default_subtitles">預設</string> <string name="action_default">預設</string>
<string name="free_storage">空閒</string> <string name="free_storage">空閒</string>
<string name="used_storage">已使用</string> <string name="used_storage">已使用</string>
<string name="app_storage">應用程式</string> <string name="app_storage">應用程式</string>

View file

@ -57,7 +57,6 @@
<string name="type_completed">观看完毕</string> <string name="type_completed">观看完毕</string>
<string name="type_dropped">放弃观看</string> <string name="type_dropped">放弃观看</string>
<string name="type_plan_to_watch">计划观看</string> <string name="type_plan_to_watch">计划观看</string>
<string name="type_none"></string>
<string name="type_re_watching">重新观看</string> <string name="type_re_watching">重新观看</string>
<string name="play_movie_button">播放电影</string> <string name="play_movie_button">播放电影</string>
<string name="play_livestream_button">播放直播</string> <string name="play_livestream_button">播放直播</string>
@ -96,7 +95,6 @@
<string name="action_remove_from_bookmarks">移除</string> <string name="action_remove_from_bookmarks">移除</string>
<string name="action_add_to_bookmarks">设置观看状态</string> <string name="action_add_to_bookmarks">设置观看状态</string>
<string name="sort_apply">应用</string> <string name="sort_apply">应用</string>
<string name="sort_cancel">取消</string>
<string name="sort_copy">复制</string> <string name="sort_copy">复制</string>
<string name="sort_close">关闭</string> <string name="sort_close">关闭</string>
<string name="sort_clear">清除</string> <string name="sort_clear">清除</string>
@ -206,7 +204,7 @@
<string name="no_episodes_found">未找到剧集</string> <string name="no_episodes_found">未找到剧集</string>
<string name="delete_file">删除文件</string> <string name="delete_file">删除文件</string>
<string name="delete">删除</string> <string name="delete">删除</string>
<string name="cancel" translatable="false">@string/sort_cancel</string> <string name="cancel">取消</string>
<string name="pause">暂停</string> <string name="pause">暂停</string>
<string name="resume">继续</string> <string name="resume">继续</string>
<string name="go_back_30">-30</string> <string name="go_back_30">-30</string>
@ -225,7 +223,7 @@
<string name="synopsis">简介</string> <string name="synopsis">简介</string>
<string name="queued">已加入队列</string> <string name="queued">已加入队列</string>
<string name="no_subtitles">无字幕</string> <string name="no_subtitles">无字幕</string>
<string name="default_subtitles">默认</string> <string name="action_default">默认</string>
<string name="free_storage">空闲</string> <string name="free_storage">空闲</string>
<string name="used_storage">已使用</string> <string name="used_storage">已使用</string>
<string name="app_storage">应用</string> <string name="app_storage">应用</string>

View file

@ -77,11 +77,11 @@
<string name="rew_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="rating_format" formatted="true" translatable="false">%.1f/10.0</string>
<string name="year_format" formatted="true" translatable="false">%d</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="app_dub_sub_episode_text_format" formatted="true">%1$s Ep %2$d</string>
<string name="cast_format" formatted="true">Cast: %s</string> <string name="cast_format" formatted="true">Cast: %s</string>
<string name="next_episode_format" formatted="true">Episode %d will be released in</string> <string name="next_episode_format" formatted="true">Episode %d will be released in</string>
<string name="next_episode_time_day_format" formatted="true">%dd %dh %dm</string> <string name="next_episode_time_day_format" formatted="true">%1$dd %2$dh %3$dm</string>
<string name="next_episode_time_hour_format" formatted="true">%dh %dm</string> <string name="next_episode_time_hour_format" formatted="true">%1$dh %2$dm</string>
<string name="next_episode_time_min_format" formatted="true">%dm</string> <string name="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 --> <!-- 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="result_poster_img_des">Poster</string>
@ -97,7 +97,7 @@
<!-- TRANSLATE, BUT DON'T FORGET FORMAT --> <!-- TRANSLATE, BUT DON'T FORGET FORMAT -->
<string name="player_speed_text_format" formatted="true">Speed (%.2fx)</string> <string name="player_speed_text_format" formatted="true">Speed (%.2fx)</string>
<string name="rated_format" formatted="true">Rated: %.1f</string> <string name="rated_format" formatted="true">Rated: %.1f</string>
<string name="new_update_format" formatted="true">New update found!\n%s -&gt; %s</string> <string name="new_update_format" formatted="true">New update found!\n%1$s -&gt; %2$s</string>
<string name="filler" formatted="true">Filler</string> <string name="filler" formatted="true">Filler</string>
<string name="duration_format" formatted="true">%d min</string> <string name="duration_format" formatted="true">%d min</string>
<string name="app_name">CloudStream</string> <string name="app_name">CloudStream</string>
@ -123,7 +123,7 @@
<string name="type_completed">Completed</string> <string name="type_completed">Completed</string>
<string name="type_dropped">Dropped</string> <string name="type_dropped">Dropped</string>
<string name="type_plan_to_watch">Plan to Watch</string> <string name="type_plan_to_watch">Plan to Watch</string>
<string name="type_none">None</string> <string name="type_none" translatable="false">@string/none</string>
<string name="type_re_watching">Rewatching</string> <string name="type_re_watching">Rewatching</string>
<string name="play_movie_button">Play Movie</string> <string name="play_movie_button">Play Movie</string>
<string name="play_trailer_button">Play Trailer</string> <string name="play_trailer_button">Play Trailer</string>
@ -164,7 +164,7 @@
<string name="action_remove_from_bookmarks">Remove</string> <string name="action_remove_from_bookmarks">Remove</string>
<string name="action_add_to_bookmarks">Set watch status</string> <string name="action_add_to_bookmarks">Set watch status</string>
<string name="sort_apply">Apply</string> <string name="sort_apply">Apply</string>
<string name="sort_cancel">Cancel</string> <string name="sort_cancel" translatable="false">@string/cancel</string>
<string name="sort_copy">Copy</string> <string name="sort_copy">Copy</string>
<string name="sort_close">Close</string> <string name="sort_close">Close</string>
<string name="sort_clear">Clear</string> <string name="sort_clear">Clear</string>
@ -276,18 +276,18 @@
developers developers
</string> </string>
<string name="season">Season</string> <string name="season">Season</string>
<string name="season_format">%s %d%s</string> <string name="season_format">%1$s %2$d%3$s</string>
<string name="no_season">No Season</string> <string name="no_season">No Season</string>
<string name="episode">Episode</string> <string name="episode">Episode</string>
<string name="episodes">Episodes</string> <string name="episodes">Episodes</string>
<string name="episodes_range">%d-%d</string> <string name="episodes_range">%1$d-%2$d</string>
<string name="episode_format" formatted="true">%d %s</string> <string name="episode_format" formatted="true">%1$d %2$s</string>
<string name="season_short">S</string> <string name="season_short">S</string>
<string name="episode_short">E</string> <string name="episode_short">E</string>
<string name="no_episodes_found">No Episodes found</string> <string name="no_episodes_found">No Episodes found</string>
<string name="delete_file">Delete File</string> <string name="delete_file">Delete File</string>
<string name="delete">Delete</string> <string name="delete">Delete</string>
<string name="cancel" translatable="false">@string/sort_cancel</string> <string name="cancel">Cancel</string>
<string name="pause">Pause</string> <string name="pause">Pause</string>
<string name="start">Start</string> <string name="start">Start</string>
<string name="test_failed">Failed</string> <string name="test_failed">Failed</string>
@ -307,8 +307,9 @@
<string name="synopsis">Synopsis</string> <string name="synopsis">Synopsis</string>
<string name="queued">queued</string> <string name="queued">queued</string>
<string name="no_subtitles">No Subtitles</string> <string name="no_subtitles">No Subtitles</string>
<string name="default_subtitles">Default</string> <string name="action_default">Default</string>
<string name="default_account">@string/default_subtitles</string> <string name="default_subtitles" translatable="false">@string/action_default</string>
<string name="default_account" translatable="false">@string/action_default</string>
<string name="free_storage">Free</string> <string name="free_storage">Free</string>
<string name="used_storage">Used</string> <string name="used_storage">Used</string>
<string name="app_storage">App</string> <string name="app_storage">App</string>
@ -470,7 +471,7 @@
<string name="kitsu_account_settings" translatable="false">Kitsu</string> <string name="kitsu_account_settings" translatable="false">Kitsu</string>
<string name="trakt_account_settings" translatable="false">Trakt</string> <string name="trakt_account_settings" translatable="false">Trakt</string>
--> -->
<string name="login_format" formatted="true">%s %s</string> <string name="login_format" formatted="true">%1$s %2$s</string>
<string name="account">account</string> <string name="account">account</string>
<string name="logout">Log out</string> <string name="logout">Log out</string>
<string name="login">Log in</string> <string name="login">Log in</string>
@ -571,8 +572,8 @@
<string name="plugin_deleted">Plugin Deleted</string> <string name="plugin_deleted">Plugin Deleted</string>
<string name="plugin_load_fail" formatted="true">Could not load %s</string> <string name="plugin_load_fail" formatted="true">Could not load %s</string>
<string name="is_adult">18+</string> <string name="is_adult">18+</string>
<string name="batch_download_start_format" formatted="true">Started downloading %d %s…</string> <string name="batch_download_start_format" formatted="true">Started downloading %1$d %2$s…</string>
<string name="batch_download_finish_format" formatted="true">Downloaded %d %s</string> <string name="batch_download_finish_format" formatted="true">Downloaded %1$d %2$s</string>
<string name="batch_download_nothing_to_download_format" formatted="true">All %s already downloaded</string> <string name="batch_download_nothing_to_download_format" formatted="true">All %s already downloaded</string>
<string name="no_plugins_found_error">No plugins found in repository</string> <string name="no_plugins_found_error">No plugins found in repository</string>
<string name="no_repository_found_error">Repository not found, check the URL and try VPN</string> <string name="no_repository_found_error">Repository not found, check the URL and try VPN</string>
@ -666,6 +667,8 @@
<string name="subscription_new">Subscribed to %s</string> <string name="subscription_new">Subscribed to %s</string>
<string name="subscription_deleted">Unsubscribed from %s</string> <string name="subscription_deleted">Unsubscribed from %s</string>
<string name="subscription_episode_released">Episode %d released!</string> <string name="subscription_episode_released">Episode %d released!</string>
<string name="action_subscribe">Subscribe</string>
<string name="action_unsubscribe">Unsubscribe</string>
<string name="profile_number">Profile %d</string> <string name="profile_number">Profile %d</string>
<string name="wifi">Wi-Fi</string> <string name="wifi">Wi-Fi</string>
<string name="mobile_data">Mobile data</string> <string name="mobile_data">Mobile data</string>
@ -686,13 +689,41 @@
<string name="qualities">Qualities</string> <string name="qualities">Qualities</string>
<string name="profile_background_des">Profile background</string> <string name="profile_background_des">Profile background</string>
<string name="unable_to_inflate">UI was unable to be created correctly, this is a MAJOR BUG and should be reported immediately %s</string> <string name="unable_to_inflate">UI was unable to be created correctly, this is a MAJOR BUG and should be reported immediately %s</string>
<string name="tv_no_focus_tag" translatable="false">tv_no_focus_tag</string>
<string name="already_voted">You have already voted</string> <string name="already_voted">You have already voted</string>
<string name="favorites_list_name">Favorites</string> <string name="favorites_list_name">Favorites</string>
<string name="favorite_added">%s added to favorites</string> <string name="favorite_added">%s added to favorites</string>
<string name="favorite_removed">%s removed from favorites</string> <string name="favorite_removed">%s removed from favorites</string>
<string name="action_add_to_favorites">Add to favorites</string> <string name="action_add_to_favorites">Add to favorites</string>
<string name="action_remove_from_favorites">Remove from favorites</string> <string name="action_remove_from_favorites">Remove from favorites</string>
<string name="duplicate_title">Potential Duplicate Found</string>
<string name="duplicate_add">Add</string>
<string name="duplicate_replace">Replace</string>
<string name="duplicate_replace_all">Replace All</string>
<string name="duplicate_cancel" translatable="false">@string/sort_cancel</string>
<string name="duplicate_message_single">
It appears that a potentially duplicate item already exists in your library: \'%1$s.\'
\n\nWould you like to add this item anyway, replace the existing one, or cancel the action?
</string>
<string name="duplicate_message_multiple" formatted="true">
Potential duplicate items have been found in your library:
\n\n%s
\n\nWould you like to add this item anyway, replace the existing ones, or cancel the action?
</string>
<string name="tv_no_focus_tag" translatable="false">tv_no_focus_tag</string>
<string name="enter_pin">Enter PIN</string>
<string name="enter_current_pin">Enter Current PIN</string>
<string name="lock_profile">Lock Profile</string>
<string name="pin">PIN</string>
<string name="pin_error_incorrect">Incorrect PIN. Please try again.</string>
<string name="pin_error_length">PIN must be 4 characters</string>
<string name="select_an_account">Select an Account</string>
</resources> </resources>