Skip to content

Commit 0a32947

Browse files
authored
Merge pull request #1238 from TortugaPower/develop
Release v5.5.2
2 parents 5e9de8f + 9a69cbb commit 0a32947

File tree

63 files changed

+147
-828
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

63 files changed

+147
-828
lines changed

BookPlayer.xcodeproj/project.pbxproj

+22-78
Large diffs are not rendered by default.

BookPlayer/Base.lproj/Localizable.strings

+2
Original file line numberDiff line numberDiff line change
@@ -344,3 +344,5 @@ We're working hard on providing a seamless experience, if possible, please conta
344344
"jellyfin_error_unauthorized" = "Sign In failed. Check your username and password.";
345345
"file_size_unknown" = "Unknown size";
346346
"runtime_unknown" = "Unknown duration";
347+
"subscription_required_title" = "Subscription required";
348+
"Swipe rows to see download options" = "Swipe rows to see download options";

BookPlayer/Services/VoiceOverService.swift

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1-
import BookPlayerKit
1+
#if os(watchOS)
2+
import BookPlayerWatchKit
3+
#else
4+
import BookPlayerKit
5+
#endif
26
import Foundation
37

48
class VoiceOverService {

BookPlayer/ar.lproj/Localizable.strings

+2
Original file line numberDiff line numberDiff line change
@@ -344,3 +344,5 @@
344344
"jellyfin_error_unauthorized" = "فشل تسجيل الدخول. تحقق من اسم المستخدم وكلمة المرور.";
345345
"file_size_unknown" = "حجم غير معروف";
346346
"runtime_unknown" = "مدة غير معروفة";
347+
"subscription_required_title" = "الاشتراك مطلوب";
348+
"Swipe rows to see download options" = "مرر الصفوف لرؤية خيارات التنزيل";

BookPlayer/cs.lproj/Localizable.strings

+2
Original file line numberDiff line numberDiff line change
@@ -344,3 +344,5 @@
344344
"jellyfin_error_unauthorized" = "Přihlášení se nezdařilo. Zkontrolujte své uživatelské jméno a heslo.";
345345
"file_size_unknown" = "Neznámá velikost";
346346
"runtime_unknown" = "Neznámá doba trvání";
347+
"subscription_required_title" = "Je vyžadováno předplatné";
348+
"Swipe rows to see download options" = "Přejetím po řádcích zobrazíte možnosti stahování";

BookPlayer/da.lproj/Localizable.strings

+2
Original file line numberDiff line numberDiff line change
@@ -344,3 +344,5 @@
344344
"jellyfin_error_unauthorized" = "Log ind mislykkedes. Tjek dit brugernavn og adgangskode.";
345345
"file_size_unknown" = "Ukendt størrelse";
346346
"runtime_unknown" = "Ukendt varighed";
347+
"subscription_required_title" = "Kræver abonnement";
348+
"Swipe rows to see download options" = "Stryg rækkerne for at se downloadmuligheder";

BookPlayer/de.lproj/Localizable.strings

+2
Original file line numberDiff line numberDiff line change
@@ -344,3 +344,5 @@
344344
"jellyfin_error_unauthorized" = "Anmeldung fehlgeschlagen. Überprüfen Sie Ihren Benutzernamen und Ihr Passwort.";
345345
"file_size_unknown" = "Unbekannte Größe";
346346
"runtime_unknown" = "Unbekannte Dauer";
347+
"subscription_required_title" = "Abonnement erforderlich";
348+
"Swipe rows to see download options" = "Wischen Sie durch die Zeilen, um die Download-Optionen anzuzeigen";

BookPlayer/el.lproj/Localizable.strings

+2
Original file line numberDiff line numberDiff line change
@@ -344,3 +344,5 @@
344344
"jellyfin_error_unauthorized" = "Η σύνδεση απέτυχε. Ελέγξτε το όνομα χρήστη και τον κωδικό πρόσβασής σας.";
345345
"file_size_unknown" = "Άγνωστο μέγεθος";
346346
"runtime_unknown" = "Άγνωστη διάρκεια";
347+
"subscription_required_title" = "Απαιτείται συνδρομή";
348+
"Swipe rows to see download options" = "Σύρετε σειρές για να δείτε τις επιλογές λήψης";

BookPlayer/en.lproj/Localizable.strings

+2
Original file line numberDiff line numberDiff line change
@@ -344,3 +344,5 @@ We're working hard on providing a seamless experience, if possible, please conta
344344
"jellyfin_error_unauthorized" = "Sign In failed. Check your username and password.";
345345
"file_size_unknown" = "Unknown size";
346346
"runtime_unknown" = "Unknown duration";
347+
"subscription_required_title" = "Subscription required";
348+
"Swipe rows to see download options" = "Swipe rows to see download options";

BookPlayer/es.lproj/Localizable.strings

+2
Original file line numberDiff line numberDiff line change
@@ -344,3 +344,5 @@
344344
"jellyfin_error_unauthorized" = "Error al iniciar sesión. Verifique su nombre de usuario y contraseña.";
345345
"file_size_unknown" = "Tamaño desconocido";
346346
"runtime_unknown" = "Duración desconocida";
347+
"subscription_required_title" = "Se requiere suscripción";
348+
"Swipe rows to see download options" = "Desliza las filas para ver las opciones de descarga";

BookPlayer/fi.lproj/Localizable.strings

+2
Original file line numberDiff line numberDiff line change
@@ -344,3 +344,5 @@
344344
"jellyfin_error_unauthorized" = "Kirjautuminen epäonnistui. Tarkista käyttäjätunnuksesi ja salasanasi.";
345345
"file_size_unknown" = "Tuntematon koko";
346346
"runtime_unknown" = "Tuntematon kesto";
347+
"subscription_required_title" = "Tilaus vaaditaan";
348+
"Swipe rows to see download options" = "Pyyhkäise rivejä nähdäksesi latausvaihtoehdot";

BookPlayer/fr.lproj/Localizable.strings

+2
Original file line numberDiff line numberDiff line change
@@ -344,3 +344,5 @@
344344
"jellyfin_error_unauthorized" = "La connexion a échoué. Vérifiez votre nom d'utilisateur et votre mot de passe.";
345345
"file_size_unknown" = "Taille inconnue";
346346
"runtime_unknown" = "Durée inconnue";
347+
"subscription_required_title" = "Abonnement requis";
348+
"Swipe rows to see download options" = "Faites glisser les lignes pour voir les options de téléchargement";

BookPlayer/hu.lproj/Localizable.strings

+2
Original file line numberDiff line numberDiff line change
@@ -344,3 +344,5 @@
344344
"jellyfin_error_unauthorized" = "Sikertelen bejelentkezés. Ellenőrizze felhasználónevét és jelszavát.";
345345
"file_size_unknown" = "Ismeretlen méret";
346346
"runtime_unknown" = "Ismeretlen időtartam";
347+
"subscription_required_title" = "Előfizetés szükséges";
348+
"Swipe rows to see download options" = "Csúsztassa el a sorokat a letöltési lehetőségek megtekintéséhez";

BookPlayer/it.lproj/Localizable.strings

+2
Original file line numberDiff line numberDiff line change
@@ -344,3 +344,5 @@
344344
"jellyfin_error_unauthorized" = "Accesso non riuscito. Controlla il tuo nome utente e la tua password.";
345345
"file_size_unknown" = "Dimensioni sconosciute";
346346
"runtime_unknown" = "Durata sconosciuta";
347+
"subscription_required_title" = "Abbonamento richiesto";
348+
"Swipe rows to see download options" = "Scorri le righe per vedere le opzioni di download";

BookPlayer/ja.lproj/Localizable.strings

+2
Original file line numberDiff line numberDiff line change
@@ -344,3 +344,5 @@ We're working hard on providing a seamless experience, if possible, please conta
344344
"jellyfin_error_unauthorized" = "Sign In failed. Check your username and password.";
345345
"file_size_unknown" = "Unknown size";
346346
"runtime_unknown" = "Unknown duration";
347+
"subscription_required_title" = "Subscription required";
348+
"Swipe rows to see download options" = "Swipe rows to see download options";

BookPlayer/nb.lproj/Localizable.strings

+2
Original file line numberDiff line numberDiff line change
@@ -344,3 +344,5 @@ Vi jobber hardt for å gi deg en sømløs opplevelse. Hvis mulig, kontakt oss p
344344
"jellyfin_error_unauthorized" = "Pålogging mislyktes. Sjekk brukernavnet og passordet ditt.";
345345
"file_size_unknown" = "Ukjent størrelse";
346346
"runtime_unknown" = "Ukjent varighet";
347+
"subscription_required_title" = "Abonnement kreves";
348+
"Swipe rows to see download options" = "Sveip rader for å se nedlastingsalternativer";

BookPlayer/nl.lproj/Localizable.strings

+2
Original file line numberDiff line numberDiff line change
@@ -344,3 +344,5 @@
344344
"jellyfin_error_unauthorized" = "Aanmelden mislukt. Controleer uw gebruikersnaam en wachtwoord.";
345345
"file_size_unknown" = "Onbekende grootte";
346346
"runtime_unknown" = "Onbekende duur";
347+
"subscription_required_title" = "Abonnement vereist";
348+
"Swipe rows to see download options" = "Veeg over de rijen om de downloadopties te zien";

BookPlayer/pl.lproj/Localizable.strings

+2
Original file line numberDiff line numberDiff line change
@@ -344,3 +344,5 @@
344344
"jellyfin_error_unauthorized" = "Logowanie nie powiodło się. Sprawdź swoją nazwę użytkownika i hasło.";
345345
"file_size_unknown" = "Nieznany rozmiar";
346346
"runtime_unknown" = "Nieznany czas trwania";
347+
"subscription_required_title" = "Wymagana subskrypcja";
348+
"Swipe rows to see download options" = "Przesuń wiersze, aby zobaczyć opcje pobierania";

BookPlayer/pt-BR.lproj/Localizable.strings

+2
Original file line numberDiff line numberDiff line change
@@ -344,3 +344,5 @@
344344
"jellyfin_error_unauthorized" = "Falha ao entrar. Verifique seu nome de usuário e senha.";
345345
"file_size_unknown" = "Tamanho desconhecido";
346346
"runtime_unknown" = "Duração desconhecida";
347+
"subscription_required_title" = "Assinatura necessária";
348+
"Swipe rows to see download options" = "Deslize as linhas para ver as opções de download";

BookPlayer/pt-PT.lproj/Localizable.strings

+2
Original file line numberDiff line numberDiff line change
@@ -344,3 +344,5 @@
344344
"jellyfin_error_unauthorized" = "Falha ao entrar. Verifique seu nome de usuário e senha.";
345345
"file_size_unknown" = "Tamanho desconhecido";
346346
"runtime_unknown" = "Duração desconhecida";
347+
"subscription_required_title" = "Assinatura necessária";
348+
"Swipe rows to see download options" = "Deslize as linhas para ver as opções de download";

BookPlayer/ro.lproj/Localizable.strings

+2
Original file line numberDiff line numberDiff line change
@@ -344,3 +344,5 @@
344344
"jellyfin_error_unauthorized" = "Conectarea a eșuat. Verificați-vă numele de utilizator și parola.";
345345
"file_size_unknown" = "Dimensiune necunoscută";
346346
"runtime_unknown" = "Durată necunoscută";
347+
"subscription_required_title" = "Este necesar un abonament";
348+
"Swipe rows to see download options" = "Glisați rândurile pentru a vedea opțiunile de descărcare";

BookPlayer/ru.lproj/Localizable.strings

+2
Original file line numberDiff line numberDiff line change
@@ -344,3 +344,5 @@
344344
"jellyfin_error_unauthorized" = "Войти не удалось. Проверьте имя пользователя и пароль.";
345345
"file_size_unknown" = "Неизвестный размер";
346346
"runtime_unknown" = "Неизвестная продолжительность";
347+
"subscription_required_title" = "Требуется подписка";
348+
"Swipe rows to see download options" = "Проведите пальцем по строкам, чтобы увидеть варианты загрузки";

BookPlayer/sk-SK.lproj/Localizable.strings

+9-7
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,7 @@ Usilovne pracujeme na poskytovaní bezproblémového zážitku, ak je to možné
299299
"intent_sleeptimer_eoc_title" = "Nastavenie časovača spánku na koniec kapitoly";
300300
"intent_lastbook_play_title" = "Obnovenie poslednej prehrávanej knihy";
301301
"intent_lastbook_empty_error" = "Žiadna naposledy prehrávaná kniha";
302-
"intent_playback_pause_title" = "Pozastavenie prehrávanie";
302+
"intent_playback_pause_title" = "Pozastavenie prehrávania";
303303
"storage_artwork_cache_title" = "Veľkosť vyrovnávacej pamäte obalov kníh";
304304
"settings_share_debug_information" = "Zdieľať informácie o ladení";
305305
"settings_autlock_section_title" = "Automatické uzamknutie";
@@ -329,18 +329,20 @@ Usilovne pracujeme na poskytovaní bezproblémového zážitku, ak je to možné
329329
"jellyfin_section_server_url" = "Adresa URL servera";
330330
"jellyfin_section_server_url_footer" = "Pripojte sa k serveru Jellyfin";
331331
"jellyfin_section_server" = "Server";
332-
"jellyfin_server_name_label" = "Meno";
332+
"jellyfin_server_name_label" = "Názov";
333333
"jellyfin_server_url_label" = "URL";
334-
"jellyfin_section_login" = "Prihláste sa";
334+
"jellyfin_section_login" = "Prihlásenie";
335335
"jellyfin_username_placeholder" = "Používateľské meno";
336-
"jellyfin_password_placeholder" = "heslo";
337-
"jellyfin_password_remember_me_label" = "Pamätaj na mňa";
336+
"jellyfin_password_placeholder" = "Heslo";
337+
"jellyfin_password_remember_me_label" = "Zapamätať si mňa";
338338
"settings_jellyfin_manage_connection_title" = "Spravovať pripojenie";
339-
"jellyfin_internal_error_invalid_url" = "Interná chyba: Adresa URL požiadavky je neplatná: %@";
339+
"jellyfin_internal_error_invalid_url" = "Interná chyba: URL požiadavky je neplatná: %@";
340340
"jellyfin_internal_error_build_url" = "Interná chyba: Nepodarilo sa vytvoriť adresu URL požiadavky";
341-
"jellyfin_internal_error_no_client" = "Nie je možné kontaktovať server Jellyfin. Skontrolujte poskytnutú adresu URL servera.";
341+
"jellyfin_internal_error_no_client" = "Nie je možné kontaktovať server Jellyfin. Skontrolujte poskytnutú adresu URL.";
342342
"jellyfin_error_unexpected_response" = "Neočakávaná odpoveď servera";
343343
"jellyfin_error_unexpected_response_with_code" = "Neočakávaná odpoveď servera (kód: %d – %@ )";
344344
"jellyfin_error_unauthorized" = "Prihlásenie zlyhalo. Skontrolujte svoje používateľské meno a heslo.";
345345
"file_size_unknown" = "Neznáma veľkosť";
346346
"runtime_unknown" = "Neznáme trvanie";
347+
"subscription_required_title" = "Vyžaduje sa predplatné";
348+
"Swipe rows to see download options" = "Potiahnutím riadkov zobrazíte možnosti sťahovania";

BookPlayer/sv.lproj/Localizable.strings

+2
Original file line numberDiff line numberDiff line change
@@ -344,3 +344,5 @@
344344
"jellyfin_error_unauthorized" = "Inloggning misslyckades. Kontrollera ditt användarnamn och lösenord.";
345345
"file_size_unknown" = "Okänd storlek";
346346
"runtime_unknown" = "Okänd varaktighet";
347+
"subscription_required_title" = "Prenumeration krävs";
348+
"Swipe rows to see download options" = "Svep rader för att se nedladdningsalternativ";

BookPlayer/tr.lproj/Localizable.strings

+2
Original file line numberDiff line numberDiff line change
@@ -344,3 +344,5 @@
344344
"jellyfin_error_unauthorized" = "Giriş başarısız. Kullanıcı adınızı ve şifrenizi kontrol edin.";
345345
"file_size_unknown" = "Bilinmeyen boyut";
346346
"runtime_unknown" = "Bilinmeyen süre";
347+
"subscription_required_title" = "Abonelik gerekli";
348+
"Swipe rows to see download options" = "İndirme seçeneklerini görmek için satırları kaydırın";

BookPlayer/uk.lproj/Localizable.strings

+2
Original file line numberDiff line numberDiff line change
@@ -344,3 +344,5 @@
344344
"jellyfin_error_unauthorized" = "Помилка входу. Перевірте своє ім'я користувача та пароль.";
345345
"file_size_unknown" = "Невідомий розмір";
346346
"runtime_unknown" = "Невідома тривалість";
347+
"subscription_required_title" = "Потрібна підписка";
348+
"Swipe rows to see download options" = "Гортайте рядки, щоб переглянути параметри завантаження";

BookPlayer/zh-Hans.lproj/Localizable.strings

+2
Original file line numberDiff line numberDiff line change
@@ -344,3 +344,5 @@
344344
"jellyfin_error_unauthorized" = "登录失败。请检查您的用户名和密码。";
345345
"file_size_unknown" = "未知尺寸";
346346
"runtime_unknown" = "持续时间未知";
347+
"subscription_required_title" = "需要订阅";
348+
"Swipe rows to see download options" = "滑动行查看下载选项";

BookPlayerWatch/Base.lproj/Localizable.strings

-29
This file was deleted.

BookPlayerWatch/NowPlaying/Views/NowPlayingTitleView.swift

+5
Original file line numberDiff line numberDiff line change
@@ -26,5 +26,10 @@ struct NowPlayingTitleView: View {
2626
.lineLimit(2)
2727
.fixedSize(horizontal: false, vertical: true)
2828
}
29+
.accessibilityElement(children: .ignore)
30+
.accessibilityLabel(VoiceOverService.playerMetaText(
31+
title: item?.title ?? "",
32+
author: item?.author ?? ""
33+
))
2934
}
3035
}

BookPlayerWatch/PlaybackFullControlsView.swift

+13-7
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,16 @@ import SwiftUI
1111

1212
struct PlaybackFullControlsView: View {
1313
@ObservedObject var model: PlaybackFullControlsViewModel
14+
@AppStorage(Constants.UserDefaults.globalSpeedEnabled) var globalSpeedEnabled: Bool = false
15+
@AppStorage(Constants.UserDefaults.boostVolumeEnabled) var boostVolumeEnabled: Bool = false
1416
@AppStorage(Constants.UserDefaults.autoplayEnabled) var autoplayEnabled: Bool = true
1517
@AppStorage(Constants.UserDefaults.rewindInterval) var rewindInterval: TimeInterval = 30
1618
@AppStorage(Constants.UserDefaults.forwardInterval) var forwardInterval: TimeInterval = 30
1719

1820
var body: some View {
1921
GeometryReader { metrics in
2022
List {
21-
Section("speed".localized.uppercased()) {
23+
Section("speed_title".localized.uppercased()) {
2224
VStack {
2325
HStack {
2426
Spacer()
@@ -28,6 +30,7 @@ struct PlaybackFullControlsView: View {
2830
ResizeableImageView(name: "minus.circle")
2931
}
3032
.buttonStyle(PlainButtonStyle())
33+
.accessibilityLabel("")
3134
.frame(width: metrics.size.width * 0.15)
3235
Spacer()
3336
.padding([.leading], 5)
@@ -51,6 +54,7 @@ struct PlaybackFullControlsView: View {
5154
ResizeableImageView(name: "plus.circle")
5255
}
5356
.buttonStyle(PlainButtonStyle())
57+
.accessibilityLabel("")
5458
.frame(width: metrics.size.width * 0.15)
5559
Spacer()
5660
}
@@ -59,14 +63,13 @@ struct PlaybackFullControlsView: View {
5963
.listRowBackground(Color.clear)
6064

6165
Section {
66+
Toggle(
67+
"settings_globalspeed_title",
68+
isOn: $globalSpeedEnabled
69+
)
6270
Toggle(
6371
"settings_boostvolume_title",
64-
isOn: .init(
65-
get: { model.boostVolume },
66-
set: { _ in
67-
model.handleBoostVolumeToggle()
68-
}
69-
)
72+
isOn: $boostVolumeEnabled
7073
)
7174
Toggle(
7275
"settings_autoplay_section_title".localized.capitalized,
@@ -99,6 +102,9 @@ struct PlaybackFullControlsView: View {
99102
}
100103
}
101104
.environment(\.defaultMinListRowHeight, 40)
105+
.onChange(of: boostVolumeEnabled) { boostVolume in
106+
model.handleBoostVolumeToggle(boostVolume)
107+
}
102108
}
103109
.navigationTitle("settings_controls_title")
104110
}

BookPlayerWatch/PlayerControlsView.swift

+2
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ struct PlayerControlsView: View {
2828
.padding(10)
2929
}
3030
.buttonStyle(PlainButtonStyle())
31+
.accessibilityLabel(VoiceOverService.rewindText())
3132
.frame(width: geometry.size.width * 0.28)
3233
Spacer()
3334
Button {
@@ -54,6 +55,7 @@ struct PlayerControlsView: View {
5455
.padding(10)
5556
}
5657
.buttonStyle(PlainButtonStyle())
58+
.accessibilityLabel(VoiceOverService.fastForwardText())
5759
.frame(width: geometry.size.width * 0.28)
5860
Spacer()
5961
}

BookPlayerWatch/PlayerToolbarView.swift

+4-4
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,7 @@ final class PlaybackFullControlsViewModel: ObservableObject {
2424
self.playerManager = playerManager
2525
}
2626

27-
func handleBoostVolumeToggle() {
28-
let flag = !boostVolume
29-
UserDefaults.standard.set(flag, forKey: Constants.UserDefaults.boostVolumeEnabled)
30-
27+
func handleBoostVolumeToggle(_ flag: Bool) {
3128
self.playerManager.setBoostVolume(flag)
3229
}
3330

@@ -67,20 +64,23 @@ struct PlayerToolbarView: View {
6764
destination: PlaybackFullControlsView(model: PlaybackFullControlsViewModel(playerManager: playerManager))
6865
) {
6966
ResizeableImageView(name: "dial.max")
67+
.accessibilityLabel("settings_controls_title".localized)
7068
.padding(11)
7169
}
7270
.buttonStyle(PlainButtonStyle())
7371

7472
Spacer()
7573

7674
VolumeView(type: .local)
75+
.accessibilityHidden(true)
7776

7877
Spacer()
7978

8079
Button {
8180
isShowingMoreList = true
8281
} label: {
8382
ResizeableImageView(name: "list.bullet")
83+
.accessibilityLabel("chapters_title".localized)
8484
.padding(14)
8585
}
8686
.buttonStyle(PlainButtonStyle())

BookPlayerWatch/RefreshableListView.swift

+9-2
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ struct RefreshableListView<Content: View>: View {
2929
List {
3030
Section {
3131
if refreshing {
32-
ProgressView()
32+
ProgressView().id(UUID())
3333
.tint(.white)
3434
.frame(height: 10)
3535
.listRowBackground(Color.clear)
@@ -44,6 +44,11 @@ struct RefreshableListView<Content: View>: View {
4444
}
4545
}
4646
.listRowBackground(Color.clear)
47+
.accessibilityRemoveTraits(.isImage)
48+
.accessibilityLabel("watchapp_refresh_data_title".localized)
49+
.accessibilityAction {
50+
self.refreshing = true
51+
}
4752
}
4853
}
4954
content
@@ -52,7 +57,9 @@ struct RefreshableListView<Content: View>: View {
5257
.environment(\.defaultMinListRowHeight, 1)
5358
.background(FixedView())
5459
.onPreferenceChange(RefreshableKeyTypes.PrefKey.self) { values in
55-
refreshLogic(values: values)
60+
Task { @MainActor in
61+
refreshLogic(values: values)
62+
}
5663
}
5764
}
5865

0 commit comments

Comments
 (0)