Compare commits

...

25 Commits

Author SHA1 Message Date
Kelvin eaeaf3538f Better messaging on failed to connect sync 2024-12-18 22:20:11 +01:00
Kai DeLorenzo 85e381a85e Merge branch 'update-deps' into 'master'
update deps

See merge request videostreaming/grayjay!69
2024-12-18 20:37:07 +00:00
Kai 1b7ee8231b update deps 2024-12-18 14:36:40 -06:00
Kai DeLorenzo 1b8b8f5738 Merge branch 'tablet-rotation-issue' into 'master'
more recent landscape and rotation issues

See merge request videostreaming/grayjay!66
2024-12-14 20:42:11 +00:00
Kai 53df19b477 fixes for:
weird tablet issues on some screen sizes
horizontal maximized player on phones
always allow full screen rotation not working
2024-12-14 14:41:28 -06:00
Kai DeLorenzo ccf21b7580 Merge branch 'rotation-regression' into 'master'
fix rotation regression

See merge request videostreaming/grayjay!65
2024-12-14 03:13:21 +00:00
Kai 4189d62a57 fix rotation regression 2024-12-13 20:47:21 -06:00
Koen 9a3e3af614 Merge branch 'feat/apple-podcasts-plugin' into 'master'
Add Apple Podcasts plugin

See merge request videostreaming/grayjay!63
2024-12-13 18:55:16 +00:00
Stefan f7187400dc Add Apple Podcasts plugin 2024-12-13 17:59:56 +00:00
Kai DeLorenzo f55a7f0a7b Merge branch 'detect-system-setting-changes' into 'master'
detect system auto rotate setting changes

See merge request videostreaming/grayjay!62
2024-12-13 17:46:00 +00:00
Kai d6d35a645e detect system auto rotate setting changes
correctly handle lock button when full screen
2024-12-13 11:44:57 -06:00
Kai e719dcc7f5 detect system auto rotate setting changes
correctly handle lock button when full screen
2024-12-13 11:23:40 -06:00
Kai DeLorenzo bc5bc5450c Merge branch 'change-default-auto-rotate-setting' into 'master'
change default to force auto rotate while full screen

See merge request videostreaming/grayjay!61
2024-12-13 16:22:00 +00:00
Kai f4bade0c2e change default to force auto rotate while full screen 2024-12-13 10:21:40 -06:00
Koen J 9be59c674d Updated YouTube. 2024-12-13 17:13:42 +01:00
Kai DeLorenzo a1dec23c20 Merge branch 'default-reset-auto-rotate-disabled' into 'master'
remove assumptions about rotation preference

See merge request videostreaming/grayjay!60
2024-12-13 16:01:07 +00:00
Kai ed926c4e37 remove assumptions about rotation preference 2024-12-13 10:00:43 -06:00
Kai DeLorenzo ab360ed6f6 Merge branch 'force-leave-landscape-tweak' into 'master'
Force leave landscape tweak

See merge request videostreaming/grayjay!59
2024-12-13 15:43:33 +00:00
Kai 569ba3d651 suppress warning 2024-12-13 09:43:08 -06:00
Kai 60fe28c2fe simplified rotation logic 2024-12-13 09:41:52 -06:00
Kai DeLorenzo 2787e29a07 Merge branch 'delay-tweak' into 'master'
increase delay to prevent erroneous rotations

See merge request videostreaming/grayjay!58
2024-12-13 05:02:23 +00:00
Kai c77a4d08d6 increase delay to prevent erroneous rotations 2024-12-12 23:01:28 -06:00
Kai DeLorenzo 9b3f90f922 Merge branch 'auto-rotate-fixes' into 'master'
more rotation/orientation fixes

See merge request videostreaming/grayjay!57
2024-12-12 21:27:20 +00:00
Kai c88d457021 fix device getting stuck landscape or in portrait when entering and exiting full screen via the button
fix weird rotation behavior when locking and unlocking rotation via the player button
2024-12-12 15:25:02 -06:00
Koen J b20b625820 Fixed compiler errors. 2024-12-12 16:02:37 +01:00
29 changed files with 210 additions and 115 deletions
+6
View File
@@ -82,3 +82,9 @@
[submodule "app/src/stable/assets/sources/dailymotion"]
path = app/src/stable/assets/sources/dailymotion
url = ../plugins/dailymotion.git
[submodule "app/src/stable/assets/sources/apple-podcast"]
path = app/src/stable/assets/sources/apple-podcast
url = ../plugins/apple-podcasts.git
[submodule "app/src/unstable/assets/sources/apple-podcasts"]
path = app/src/unstable/assets/sources/apple-podcasts
url = ../plugins/apple-podcasts.git
@@ -415,8 +415,8 @@ class Settings : FragmentedStorageFileJson() {
@FormField(R.string.simplify_sources, FieldForm.TOGGLE, R.string.simplify_sources_description, 4)
var simplifySources: Boolean = true;
@FormField(R.string.force_allow_full_screen_rotation, FieldForm.TOGGLE, R.string.force_allow_full_screen_rotation_description, 5)
var forceAllowFullScreenRotation: Boolean = false
@FormField(R.string.always_allow_reverse_landscape_auto_rotate, FieldForm.TOGGLE, R.string.always_allow_reverse_landscape_auto_rotate_description, 5)
var alwaysAllowReverseLandscapeAutoRotate: Boolean = true
@FormField(R.string.background_behavior, FieldForm.DROPDOWN, -1, 6)
@DropdownFieldOptionsId(R.array.player_background_behavior)
@@ -122,7 +122,11 @@ class SyncPairActivity : AppCompatActivity() {
} catch (e: Throwable) {
withContext(Dispatchers.Main) {
_layoutPairingError.visibility = View.VISIBLE
_textError.text = e.message
if(e.message == "Failed to connect") {
_textError.text = "Failed to connect.\n\nThis may be due to not being on the same network, due to firewall, or vpn.\nSync currently operates only over local direct connections."
}
else
_textError.text = e.message
_layoutPairing.visibility = View.GONE
Logger.e(TAG, "Failed to pair", e)
}
@@ -1,11 +1,16 @@
package com.futo.platformplayer.fragment.mainactivity.main
import android.annotation.SuppressLint
import android.content.Context
import android.content.pm.ActivityInfo
import android.content.res.Configuration
import android.database.ContentObserver
import android.os.Build
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.view.LayoutInflater
import android.view.OrientationEventListener
import android.view.View
import android.view.ViewGroup
import android.view.WindowInsets
@@ -28,13 +33,18 @@ import com.futo.platformplayer.models.PlatformVideoWithTime
import com.futo.platformplayer.models.UrlVideoWithTime
import com.futo.platformplayer.states.StatePlayer
import com.futo.platformplayer.views.containers.SingleViewTouchableMotionLayout
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlin.math.min
//region Fragment
@UnstableApi
class VideoDetailFragment : MainFragment {
override val isMainView : Boolean = false;
class VideoDetailFragment() : MainFragment() {
override val isMainView: Boolean = false;
override val hasBottomBar: Boolean = true;
override val isOverlay : Boolean = true;
override val isOverlay: Boolean = true;
override val isHistory: Boolean = false;
private var _isActive: Boolean = false;
@@ -76,8 +86,9 @@ class VideoDetailFragment : MainFragment {
private var _loadUrlOnCreate: UrlVideoWithTime? = null;
private var _leavingPiP = false;
//region Fragment
constructor() : super()
private var _landscapeOrientationListener: LandscapeOrientationListener? = null
private var _portraitOrientationListener: PortraitOrientationListener? = null
private var _autoRotateObserver: AutoRotateObserver? = null
fun nextVideo() {
_viewDetail?.nextVideo(true, true, true);
@@ -88,23 +99,27 @@ class VideoDetailFragment : MainFragment {
}
private fun isSmallWindow(): Boolean {
return min(
resources.configuration.screenWidthDp,
resources.configuration.screenHeightDp
) < resources.getInteger(R.integer.column_width_dp) * 2
return resources.configuration.smallestScreenWidthDp < resources.getInteger(R.integer.column_width_dp) * 2
}
private fun isAutoRotateEnabled(): Boolean {
return android.provider.Settings.System.getInt(
context?.contentResolver,
android.provider.Settings.System.ACCELEROMETER_ROTATION, 0
) == 1
}
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
val isLandscapeVideo: Boolean = _viewDetail?.isLandscapeVideo() ?: false
val isSmallWindow = isSmallWindow()
if (
isSmallWindow
&& newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE
&& !isFullscreen
&& !isInPictureInPicture
&& state == State.MAXIMIZED
) {
_viewDetail?.setFullscreen(true)
@@ -141,6 +156,8 @@ class VideoDetailFragment : MainFragment {
) {
_viewDetail?.setFullscreen(true)
}
updateOrientation()
}
fun updateOrientation() {
@@ -148,25 +165,50 @@ class VideoDetailFragment : MainFragment {
val isFullScreenPortraitAllowed = Settings.instance.playback.fullscreenPortrait
val isReversePortraitAllowed = Settings.instance.playback.reversePortrait
val rotationLock = StatePlayer.instance.rotationLock
val alwaysAllowReverseLandscapeAutoRotate = Settings.instance.playback.alwaysAllowReverseLandscapeAutoRotate
val isLandscapeVideo: Boolean = _viewDetail?.isLandscapeVideo() ?: false
val isLandscapeVideo: Boolean = _viewDetail?.isLandscapeVideo() ?: true
val isSmallWindow = isSmallWindow()
val autoRotateEnabled = isAutoRotateEnabled()
// For small windows if the device isn't landscape right now and full screen portrait isn't allowed then we should force landscape
if (isSmallWindow && isFullscreen && !isFullScreenPortraitAllowed && resources.configuration.orientation == Configuration.ORIENTATION_PORTRAIT && !rotationLock && isLandscapeVideo) {
if(Settings.instance.playback.forceAllowFullScreenRotation){
if (alwaysAllowReverseLandscapeAutoRotate){
a.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE
}else{
} else {
a.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_USER_LANDSCAPE
}
if (autoRotateEnabled
) {
// start listening for the device to rotate to landscape
// at which point we'll be able to set requestedOrientation to back to UNSPECIFIED
_landscapeOrientationListener?.enableListener()
}
}
// For small windows if always all reverse landscape then we'll lock the orientation to landscape when system auto-rotate is off to make sure that locking
// and unlockiung in the player settings keep orientation in landscape
else if (isSmallWindow && isFullscreen && !isFullScreenPortraitAllowed && alwaysAllowReverseLandscapeAutoRotate && !rotationLock && isLandscapeVideo && !autoRotateEnabled) {
a.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE
}
// For small windows if the device isn't in a portrait orientation and we're in the maximized state then we should force portrait
// only do this if auto-rotate is on portrait is forced when leaving full screen for autorotate off
else if (isSmallWindow && !isMinimizingFromFullScreen && !isFullscreen && state == State.MAXIMIZED && resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE) {
@SuppressLint("SourceLockedOrientationActivity")
a.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT
if (autoRotateEnabled
) {
// start listening for the device to rotate to portrait
// at which point we'll be able to set requestedOrientation to back to UNSPECIFIED
_portraitOrientationListener?.enableListener()
}
} else if (rotationLock) {
_portraitOrientationListener?.disableListener()
_landscapeOrientationListener?.disableListener()
a.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LOCKED
} else {
_portraitOrientationListener?.disableListener()
_landscapeOrientationListener?.disableListener()
a.requestedOrientation = if (isReversePortraitAllowed) {
ActivityInfo.SCREEN_ORIENTATION_FULL_USER
} else {
@@ -341,6 +383,30 @@ class VideoDetailFragment : MainFragment {
StatePlayer.instance.onRotationLockChanged.subscribe(this) {
updateOrientation()
}
val delayBeforeRemoveRotationLock = 800L
_landscapeOrientationListener = LandscapeOrientationListener(requireContext())
{
CoroutineScope(Dispatchers.Main).launch {
// delay to make sure that the system auto rotate updates
delay(delayBeforeRemoveRotationLock)
updateOrientation()
}
}
_portraitOrientationListener = PortraitOrientationListener(requireContext())
{
CoroutineScope(Dispatchers.Main).launch {
// delay to make sure that the system auto rotate updates
delay(delayBeforeRemoveRotationLock)
updateOrientation()
}
}
_autoRotateObserver = AutoRotateObserver(requireContext(), Handler(Looper.getMainLooper())) {
updateOrientation()
}
_autoRotateObserver?.startObserving()
return _view!!;
}
@@ -442,6 +508,10 @@ class VideoDetailFragment : MainFragment {
SettingsActivity.settingsActivityClosed.remove(this)
StatePlayer.instance.onRotationLockChanged.remove(this)
_landscapeOrientationListener?.disableListener()
_portraitOrientationListener?.disableListener()
_autoRotateObserver?.stopObserving()
_viewDetail?.let {
_viewDetail = null;
it.onDestroy();
@@ -513,6 +583,11 @@ class VideoDetailFragment : MainFragment {
showSystemUI()
}
// temporarily force the device to portrait if auto-rotate is disabled to prevent landscape when exiting full screen on a small device
// @SuppressLint("SourceLockedOrientationActivity")
// if (!isFullscreen && isSmallWindow() && !isAutoRotateEnabled() && !isMinimizingFromFullScreen) {
// activity?.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT
// }
updateOrientation();
_view?.allowMotion = !fullscreen;
}
@@ -534,4 +609,88 @@ class VideoDetailFragment : MainFragment {
//region View
//TODO: Determine if encapsulated would be readable enough
//endregion
}
}
class LandscapeOrientationListener(
context: Context,
private val onLandscapeDetected: () -> Unit
) : OrientationEventListener(context) {
private var isListening = false
override fun onOrientationChanged(orientation: Int) {
if (!isListening) return
if (orientation in 60..120 || orientation in 240..300) {
onLandscapeDetected()
disableListener()
}
}
fun enableListener() {
if (!isListening) {
isListening = true
enable()
}
}
fun disableListener() {
if (isListening) {
isListening = false
disable()
}
}
}
class PortraitOrientationListener(
context: Context,
private val onPortraitDetected: () -> Unit
) : OrientationEventListener(context) {
private var isListening = false
override fun onOrientationChanged(orientation: Int) {
if (!isListening) return
if (orientation in 0..30 || orientation in 330..360 || orientation in 150..210) {
onPortraitDetected()
disableListener()
}
}
fun enableListener() {
if (!isListening) {
isListening = true
enable()
}
}
fun disableListener() {
if (isListening) {
isListening = false
disable()
}
}
}
class AutoRotateObserver(context: Context, handler: Handler, private val onAutoRotateChanged: () -> Unit) : ContentObserver(handler) {
private val contentResolver = context.contentResolver
override fun onChange(selfChange: Boolean) {
super.onChange(selfChange)
onAutoRotateChanged()
}
fun startObserving() {
contentResolver.registerContentObserver(
android.provider.Settings.System.getUriFor(android.provider.Settings.System.ACCELEROMETER_ROTATION),
false,
this
)
}
fun stopObserving() {
contentResolver.unregisterContentObserver(this)
}
}
@@ -2384,8 +2384,13 @@ class VideoDetailView : ConstraintLayout {
}
fun isLandscapeVideo(): Boolean? {
val videoSourceWidth = _player.exoPlayer?.player?.videoSize?.width
val videoSourceHeight = _player.exoPlayer?.player?.videoSize?.height
var videoSourceWidth = _player.exoPlayer?.player?.videoSize?.width
var videoSourceHeight = _player.exoPlayer?.player?.videoSize?.height
if (video?.video?.videoSources?.isNotEmpty() == true && (videoSourceWidth == null || videoSourceHeight == null || videoSourceWidth == 0 || videoSourceHeight == 0)) {
videoSourceWidth = video?.video?.videoSources!![0].width
videoSourceHeight = video?.video?.videoSources!![0].height
}
return if (videoSourceWidth == null || videoSourceHeight == null || videoSourceWidth == 0 || videoSourceHeight == 0){
null
@@ -592,11 +592,6 @@ class FutoVideoPlayer : FutoVideoPlayerBase {
@OptIn(UnstableApi::class)
fun setFullScreen(fullScreen: Boolean) {
// prevent fullscreen before the video has loaded to make sure we know whether it's a vertical or horizontal video
if(exoPlayer?.player?.videoSize?.height ?: 0 == 0 && fullScreen){
return
}
updateRotateLock()
if (isFullScreen == fullScreen) {
-8
View File
@@ -233,8 +233,6 @@
<string name="announcement">إعلان</string>
<string name="attempt_to_utilize_byte_ranges">محاولة استخدام مدى البايت</string>
<string name="auto_update">تحديث تلقائي</string>
<string name="auto_rotate">تدوير تلقائي</string>
<string name="auto_rotate_dead_zone">منطقة ميتة للتدوير التلقائي</string>
<string name="automatic_backup">نسخ احتياطي تلقائي</string>
<string name="background_behavior">سلوك الخلفية</string>
<string name="background_update">تحديث الخلفية</string>
@@ -539,7 +537,6 @@
<string name="not_yet_available_retrying_in_time_s">لم يصبح متوفراً بعد، إعادة المحاولة في {time}s</string>
<string name="failed_to_retry_for_live_stream">فشل في إعادة المحاولة للبث المباشر</string>
<string name="this_app_is_in_development_please_submit_bug_reports_and_understand_that_many_features_are_incomplete">هذا التطبيق قيد التطوير. يرجى إرسال تقارير الأخطاء وفهم أن العديد من الميزات غير مكتملة.</string>
<string name="please_use_at_least_3_characters">يرجى استخدام 3 أحرف على الأقل</string>
<string name="are_you_sure_you_want_to_delete_this_video">هل أنت متأكد من أنك ترغب في حذف هذا الفيديو؟</string>
<string name="tap_to_open">انقر للفتح</string>
<string name="watching">يشاهد</string>
@@ -661,11 +658,6 @@
<item>عند التشغيل</item>
<item>أبداً</item>
</string-array>
<string-array name="system_enabled_disabled_array">
<item>معطل</item>
<item>مفعل</item>
<item>كما في النظام</item>
</string-array>
<string-array name="enabled_disabled_array">
<item>معطل</item>
<item>مفعل</item>
-8
View File
@@ -243,8 +243,6 @@
<string name="announcement">Ankündigung</string>
<string name="attempt_to_utilize_byte_ranges">Versuch, Byte-Bereiche zu nutzen</string>
<string name="auto_update">Automatische Aktualisierung</string>
<string name="auto_rotate">Automatische Drehung</string>
<string name="auto_rotate_dead_zone">Toter Winkel für automatische Drehung</string>
<string name="automatic_backup">Automatisches Backup</string>
<string name="background_behavior">Hintergrundverhalten</string>
<string name="background_update">Hintergrundaktualisierung</string>
@@ -542,7 +540,6 @@
<string name="not_yet_available_retrying_in_time_s">Noch nicht verfügbar, erneuter Versuch in {time}s</string>
<string name="failed_to_retry_for_live_stream">Fehler beim erneuten Versuch für den Live-Stream</string>
<string name="this_app_is_in_development_please_submit_bug_reports_and_understand_that_many_features_are_incomplete">Diese App befindet sich in der Entwicklung. Bitte senden Sie Fehlerberichte und verstehen Sie, dass viele Funktionen unvollständig sind.</string>
<string name="please_use_at_least_3_characters">Bitte verwenden Sie mindestens 3 Zeichen</string>
<string name="are_you_sure_you_want_to_delete_this_video">Sind Sie sicher, dass Sie dieses Video löschen möchten?</string>
<string name="tap_to_open">Tippen Sie zum Öffnen</string>
<string name="watching">anschauen</string>
@@ -661,11 +658,6 @@
<item>Beim Start</item>
<item>Nie</item>
</string-array>
<string-array name="system_enabled_disabled_array">
<item>Deaktiviert</item>
<item>Aktiviert</item>
<item>Gleich wie System</item>
</string-array>
<string-array name="enabled_disabled_array">
<item>Deaktiviert</item>
<item>Aktiviert</item>
-14
View File
@@ -217,8 +217,6 @@
<string name="announcement">Anuncio</string>
<string name="attempt_to_utilize_byte_ranges">Intentar utilizar rangos de bytes</string>
<string name="auto_update">Actualización automática</string>
<string name="auto_rotate">Auto-rotar</string>
<string name="auto_rotate_dead_zone">Zona muerta de auto-rotación</string>
<string name="automatic_backup">Copia de seguridad automática</string>
<string name="background_behavior">Comportamiento en segundo plano</string>
<string name="background_update">Actualización en segundo plano</string>
@@ -523,7 +521,6 @@
<string name="not_yet_available_retrying_in_time_s">Todavía no está disponible, reintento en {time}s</string>
<string name="failed_to_retry_for_live_stream">Error al reintentar la transmisión en vivo</string>
<string name="this_app_is_in_development_please_submit_bug_reports_and_understand_that_many_features_are_incomplete">Esta aplicación está en desarrollo. Por favor, envía informes de errores y comprende que muchas características están incompletas.</string>
<string name="please_use_at_least_3_characters">Por favor, usa al menos 3 caracteres</string>
<string name="are_you_sure_you_want_to_delete_this_video">¿Estás seguro de que deseas eliminar este video?</string>
<string name="tap_to_open">Toca para abrir</string>
<string name="watching">viendo</string>
@@ -671,17 +668,6 @@
<item>Al Iniciar</item>
<item>Nunca</item>
</string-array>
<string-array name="system_enabled_disabled_array">
<item>Desactivado</item>
<item>Activado</item>
<item>Mismo que el Sistema</item>
</string-array>
<string-array name="auto_rotate_dead_zone">
<item>0</item>
<item>5</item>
<item>10</item>
<item>20</item>
</string-array>
<string-array name="enabled_disabled_array">
<item>Desactivado</item>
<item>Activado</item>
-8
View File
@@ -256,8 +256,6 @@
<string name="announcement">Annonce</string>
<string name="attempt_to_utilize_byte_ranges">Tentative d\'utilisation de plages d\'octets</string>
<string name="auto_update">Mise à jour automatique</string>
<string name="auto_rotate">Rotation automatique</string>
<string name="auto_rotate_dead_zone">Zone morte de rotation automatique</string>
<string name="automatic_backup">Sauvegarde automatique</string>
<string name="background_behavior">Comportement en arrière-plan</string>
<string name="background_update">Mise à jour en arrière-plan</string>
@@ -562,7 +560,6 @@
<string name="not_yet_available_retrying_in_time_s">Pas encore disponible, réessai dans {time}s</string>
<string name="failed_to_retry_for_live_stream">Échec de la tentative de réessai pour la diffusion en direct</string>
<string name="this_app_is_in_development_please_submit_bug_reports_and_understand_that_many_features_are_incomplete">Cette application est en développement. Veuillez soumettre des rapports de bug et comprendre que de nombreuses fonctionnalités ne sont pas encore complètes.</string>
<string name="please_use_at_least_3_characters">Veuillez utiliser au moins 3 caractères</string>
<string name="are_you_sure_you_want_to_delete_this_video">Êtes-vous sûr de vouloir supprimer cette vidéo ?</string>
<string name="tap_to_open">Appuyez pour ouvrir</string>
<string name="watching">en train de regarder</string>
@@ -661,11 +658,6 @@
<item>Au démarrage</item>
<item>Jamais</item>
</string-array>
<string-array name="system_enabled_disabled_array">
<item>Désactivé</item>
<item>Activé</item>
<item>Même que le système</item>
</string-array>
<string-array name="enabled_disabled_array">
<item>Désactivé</item>
<item>Activé</item>
-8
View File
@@ -220,8 +220,6 @@
<string name="announcement">お知らせ</string>
<string name="attempt_to_utilize_byte_ranges">バイト範囲を使用する試み</string>
<string name="auto_update">自動更新</string>
<string name="auto_rotate">自動回転</string>
<string name="auto_rotate_dead_zone">自動回転デッドゾーン</string>
<string name="automatic_backup">自動バックアップ</string>
<string name="background_behavior">バックグラウンドの動作</string>
<string name="background_update">バックグラウンド更新</string>
@@ -524,7 +522,6 @@
<string name="not_yet_available_retrying_in_time_s">{time}秒後に再試行、まだ利用できません</string>
<string name="failed_to_retry_for_live_stream">ライブストリームの再試行に失敗しました</string>
<string name="this_app_is_in_development_please_submit_bug_reports_and_understand_that_many_features_are_incomplete">このアプリは開発中です。バグレポートを提出し、多くの機能が未完成であることを理解してください。</string>
<string name="please_use_at_least_3_characters">少なくとも3文字を使用してください</string>
<string name="are_you_sure_you_want_to_delete_this_video">このビデオを削除してもよろしいですか?</string>
<string name="tap_to_open">タップして開く</string>
<string name="watching">視聴中</string>
@@ -661,11 +658,6 @@
<item>起動時</item>
<item>なし</item>
</string-array>
<string-array name="system_enabled_disabled_array">
<item>無効</item>
<item>有効</item>
<item>システムと同じ</item>
</string-array>
<string-array name="enabled_disabled_array">
<item>無効</item>
<item>有効</item>
-8
View File
@@ -255,8 +255,6 @@
<string name="announcement">공고</string>
<string name="attempt_to_utilize_byte_ranges">바이트 범위 사용 시도</string>
<string name="auto_update">자동 업데이트</string>
<string name="auto_rotate">자동 회전</string>
<string name="auto_rotate_dead_zone">자동 회전 데드 존</string>
<string name="automatic_backup">자동 백업</string>
<string name="background_behavior">백그라운드 동작</string>
<string name="background_update">백그라운드 업데이트</string>
@@ -561,7 +559,6 @@
<string name="not_yet_available_retrying_in_time_s">아직 사용할 수 없습니다, {time}초 후에 다시 시도합니다</string>
<string name="failed_to_retry_for_live_stream">라이브 스트림을 다시 시도하지 못했습니다</string>
<string name="this_app_is_in_development_please_submit_bug_reports_and_understand_that_many_features_are_incomplete">이 앱은 개발 중입니다. 버그 보고를 제출해 주시고, 많은 기능이 미완성임을 이해해 주세요.</string>
<string name="please_use_at_least_3_characters">최소 3자 이상 사용해 주세요</string>
<string name="are_you_sure_you_want_to_delete_this_video">이 비디오를 삭제하시겠습니까?</string>
<string name="tap_to_open">열려면 탭하세요</string>
<string name="watching">시청 중</string>
@@ -661,11 +658,6 @@
<item>시작할 때</item>
<item>안 함</item>
</string-array>
<string-array name="system_enabled_disabled_array">
<item>비활성화</item>
<item>활성화</item>
<item>시스템과 동일</item>
</string-array>
<string-array name="enabled_disabled_array">
<item>비활성화</item>
<item>활성화</item>
-8
View File
@@ -256,8 +256,6 @@
<string name="announcement">Anúncio</string>
<string name="attempt_to_utilize_byte_ranges">Tentar utilizar intervalos de bytes</string>
<string name="auto_update">Atualização Automática</string>
<string name="auto_rotate">Rotação Automática</string>
<string name="auto_rotate_dead_zone">Zona Morta de Rotação Automática</string>
<string name="automatic_backup">Backup Automático</string>
<string name="background_behavior">Comportamento em Segundo Plano</string>
<string name="background_update">Atualização em Segundo Plano</string>
@@ -557,7 +555,6 @@
<string name="not_yet_available_retrying_in_time_s">Ainda não disponível, tentando novamente em {time}s</string>
<string name="failed_to_retry_for_live_stream">Falha ao tentar novamente para transmissão ao vivo</string>
<string name="this_app_is_in_development_please_submit_bug_reports_and_understand_that_many_features_are_incomplete">Este aplicativo está em desenvolvimento. Envie relatórios de erros e entenda que muitos recursos estão incompletos.</string>
<string name="please_use_at_least_3_characters">Use pelo menos 3 caracteres</string>
<string name="are_you_sure_you_want_to_delete_this_video">Tem certeza de que deseja excluir este vídeo?</string>
<string name="tap_to_open">Toque para abrir</string>
<string name="watching">Assistindo</string>
@@ -661,11 +658,6 @@
<item>Ao Iniciar</item>
<item>Nunca</item>
</string-array>
<string-array name="system_enabled_disabled_array">
<item>Desativado</item>
<item>Ativado</item>
<item>Como no Sistema</item>
</string-array>
<string-array name="enabled_disabled_array">
<item>Desativado</item>
<item>Ativado</item>
-8
View File
@@ -252,8 +252,6 @@
<string name="announcement">Объявление</string>
<string name="attempt_to_utilize_byte_ranges">Попытка использовать диапазоны байт</string>
<string name="auto_update">Автообновление</string>
<string name="auto_rotate">Автоповорот</string>
<string name="auto_rotate_dead_zone">Мертвая зона автоповорота</string>
<string name="automatic_backup">Автоматическое резервное копирование</string>
<string name="background_behavior">Поведение в фоновом режиме</string>
<string name="background_update">Фоновое обновление</string>
@@ -558,7 +556,6 @@
<string name="not_yet_available_retrying_in_time_s">Ещё недоступно, повторная попытка через {time}с</string>
<string name="failed_to_retry_for_live_stream">Не удалось повторить попытку для прямого эфира</string>
<string name="this_app_is_in_development_please_submit_bug_reports_and_understand_that_many_features_are_incomplete">Это приложение находится в стадии разработки. Пожалуйста, отправляйте сообщения об ошибках и поймите, что многие функции незавершены.</string>
<string name="please_use_at_least_3_characters">Пожалуйста, используйте хотя бы 3 символа</string>
<string name="are_you_sure_you_want_to_delete_this_video">Вы уверены, что хотите удалить это видео?</string>
<string name="tap_to_open">Нажмите, чтобы открыть</string>
<string name="watching">Смотрят</string>
@@ -661,11 +658,6 @@
<item>При запуске</item>
<item>Никогда</item>
</string-array>
<string-array name="system_enabled_disabled_array">
<item>Отключено</item>
<item>Включено</item>
<item>Как в системе</item>
</string-array>
<string-array name="enabled_disabled_array">
<item>Отключено</item>
<item>Включено</item>
-8
View File
@@ -256,8 +256,6 @@
<string name="announcement">公告</string>
<string name="attempt_to_utilize_byte_ranges">尝试使用字节范围</string>
<string name="auto_update">自动更新</string>
<string name="auto_rotate">自动旋转</string>
<string name="auto_rotate_dead_zone">自动旋转死区</string>
<string name="automatic_backup">自动备份</string>
<string name="background_behavior">后台行为</string>
<string name="background_update">后台更新</string>
@@ -562,7 +560,6 @@
<string name="not_yet_available_retrying_in_time_s">尚未可用,将在{time}s后重试</string>
<string name="failed_to_retry_for_live_stream">无法重新尝试直播流</string>
<string name="this_app_is_in_development_please_submit_bug_reports_and_understand_that_many_features_are_incomplete">此应用处于开发中。请提交错误报告,并理解许多功能尚未完成。</string>
<string name="please_use_at_least_3_characters">请至少使用3个字符</string>
<string name="are_you_sure_you_want_to_delete_this_video">您确定要删除此视频吗?</string>
<string name="tap_to_open">点击打开</string>
<string name="watching">正在观看</string>
@@ -661,11 +658,6 @@
<item>启动时</item>
<item>从不</item>
</string-array>
<string-array name="system_enabled_disabled_array">
<item>已禁用</item>
<item>已启用</item>
<item>与系统相同</item>
</string-array>
<string-array name="enabled_disabled_array">
<item>已禁用</item>
<item>已启用</item>
+2 -2
View File
@@ -287,8 +287,8 @@
<string name="planned_content_notifications_description">Schedules discovered planned content as notifications, resulting in more accurate notifications for this content.</string>
<string name="attempt_to_utilize_byte_ranges">Attempt to utilize byte ranges</string>
<string name="auto_update">Auto Update</string>
<string name="force_allow_full_screen_rotation">Force Allow Full Screen Rotation</string>
<string name="force_allow_full_screen_rotation_description">Allow auto-rotation between the two landscape orientations even when you disable auto-rotate at the system level.</string>
<string name="always_allow_reverse_landscape_auto_rotate">Always allow reverse landscape auto-rotate</string>
<string name="always_allow_reverse_landscape_auto_rotate_description">There will always be auto-rotation between the two landscape orientations in full-screen mode, even when you disable auto-rotate in system settings.</string>
<string name="simplify_sources">Simplify sources</string>
<string name="simplify_sources_description">Deduplicate sources by resolution so that only more relevant sources are visible.</string>
<string name="automatic_backup">Automatic Backup</string>
+2 -1
View File
@@ -12,7 +12,8 @@
"cf8ea74d-ad9b-489e-a083-539b6aa8648c": "sources/bilibili/build/BiliBiliConfig.json",
"4e365633-6d3f-4267-8941-fdc36631d813": "sources/spotify/build/SpotifyConfig.json",
"9c87e8db-e75d-48f4-afe5-2d203d4b95c5": "sources/dailymotion/build/DailymotionConfig.json",
"e8b1ad5f-0c6d-497d-a5fa-0a785a16d902": "sources/bitchute/BitchuteConfig.json"
"e8b1ad5f-0c6d-497d-a5fa-0a785a16d902": "sources/bitchute/BitchuteConfig.json",
"89ae4889-0420-4d16-ad6c-19c776b28f99": "sources/apple-podcasts/ApplePodcastsConfig.json"
},
"SOURCES_EMBEDDED_DEFAULT": [
"35ae969a-a7db-11ed-afa1-0242ac120002"
+2 -1
View File
@@ -12,7 +12,8 @@
"cf8ea74d-ad9b-489e-a083-539b6aa8648c": "sources/bilibili/build/BiliBiliConfig.json",
"4e365633-6d3f-4267-8941-fdc36631d813": "sources/spotify/build/SpotifyConfig.json",
"9c87e8db-e75d-48f4-afe5-2d203d4b95c5": "sources/dailymotion/build/DailymotionConfig.json",
"e8b1ad5f-0c6d-497d-a5fa-0a785a16d902": "sources/bitchute/BitchuteConfig.json"
"e8b1ad5f-0c6d-497d-a5fa-0a785a16d902": "sources/bitchute/BitchuteConfig.json",
"89ae4889-0420-4d16-ad6c-19c776b28f99": "sources/apple-podcasts/ApplePodcastsConfig.json"
},
"SOURCES_EMBEDDED_DEFAULT": [
"35ae969a-a7db-11ed-afa1-0242ac120002"