diff --git a/.github/actions/native-build/action.yml b/.github/actions/native-build/action.yml
index 309c6b59..770e552a 100644
--- a/.github/actions/native-build/action.yml
+++ b/.github/actions/native-build/action.yml
@@ -10,7 +10,7 @@ runs:
- name: Load ffmpeg module cache
id: cache_ffmpeg_module
if: ${{ inputs.cache }}
- uses: actions/cache/restore@v4
+ uses: actions/cache/restore@v5
with:
path: |
app/libs
@@ -18,7 +18,7 @@ runs:
- name: Load libmpv module cache
id: cache_libmpv_module
if: ${{ inputs.cache }}
- uses: actions/cache/restore@v4
+ uses: actions/cache/restore@v5
with:
path: |
app/src/main/libs
@@ -43,7 +43,7 @@ runs:
./build_ffmpeg_decoder.sh "${{ env.ANDROID_SDK_ROOT }}/ndk/${{ env.NDK_VERSION }}"
- name: Save ffmpeg module cache
id: cache_ffmpeg_module_save
- uses: actions/cache/save@v4
+ uses: actions/cache/save@v5
with:
path: |
app/libs
@@ -75,7 +75,7 @@ runs:
#ln -s libs jniLibs
- name: Save libmpv module cache
id: cache_libmpv_module_save
- uses: actions/cache/save@v4
+ uses: actions/cache/save@v5
with:
path: |
app/src/main/libs
diff --git a/.github/actions/setup/action.yml b/.github/actions/setup/action.yml
index 1153cc97..774dae38 100644
--- a/.github/actions/setup/action.yml
+++ b/.github/actions/setup/action.yml
@@ -6,9 +6,9 @@ runs:
steps:
# Setup the SDKs
- name: Set up Python
- uses: actions/setup-python@v5
+ uses: actions/setup-python@v6
with:
- python-version: '3.12'
+ python-version: '3.14'
- name: Setup JDK
uses: actions/setup-java@v5
with:
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index 539f0572..9583525d 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -25,7 +25,7 @@ jobs:
contents: write
steps:
- name: Checkout the code
- uses: actions/checkout@v5
+ uses: actions/checkout@v6
with:
fetch-depth: 0 # Need the tags to build
- name: Setup
diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml
index 56513c4b..db31b32e 100644
--- a/.github/workflows/pr.yml
+++ b/.github/workflows/pr.yml
@@ -16,13 +16,13 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout the code
- uses: actions/checkout@v5
+ uses: actions/checkout@v6
with:
fetch-depth: 0 # Need the tags to build
- name: Setup Python
uses: actions/setup-python@v6
with:
- python-version: '3.12'
+ python-version: '3.14'
- name: Run pre-commit
uses: pre-commit/action@v3.0.1
@@ -31,7 +31,7 @@ jobs:
needs: pre-commit
steps:
- name: Checkout the code
- uses: actions/checkout@v5
+ uses: actions/checkout@v6
with:
fetch-depth: 0 # Need the tags to build
- name: Setup
@@ -49,13 +49,13 @@ jobs:
- name: Tar build dirs
run: |
tar -czf build.tgz ./app/.
- - uses: actions/upload-artifact@v5
+ - uses: actions/upload-artifact@v6
id: upload-build-dirs
with:
name: "${{ env.BUILD_DIRS_ARTIFACT }}"
path: build.tgz
if-no-files-found: error
- - uses: actions/upload-artifact@v5
+ - uses: actions/upload-artifact@v6
with:
name: APKs
path: "${{ steps.buildapp.outputs.apks }}"
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 7c5c45f9..b63017b5 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -21,7 +21,7 @@ jobs:
contents: write
steps:
- name: Checkout the code
- uses: actions/checkout@v5
+ uses: actions/checkout@v6
with:
fetch-depth: 0 # Need the tags to build
- name: Setup
diff --git a/app/src/main/java/com/github/damontecres/wholphin/data/model/BaseItem.kt b/app/src/main/java/com/github/damontecres/wholphin/data/model/BaseItem.kt
index 5703b682..3030b7d0 100644
--- a/app/src/main/java/com/github/damontecres/wholphin/data/model/BaseItem.kt
+++ b/app/src/main/java/com/github/damontecres/wholphin/data/model/BaseItem.kt
@@ -92,12 +92,16 @@ data class BaseItem(
episodeCornerText =
data.indexNumber?.let { "E$it" }
?: data.premiereDate?.let(::formatDateTime),
- episdodeUnplayedCornerText =
- data.indexNumber?.let { "E$it" }
- ?: data.userData
- ?.unplayedItemCount
- ?.takeIf { it > 0 }
- ?.let { abbreviateNumber(it) },
+ episodeUnplayedCornerText =
+ if (type == BaseItemKind.SERIES || type == BaseItemKind.SEASON || type == BaseItemKind.BOX_SET) {
+ data.indexNumber?.let { "E$it" }
+ ?: data.userData
+ ?.unplayedItemCount
+ ?.takeIf { it > 0 }
+ ?.let { abbreviateNumber(it) }
+ } else {
+ null
+ },
quickDetails =
buildAnnotatedString {
val details =
@@ -208,6 +212,6 @@ val BaseItemDto.aspectRatioFloat: Float? get() = width?.let { w -> height?.let {
@Immutable
data class BaseItemUi(
val episodeCornerText: String?,
- val episdodeUnplayedCornerText: String?,
+ val episodeUnplayedCornerText: String?,
val quickDetails: AnnotatedString,
)
diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/Formatting.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/Formatting.kt
index e4f107b4..1842620a 100644
--- a/app/src/main/java/com/github/damontecres/wholphin/ui/Formatting.kt
+++ b/app/src/main/java/com/github/damontecres/wholphin/ui/Formatting.kt
@@ -167,19 +167,19 @@ fun listToDotString(
strings.forEachIndexed { index, string ->
append(string)
if (index != strings.lastIndex) dot()
- communityRating?.let {
- dot()
- append(String.format(Locale.getDefault(), "%.1f", it))
- appendInlineContent(id = "star")
- }
- criticRating?.let {
- dot()
- append("${it.toInt()}%")
- if (it >= 60f) {
- appendInlineContent(id = "fresh")
- } else {
- appendInlineContent(id = "rotten")
- }
+ }
+ communityRating?.let {
+ dot()
+ append(String.format(Locale.getDefault(), "%.1f", it))
+ appendInlineContent(id = "star")
+ }
+ criticRating?.let {
+ dot()
+ append("${it.toInt()}%")
+ if (it >= 60f) {
+ appendInlineContent(id = "fresh")
+ } else {
+ appendInlineContent(id = "rotten")
}
}
}
diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/detail/discover/DiscoverMovieDetailsHeader.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/detail/discover/DiscoverMovieDetailsHeader.kt
index 79ccb8dd..d8647132 100644
--- a/app/src/main/java/com/github/damontecres/wholphin/ui/detail/discover/DiscoverMovieDetailsHeader.kt
+++ b/app/src/main/java/com/github/damontecres/wholphin/ui/detail/discover/DiscoverMovieDetailsHeader.kt
@@ -65,7 +65,7 @@ fun DiscoverMovieDetailsHeader(
) {
val padding = 4.dp
val details =
- remember(movie) {
+ remember(movie, rating) {
buildList {
movie.releaseDate?.let(::add)
movie.runtime
@@ -89,6 +89,7 @@ fun DiscoverMovieDetailsHeader(
?.releaseDates
?.firstOrNull()
?.certification
+ ?.takeIf { it.isNotNullOrBlank() }
?.let(::add)
}.let {
listToDotString(
diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/detail/discover/DiscoverSeriesDetails.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/detail/discover/DiscoverSeriesDetails.kt
index dcaed1c5..64748bd0 100644
--- a/app/src/main/java/com/github/damontecres/wholphin/ui/detail/discover/DiscoverSeriesDetails.kt
+++ b/app/src/main/java/com/github/damontecres/wholphin/ui/detail/discover/DiscoverSeriesDetails.kt
@@ -463,7 +463,7 @@ fun DiscoverSeriesDetailsHeader(
) {
val padding = 4.dp
val details =
- remember(series) {
+ remember(series, rating) {
buildList {
series.firstAirDate?.let(::add)
series.episodeRunTime
diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/detail/movie/MovieDetailsHeader.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/detail/movie/MovieDetailsHeader.kt
index 4d5f72d7..45e3ee54 100644
--- a/app/src/main/java/com/github/damontecres/wholphin/ui/detail/movie/MovieDetailsHeader.kt
+++ b/app/src/main/java/com/github/damontecres/wholphin/ui/detail/movie/MovieDetailsHeader.kt
@@ -113,6 +113,7 @@ fun MovieDetailsHeader(
movie.data.people
?.filter { it.type == PersonKind.DIRECTOR && it.name.isNotNullOrBlank() }
?.joinToString(", ") { it.name!! }
+ ?.takeIf { it.isNotNullOrBlank() }
}
directorName
diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/main/HomePage.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/main/HomePage.kt
index c7c345c1..7b964fc7 100644
--- a/app/src/main/java/com/github/damontecres/wholphin/ui/main/HomePage.kt
+++ b/app/src/main/java/com/github/damontecres/wholphin/ui/main/HomePage.kt
@@ -494,7 +494,7 @@ fun HomePageCardContent(
aspectRatio = ratio,
imageType = imageType,
imageContentScale = scale,
- cornerText = item?.ui?.episdodeUnplayedCornerText,
+ cornerText = item?.ui?.episodeUnplayedCornerText,
played = item?.data?.userData?.played ?: false,
favorite = item?.favorite ?: false,
playPercent =
@@ -512,7 +512,7 @@ fun HomePageCardContent(
aspectRatio = ratio,
imageType = imageType,
imageContentScale = scale,
- cornerText = item?.ui?.episdodeUnplayedCornerText,
+ cornerText = item?.ui?.episodeUnplayedCornerText,
played = item?.data?.userData?.played ?: false,
favorite = item?.favorite ?: false,
playPercent =
diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml
index 4ed1e15c..1a328c33 100644
--- a/app/src/main/res/values-cs/strings.xml
+++ b/app/src/main/res/values-cs/strings.xml
@@ -22,7 +22,7 @@
Potvrdit
Pokračovat ve sledování
Hodnocení kritiků
- %.1f sekund
+ %.2f sekund
Výchozí
Smazat
Zemřel
@@ -453,4 +453,26 @@
Prokládané
Color code programs
MPV je nyní výchozím přehrávačem mimo HDR.\nToto můžete změnit v nastavení.
+ Styl HDR titulků
+ Průhlednost obrázku titulků
+ Jas
+ Kontrast
+ Sytost
+ Odstín
+ Červená
+ Zelená
+ Modrá
+ Rozostření
+ Uložit do alba
+ Přehrát prezentaci
+ Zastavit prezentaci
+ Na začátek
+ Žádné další fotky
+ Otočit vlevo
+ Otočit vpravo
+ Přiblížit
+ Oddálit
+ Trvání prezentace
+ Přehrávat videa během prezentace
+ Odesílat protokol informací o médiích serveru
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 03038fc8..eddd471d 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -371,7 +371,7 @@
Im Trend
Starten der Spracherkennung fehlgeschlagen
Zurück wählen um abzubrechen
- MPV ist jetzt der Standard-Player, außer für HDR.\nDas kannst du in den Einstellungen ändern.
+ MPV ist jetzt der Standard-Player, außer für HDR.\nDu kannst das in den Einstellungen ändern.
Sprachsuche
Sprechen, um zu suchen
Ignoriert geräte kompatibilität
@@ -384,4 +384,37 @@
Hintergrundstil
Bildwiederholraten-Anpassung
Keine Spracheingabe erkannt
+ Spracherkennungsfehler
+ Aufnahme-Fehler
+ Keine Spracherkennung
+ Spracherkennung beschäftigt
+ Spracherkennung ist abgelaufen
+ Videobereich
+ Video-Bereichstyp
+ Farbkorrektur-Software
+ Spur-Auswahl löschen
+ Seerr-Server entfernen
+ AV1 Software-Dekodierung
+ anamorph
+ Farbraum
+ Farbübertragung
+ Primärfarben
+ Pixelformat
+ Referenzbilder
+ Randgröße
+ Auflösungswechsel
+ Gaststars
+ Ab Anfang
+ keine Fotos
+ Links Rotieren
+ Rechts Rotieren
+ Rot
+ Grün
+ Blau
+ Verschwommen
+ Speichern für Album
+ Diashow abspielen
+ Diashow anhalten
+ Helligkeit
+ Kontrast
diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml
index 4d7b297d..6159ff33 100644
--- a/app/src/main/res/values-el/strings.xml
+++ b/app/src/main/res/values-el/strings.xml
@@ -171,35 +171,35 @@
Επιπρόσθετα
- Άλλο
-
+
- Παρασκήνια
-
+
- Αποσπάσματα
-
+
- Διαγραμμένες σκηνές
-
+
- Συνεντεύξεις
-
+
- Σκηνές
-
+
- Δείγματα
-
+
- Χαρακτηριστικά
-
+
Αυτόματος έλεγχος για ενημερώσεις
Καθυστέρηση πριν την έναρξη του επόμενου
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index 35d7e885..31445b5a 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -24,11 +24,11 @@
Favoritos
Tamaño
Géneros
- Página de inicio
+ Inicio
Inmediato
Intro
#ABCDEFGHIJKLMNOPQRSTUVWXYZ
- Catálogo
+ Biblioteca
Información de licencia
Tasa de bits máxima
Más
@@ -46,14 +46,14 @@
Agregado recientemente en %1$s
Agregado recientemente
Recomendado
- Reiniciarlo
+ Reiniciar
Reanudar
Guardar
Buscar
Buscando…
Seleccionar servidor
- Seleccionar usuario
+ Seleccionar Usuario
Nombre
Aleatorio
Estudios
@@ -65,15 +65,15 @@
Cambiar
Tráiler
- - Tráilers
-
+ - Tráiler
+ - Tráilers
Series
Interfaz
Versión
- Video
- Videos
+ Vídeo
+ Vídeos
%1$d años
Reproducir con transcodificación
Mostrar reloj
@@ -85,8 +85,8 @@
Duración
Extras
- - Otros
-
+ - Otro
+ - Otros
Configuración avanzada
@@ -97,19 +97,19 @@
Configuración
Calificación de la crítica
Resumen
- Grabar programa
+ Grabar Programa
Grabar serie
Quitar de favoritos
Mostrar información de depuración
Mostrar
Aleatorio
Saltar
- Ordenar por fecha de añadido del episodio
+ Ordenar por fecha de inclusión del episodio
Acerca de
Grabaciones activas
Cancelar grabación
Cancelar grabación de la serie
- Borrar la caché de imágenes
+ Borrar caché de imágenes
Valoración de la comunidad
¡Se ha producido un error! Pulsa el botón para enviar los registros a tu servidor.
Predeterminado
@@ -119,41 +119,41 @@
Servidores detectados
Descargando…
- Introduce la IP o la URL del servidor
- Error al cargar la colección %1$s
- Pista forzada
+ Introduce la IP o URL del servidor, incluido el puerto
+ Error cargando la colección %1$s
+ Forzado
Ir a la serie
Ir a
- Ocultar los controles de reproducción
+ Ocultar controles de reproducción
Ocultar información de depuración
Ocultar
- Televisión en directo
+ TV en vivo
Cargando…
- ¿Marcar toda la serie como vista?
- ¿Marcar toda la serie como no reproducida?
+ ¿Marcar la serie completa como vista?
+ ¿Marcar la serie completa como no vista?
Marcar como no visto
Marcar como visto
Más como esto
Películas
- A continuación
+ Siguiente
Sin datos
- No hay grabaciones programadas
- No hay ninguna actualización disponible
+ Sin grabaciones programadas
+ No hay actualizaciones disponibles
Ruta
- Recuento de reproducciones
+ Reproducciones
Reproducir desde aquí
Mostrar información de depuración de reproducción
Velocidad de reproducción
Configuración del perfil de usuario
Grabado recientemente
Lanzado recientemente
- Mostrar \"A continuación\"
- Fecha de añadido
- Ordenar por fecha de reproducción
- Ordenar por fecha de lanzamiento
- La descarga está tardando demasiado; puede que necesites reiniciar la reproducción
- Mejor valoradas sin ver
- Programación del DVR
+ Mostrar “Siguiente”
+ Fecha de inclusión
+ Fecha de reproducción
+ Fecha de lanzamiento
+ La descarga está tardando demasiado, es posible que debas reiniciar la reproducción
+ Mejor calificados no vistos
+ Programación DVR
Guía
Temporada
Temporadas
@@ -162,15 +162,15 @@
Escala de vídeo
Ver en directo
Orden de emisión
- Poner la fuente en cursiva
+ Cursiva
- - Detrás de las cámaras
+ - Detrás de cámaras
- - Canciones principales
-
+ - Canción principal
+ - Canciones principales
@@ -181,26 +181,26 @@
- Clip
- Clips
-
+
- - Escenas eliminadas
-
+ - Escena eliminada
+ - Escenas eliminadas
- - Entrevistas
-
+ - Entrevista
+ - Entrevistas
- - Escenas
-
+ - Escena
+ - Escenas
- - Fragmentos
-
+ - Muestra
+ - Muestras
@@ -209,7 +209,7 @@
- - Cortos
+ - CortoCortos
@@ -233,32 +233,32 @@
- %d segundos
- El dispositivo es compatible con AC3/Dolby Digital
- Comprobar actualizaciones automáticamente
- Retraso antes de reproducir lo siguiente
- Reproducir automáticamente lo siguiente
- Comprobar si hay actualizaciones
- Se aplica solo a series de televisión
-
+ El dispositivo soporta AC3/Dolby Digital
+ Buscar actualizaciones automáticamente
+ Retraso antes de reproducir el siguiente
+ Reproducción automática del siguiente
+ Buscar actualizaciones
+ Aplica solo a series
+
Reproducción directa de subtítulos ASS
Reproducción directa de subtítulos PGS
Convertir siempre a estéreo
- Usar módulo de decodificación FFmpeg
- Escala predeterminada del contenido
+ Usar módulo decodificador FFmpeg
+ Escala de contenido predeterminada
Instalar actualización
- Máximo de elementos por fila en inicio
+ Elementos máximos en filas de inicio
Elige los elementos predeterminados que se mostrarán; los demás permanecerán ocultos
- Personalizar los elementos del panel de navegación
+ Personalizar elementos del panel de navegación
Clic para cambiar de página
- Cambiar las páginas del menú lateral al recibir el foco
+ Cambiar páginas del menú al enfocar
Protección contra inactividad
Anulaciones de reproducción
- Recordar las pestañas seleccionadas
- Permitir volver a ver en “A continuación”
+ Recordar pestañas seleccionadas
+ Permitir volver a ver en “Siguiente”
Pasos de la barra de búsqueda
Útil para depuración
- Enviar los registros de la app al servidor actual
- Intentará enviarlos al último servidor conectado
+ Enviar registros de la app al servidor actual
+ Intentará enviarse al último servidor conectado
Enviar informes de fallos
Retroceder al reanudar la reproducción
Retroceder
@@ -266,22 +266,22 @@
Avanzar
Comportamiento al saltar la intro
Comportamiento al saltar el outro
- Comportamiento al saltar los avances
- Comportamiento al saltar el resumen
+ Comportamiento al saltar avances
+ Comportamiento al saltar resumen
Actualización disponible
- URL para comprobar actualizaciones de la aplicación
+ URL usada para comprobar actualizaciones
URL de actualización
Tamaño de fuente
- Color de la fuente
- Opacidad de la fuente
+ Color de fuente
+ Opacidad de fuente
Estilo del borde
Color del borde
Opacidad del fondo
Estilo del fondo
- Estilo de los subtítulos
+ Estilo de subtítulos
Color del fondo
Restablecer
- Fuente en negrita
+ Negrita
Motor de reproducción
MPV: Usar decodificación por hardware
Desactívalo si experimentas fallos
@@ -303,7 +303,7 @@
Fuente
Fondo
Clasificación parental
- Termina en %1$s
+ Termina a las %1$s
Introduzca la dirección del servidor
No se encontraron servidores
Información multimedia
@@ -385,13 +385,13 @@
Error de reconocimiento de voz
Se requiere permiso para el micrófono
Error de red
- Tiempo de espera agotado de red
+ Tiempo de espera de red agotado
No se reconoce el habla
Reconocimiento de voz ocupado
Error de servidor
No se detecta voz
Error desconocido
- No se pudo iniciar el reconocimiento de voz
+ Error al iniciar el reconocimiento de voz
Se agotó el tiempo de espera para el reconocimiento de voz
Reintentar
Cambio de resolución
@@ -421,4 +421,5 @@
Próximos programas de televisión
Solicitar en 4K
Decodificación por software AV1
+ MPV es ahora el reproductor por defecto para HDR.\nPuedes cambiar esto en los ajustes.
diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml
index 765c5fe2..482554a0 100644
--- a/app/src/main/res/values-et/strings.xml
+++ b/app/src/main/res/values-et/strings.xml
@@ -22,7 +22,7 @@
Kinnita
Jätka vaatamist
Kriitikute hinnang
- %.1f sekundit
+ %.2f sekundit
Vaikimisi
Kustuta
Surmaaeg
@@ -406,4 +406,25 @@
Proovi uuesti
AV1 tarkvaraline dekodeerimine
MPV on nüüd vaikimisi meediaesitaja kõige v.a. HDR-i jaoks.\nSeda saad muuta seadistustest.
+ HDR-i tiitrite stiil
+ Pildiliste tiitrite läbipaistvus
+ Eredus
+ Kontrastsus
+ Küllastus
+ Värvitoon
+ Punane
+ Roheline
+ Sinine
+ Hägustamine
+ Salvesta albumi jaoks
+ Näita slaidiesitlust
+ Peata slaidiesitlus
+ Alguses
+ Rohkem fotosid pole
+ Pööra vasakule
+ Pööra paremale
+ Suumi sisse
+ Suumi välja
+ Slaidiesitluse kestus
+ Slaidiesitluse ajal esita videoid
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index a53c580f..c131a379 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -422,4 +422,25 @@
Demande en 4K
Décodage logiciel AV1
MPV est désormais le lecteur par défaut, sauf pour HDR.\nVous pouvez modifier cela dans les paramètres.
+ Style de sous-titres HDR
+ opacité du sous-titre de l\'image
+ Luminosité
+ Contraste
+ Saturation
+ Teinte
+ Rouge
+ Vert
+ Bleu
+ Flou
+ Enregistrer pour l\'album
+ Lire le diaporama
+ Arrêter le diaporama
+ Au début
+ Plus de photos
+ Faire pivoter à gauche
+ Faire pivoter à droite
+ Zoomer
+ Dézoomer
+ Durée du diaporama
+ Diffuser des vidéos pendant le diaporama
diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml
index c1bf5242..03fd5a93 100644
--- a/app/src/main/res/values-in/strings.xml
+++ b/app/src/main/res/values-in/strings.xml
@@ -23,7 +23,7 @@
Konfirmasi
Lanjutkan menonton
Penilaian Kritis
- %.1f detik
+ %.2f detik
Bawaan
Hapus
Meninggal
@@ -389,4 +389,27 @@
Minta
Tertunda
Dekode perangkat lunak AV1
+ MPV sekarang adalah pemutar bawaan kecuali konten HDR.\nPerubahan dapat dilakukan di menu pengaturan.
+ Gaya subtitel HDR
+ Opasitas subtitel gambar
+ Kecerahan
+ Kontras
+ Saturasi
+ Hue
+ Merah
+ Hijau
+ Biru
+ Kabur
+ Simpan ke album
+ Putar tayangan slide
+ Hentikan tayangan slide
+ Di awal
+ Tidak ada foto lagi
+ Putar kiri
+ Putar kanan
+ Perbesar
+ Perkecil
+ Durasi tayangan slide
+ Putar video selama tayangan slide
+ Kirim log info media ke server
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index 15a70f3d..e5aa51b4 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -104,7 +104,7 @@
Guida TV
Mostra
Ricerca in corso…
- %.1f secondi
+ %.2f secondi
Commerciale
Valutazione community
Valutazione della critica
@@ -422,4 +422,26 @@
Riconoscimento vocale scaduto
Decodifica software AV1
MPV è ora il lettore predefinito, eccetto per i contenuti HDR.\nPuoi modificarlo nelle impostazioni.
+ Stile sottotitoli HDR
+ Opacità sottotitoli immagine
+ Luminosità
+ Contrasto
+ Saturazione
+ Tinta
+ Rosso
+ Verde
+ Blu
+ Sfocatura
+ Salva per l\'album
+ Riproduci slideshow
+ Ferma slideshow
+ Dall\'inizio
+ Nessun\'altra foto
+ Ruota a sinistra
+ Ruota a destra
+ Ingrandisci
+ Rimpicciolisci
+ Durata slideshow
+ Riproduci video durante lo slideshow
+ Invia log informazioni media al server
diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml
index 5b39797f..d892ebf3 100644
--- a/app/src/main/res/values-nb-rNO/strings.xml
+++ b/app/src/main/res/values-nb-rNO/strings.xml
@@ -122,7 +122,7 @@
Trailer
- Trailere
-
+
DVR-plan
Programoversikt
@@ -155,47 +155,47 @@
Ekstramateriale
- Annet
-
+
- Bak kulissene
-
+
- Temasanger
-
+
- Temavideoer
-
+
- Klipp
-
+
- Slettede scener
-
+
- Intervjuer
-
+
- Scener
-
+
- Smakebiter
-
+
- Bakomfilmer
-
+
- Kortfilmer
-
+
- %s nedlasting
diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml
index 69a8f90a..53cd49fc 100644
--- a/app/src/main/res/values-pl/strings.xml
+++ b/app/src/main/res/values-pl/strings.xml
@@ -45,9 +45,9 @@
Zwiastun
- Zwiastuny
-
-
-
+
+
+
Potwierdź
Data Wydania
@@ -122,21 +122,21 @@
Wciśnij środek by pauzować/wznowić
- Wywiady
-
-
-
+
+
+
- Sceny
-
-
-
+
+
+
- Czołówki
-
-
-
+
+
+
Utwórz nową playliste
Dodaj do playlisty
@@ -182,9 +182,9 @@
Czcionka kursywy
- Za kulisami
-
-
-
+
+
+
Ustawienia zaawansowane
Sprawdź dostępność aktualizacji
@@ -270,15 +270,15 @@
Dodatki
- Inne
-
-
-
+
+
+
- Usunięte sceny
-
-
-
+
+
+
Naciśnij by zmienić stronę
Przydatne do debugowania
diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml
index 3205d05d..c2ee4aec 100644
--- a/app/src/main/res/values-pt/strings.xml
+++ b/app/src/main/res/values-pt/strings.xml
@@ -13,7 +13,7 @@
Colecção
Colecções
Confirmar
- %.1f segundos
+ %.2f segundos
Padrão
Eliminar
Realizado por %1$s
@@ -422,4 +422,33 @@
Tentar novamente
Decodificação de AV1 por software
O MPV é agora o reprodutor padrão, exceto para HDR.\nPode alterar esta configuração nas definições.
+
+ - %s Dia
+ - %s Dias
+ - %s Dias
+
+ Estilo de legenda HDR
+ Transparência da legenda da imagem
+ Brilho
+ Contraste
+ Saturação
+ Matiz
+ Vermelho
+ Verde
+ Azul
+ Desfoque
+ Guardar para o álbum
+ Reproduzir slides
+ Parar slides
+ No início
+ Não há mais fotos
+ Rodar para a esquerda
+ Rodar para a direita
+ Ampliar
+ Diminuir
+ Duração dos slides
+ Reproduzir vídeos durante a apresentação de slides
+ Enviar registo de informações de mídia para o servidor
+ Sem limite
+ Dias máximos em \'A Seguir\'
diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml
new file mode 100644
index 00000000..745da44f
--- /dev/null
+++ b/app/src/main/res/values-tr/strings.xml
@@ -0,0 +1,439 @@
+
+
+ Hakkında
+ Etkin kayıtlar
+ Favori
+ Sunucu Ekle
+ Kullanıcı Ekle
+ Ses
+ Doğum yeri
+ Bit hızı
+ Doğum Tarihi
+ Kaydı iptal et
+ Dizi kaydını iptal et
+ İptal
+ Bölümler
+ Seç: %1$s
+ Resim önbelleğini temizle
+ Koleksiyon
+ Koleksiyonlar
+ Reklam
+ Topluluk puanı
+ Bir hata oluştu! Günlükleri sunucunuza göndermek için düğmeye basın.
+ Onayla
+ İzlemeye devam et
+ Eleştirmen puanı
+ %.2f saniye
+ Varsayılan
+ Sil
+ Ölüm Tarihi
+ Yönetmen %1$s
+ Yönetmen
+ Devre dışı
+ Keşfedilen sunucular
+
+ İndiriliyor…
+ Etkin
+ Bitiş saati %1$s
+ Sunucu IP adresini veya URL\'sini girin
+ Sunucu adresini girin
+ Bölümler
+ %1$s koleksiyonu yüklenirken bir hata oluştu
+ Harici
+ Favoriler
+ Boyut
+ Zorunlu
+ Türler
+ Dizilere git
+ Git
+ Oynatma kontrollerini gizle
+ Hata ayıklama bilgilerini gizle
+ Gizle
+ Ana Ekran
+ Hemen
+ İntro
+ #ABCÇDEFGĞHIİJKLMNOÖPRSŞTUÜVYZ
+ Kütüphane
+ Lisans bilgileri
+ Canlı TV
+ Yükleniyor…
+ Tüm diziyi izlendi olarak işaretle?
+ Tüm diziyi izlenmedi olarak işaretle?
+ İzlenmedi olarak işaretle
+ İzlendi olarak işaretle
+ Maksimum bit hızı
+ Benzerleri
+ Diğer
+
+ - Filmler
+
+
+ Ad
+ Sıradaki bölümler
+ Veri yok
+ Sonuç bulunamadı
+ Sunucu bulunamadı
+ Planlanmış kayıt yok
+ Güncelleme mevcut değil
+ Hiçbiri
+ Sadece zorunlu altyazılar
+ Kapanış jeneriği
+ Yol
+
+ - Kişiler
+
+
+ Oynatma Sayısı
+ Buradan oynat
+ Oynat
+ Oynatma hata ayıklama bilgilerini göster
+ Oynatma hızı
+ Oynatma
+ Oynatma Listesi
+ Oynatma Listeleri
+ Önizleme
+ Kullanıcı Profili Ayarları
+ Kuyruk
+ Özet
+ %1$s kütüphanesine son eklenenler
+ Son eklenen
+ Son Kaydedilenler
+ Son Çıkanlar
+ Önerilenler
+ Programı Kaydet
+ Diziyi Kaydet
+ Favorilerden kaldır
+ Yeniden Başlat
+ Sürdür
+ Kaydet
+
+ Ara
+ Aranıyor…
+ Sesli arama
+ Başlatılıyor
+ Aramak için konuşun
+ İşleniyor
+ İptal etmek için geri tuşuna basın
+ Ses kayıt hatası
+ Ses tanıma hatası
+ Mikrofon izni gerekiyor
+ Ağ hatası
+ Ağ zaman aşımı
+ Ses tanınmadı
+ Ses tanıma meşgul
+ Sunucu hatası
+ Ses algılanamadı
+ Bilinmeyen hata
+ Ses tanıma başlatılamadı
+ Ses tanıma zaman aşımına uğradı
+ Yeniden deneyin
+ Sunucu Seç
+ Kullanıcı Seç
+ Hata ayıklama bilgisini göster
+ Sıradakini göster
+ Göster
+ Karıştır
+ Atla
+ Eklenme tarihi
+ Bölüm Eklenme Tarihi
+ Oynatma Tarihi
+ Yayınlanma Tarihi
+ Ad
+ Rastgele
+ Yapım Stüdyoları
+ Gönder
+ İndirme işlemi uzun sürüyor, oynatmayı yeniden başlatmanız gerekebilir
+ Altyazı
+ Altyazılar
+ Öneriler
+ Sunucu değiştir
+ Değiştir
+ İzlenmemiş En İyiler
+ Fragman
+
+ - Fragmanlar
+
+
+ Kayıt Takvimi
+ Rehber
+ Sezon
+ Sezonlar
+
+ - Diziler
+
+
+ Arayüz
+ Bilinmiyor
+ Güncellemeler
+ Sürüm
+ Video Ölçeği
+ Video
+ Videolar
+ Canlı izle
+ %1$d yaşında
+ Kod dönüştürerek oynat
+ Medya Bilgisi
+ Saati göster
+ Yayınlanma Sırası
+ Yeni oynatma listesi oluştur
+ Oynatma listesine ekle
+ Tek tıkla duraklat
+ Durdur/Oynat için orta tuşa basın
+ Metni italik yap
+ Font
+ Arka plan
+ Başarılı
+ Yaş Derecelendirmesi
+ Süre
+ Ekstralar
+
+ - Diğer Ekstralar
+
+
+
+ - Sahne Arkası
+
+
+
+ - Tema şarkıları
+
+
+
+ - Tema Videoları
+
+
+
+ - Klipler
+
+
+
+ - Silinmiş Sahneler
+
+
+
+ - Röportajlar
+
+
+
+ - Sahneler
+
+
+
+ - Örnekler
+
+
+
+ - Tanıtımlar
+
+
+
+ - Kısa Videolar
+
+
+
+ - %s indirme
+ - %s indirilenler
+
+
+ - %d saat
+ - %d saat
+
+
+ - %d öğe
+ - %d öğe
+
+
+ - %d saniye
+ - %d saniye
+
+ AC3/Dolby Digital desteği
+ Gelişmiş Ayarlar
+ Gelişmiş Arayüz
+ Uygulama teması
+ Güncellemeleri otomatik denetle
+ Sıradakini oynatma gecikmesi
+ Sıradakini otomatik oynat
+ Güncellemeleri kontrol et
+ Yalnızca diziler için geçerlidir
+
+ ASS altyazıları doğrudan oynat
+ PGS altyazıları doğrudan oynat
+ Her zaman Stereo\'ya dönüştür
+ FFmpeg kod çözücü kullan
+ Varsayılan içerik ölçeği
+ Güncellemeyi yükle
+ Yüklü sürüm
+ Ana sayfa satırlarında maksimum öge sayısı
+ Gösterilecek varsayılan ögeleri seçin, diğerleri gizlenecektir
+ Yan Menü Ögelerini Düzenle
+ Sayfalar arası geçiş için tıklayın
+ Odaklanınca yan menü sayfalarını değiştir
+ Uyuyakalma Koruması
+ Tema müziğini oynat
+ Oynatmayı geçersiz kılanlar
+ Seçili sekmeleri hatırla
+ Sıradaki bölümlerde tekrar izlemeyi etkinleştir
+ İlerleme çubuğu adımları
+ Hata ayıklama için yararlıdır
+ Uygulama günlüklerini mevcut sunucuya gönder
+ Son bağlanan sunucuya gönderilmeye çalışılacak
+ Hata raporlarını gönder
+ Ayarlar
+ Devam ederken videoyu geri sar
+ Geri atla
+ Reklam geçme davranışı
+ İleri atla
+ İntro atlama davranışı
+ Kapanış jeneriği atlama davranışı
+ Önizlemeyi atlama davranışı
+ Özet atlama davranışı
+ Güncelleme mevcut
+ Uygulama güncellemelerini kontrol etmek için kullanılan URL
+ Güncelleme URL\'si
+ Yazı tipi boyutu
+ Yazı tipi rengi
+ Yazı tipi opaklığı
+ Kenar stili
+ Kenar rengi
+ Arka plan opaklığı
+ Arka plan stili
+ Altyazı stili
+ Arka plan rengi
+ Sıfırla
+ Kalın yazı tipi
+ Oynatıcı motoru
+ MPV: Donanım kod çözmeyi kullan
+ Çökme sorunu yaşıyorsanız devre dışı bırakın
+ MPV Ayarları
+ ExoPlayer Ayarları
+ Bölümü atla
+ Reklamları atla
+ Önizlemeyi atla
+ Özeti atla
+ Kapanış jeneriğini atla
+ İntroyu atla
+ Oynatıldı
+ Filtre
+ Yıl
+ Dönem
+ Sil
+ MPV: gpu-next kullan
+ mpv.conf dosyasını düzenle
+ Değişiklikleri iptal et?
+ Kenar boşluğu
+ Ayrıntılı günlükleme
+ PIN girin
+ Otomatik oturum aç
+ Sunucu üzerinden giriş yap
+ Onaylamak için orta tuşa basın
+ Profil için PIN iste
+ PIN\'i onayla
+ Hatalı
+ PIN en az 4 haneli olmalıdır
+ PIN kaldırılacak
+ Görüntü disk önbellek boyutu (MB)
+ Görünüm seçenekleri
+ Sütun sayısı
+ Öğe aralığı
+ En Boy Oranı
+ Detayları göster
+ Görsel türü
+ Dolby Vision
+ Dolby Atmos
+
+ Konuk oyuncular
+ Kenar boyutu
+ Yenileme hızı değiştirme
+ Otomatik
+ Kullanıcı adı/şifre kullan
+ Oturum aç
+ Genel
+ Kapsayıcı
+ Başlık
+ Codec
+ Profil
+ Düzey
+ Çözünürlük
+ Anamorfik
+ Geçmeli
+ Kare hızı
+ Bit derinliği
+ Video aralığı
+ Video aralık türü
+ Renk alanı
+ Renk aktarımı
+ Renk ön seçimleri
+ Piksel biçimi
+ Referans kareler
+ NAL
+ Dil
+ Düzen
+ Kanallar
+ Örnekleme hızı
+ AVC
+ Evet
+ Hayır
+ SDR
+ HDR
+ HDR10
+ HDR10+
+ HLG
+ bit
+ Hz
+ Başlıkları göster
+ Tekrarla
+ Favori kanalları en başta göster
+ Kanalları son izlenene göre sırala
+ Programları türüne göre renklendir
+ Altyazı gecikmesi
+ Görsel arka plan stili
+ Çözünürlük değiştirme
+ Lokal
+ Fragmanı oynat
+ Fragman yok
+ Parça seçimlerini temizle
+ DTS:X
+ DTS:HD
+ TrueHD
+ DD
+ DD+
+ DTS
+ Dolby Vision Profil 7\'yi doğrudan oynat
+ Cihaz uyumluluk kontrollerini yoksay
+ Keşfet
+ İstek
+ Beklemede
+ Seerr entegrasyonu
+ Seerr Sunucusunu Kaldır
+ Seerr sunucusu eklendi
+ Şifre
+ Kullanıcı adı
+ URL
+ Popüler
+ Yaklaşan Filmler
+ Yaklaşan Diziler
+ 4K olarak iste
+ AV1 yazılımsal kod çözme
+ HDR içerikler hariç varsayılan oynatıcı artık MPV. \nBu ayarı ayarlar bölümünden değiştirebilirsiniz.
+ HDR Altyazı Stili
+ Altyazı Arka Plan Matlığı
+ Parlaklık
+ Kontrast
+ Doygunluk
+ Ton
+ Kırmızı
+ Yeşil
+ Mavi
+ Bulanıklık
+ Albüme Kaydet
+ Slayt Gösterisini Oynat
+ Slayt Gösterisini Durdur
+ En baştan
+ Daha fazla fotoğraf yok
+ Sola döndür
+ Sağa döndür
+ Yakınlaştır
+ Uzaklaştır
+ Slayt Gösterisi Süresi
+ Slayt gösterisi sırasında videoları oynat
+
diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml
index dce8332a..ea7e0323 100644
--- a/app/src/main/res/values-uk/strings.xml
+++ b/app/src/main/res/values-uk/strings.xml
@@ -23,7 +23,7 @@
Підтвердити
Продовжити перегляд
Оцінка критиків
- %.1fсекунд
+ %.1f секунд
За замовчуванням
Видалити
Помер
@@ -453,4 +453,25 @@
Запит в 4К
Програмне декодування AV1
MPV тепер є плеєром за замовчуванням, за винятком для HDR.\nВи можете змінити це в налаштуваннях.
+ HDR субтитри
+ Прозорість зображення заголовку
+ Яскравість
+ Контрастність
+ Насичення
+ Відтінок
+ Червоний
+ Зелений
+ Синій
+ Розмиття
+ Зберегти до альбому
+ Відтворити слайд-шоу
+ Зупинити слайд-шоу
+ На початок
+ Фото більше немає
+ Повернути ліворуч
+ Повернути праворуч
+ Збільшити
+ Зменшити
+ Тривалість слайд-шоу
+ Відтворення відео під час слайд-шоу
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index 10a25eac..b08bfeb5 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -23,7 +23,7 @@
确认
继续观看
影评人评分
- %.1f 秒
+ %.2f 秒
默认
删除
去世
@@ -231,10 +231,10 @@
将尝试发送到最后连接的服务器
发送崩溃报告
设置
- 恢复播放时快退
- 快退
+ 恢复播放时自动向后跳过
+ 向后跳过
跳过广告方式
- 快进
+ 向前跳过
跳过片头方式
跳过片尾方式
跳过预览方式
@@ -390,4 +390,31 @@
重试
AV1 软件解码
除 HDR 视频外,mpv 现在是默认播放器。\n您可以在设置中更改此设置。
+ HDR 字幕样式
+ 图像字幕不透明度
+ 亮度
+ 对比度
+ 饱和度
+ 色调
+ 红色
+ 绿色
+ 蓝色
+ 模糊
+ 保存到相册
+ 播放幻灯片
+ 停止幻灯片
+ 回到开头
+ 没有更多照片
+ 向左旋转
+ 向右旋转
+ 放大
+ 缩小
+ 幻灯片时长
+ 幻灯片播放期间播放视频
+ 将媒体信息日志发送到服务器
+
+ - %s 天
+
+ 无限制
+ 即将播放中的最大天数
diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml
index fd54746c..330f5dd0 100644
--- a/app/src/main/res/values-zh-rTW/strings.xml
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -119,10 +119,10 @@
更新的 URL
字體大小
字體顏色
- 字體透明度
+ 字體不透明度
邊框樣式
邊框顏色
- 背景透明度
+ 背景不透明度
背景樣式
字幕樣式
背景顏色
@@ -160,7 +160,7 @@
確認
繼續觀看
影評人評分
- %.1f 秒
+ %.2f 秒
預設
刪除
去世
@@ -389,4 +389,26 @@
語音辨識逾時
重試
AV1 軟體解碼
+ 除了 HDR 影片外,MPV 已成為預設播放器。 \n您可以在設定中變更此設定。
+ HDR 字幕樣式
+ 對比
+ 飽和度
+ 色調
+ 紅色
+ 綠色
+ 藍色
+ 模糊
+ 存為相簿
+ 播放幻燈片
+ 停播幻燈片
+ 從頭開始
+ 已無更多照片
+ 向左旋轉
+ 向右旋轉
+ 放大
+ 縮小
+ 幻燈片播放時間
+ 幻燈片播放時播放影片
+ 圖形字幕不透明度
+ 亮度
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 32a80878..92c7835c 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -15,9 +15,9 @@ ksp = "2.3.5"
coreKtx = "1.17.0"
appcompat = "1.7.1"
composeBom = "2026.01.01"
-mockk = "1.14.7"
+mockk = "1.14.9"
robolectric = "4.16.1"
-multiplatformMarkdownRenderer = "0.39.1"
+multiplatformMarkdownRenderer = "0.39.2"
okhttpBom = "5.3.2"
programguide = "1.6.0"
slf4j2Timber = "1.2"
@@ -35,14 +35,14 @@ material3AdaptiveNav3 = "1.0.0-alpha03"
protobuf = "0.9.6"
datastore = "1.2.0"
kotlinx-serialization = "1.10.0"
-protobuf-javalite = "4.33.4"
+protobuf-javalite = "4.33.5"
hilt = "2.58"
room = "2.8.4"
preferenceKtx = "1.2.1"
tvprovider = "1.1.0"
workRuntimeKtx = "2.11.1"
paletteKtx = "1.0.0"
-kotlinxCoroutinesTest = "1.7.3"
+kotlinxCoroutinesTest = "1.10.2"
coreTesting = "2.2.0"
openapi-generator = "7.19.0"
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
index e708b1c0..1b33c55b 100644
Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index fbff848d..aaaabb3c 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,7 @@
-#Sat Sep 20 16:26:22 EDT 2025
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.4-bin.zip
+networkTimeout=10000
+validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
diff --git a/gradlew b/gradlew
index 4f906e0c..23d15a93 100755
--- a/gradlew
+++ b/gradlew
@@ -1,7 +1,7 @@
-#!/usr/bin/env sh
+#!/bin/sh
#
-# Copyright 2015 the original author or authors.
+# Copyright © 2015-2021 the original authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -15,81 +15,115 @@
# See the License for the specific language governing permissions and
# limitations under the License.
#
+# SPDX-License-Identifier: Apache-2.0
+#
##############################################################################
-##
-## Gradle start up script for UN*X
-##
+#
+# Gradle start up script for POSIX generated by Gradle.
+#
+# Important for running:
+#
+# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
+# noncompliant, but you have some other compliant shell such as ksh or
+# bash, then to run this script, type that shell name before the whole
+# command line, like:
+#
+# ksh Gradle
+#
+# Busybox and similar reduced shells will NOT work, because this script
+# requires all of these POSIX shell features:
+# * functions;
+# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
+# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
+# * compound commands having a testable exit status, especially «case»;
+# * various built-in commands including «command», «set», and «ulimit».
+#
+# Important for patching:
+#
+# (2) This script targets any POSIX shell, so it avoids extensions provided
+# by Bash, Ksh, etc; in particular arrays are avoided.
+#
+# The "traditional" practice of packing multiple parameters into a
+# space-separated string is a well documented source of bugs and security
+# problems, so this is (mostly) avoided, by progressively accumulating
+# options in "$@", and eventually passing that to Java.
+#
+# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
+# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
+# see the in-line comments for details.
+#
+# There are tweaks for specific operating systems such as AIX, CygWin,
+# Darwin, MinGW, and NonStop.
+#
+# (3) This script is generated from the Groovy template
+# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
+# within the Gradle project.
+#
+# You can find Gradle at https://github.com/gradle/gradle/.
+#
##############################################################################
# Attempt to set APP_HOME
+
# Resolve links: $0 may be a link
-PRG="$0"
-# Need this for relative symlinks.
-while [ -h "$PRG" ] ; do
- ls=`ls -ld "$PRG"`
- link=`expr "$ls" : '.*-> \(.*\)$'`
- if expr "$link" : '/.*' > /dev/null; then
- PRG="$link"
- else
- PRG=`dirname "$PRG"`"/$link"
- fi
+app_path=$0
+
+# Need this for daisy-chained symlinks.
+while
+ APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
+ [ -h "$app_path" ]
+do
+ ls=$( ls -ld "$app_path" )
+ link=${ls#*' -> '}
+ case $link in #(
+ /*) app_path=$link ;; #(
+ *) app_path=$APP_HOME$link ;;
+ esac
done
-SAVED="`pwd`"
-cd "`dirname \"$PRG\"`/" >/dev/null
-APP_HOME="`pwd -P`"
-cd "$SAVED" >/dev/null
-APP_NAME="Gradle"
-APP_BASE_NAME=`basename "$0"`
-
-# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+# This is normally unused
+# shellcheck disable=SC2034
+APP_BASE_NAME=${0##*/}
+# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
+APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit
# Use the maximum available, or set MAX_FD != -1 to use that value.
-MAX_FD="maximum"
+MAX_FD=maximum
warn () {
echo "$*"
-}
+} >&2
die () {
echo
echo "$*"
echo
exit 1
-}
+} >&2
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
-case "`uname`" in
- CYGWIN* )
- cygwin=true
- ;;
- Darwin* )
- darwin=true
- ;;
- MINGW* )
- msys=true
- ;;
- NONSTOP* )
- nonstop=true
- ;;
+case "$( uname )" in #(
+ CYGWIN* ) cygwin=true ;; #(
+ Darwin* ) darwin=true ;; #(
+ MSYS* | MINGW* ) msys=true ;; #(
+ NONSTOP* ) nonstop=true ;;
esac
-CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+CLASSPATH="\\\"\\\""
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
- JAVACMD="$JAVA_HOME/jre/sh/java"
+ JAVACMD=$JAVA_HOME/jre/sh/java
else
- JAVACMD="$JAVA_HOME/bin/java"
+ JAVACMD=$JAVA_HOME/bin/java
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
@@ -98,88 +132,120 @@ Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
- JAVACMD="java"
- which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+ JAVACMD=java
+ if ! command -v java >/dev/null 2>&1
+ then
+ die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
+ fi
fi
# Increase the maximum file descriptors if we can.
-if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
- MAX_FD_LIMIT=`ulimit -H -n`
- if [ $? -eq 0 ] ; then
- if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
- MAX_FD="$MAX_FD_LIMIT"
- fi
- ulimit -n $MAX_FD
- if [ $? -ne 0 ] ; then
- warn "Could not set maximum file descriptor limit: $MAX_FD"
- fi
- else
- warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
- fi
-fi
-
-# For Darwin, add options to specify how the application appears in the dock
-if $darwin; then
- GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
-fi
-
-# For Cygwin or MSYS, switch paths to Windows format before running java
-if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
- APP_HOME=`cygpath --path --mixed "$APP_HOME"`
- CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
-
- JAVACMD=`cygpath --unix "$JAVACMD"`
-
- # We build the pattern for arguments to be converted via cygpath
- ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
- SEP=""
- for dir in $ROOTDIRSRAW ; do
- ROOTDIRS="$ROOTDIRS$SEP$dir"
- SEP="|"
- done
- OURCYGPATTERN="(^($ROOTDIRS))"
- # Add a user-defined pattern to the cygpath arguments
- if [ "$GRADLE_CYGPATTERN" != "" ] ; then
- OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
- fi
- # Now convert the arguments - kludge to limit ourselves to /bin/sh
- i=0
- for arg in "$@" ; do
- CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
- CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
-
- if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
- eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
- else
- eval `echo args$i`="\"$arg\""
- fi
- i=`expr $i + 1`
- done
- case $i in
- 0) set -- ;;
- 1) set -- "$args0" ;;
- 2) set -- "$args0" "$args1" ;;
- 3) set -- "$args0" "$args1" "$args2" ;;
- 4) set -- "$args0" "$args1" "$args2" "$args3" ;;
- 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
- 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
- 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
- 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
- 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
+ case $MAX_FD in #(
+ max*)
+ # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
+ # shellcheck disable=SC2039,SC3045
+ MAX_FD=$( ulimit -H -n ) ||
+ warn "Could not query maximum file descriptor limit"
+ esac
+ case $MAX_FD in #(
+ '' | soft) :;; #(
+ *)
+ # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
+ # shellcheck disable=SC2039,SC3045
+ ulimit -n "$MAX_FD" ||
+ warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
fi
-# Escape application args
-save () {
- for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
- echo " "
-}
-APP_ARGS=`save "$@"`
+# Collect all arguments for the java command, stacking in reverse order:
+# * args from the command line
+# * the main class name
+# * -classpath
+# * -D...appname settings
+# * --module-path (only if needed)
+# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
-# Collect all arguments for the java command, following the shell quoting and substitution rules
-eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if "$cygwin" || "$msys" ; then
+ APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
+ CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
+
+ JAVACMD=$( cygpath --unix "$JAVACMD" )
+
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ for arg do
+ if
+ case $arg in #(
+ -*) false ;; # don't mess with options #(
+ /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
+ [ -e "$t" ] ;; #(
+ *) false ;;
+ esac
+ then
+ arg=$( cygpath --path --ignore --mixed "$arg" )
+ fi
+ # Roll the args list around exactly as many times as the number of
+ # args, so each arg winds up back in the position where it started, but
+ # possibly modified.
+ #
+ # NB: a `for` loop captures its iteration list before it begins, so
+ # changing the positional parameters here affects neither the number of
+ # iterations, nor the values presented in `arg`.
+ shift # remove old arg
+ set -- "$@" "$arg" # push replacement arg
+ done
+fi
+
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Collect all arguments for the java command:
+# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
+# and any embedded shellness will be escaped.
+# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
+# treated as '${Hostname}' itself on the command line.
+
+set -- \
+ "-Dorg.gradle.appname=$APP_BASE_NAME" \
+ -classpath "$CLASSPATH" \
+ -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \
+ "$@"
+
+# Stop when "xargs" is not available.
+if ! command -v xargs >/dev/null 2>&1
+then
+ die "xargs is not available"
+fi
+
+# Use "xargs" to parse quoted args.
+#
+# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
+#
+# In Bash we could simply go:
+#
+# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
+# set -- "${ARGS[@]}" "$@"
+#
+# but POSIX shell has neither arrays nor command substitution, so instead we
+# post-process each arg (as a line of input to sed) to backslash-escape any
+# character that might be a shell metacharacter, then use eval to reverse
+# that process (while maintaining the separation between arguments), and wrap
+# the whole thing up as a single "set" statement.
+#
+# This will of course break if any of these variables contains a newline or
+# an unmatched quote.
+#
+
+eval "set -- $(
+ printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
+ xargs -n1 |
+ sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
+ tr '\n' ' '
+ )" '"$@"'
exec "$JAVACMD" "$@"
diff --git a/gradlew.bat b/gradlew.bat
index ac1b06f9..5eed7ee8 100644
--- a/gradlew.bat
+++ b/gradlew.bat
@@ -13,8 +13,10 @@
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
+@rem SPDX-License-Identifier: Apache-2.0
+@rem
-@if "%DEBUG%" == "" @echo off
+@if "%DEBUG%"=="" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@@ -25,7 +27,8 @@
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
-if "%DIRNAME%" == "" set DIRNAME=.
+if "%DIRNAME%"=="" set DIRNAME=.
+@rem This is normally unused
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@@ -40,13 +43,13 @@ if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
-if "%ERRORLEVEL%" == "0" goto execute
+if %ERRORLEVEL% equ 0 goto execute
-echo.
-echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
+echo. 1>&2
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
+echo. 1>&2
+echo Please set the JAVA_HOME variable in your environment to match the 1>&2
+echo location of your Java installation. 1>&2
goto fail
@@ -56,32 +59,34 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute
-echo.
-echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
+echo. 1>&2
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
+echo. 1>&2
+echo Please set the JAVA_HOME variable in your environment to match the 1>&2
+echo location of your Java installation. 1>&2
goto fail
:execute
@rem Setup the command line
-set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+set CLASSPATH=
@rem Execute Gradle
-"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %*
:end
@rem End local scope for the variables with windows NT shell
-if "%ERRORLEVEL%"=="0" goto mainEnd
+if %ERRORLEVEL% equ 0 goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
-if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
-exit /b 1
+set EXIT_CODE=%ERRORLEVEL%
+if %EXIT_CODE% equ 0 set EXIT_CODE=1
+if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
+exit /b %EXIT_CODE%
:mainEnd
if "%OS%"=="Windows_NT" endlocal
diff --git a/renovate.json b/renovate.json
index dc6fbf78..03e6a404 100644
--- a/renovate.json
+++ b/renovate.json
@@ -28,7 +28,7 @@
{
"groupName": "AGP",
"matchPackageNames": [
- "com.android.application:**"
+ "com.android.application**"
]
},
{