mirror of
https://github.com/recloudstream/cloudstream.git
synced 2024-08-15 01:53:11 +00:00
Merge branch 'master' into code-cleanup
This commit is contained in:
commit
5f86c179be
69 changed files with 203 additions and 24 deletions
app
build.gradle.kts
src
androidTest/java/com/lagradost/cloudstream3
main
java/com/lagradost/cloudstream3
res
layout
values-af
values-ajp
values-am
values-ar
values-ars
values-as
values-bg
values-bn
values-bp
values-cs
values-de
values-el
values-eo
values-es
values-fa
values-fil
values-fr
values-gl
values-hi
values-hr
values-hu
values-in
values-it
values-iw
values-ja
values-kn
values-ko
values-lt
values-lv
values-mk
values-ml
values-ms
values-mt
values-my
values-ne
values-nl
values-nn
values-no
values-or
values-pl
values-pt
values-qt
values-ro
values-ru
values-sk
values-so
values-sv
values-ta
values-ti
values-tl
values-tr
values-uk
values-ur
values-vi
values-zh-rTW
values-zh
values
xml
library/src/commonMain/kotlin/com/lagradost/cloudstream3
|
@ -60,8 +60,8 @@ android {
|
|||
minSdk = 21
|
||||
targetSdk = 33 /* Android 14 is Fu*ked
|
||||
^ https://developer.android.com/about/versions/14/behavior-changes-14#safer-dynamic-code-loading*/
|
||||
versionCode = 63
|
||||
versionName = "4.3.2"
|
||||
versionCode = 64
|
||||
versionName = "4.4.0"
|
||||
|
||||
resValue("string", "app_version", "${defaultConfig.versionName}${versionNameSuffix ?: ""}")
|
||||
resValue("string", "commit_hash", "git rev-parse --short HEAD".execute() ?: "")
|
||||
|
@ -200,7 +200,7 @@ dependencies {
|
|||
// PlayBack
|
||||
implementation("com.jaredrummler:colorpicker:1.1.0") // Subtitle Color Picker
|
||||
implementation("com.github.recloudstream:media-ffmpeg:1.1.0") // Custom FF-MPEG Lib for Audio Codecs
|
||||
implementation("com.github.teamnewpipe:NewPipeExtractor:592f159") /* For Trailers
|
||||
implementation("com.github.teamnewpipe:NewPipeExtractor:2d36945") /* For Trailers
|
||||
^ Update to Latest Commits if Trailers Misbehave, github.com/TeamNewPipe/NewPipeExtractor/commits/dev */
|
||||
implementation("com.github.albfernandez:juniversalchardet:2.5.0") // Subtitle Decoding
|
||||
|
||||
|
|
|
@ -154,7 +154,7 @@ class ExampleInstrumentedTest {
|
|||
fun providerCorrectHomepage() {
|
||||
runBlocking {
|
||||
getAllProviders().toList().amap { api ->
|
||||
TestingUtils.testHomepage(api, ::println)
|
||||
TestingUtils.testHomepage(api, TestingUtils.Logger())
|
||||
}
|
||||
}
|
||||
println("Done providerCorrectHomepage")
|
||||
|
@ -166,7 +166,6 @@ class ExampleInstrumentedTest {
|
|||
TestingUtils.getDeferredProviderTests(
|
||||
this,
|
||||
getAllProviders(),
|
||||
::println
|
||||
) { _, _ -> }
|
||||
}
|
||||
}
|
||||
|
|
|
@ -572,6 +572,35 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener, BiometricCa
|
|||
binding?.apply {
|
||||
navRailView.isVisible = isNavVisible && landscape
|
||||
navView.isVisible = isNavVisible && !landscape
|
||||
|
||||
/**
|
||||
* We need to make sure if we return to a sub-fragment,
|
||||
* the correct navigation item is selected so that it does not
|
||||
* highlight the wrong one in UI.
|
||||
*/
|
||||
when (destination.id) {
|
||||
in listOf(R.id.navigation_downloads, R.id.navigation_download_child) -> {
|
||||
navRailView.menu.findItem(R.id.navigation_downloads).isChecked = true
|
||||
navView.menu.findItem(R.id.navigation_downloads).isChecked = true
|
||||
}
|
||||
in listOf(
|
||||
R.id.navigation_settings,
|
||||
R.id.navigation_subtitles,
|
||||
R.id.navigation_chrome_subtitles,
|
||||
R.id.navigation_settings_player,
|
||||
R.id.navigation_settings_updates,
|
||||
R.id.navigation_settings_ui,
|
||||
R.id.navigation_settings_account,
|
||||
R.id.navigation_settings_providers,
|
||||
R.id.navigation_settings_general,
|
||||
R.id.navigation_settings_extensions,
|
||||
R.id.navigation_settings_plugins,
|
||||
R.id.navigation_test_providers
|
||||
) -> {
|
||||
navRailView.menu.findItem(R.id.navigation_settings).isChecked = true
|
||||
navView.menu.findItem(R.id.navigation_settings).isChecked = true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -236,6 +236,7 @@ open class TraktProvider : MainAPI() {
|
|||
posterUrl = fixPath(episode.images?.screenshot?.firstOrNull()),
|
||||
rating = episode.rating?.times(10)?.roundToInt(),
|
||||
description = episode.overview,
|
||||
runTime = episode.runtime
|
||||
).apply {
|
||||
this.addDate(episode.firstAired, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX")
|
||||
if (nextAir == null && this.date != null && this.date!! > unixTimeMS && this.season != 0) {
|
||||
|
|
|
@ -26,16 +26,19 @@ import android.view.animation.AlphaAnimation
|
|||
import android.view.animation.Animation
|
||||
import android.view.animation.AnimationUtils
|
||||
import androidx.annotation.OptIn
|
||||
import android.widget.LinearLayout
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
import androidx.core.graphics.blue
|
||||
import androidx.core.graphics.green
|
||||
import androidx.core.graphics.red
|
||||
import androidx.core.view.children
|
||||
import androidx.core.view.isGone
|
||||
import androidx.core.view.isInvisible
|
||||
import androidx.core.view.isVisible
|
||||
import androidx.core.widget.doOnTextChanged
|
||||
import androidx.media3.common.util.UnstableApi
|
||||
import androidx.preference.PreferenceManager
|
||||
import com.google.android.material.button.MaterialButton
|
||||
import com.lagradost.cloudstream3.CommonActivity.keyEventListener
|
||||
import com.lagradost.cloudstream3.CommonActivity.playerEventListener
|
||||
import com.lagradost.cloudstream3.CommonActivity.screenHeight
|
||||
|
@ -121,6 +124,7 @@ open class FullScreenPlayer : AbstractPlayerFragment() {
|
|||
protected var doubleTapPauseEnabled = true
|
||||
protected var playerRotateEnabled = false
|
||||
protected var autoPlayerRotateEnabled = false
|
||||
private var hideControlsNames = false
|
||||
|
||||
protected var subtitleDelay
|
||||
set(value) = try {
|
||||
|
@ -1419,6 +1423,8 @@ open class FullScreenPlayer : AbstractPlayerFragment() {
|
|||
false
|
||||
)
|
||||
|
||||
hideControlsNames = settingsManager.getBoolean(ctx.getString(R.string.hide_player_control_names_key), false)
|
||||
|
||||
val profiles = QualityDataHelper.getProfiles()
|
||||
val type = if (ctx.isUsingMobileData())
|
||||
QualityDataHelper.QualityProfileType.Data
|
||||
|
@ -1439,6 +1445,9 @@ open class FullScreenPlayer : AbstractPlayerFragment() {
|
|||
playerSpeedBtt.isVisible = playBackSpeedEnabled
|
||||
playerResizeBtt.isVisible = playerResizeEnabled
|
||||
playerRotateBtt.isVisible = playerRotateEnabled
|
||||
if (hideControlsNames) {
|
||||
hideControlsNames()
|
||||
}
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
logError(e)
|
||||
|
@ -1591,6 +1600,22 @@ open class FullScreenPlayer : AbstractPlayerFragment() {
|
|||
}
|
||||
}
|
||||
|
||||
private fun PlayerCustomLayoutBinding.hideControlsNames() {
|
||||
fun iterate(layout: LinearLayout) {
|
||||
layout.children.forEach {
|
||||
if (it is MaterialButton) {
|
||||
it.textSize = 0f
|
||||
it.iconPadding = 0
|
||||
it.iconGravity = MaterialButton.ICON_GRAVITY_TEXT_START
|
||||
it.setPadding(0,0,0,0)
|
||||
} else if (it is LinearLayout) {
|
||||
iterate(it)
|
||||
}
|
||||
}
|
||||
}
|
||||
iterate(playerLockHolder.parent as LinearLayout)
|
||||
}
|
||||
|
||||
override fun playerDimensionsLoaded(width: Int, height: Int) {
|
||||
isVerticalOrientation = height > width
|
||||
updateOrientation()
|
||||
|
|
|
@ -27,7 +27,8 @@ import com.lagradost.cloudstream3.utils.UIHelper.toPx
|
|||
import com.lagradost.cloudstream3.utils.VideoDownloadHelper
|
||||
import java.text.DateFormat
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.*
|
||||
import java.util.Date
|
||||
import java.util.Locale
|
||||
|
||||
const val ACTION_PLAY_EPISODE_IN_PLAYER = 1
|
||||
const val ACTION_PLAY_EPISODE_IN_VLC_PLAYER = 2
|
||||
|
@ -58,6 +59,7 @@ const val ACTION_MARK_AS_WATCHED = 18
|
|||
const val ACTION_FCAST = 19
|
||||
|
||||
const val TV_EP_SIZE = 400
|
||||
|
||||
data class EpisodeClickEvent(val action: Int, val data: ResultEpisode)
|
||||
|
||||
class EpisodeAdapter(
|
||||
|
@ -273,7 +275,10 @@ class EpisodeAdapter(
|
|||
episodeDate.setText(
|
||||
txt(
|
||||
R.string.episode_upcoming_format,
|
||||
secondsToReadable(card.airDate.minus(unixTimeMS).div(1000).toInt(), "")
|
||||
secondsToReadable(
|
||||
card.airDate.minus(unixTimeMS).div(1000).toInt(),
|
||||
""
|
||||
)
|
||||
)
|
||||
)
|
||||
} else {
|
||||
|
@ -291,6 +296,12 @@ class EpisodeAdapter(
|
|||
episodeDate.isVisible = false
|
||||
}
|
||||
|
||||
episodeRuntime.setText(
|
||||
txt(
|
||||
card.runTime?.times(60L)?.toInt()?.let { secondsToReadable(it, "") }
|
||||
)
|
||||
)
|
||||
|
||||
if (isLayout(EMULATOR or PHONE)) {
|
||||
episodePoster.setOnClickListener {
|
||||
clickCallback.invoke(EpisodeClickEvent(ACTION_CLICK_DEFAULT, card))
|
||||
|
|
|
@ -51,6 +51,7 @@ data class ResultEpisode(
|
|||
/** Sum of all previous season episode counts + episode */
|
||||
val totalEpisodeIndex: Int? = null,
|
||||
val airDate: Long? = null,
|
||||
val runTime: Int? = null,
|
||||
)
|
||||
|
||||
fun ResultEpisode.getRealPosition(): Long {
|
||||
|
@ -87,6 +88,7 @@ fun buildResultEpisode(
|
|||
parentId: Int,
|
||||
totalEpisodeIndex: Int? = null,
|
||||
airDate: Long? = null,
|
||||
runTime: Int? = null,
|
||||
): ResultEpisode {
|
||||
val posDur = getViewPos(id)
|
||||
val videoWatchState = getVideoWatchState(id) ?: VideoWatchState.None
|
||||
|
@ -111,6 +113,7 @@ fun buildResultEpisode(
|
|||
videoWatchState,
|
||||
totalEpisodeIndex,
|
||||
airDate,
|
||||
runTime,
|
||||
)
|
||||
}
|
||||
|
||||
|
|
|
@ -2163,7 +2163,7 @@ class ResultViewModel2 : ViewModel() {
|
|||
// lets say that we have subscribed, then we must be able to unsubscribe no matter what
|
||||
else if (data != null) {
|
||||
_subscribeStatus.postValue(true)
|
||||
}
|
||||
} else _subscribeStatus.postValue(null)
|
||||
}
|
||||
|
||||
private fun postFavorites(loadResponse: LoadResponse) {
|
||||
|
@ -2371,7 +2371,8 @@ class ResultViewModel2 : ViewModel() {
|
|||
loadResponse.type,
|
||||
mainId,
|
||||
totalIndex,
|
||||
airDate = i.date
|
||||
airDate = i.date,
|
||||
runTime = i.runTime,
|
||||
)
|
||||
|
||||
val season = eps.seasonIndex ?: 0
|
||||
|
@ -2426,7 +2427,8 @@ class ResultViewModel2 : ViewModel() {
|
|||
loadResponse.type,
|
||||
mainId,
|
||||
totalIndex,
|
||||
airDate = episode.date
|
||||
airDate = episode.date,
|
||||
runTime = episode.runTime,
|
||||
)
|
||||
|
||||
val season = ep.seasonIndex ?: 0
|
||||
|
@ -2859,4 +2861,4 @@ class ResultViewModel2 : ViewModel() {
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -86,10 +86,6 @@ class SettingsPlayer : PreferenceFragmentCompat() {
|
|||
return@setOnPreferenceClickListener true
|
||||
}
|
||||
|
||||
/*(getPref(R.string.double_tap_seek_time_key) as? SeekBarPreference?)?.let {
|
||||
|
||||
}*/
|
||||
|
||||
getPref(R.string.prefer_limit_title_rez_key)?.setOnPreferenceClickListener {
|
||||
val prefNames = resources.getStringArray(R.array.limit_title_rez_pref_names)
|
||||
val prefValues = resources.getIntArray(R.array.limit_title_rez_pref_values)
|
||||
|
@ -108,6 +104,8 @@ class SettingsPlayer : PreferenceFragmentCompat() {
|
|||
return@setOnPreferenceClickListener true
|
||||
}
|
||||
|
||||
getPref(R.string.hide_player_control_names_key)?.hideOn(TV)
|
||||
|
||||
getPref(R.string.quality_pref_key)?.setOnPreferenceClickListener {
|
||||
val prefValues = Qualities.entries.map { it.value }.reversed().toMutableList()
|
||||
prefValues.remove(Qualities.Unknown.value)
|
||||
|
|
|
@ -44,7 +44,7 @@
|
|||
android:nextFocusRight="@id/download_button"
|
||||
android:scaleType="centerCrop"
|
||||
tools:src="@drawable/example_poster"
|
||||
tools:visibility="invisible"/>
|
||||
tools:visibility="invisible" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/episode_play_icon"
|
||||
|
@ -53,7 +53,7 @@
|
|||
android:layout_gravity="center"
|
||||
android:contentDescription="@string/play_episode"
|
||||
android:src="@drawable/play_button"
|
||||
tools:visibility="invisible"/>
|
||||
tools:visibility="invisible" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/episode_upcoming_icon"
|
||||
|
@ -106,12 +106,29 @@
|
|||
tools:text="1. Jobless" />
|
||||
</LinearLayout>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/episode_rating"
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textColor="?attr/grayTextColor"
|
||||
tools:text="Rated: 8.8" />
|
||||
android:layout_gravity="start"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/episode_rating"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginEnd="10dp"
|
||||
android:textColor="?attr/grayTextColor"
|
||||
tools:text="Rated: 8.8" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/episode_runtime"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginEnd="10dp"
|
||||
android:textColor="?attr/grayTextColor"
|
||||
tools:text="80min" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/episode_date"
|
||||
|
@ -119,6 +136,7 @@
|
|||
android:layout_height="wrap_content"
|
||||
android:textColor="?attr/grayTextColor"
|
||||
tools:text="15 Apr 2024" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<com.lagradost.cloudstream3.ui.download.button.PieFetchButton
|
||||
|
|
|
@ -106,4 +106,5 @@
|
|||
<string name="subs_import_text" formatted="true">Voer lettertipes in deur dit in %s te plaas</string>
|
||||
<string name="cast_format" formatted="true">Rolverdeling: %s</string>
|
||||
<string name="subscribe_tooltip">Nuwe episode notifikasie</string>
|
||||
<string name="hide_player_control_names_key" translatable="false">hide_player_control_names_key</string>
|
||||
</resources>
|
||||
|
|
|
@ -640,4 +640,5 @@
|
|||
<string name="dismiss">تجاهل</string>
|
||||
<string name="open_downloaded_repo">متاح الريپوزيتوري</string>
|
||||
<string name="device_pin_url_message">فتاح <b>%s</b> ع تلفونك أو كمپيوترك، وحط الكود اللي فوق</string>
|
||||
<string name="hide_player_control_names_key" translatable="false">hide_player_control_names_key</string>
|
||||
</resources>
|
||||
|
|
|
@ -108,4 +108,5 @@
|
|||
<string name="action_open_watching">ተጨማሪ መረጃ</string>
|
||||
<string name="search_provider_text_types">ዓይነቶችን በመጠቀም ይፈልጉ</string>
|
||||
<string name="subs_import_text" formatted="true">ቅርጸ-ቁምፊዎችን በ%s ውስጥ በማስቀመጥ ያጫኑ</string>
|
||||
<string name="hide_player_control_names_key" translatable="false">hide_player_control_names_key</string>
|
||||
</resources>
|
||||
|
|
|
@ -666,4 +666,5 @@
|
|||
<string name="device_pin_url_message">قم بزيارة <b>%s</b> على هاتفك الذكي أو جهاز الكمبيوتر وأدخل الرمز أعلاه</string>
|
||||
<string name="device_pin_error_message">لا يمكن الحصول على رمز PIN للجهاز، حاول المصادقة المحلية</string>
|
||||
<string name="device_pin_counter_text">تنتهي صلاحية الرمز خلال %1$dm %2$ds</string>
|
||||
<string name="hide_player_control_names_key" translatable="false">hide_player_control_names_key</string>
|
||||
</resources>
|
||||
|
|
|
@ -352,4 +352,5 @@
|
|||
<string name="documentaries_singular">وثائقي</string>
|
||||
<string name="site">موقع</string>
|
||||
<string name="limit_title">عنوان مشغل الفيديو بحد أقصى لعدد الأحرف</string>
|
||||
<string name="hide_player_control_names_key" translatable="false">hide_player_control_names_key</string>
|
||||
</resources>
|
||||
|
|
|
@ -621,4 +621,5 @@
|
|||
<string name="pick_subtitle">ছাবটাইটেল বাছনি কৰক</string>
|
||||
<string name="play_episode">পৰ্ব খেলাওক</string>
|
||||
<string name="sort_apply">প্ৰয়োগ কৰক</string>
|
||||
<string name="hide_player_control_names_key" translatable="false">hide_player_control_names_key</string>
|
||||
</resources>
|
||||
|
|
|
@ -601,4 +601,5 @@
|
|||
<string name="recommendations_tooltip">Покажи предложения</string>
|
||||
<string name="speed_setting_summary">Добавя опция за промяна на скоростта в плеъра</string>
|
||||
<string name="test_extensions_summary">Този тест е направен за програмисти и не проверява работата на никакви добавки.</string>
|
||||
<string name="hide_player_control_names_key" translatable="false">hide_player_control_names_key</string>
|
||||
</resources>
|
||||
|
|
|
@ -359,4 +359,5 @@
|
|||
<string name="account">অ্যাকাউন্ট</string>
|
||||
<string name="logout">প্রস্থান</string>
|
||||
<string name="episode_format" formatted="true">%1$d%2$s</string>
|
||||
<string name="hide_player_control_names_key" translatable="false">hide_player_control_names_key</string>
|
||||
</resources>
|
||||
|
|
|
@ -656,4 +656,5 @@
|
|||
<string name="device_pin_error_message">Não é possível obter o código PIN do dispositivo, tente a autenticação local</string>
|
||||
<string name="device_pin_expired_message">O código PIN expirou!</string>
|
||||
<string name="device_pin_counter_text">O código expira em %1$dm %2$ds</string>
|
||||
<string name="hide_player_control_names_key" translatable="false">hide_player_control_names_key</string>
|
||||
</resources>
|
||||
|
|
|
@ -658,4 +658,5 @@
|
|||
<string name="pref_category_accounts">Účty</string>
|
||||
<string name="auth_locally">Lokální ověření</string>
|
||||
<string name="device_pin_expired_message">PIN kód vypršel!</string>
|
||||
<string name="hide_player_control_names_key" translatable="false">hide_player_control_names_key</string>
|
||||
</resources>
|
||||
|
|
|
@ -615,4 +615,5 @@
|
|||
<string name="reset_btn">Zurücksetzen</string>
|
||||
<string name="app_unrestricted_toast">Akkuverbrauch der App ist bereits auf unbeschränkt eingestellt</string>
|
||||
<string name="app_info_intent_error">CloudStreams App-Info kann nicht geöffnet werden.</string>
|
||||
<string name="hide_player_control_names_key" translatable="false">hide_player_control_names_key</string>
|
||||
</resources>
|
||||
|
|
|
@ -625,4 +625,5 @@
|
|||
<string name="biometric_warning">Τα δεδομένα σας στο CloudStream έχουν κάνει back up. Αν και η πιθανότητα είναι πολύ χαμηλή, όλες οι συσκευές συμπεριφέρονται διαφορετικά. Στη σπάνια περίπτωση, που απαγορευτεί η πρόσβασή σας από την εφαρμογή, διαγράψτε τα δεδομένα εφαρμογής και επαναφέρετέ τα από ένα ήδη υπάρχον backup. Συγνώμη για οποιαδήποτε ταλαιπωρία.</string>
|
||||
<string name="pref_category_accounts">Λογαριασμοί</string>
|
||||
<string name="pref_category_security">Ασφάλεια</string>
|
||||
<string name="hide_player_control_names_key" translatable="false">hide_player_control_names_key</string>
|
||||
</resources>
|
||||
|
|
|
@ -127,4 +127,5 @@
|
|||
<string name="downloaded">Elŝutite</string>
|
||||
<string name="downloading">Elŝutante</string>
|
||||
<string name="download_failed">Elŝuto Malsukcesite</string>
|
||||
<string name="hide_player_control_names_key" translatable="false">hide_player_control_names_key</string>
|
||||
</resources>
|
||||
|
|
|
@ -634,4 +634,5 @@
|
|||
<string name="device_pin_expired_message">¡El código PIN ya ha caducado!</string>
|
||||
<string name="device_pin_counter_text">El código caduca en %1$d mín y %2$d s</string>
|
||||
<string name="device_pin_error_message">No puedo obtener el código PIN del dispositivo; intente con la autenticación local</string>
|
||||
<string name="hide_player_control_names_key" translatable="false">hide_player_control_names_key</string>
|
||||
</resources>
|
||||
|
|
|
@ -191,4 +191,5 @@
|
|||
<string name="action_default">پیشفرض</string>
|
||||
<string name="cartoons_singular">کارتون</string>
|
||||
<string name="torrent_singular">تورنت</string>
|
||||
<string name="hide_player_control_names_key" translatable="false">hide_player_control_names_key</string>
|
||||
</resources>
|
||||
|
|
|
@ -1,2 +1,4 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources/>
|
||||
<resources>
|
||||
<string name="hide_player_control_names_key" translatable="false">hide_player_control_names_key</string>
|
||||
</resources>
|
||||
|
|
|
@ -620,4 +620,5 @@
|
|||
<string name="biometric_setting">Verrouillage biométrique</string>
|
||||
<string name="player_settings_select_cast_device">Sélectionnez un appareil de diffusion</string>
|
||||
<string name="next_season_episode_format" formatted="true">Saison %1$d Episode %2$d sera publié dans</string>
|
||||
<string name="hide_player_control_names_key" translatable="false">hide_player_control_names_key</string>
|
||||
</resources>
|
||||
|
|
|
@ -164,4 +164,5 @@
|
|||
<string name="automatic_plugin_download_mode_title">Selecciona o modo para filtrar a descarga dos complementos</string>
|
||||
<string name="automatic_plugin_download_summary">Instala automáticamente todos os complementos aínda non instalados dos repositorios engadidos.</string>
|
||||
<string name="updates_settings">Mostrar actualizacións da aplicación</string>
|
||||
<string name="hide_player_control_names_key" translatable="false">hide_player_control_names_key</string>
|
||||
</resources>
|
||||
|
|
|
@ -209,4 +209,5 @@
|
|||
<string name="subs_outline_color">रूपरेखा रंग</string>
|
||||
<string name="subs_subtitle_elevation">उपशीर्षक ऊंचाई</string>
|
||||
<string name="subs_font">अक्षर शैली</string>
|
||||
<string name="hide_player_control_names_key" translatable="false">hide_player_control_names_key</string>
|
||||
</resources>
|
||||
|
|
|
@ -651,4 +651,5 @@
|
|||
<string name="cs3wiki">CloudStream Wiki</string>
|
||||
<string name="pref_category_accounts">Računi</string>
|
||||
<string name="pref_category_security">Sigurnost</string>
|
||||
<string name="hide_player_control_names_key" translatable="false">hide_player_control_names_key</string>
|
||||
</resources>
|
||||
|
|
|
@ -592,4 +592,5 @@
|
|||
<string name="pin_error_length">A PIN 4 karakter hosszú kell legyen</string>
|
||||
<string name="auto_rotate_video">Auto elforgatás</string>
|
||||
<string name="auto_rotate_video_desc">Az automatikus videó orientáció alapján való képernyő elforgatás bekapcsolása</string>
|
||||
<string name="hide_player_control_names_key" translatable="false">hide_player_control_names_key</string>
|
||||
</resources>
|
||||
|
|
|
@ -647,4 +647,5 @@
|
|||
<string name="cs3wiki">CloudStream Wiki</string>
|
||||
<string name="pref_category_security">Keamanan</string>
|
||||
<string name="pref_category_accounts">Akun</string>
|
||||
<string name="hide_player_control_names_key" translatable="false">hide_player_control_names_key</string>
|
||||
</resources>
|
||||
|
|
|
@ -654,4 +654,5 @@
|
|||
<string name="device_pin_error_message">Impossibile ottenere il codice PIN del dispositivo, prova l\'autenticazione locale</string>
|
||||
<string name="device_pin_expired_message">Il codice PIN è scaduto!</string>
|
||||
<string name="device_pin_counter_text">Il codice scadrà tra %1$dm %2$ds</string>
|
||||
<string name="hide_player_control_names_key" translatable="false">hide_player_control_names_key</string>
|
||||
</resources>
|
||||
|
|
|
@ -550,4 +550,5 @@
|
|||
\nיגרמו לעדיפות הסרטון להיות 10.
|
||||
\n
|
||||
\nשימו לב: אם הסכום הוא 10 או יותר, הנגן ידלג על טעינת הסרטון כאשר הלינק נטען!</string>
|
||||
<string name="hide_player_control_names_key" translatable="false">hide_player_control_names_key</string>
|
||||
</resources>
|
||||
|
|
|
@ -242,4 +242,5 @@
|
|||
<string name="autoplay_next_settings_des">現在のエピソードが終了したら次のエピソードを開始する</string>
|
||||
<string name="subs_hold_to_reset_to_default">長押しするとデフォルトにリセットされます</string>
|
||||
<string name="popup_resume_download">ダウンロードを再開</string>
|
||||
<string name="hide_player_control_names_key" translatable="false">hide_player_control_names_key</string>
|
||||
</resources>
|
||||
|
|
|
@ -130,4 +130,5 @@
|
|||
<string name="swipe_to_change_settings_des">Brightness ಅಥವಾ volume ಬದಲಾಯಿಸಲು ಎಡ ಅಥವಾ ಬಲಭಾಗದಲ್ಲಿ ಮೇಲಕ್ಕೆ ಅಥವಾ ಕೆಳಕ್ಕೆ ಸ್ಲೈಡ್ ಮಾಡಿ</string>
|
||||
<string name="autoplay_next_settings_des">ಈಗಿನ ಎಪಿಸೋಡ್ ಮುಗಿದಾಗ ಮುಂದಿನ ಎಪಿಸೋಡ್ ಅನ್ನು ಪ್ರಾರಂಭಿಸಿ</string>
|
||||
<string name="swipe_to_change_settings">ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಬದಲಾಯಿಸಲು ಸ್ವೈಪ್ ಮಾಡಿ</string>
|
||||
<string name="hide_player_control_names_key" translatable="false">hide_player_control_names_key</string>
|
||||
</resources>
|
||||
|
|
|
@ -634,4 +634,5 @@
|
|||
<string name="enter_pin_with_name" formatted="true">%s의 PIN 입력</string>
|
||||
<string name="action_remove_from_favorites">즐겨찾기에서 제거</string>
|
||||
<string name="episode_action_cast_mirror">캐스트미러</string>
|
||||
<string name="hide_player_control_names_key" translatable="false">hide_player_control_names_key</string>
|
||||
</resources>
|
||||
|
|
|
@ -260,4 +260,5 @@
|
|||
<string name="confirm_exit_dialog">Ar tikrai norite išeiti\?</string>
|
||||
<string name="action_remove_from_watched">Pašalinti iš žiūrimų</string>
|
||||
<string name="audio_tracks">Garso takelis</string>
|
||||
<string name="hide_player_control_names_key" translatable="false">hide_player_control_names_key</string>
|
||||
</resources>
|
||||
|
|
|
@ -527,4 +527,5 @@
|
|||
<string name="subscription_in_progress_notification">Abonēto šovu atjaunināšana</string>
|
||||
<string name="subscription_list_name">Abonēts</string>
|
||||
<string name="subscription_new">Abonēts %s</string>
|
||||
<string name="hide_player_control_names_key" translatable="false">hide_player_control_names_key</string>
|
||||
</resources>
|
||||
|
|
|
@ -624,4 +624,5 @@
|
|||
<string name="clipboard_permission_error">Грешка при пристапот до таблата со исечоци, обидете се повторно.</string>
|
||||
<string name="clipboard_unknown_error">Грешка при копирање, копирајте го logcat и контактирајте со поддршката за апликацијата.</string>
|
||||
<string name="audio_book_singular">Аудио книга</string>
|
||||
<string name="hide_player_control_names_key" translatable="false">hide_player_control_names_key</string>
|
||||
</resources>
|
||||
|
|
|
@ -280,4 +280,5 @@
|
|||
<string name="subs_edge_type">എഡ്ജ് തരം</string>
|
||||
<string name="subs_outline_color">ഔട്ട്ലൈൻ നിറം</string>
|
||||
<string name="subs_background_color">പശ്ചാത്തല നിറം</string>
|
||||
<string name="hide_player_control_names_key" translatable="false">hide_player_control_names_key</string>
|
||||
</resources>
|
||||
|
|
|
@ -57,4 +57,5 @@
|
|||
<string name="sort_close">Tutup</string>
|
||||
<string name="app_dub_sub_episode_text_format" formatted="true">Ep</string>
|
||||
<string name="next_season_episode_format" formatted="true">cuba</string>
|
||||
<string name="hide_player_control_names_key" translatable="false">hide_player_control_names_key</string>
|
||||
</resources>
|
||||
|
|
|
@ -123,4 +123,5 @@
|
|||
<string name="error_bookmarks_text">Bookmarks</string>
|
||||
<string name="action_remove_from_bookmarks">Neħħi</string>
|
||||
<string name="download_failed">Falla t-tniżżil</string>
|
||||
<string name="hide_player_control_names_key" translatable="false">hide_player_control_names_key</string>
|
||||
</resources>
|
||||
|
|
|
@ -550,4 +550,5 @@
|
|||
<string name="already_voted">သင်နဂိုတည်းကသတ်မှတ်ပြီး</string>
|
||||
<string name="select_library">လိုက်ဘရီရွေးချယ်ရန်</string>
|
||||
<string name="open_with">ဖြင့်ဖွင့်မည်</string>
|
||||
<string name="hide_player_control_names_key" translatable="false">hide_player_control_names_key</string>
|
||||
</resources>
|
||||
|
|
|
@ -128,4 +128,5 @@
|
|||
<string name="player_subtitles_settings_des">प्लेयरको उपशीर्षकको सेटिङ</string>
|
||||
<string name="repo_copy_label">रिपोजिटरी को नाम र यूआरएल</string>
|
||||
<string name="toast_copied">कपी गरियो!</string>
|
||||
<string name="hide_player_control_names_key" translatable="false">hide_player_control_names_key</string>
|
||||
</resources>
|
||||
|
|
|
@ -608,4 +608,5 @@
|
|||
<string name="links_reloaded_toast">Link opnieuw geladen</string>
|
||||
<string name="auto_rotate_video">Autoroteer</string>
|
||||
<string name="rotate_video">Roteer</string>
|
||||
<string name="hide_player_control_names_key" translatable="false">hide_player_control_names_key</string>
|
||||
</resources>
|
||||
|
|
|
@ -195,4 +195,5 @@
|
|||
<string name="picture_in_picture">Bilde i bilde</string>
|
||||
<string name="continue_watching">Fortsett å sjå</string>
|
||||
<string name="reload_error">Prøv tilkopling på nytt…</string>
|
||||
<string name="hide_player_control_names_key" translatable="false">hide_player_control_names_key</string>
|
||||
</resources>
|
||||
|
|
|
@ -538,4 +538,5 @@
|
|||
<string name="use">Bruk</string>
|
||||
<string name="help">Hjelp</string>
|
||||
<string name="profile_background_des">Profilbakgrunn</string>
|
||||
<string name="hide_player_control_names_key" translatable="false">hide_player_control_names_key</string>
|
||||
</resources>
|
||||
|
|
|
@ -159,4 +159,5 @@
|
|||
<string name="no_data">କୌଣସି ତଥ୍ୟ ନାହିଁ</string>
|
||||
<string name="app_dub_sub_episode_text_format" formatted="true">%1$s ଅ %2$d</string>
|
||||
<string name="video_skip_op">ଆଦ୍ୟ ବାଦ୍ ଦିଅ</string>
|
||||
<string name="hide_player_control_names_key" translatable="false">hide_player_control_names_key</string>
|
||||
</resources>
|
||||
|
|
|
@ -635,4 +635,5 @@
|
|||
<string name="dismiss">Odrzuć</string>
|
||||
<string name="open_downloaded_repo">Otwórz repozytorium</string>
|
||||
<string name="device_pin_url_message">Odwiedź <b>%s</b> na swoim smartfonie lub komputerze i wprowadź powyższy kod</string>
|
||||
<string name="hide_player_control_names_key" translatable="false">hide_player_control_names_key</string>
|
||||
</resources>
|
||||
|
|
|
@ -621,4 +621,5 @@
|
|||
<string name="player_settings_play_in_fcast">Fcast</string>
|
||||
<string name="player_settings_select_cast_device">Escolha o dispositivo</string>
|
||||
<string name="episode_action_cast_mirror">Transmitir</string>
|
||||
<string name="hide_player_control_names_key" translatable="false">hide_player_control_names_key</string>
|
||||
</resources>
|
||||
|
|
|
@ -247,4 +247,5 @@
|
|||
<string name="sort_save">oooooh uuaagh</string>
|
||||
<string name="action_open_play">@string/home_play</string>
|
||||
<string name="chromecast_subtitles_settings">oouuhhh ahhooo-ahah</string>
|
||||
<string name="hide_player_control_names_key" translatable="false">hide_player_control_names_key</string>
|
||||
</resources>
|
||||
|
|
|
@ -641,4 +641,5 @@
|
|||
<string name="player_settings_select_cast_device">Selectați divece-ul pe care doriți să faceți cast</string>
|
||||
<string name="episode_action_cast_mirror">Cast mirror</string>
|
||||
<string name="player_settings_play_in_fcast">Fcast</string>
|
||||
<string name="hide_player_control_names_key" translatable="false">hide_player_control_names_key</string>
|
||||
</resources>
|
||||
|
|
|
@ -622,4 +622,5 @@
|
|||
<string name="episode_upcoming_format" formatted="true">Выйдет %s</string>
|
||||
<string name="player_settings_play_in_fcast">Fcast</string>
|
||||
<string name="player_settings_select_cast_device">Выберите девайс для трансляции</string>
|
||||
<string name="hide_player_control_names_key" translatable="false">hide_player_control_names_key</string>
|
||||
</resources>
|
||||
|
|
|
@ -377,4 +377,5 @@
|
|||
<string name="add_repository">Pridať repozitár</string>
|
||||
<string name="repository_name_hint">Názov repozitára</string>
|
||||
<string name="view_public_repositories_button">Zobraziť komunitné repozitáre</string>
|
||||
<string name="hide_player_control_names_key" translatable="false">hide_player_control_names_key</string>
|
||||
</resources>
|
||||
|
|
|
@ -485,4 +485,5 @@
|
|||
<string name="skip_type_op">Bilowga</string>
|
||||
<string name="skip_type_mixed_op">Bilow isku qasan</string>
|
||||
<string name="skip_type_creddits">Qoraalka dhamaadka</string>
|
||||
<string name="hide_player_control_names_key" translatable="false">hide_player_control_names_key</string>
|
||||
</resources>
|
||||
|
|
|
@ -626,4 +626,5 @@
|
|||
<string name="cs3wiki">CloudStream Wiki</string>
|
||||
<string name="pref_category_accounts">Konton</string>
|
||||
<string name="pref_category_security">Säkerhet</string>
|
||||
<string name="hide_player_control_names_key" translatable="false">hide_player_control_names_key</string>
|
||||
</resources>
|
||||
|
|
|
@ -615,4 +615,5 @@
|
|||
<string name="favorite_removed">%கள் பிடித்தவைகளிலிருந்து அகற்றப்பட்டன</string>
|
||||
<string name="biometric_warning">உங்கள் கிளவுட்ச்ட்ரீம் தரவு இப்போது காப்புப் பிரதி எடுக்கப்பட்டுள்ளது. இதன் சாத்தியம் மிகக் குறைவு என்றாலும், எல்லா சாதனங்களும் வித்தியாசமாக நடந்து கொள்ளலாம். அரிய விசயத்தில், பயன்பாட்டை அணுகுவதிலிருந்து நீங்கள் பூட்டப்படுகிறீர்கள், பயன்பாட்டு தரவை முழுவதுமாக அழித்து, காப்புப்பிரதியிலிருந்து மீட்டெடுக்கவும். இதிலிருந்து எழும் ஏதேனும் சிரமத்திற்கு நாங்கள் மிகவும் வருந்துகிறோம்.</string>
|
||||
<string name="custom_media_singluar">ஊடகம்</string>
|
||||
<string name="hide_player_control_names_key" translatable="false">hide_player_control_names_key</string>
|
||||
</resources>
|
||||
|
|
|
@ -3,4 +3,5 @@
|
|||
<string name="app_dub_sub_episode_text_format" formatted="true">%1$s ክፋል %2$d</string>
|
||||
<string name="next_episode_format" formatted="true">ክፋል %d በ ላይ ይወጣል</string>
|
||||
<string name="cast_format" formatted="true">ተዋሳእቲ፡ %s</string>
|
||||
<string name="hide_player_control_names_key" translatable="false">hide_player_control_names_key</string>
|
||||
</resources>
|
||||
|
|
|
@ -265,4 +265,5 @@
|
|||
<string name="chromecast_subtitles_settings">Mga Subtitle ng Chromecast</string>
|
||||
<string name="chromecast_subtitles_settings_des">Mga setting ng mga subtitle ng Chromecast</string>
|
||||
<string name="play_trailer_button">Maglaro ng Trailer</string>
|
||||
<string name="hide_player_control_names_key" translatable="false">hide_player_control_names_key</string>
|
||||
</resources>
|
||||
|
|
|
@ -681,4 +681,5 @@
|
|||
<string name="device_pin_error_message">Cihaz PIN kodu alınamıyor, yerel kimlik doğrulamayı deneyin</string>
|
||||
<string name="device_pin_expired_message">PIN kodunun süresi doldu!</string>
|
||||
<string name="device_pin_counter_text">Kodun süresi %1$dm %2$ds içinde doluyor</string>
|
||||
<string name="hide_player_control_names_key" translatable="false">hide_player_control_names_key</string>
|
||||
</resources>
|
||||
|
|
|
@ -634,4 +634,5 @@
|
|||
<string name="device_pin_counter_text">Термін дії коду закінчується через %1$dхв %2$dс</string>
|
||||
<string name="auth_locally">Автентифікація по місцю</string>
|
||||
<string name="dismiss">Відхилити</string>
|
||||
<string name="hide_player_control_names_key" translatable="false">hide_player_control_names_key</string>
|
||||
</resources>
|
||||
|
|
|
@ -617,4 +617,5 @@
|
|||
<string name="result_search_tooltip">دیگر ایکسٹینشنز میں تلاش کریں</string>
|
||||
<string name="recommendations_tooltip">سفارشات دکھائیں</string>
|
||||
<string name="biometric_warning">آپ کے CloudStream ڈیٹا کا اب بیک اپ لیا گیا ہے۔ اگرچہ اس کا امکان بہت کم ہے، لیکن مختلف ڈیوائس مختلف طریقے سے کام کر سکتے ہیں۔ اگر آپ ایپ تک رسائی حاصل کرنے سے قاصر ہیں تو، ایپ کا ڈیٹا مکمل طور پر صاف کریں اور بیک اپ سے بحال کریں۔ اس سے ہونے والی کسی بھی تکلیف کے لیے ہم بہت معذرت خواہ ہیں۔</string>
|
||||
<string name="hide_player_control_names_key" translatable="false">hide_player_control_names_key</string>
|
||||
</resources>
|
||||
|
|
|
@ -643,4 +643,5 @@
|
|||
<string name="device_pin_url_message">Truy cập <b>%s</b> trên điện thoại hoặc máy tính và nhập mã bên trên</string>
|
||||
<string name="device_pin_expired_message">Mã PIN đã hết hạn!</string>
|
||||
<string name="device_pin_counter_text">Mã sẽ hết hạn trong %1$dm %2$ds</string>
|
||||
<string name="hide_player_control_names_key" translatable="false">hide_player_control_names_key</string>
|
||||
</resources>
|
||||
|
|
|
@ -671,4 +671,5 @@
|
|||
<string name="battery_dialog_message">為了確保下載與通知已訂閱的電視節目的不間斷,CloudStream 需要取得在背景執行的權限。若點選「確定」,將移至「應用程式資訊」,請找到「應用程式電池使用」並將電池用量設置為「無限制」。請注意,取得此權限並不表示 CS3 會明顯增加電池用量,而是只在必要時在背景執行,例如取得通知或使用官方擴充功能下載影片時。若選擇「取消」,您可以稍後在「一般設定」中調整此設定。</string>
|
||||
<string name="cs3wiki">CloudStream Wiki</string>
|
||||
<string name="biometric_unsupported">此裝置不支援生物特徵認證</string>
|
||||
<string name="hide_player_control_names_key" translatable="false">hide_player_control_names_key</string>
|
||||
</resources>
|
||||
|
|
|
@ -673,4 +673,5 @@
|
|||
<string name="player_settings_select_cast_device">选择投射设备</string>
|
||||
<string name="next_season_episode_format" formatted="true">%1$d季%2$d集将在</string>
|
||||
<string name="episode_action_cast_mirror">投射镜像</string>
|
||||
<string name="hide_player_control_names_key" translatable="false">hide_player_control_names_key</string>
|
||||
</resources>
|
||||
|
|
|
@ -797,4 +797,6 @@
|
|||
<string name="device_pin_error_message">Can\'t get the device PIN code, try local authentication</string>
|
||||
<string name="device_pin_expired_message">PIN code is now expired !</string>
|
||||
<string name="device_pin_counter_text">Code expires in %1$dm %2$ds</string>
|
||||
<string name="hide_player_control_names_key" translatable="false">hide_player_control_names_key</string>
|
||||
<string name="hide_player_control_names">Hide names of the player\'s controls</string>
|
||||
</resources>
|
|
@ -37,6 +37,12 @@
|
|||
android:icon="@drawable/ic_baseline_text_format_24"
|
||||
android:key="@string/prefer_limit_title_rez_key"
|
||||
android:title="@string/limit_title_rez" />
|
||||
<SwitchPreference
|
||||
android:icon="@drawable/ic_baseline_text_format_24"
|
||||
android:key="@string/hide_player_control_names_key"
|
||||
android:title="@string/hide_player_control_names"
|
||||
android:defaultValue="false"
|
||||
/>
|
||||
</PreferenceCategory>
|
||||
|
||||
<PreferenceCategory
|
||||
|
|
|
@ -1700,7 +1700,17 @@ suspend fun MainAPI.newMovieLoadResponse(
|
|||
builder.initializer()
|
||||
return builder
|
||||
}
|
||||
|
||||
/** Episode information that will be passed to LoadLinks function & showed on UI
|
||||
* @property data string used as main LoadLinks fun parameter.
|
||||
* @property name Name of the Episode.
|
||||
* @property season Season number.
|
||||
* @property episode Episode number.
|
||||
* @property posterUrl URL of Episode's poster image.
|
||||
* @property rating Episode rating.
|
||||
* @property date Episode air date, see addDate.
|
||||
* @property runTime Episode runtime in seconds.
|
||||
* @see[addDate]
|
||||
* */
|
||||
data class Episode(
|
||||
var data: String,
|
||||
var name: String? = null,
|
||||
|
@ -1710,7 +1720,25 @@ data class Episode(
|
|||
var rating: Int? = null,
|
||||
var description: String? = null,
|
||||
var date: Long? = null,
|
||||
)
|
||||
var runTime: Int? = null,
|
||||
) {
|
||||
/**
|
||||
* Secondary constructor for backwards compatibility without runTime.
|
||||
* TODO Remove this constructor after there is a new stable release and extensions are updated to support runTime.
|
||||
*/
|
||||
constructor(
|
||||
data: String,
|
||||
name: String? = null,
|
||||
season: Int? = null,
|
||||
episode: Int? = null,
|
||||
posterUrl: String? = null,
|
||||
rating: Int? = null,
|
||||
description: String? = null,
|
||||
date: Long? = null,
|
||||
) : this(
|
||||
data, name, season, episode, posterUrl, rating, description, date, null
|
||||
)
|
||||
}
|
||||
|
||||
fun Episode.addDate(date: String?, format: String = "yyyy-MM-dd") {
|
||||
try {
|
||||
|
|
Loading…
Reference in a new issue