diff --git a/lib/i18n/bg.i18n.json b/lib/i18n/bg.i18n.json index 094cf0ea..74e05c79 100644 --- a/lib/i18n/bg.i18n.json +++ b/lib/i18n/bg.i18n.json @@ -774,7 +774,8 @@ "studio": "Студио", "random": "Случайно", "dateShared": "Дата на споделяне", - "latestEpisodeAirDate": "Дата на излъчване на последния епизод" + "latestEpisodeAirDate": "Дата на излъчване на последния епизод", + "lastEpisodeDateAdded": "Дата на добавяне на последния епизод" } }, "about": { diff --git a/lib/i18n/da.i18n.json b/lib/i18n/da.i18n.json index 63ad826c..dd9e787a 100644 --- a/lib/i18n/da.i18n.json +++ b/lib/i18n/da.i18n.json @@ -774,7 +774,8 @@ "studio": "Studie", "random": "Tilfældig", "dateShared": "Delt dato", - "latestEpisodeAirDate": "Seneste episodes premieredato" + "latestEpisodeAirDate": "Seneste episodes premieredato", + "lastEpisodeDateAdded": "Dato for senest tilføjede episode" } }, "about": { diff --git a/lib/i18n/de.i18n.json b/lib/i18n/de.i18n.json index d182a8db..b7edc3be 100644 --- a/lib/i18n/de.i18n.json +++ b/lib/i18n/de.i18n.json @@ -774,7 +774,8 @@ "studio": "Studio", "random": "Zufällig", "dateShared": "Datum geteilt", - "latestEpisodeAirDate": "Letztes Folgenausstrahlungsdatum" + "latestEpisodeAirDate": "Letztes Folgenausstrahlungsdatum", + "lastEpisodeDateAdded": "Datum der zuletzt hinzugefügten Folge" } }, "about": { diff --git a/lib/i18n/en.i18n.json b/lib/i18n/en.i18n.json index 629dca14..0529c89a 100644 --- a/lib/i18n/en.i18n.json +++ b/lib/i18n/en.i18n.json @@ -780,7 +780,8 @@ "studio": "Studio", "random": "Random", "dateShared": "Date Shared", - "latestEpisodeAirDate": "Latest Episode Air Date" + "latestEpisodeAirDate": "Latest Episode Air Date", + "lastEpisodeDateAdded": "Last Episode Date Added" } }, "about": { diff --git a/lib/i18n/es.i18n.json b/lib/i18n/es.i18n.json index 27bd4aa7..1192fb39 100644 --- a/lib/i18n/es.i18n.json +++ b/lib/i18n/es.i18n.json @@ -774,7 +774,8 @@ "studio": "Estudio", "random": "Aleatorio", "dateShared": "Fecha de compartición", - "latestEpisodeAirDate": "Última fecha de emisión del episodio" + "latestEpisodeAirDate": "Última fecha de emisión del episodio", + "lastEpisodeDateAdded": "Fecha de adición del último episodio" } }, "about": { diff --git a/lib/i18n/fr.i18n.json b/lib/i18n/fr.i18n.json index cc025fa2..1264f86e 100644 --- a/lib/i18n/fr.i18n.json +++ b/lib/i18n/fr.i18n.json @@ -774,7 +774,8 @@ "studio": "Studio", "random": "Aléatoire", "dateShared": "Date de partage", - "latestEpisodeAirDate": "Dernière date de diffusion" + "latestEpisodeAirDate": "Dernière date de diffusion", + "lastEpisodeDateAdded": "Date d'ajout du dernier épisode" } }, "about": { diff --git a/lib/i18n/it.i18n.json b/lib/i18n/it.i18n.json index bbe381e3..34cb9046 100644 --- a/lib/i18n/it.i18n.json +++ b/lib/i18n/it.i18n.json @@ -774,7 +774,8 @@ "studio": "Studio", "random": "Casuale", "dateShared": "Data di condivisione", - "latestEpisodeAirDate": "Data ultima messa in onda" + "latestEpisodeAirDate": "Data ultima messa in onda", + "lastEpisodeDateAdded": "Data aggiunta ultimo episodio" } }, "about": { diff --git a/lib/i18n/ja.i18n.json b/lib/i18n/ja.i18n.json index 578c754c..9880bdc0 100644 --- a/lib/i18n/ja.i18n.json +++ b/lib/i18n/ja.i18n.json @@ -774,7 +774,8 @@ "studio": "スタジオ", "random": "ランダム", "dateShared": "共有日", - "latestEpisodeAirDate": "最新エピソード放送日" + "latestEpisodeAirDate": "最新エピソード放送日", + "lastEpisodeDateAdded": "最新エピソード追加日" } }, "about": { diff --git a/lib/i18n/ko.i18n.json b/lib/i18n/ko.i18n.json index ebd026b0..57a2437a 100644 --- a/lib/i18n/ko.i18n.json +++ b/lib/i18n/ko.i18n.json @@ -774,7 +774,8 @@ "studio": "스튜디오", "random": "무작위", "dateShared": "공유된 날짜", - "latestEpisodeAirDate": "최신 에피소드 방영일" + "latestEpisodeAirDate": "최신 에피소드 방영일", + "lastEpisodeDateAdded": "최신 에피소드 추가일" } }, "about": { diff --git a/lib/i18n/nb.i18n.json b/lib/i18n/nb.i18n.json index f923b560..87233b6c 100644 --- a/lib/i18n/nb.i18n.json +++ b/lib/i18n/nb.i18n.json @@ -774,7 +774,8 @@ "studio": "Studio", "random": "Tilfeldig", "dateShared": "Delingsdato", - "latestEpisodeAirDate": "Siste episodes sendedato" + "latestEpisodeAirDate": "Siste episodes sendedato", + "lastEpisodeDateAdded": "Dato for sist lagt til episode" } }, "about": { diff --git a/lib/i18n/nl.i18n.json b/lib/i18n/nl.i18n.json index 6f6255e4..d1a1c11c 100644 --- a/lib/i18n/nl.i18n.json +++ b/lib/i18n/nl.i18n.json @@ -774,7 +774,8 @@ "studio": "Studio", "random": "Willekeurig", "dateShared": "Gedeeld op", - "latestEpisodeAirDate": "Laatste afleveringsuitzending" + "latestEpisodeAirDate": "Laatste afleveringsuitzending", + "lastEpisodeDateAdded": "Datum laatst toegevoegde aflevering" } }, "about": { diff --git a/lib/i18n/pl.i18n.json b/lib/i18n/pl.i18n.json index d9ec853b..3a2cd3a3 100644 --- a/lib/i18n/pl.i18n.json +++ b/lib/i18n/pl.i18n.json @@ -774,7 +774,8 @@ "studio": "Studio", "random": "Losowo", "dateShared": "Data udostępnienia", - "latestEpisodeAirDate": "Data emisji ostatniego odcinka" + "latestEpisodeAirDate": "Data emisji ostatniego odcinka", + "lastEpisodeDateAdded": "Data dodania ostatniego odcinka" } }, "about": { diff --git a/lib/i18n/pt.i18n.json b/lib/i18n/pt.i18n.json index a793c0b7..f45edcfd 100644 --- a/lib/i18n/pt.i18n.json +++ b/lib/i18n/pt.i18n.json @@ -774,7 +774,8 @@ "studio": "Estúdio", "random": "Aleatório", "dateShared": "Data de compartilhamento", - "latestEpisodeAirDate": "Última data de exibição do episódio" + "latestEpisodeAirDate": "Última data de exibição do episódio", + "lastEpisodeDateAdded": "Data de adição do último episódio" } }, "about": { diff --git a/lib/i18n/ru.i18n.json b/lib/i18n/ru.i18n.json index 03243fd1..b5f3db73 100644 --- a/lib/i18n/ru.i18n.json +++ b/lib/i18n/ru.i18n.json @@ -774,7 +774,8 @@ "studio": "Студия", "random": "Случайно", "dateShared": "Дата открытия доступа", - "latestEpisodeAirDate": "Дата выхода последнего эпизода" + "latestEpisodeAirDate": "Дата выхода последнего эпизода", + "lastEpisodeDateAdded": "Дата добавления последнего эпизода" } }, "about": { diff --git a/lib/i18n/strings.g.dart b/lib/i18n/strings.g.dart index b23881de..39885018 100644 --- a/lib/i18n/strings.g.dart +++ b/lib/i18n/strings.g.dart @@ -4,7 +4,7 @@ /// To regenerate, run: `dart run slang` /// /// Locales: 16 -/// Strings: 20409 (1275 per locale) +/// Strings: 20425 (1276 per locale) // coverage:ignore-file // ignore_for_file: type=lint, unused_import diff --git a/lib/i18n/strings_bg.g.dart b/lib/i18n/strings_bg.g.dart index d55d297d..daf87a37 100644 --- a/lib/i18n/strings_bg.g.dart +++ b/lib/i18n/strings_bg.g.dart @@ -1758,6 +1758,7 @@ class _TranslationsLibrariesSortLabelsBg extends TranslationsLibrariesSortLabels @override String get random => 'Случайно'; @override String get dateShared => 'Дата на споделяне'; @override String get latestEpisodeAirDate => 'Дата на излъчване на последния епизод'; + @override String get lastEpisodeDateAdded => 'Дата на добавяне на последния епизод'; } // Path: companionRemote.session @@ -2644,6 +2645,7 @@ extension on TranslationsBg { 'libraries.sortLabels.random' => 'Случайно', 'libraries.sortLabels.dateShared' => 'Дата на споделяне', 'libraries.sortLabels.latestEpisodeAirDate' => 'Дата на излъчване на последния епизод', + 'libraries.sortLabels.lastEpisodeDateAdded' => 'Дата на добавяне на последния епизод', 'about.title' => 'Относно', 'about.openSourceLicenses' => 'Лицензи с отворен код', 'about.versionLabel' => ({required Object version}) => 'Версия ${version}', @@ -2949,9 +2951,9 @@ extension on TranslationsBg { 'companionRemote.pairing.failedToConnect' => ({required Object error}) => 'Неуспешно свързване: ${error}', 'companionRemote.remote.disconnectConfirm' => 'Искате ли да прекъснете връзката с дистанционната сесия?', 'companionRemote.remote.reconnecting' => 'Повторно свързване...', - 'companionRemote.remote.attemptOf' => ({required Object current}) => 'Опит ${current} от 5', _ => null, } ?? switch (path) { + 'companionRemote.remote.attemptOf' => ({required Object current}) => 'Опит ${current} от 5', 'companionRemote.remote.retryNow' => 'Опитай сега', 'companionRemote.remote.tabRemote' => 'Дистанционно', 'companionRemote.remote.tabPlay' => 'Пускане', diff --git a/lib/i18n/strings_da.g.dart b/lib/i18n/strings_da.g.dart index 767d1ca4..06611ed3 100644 --- a/lib/i18n/strings_da.g.dart +++ b/lib/i18n/strings_da.g.dart @@ -1758,6 +1758,7 @@ class _TranslationsLibrariesSortLabelsDa extends TranslationsLibrariesSortLabels @override String get random => 'Tilfældig'; @override String get dateShared => 'Delt dato'; @override String get latestEpisodeAirDate => 'Seneste episodes premieredato'; + @override String get lastEpisodeDateAdded => 'Dato for senest tilføjede episode'; } // Path: companionRemote.session @@ -2644,6 +2645,7 @@ extension on TranslationsDa { 'libraries.sortLabels.random' => 'Tilfældig', 'libraries.sortLabels.dateShared' => 'Delt dato', 'libraries.sortLabels.latestEpisodeAirDate' => 'Seneste episodes premieredato', + 'libraries.sortLabels.lastEpisodeDateAdded' => 'Dato for senest tilføjede episode', 'about.title' => 'Om', 'about.openSourceLicenses' => 'Open source-licenser', 'about.versionLabel' => ({required Object version}) => 'Version ${version}', @@ -2949,9 +2951,9 @@ extension on TranslationsDa { 'companionRemote.pairing.failedToConnect' => ({required Object error}) => 'Kunne ikke oprette forbindelse: ${error}', 'companionRemote.remote.disconnectConfirm' => 'Vil du afbryde fra fjernsessionen?', 'companionRemote.remote.reconnecting' => 'Genopretter forbindelse...', - 'companionRemote.remote.attemptOf' => ({required Object current}) => 'Forsøg ${current} af 5', _ => null, } ?? switch (path) { + 'companionRemote.remote.attemptOf' => ({required Object current}) => 'Forsøg ${current} af 5', 'companionRemote.remote.retryNow' => 'Prøv igen nu', 'companionRemote.remote.tabRemote' => 'Fjernbetjening', 'companionRemote.remote.tabPlay' => 'Afspil', diff --git a/lib/i18n/strings_de.g.dart b/lib/i18n/strings_de.g.dart index 81cda90a..aee18489 100644 --- a/lib/i18n/strings_de.g.dart +++ b/lib/i18n/strings_de.g.dart @@ -1758,6 +1758,7 @@ class _TranslationsLibrariesSortLabelsDe extends TranslationsLibrariesSortLabels @override String get random => 'Zufällig'; @override String get dateShared => 'Datum geteilt'; @override String get latestEpisodeAirDate => 'Letztes Folgenausstrahlungsdatum'; + @override String get lastEpisodeDateAdded => 'Datum der zuletzt hinzugefügten Folge'; } // Path: companionRemote.session @@ -2644,6 +2645,7 @@ extension on TranslationsDe { 'libraries.sortLabels.random' => 'Zufällig', 'libraries.sortLabels.dateShared' => 'Datum geteilt', 'libraries.sortLabels.latestEpisodeAirDate' => 'Letztes Folgenausstrahlungsdatum', + 'libraries.sortLabels.lastEpisodeDateAdded' => 'Datum der zuletzt hinzugefügten Folge', 'about.title' => 'Über', 'about.openSourceLicenses' => 'Open-Source-Lizenzen', 'about.versionLabel' => ({required Object version}) => 'Version ${version}', @@ -2949,9 +2951,9 @@ extension on TranslationsDe { 'companionRemote.pairing.failedToConnect' => ({required Object error}) => 'Verbindung fehlgeschlagen: ${error}', 'companionRemote.remote.disconnectConfirm' => 'Möchtest du die Verbindung zur Fernsteuerungssitzung trennen?', 'companionRemote.remote.reconnecting' => 'Verbindung wird wiederhergestellt...', - 'companionRemote.remote.attemptOf' => ({required Object current}) => 'Versuch ${current} von 5', _ => null, } ?? switch (path) { + 'companionRemote.remote.attemptOf' => ({required Object current}) => 'Versuch ${current} von 5', 'companionRemote.remote.retryNow' => 'Jetzt wiederholen', 'companionRemote.remote.tabRemote' => 'Fernbedienung', 'companionRemote.remote.tabPlay' => 'Wiedergabe', diff --git a/lib/i18n/strings_en.g.dart b/lib/i18n/strings_en.g.dart index e785b75b..6257f49c 100644 --- a/lib/i18n/strings_en.g.dart +++ b/lib/i18n/strings_en.g.dart @@ -4173,6 +4173,9 @@ class TranslationsLibrariesSortLabelsEn { /// en: 'Latest Episode Air Date' String get latestEpisodeAirDate => 'Latest Episode Air Date'; + + /// en: 'Last Episode Date Added' + String get lastEpisodeDateAdded => 'Last Episode Date Added'; } // Path: companionRemote.session @@ -5233,6 +5236,7 @@ extension on Translations { 'libraries.sortLabels.random' => 'Random', 'libraries.sortLabels.dateShared' => 'Date Shared', 'libraries.sortLabels.latestEpisodeAirDate' => 'Latest Episode Air Date', + 'libraries.sortLabels.lastEpisodeDateAdded' => 'Last Episode Date Added', 'about.title' => 'About', 'about.openSourceLicenses' => 'Open Source Licenses', 'about.versionLabel' => ({required Object version}) => 'Version ${version}', @@ -5532,9 +5536,9 @@ extension on Translations { 'companionRemote.pairing.noDevicesHint' => 'Open Plezy on desktop and use the same WiFi', 'companionRemote.pairing.availableDevices' => 'Available Devices', 'companionRemote.pairing.manualConnection' => 'Manual Connection', - 'companionRemote.pairing.cryptoInitFailed' => 'Couldn\'t start secure connection. Sign in to Plex first.', _ => null, } ?? switch (path) { + 'companionRemote.pairing.cryptoInitFailed' => 'Couldn\'t start secure connection. Sign in to Plex first.', 'companionRemote.pairing.validationHostRequired' => 'Please enter host address', 'companionRemote.pairing.validationHostFormat' => 'Format must be IP:port (e.g., 192.168.1.100:48632)', 'companionRemote.pairing.connectionTimedOut' => 'Connection timed out. Use the same network on both devices.', diff --git a/lib/i18n/strings_es.g.dart b/lib/i18n/strings_es.g.dart index 540cf4b3..81ca6ea2 100644 --- a/lib/i18n/strings_es.g.dart +++ b/lib/i18n/strings_es.g.dart @@ -1758,6 +1758,7 @@ class _TranslationsLibrariesSortLabelsEs extends TranslationsLibrariesSortLabels @override String get random => 'Aleatorio'; @override String get dateShared => 'Fecha de compartición'; @override String get latestEpisodeAirDate => 'Última fecha de emisión del episodio'; + @override String get lastEpisodeDateAdded => 'Fecha de adición del último episodio'; } // Path: companionRemote.session @@ -2644,6 +2645,7 @@ extension on TranslationsEs { 'libraries.sortLabels.random' => 'Aleatorio', 'libraries.sortLabels.dateShared' => 'Fecha de compartición', 'libraries.sortLabels.latestEpisodeAirDate' => 'Última fecha de emisión del episodio', + 'libraries.sortLabels.lastEpisodeDateAdded' => 'Fecha de adición del último episodio', 'about.title' => 'Acerca de', 'about.openSourceLicenses' => 'Licencias de Código Abierto', 'about.versionLabel' => ({required Object version}) => 'Versión ${version}', @@ -2949,9 +2951,9 @@ extension on TranslationsEs { 'companionRemote.pairing.failedToConnect' => ({required Object error}) => 'Error al conectar: ${error}', 'companionRemote.remote.disconnectConfirm' => '¿Quieres desconectarte de la sesión remota?', 'companionRemote.remote.reconnecting' => 'Reconectando...', - 'companionRemote.remote.attemptOf' => ({required Object current}) => 'Intento ${current} de 5', _ => null, } ?? switch (path) { + 'companionRemote.remote.attemptOf' => ({required Object current}) => 'Intento ${current} de 5', 'companionRemote.remote.retryNow' => 'Reintentar ahora', 'companionRemote.remote.tabRemote' => 'Remoto', 'companionRemote.remote.tabPlay' => 'Reproducir', diff --git a/lib/i18n/strings_fr.g.dart b/lib/i18n/strings_fr.g.dart index a1414842..a72c84a1 100644 --- a/lib/i18n/strings_fr.g.dart +++ b/lib/i18n/strings_fr.g.dart @@ -1758,6 +1758,7 @@ class _TranslationsLibrariesSortLabelsFr extends TranslationsLibrariesSortLabels @override String get random => 'Aléatoire'; @override String get dateShared => 'Date de partage'; @override String get latestEpisodeAirDate => 'Dernière date de diffusion'; + @override String get lastEpisodeDateAdded => 'Date d\'ajout du dernier épisode'; } // Path: companionRemote.session @@ -2644,6 +2645,7 @@ extension on TranslationsFr { 'libraries.sortLabels.random' => 'Aléatoire', 'libraries.sortLabels.dateShared' => 'Date de partage', 'libraries.sortLabels.latestEpisodeAirDate' => 'Dernière date de diffusion', + 'libraries.sortLabels.lastEpisodeDateAdded' => 'Date d\'ajout du dernier épisode', 'about.title' => 'À propos', 'about.openSourceLicenses' => 'Licences Open Source', 'about.versionLabel' => ({required Object version}) => 'Version ${version}', @@ -2949,9 +2951,9 @@ extension on TranslationsFr { 'companionRemote.pairing.failedToConnect' => ({required Object error}) => 'Échec de la connexion : ${error}', 'companionRemote.remote.disconnectConfirm' => 'Voulez-vous vous déconnecter de la session distante ?', 'companionRemote.remote.reconnecting' => 'Reconnexion...', - 'companionRemote.remote.attemptOf' => ({required Object current}) => 'Tentative ${current} sur 5', _ => null, } ?? switch (path) { + 'companionRemote.remote.attemptOf' => ({required Object current}) => 'Tentative ${current} sur 5', 'companionRemote.remote.retryNow' => 'Réessayer maintenant', 'companionRemote.remote.tabRemote' => 'Télécommande', 'companionRemote.remote.tabPlay' => 'Lecture', diff --git a/lib/i18n/strings_it.g.dart b/lib/i18n/strings_it.g.dart index 392d6544..b46a074f 100644 --- a/lib/i18n/strings_it.g.dart +++ b/lib/i18n/strings_it.g.dart @@ -1758,6 +1758,7 @@ class _TranslationsLibrariesSortLabelsIt extends TranslationsLibrariesSortLabels @override String get random => 'Casuale'; @override String get dateShared => 'Data di condivisione'; @override String get latestEpisodeAirDate => 'Data ultima messa in onda'; + @override String get lastEpisodeDateAdded => 'Data aggiunta ultimo episodio'; } // Path: companionRemote.session @@ -2644,6 +2645,7 @@ extension on TranslationsIt { 'libraries.sortLabels.random' => 'Casuale', 'libraries.sortLabels.dateShared' => 'Data di condivisione', 'libraries.sortLabels.latestEpisodeAirDate' => 'Data ultima messa in onda', + 'libraries.sortLabels.lastEpisodeDateAdded' => 'Data aggiunta ultimo episodio', 'about.title' => 'Informazioni', 'about.openSourceLicenses' => 'Licenze Open Source', 'about.versionLabel' => ({required Object version}) => 'Versione ${version}', @@ -2949,9 +2951,9 @@ extension on TranslationsIt { 'companionRemote.pairing.failedToConnect' => ({required Object error}) => 'Connessione fallita: ${error}', 'companionRemote.remote.disconnectConfirm' => 'Vuoi disconnetterti dalla sessione remota?', 'companionRemote.remote.reconnecting' => 'Riconnessione...', - 'companionRemote.remote.attemptOf' => ({required Object current}) => 'Tentativo ${current} di 5', _ => null, } ?? switch (path) { + 'companionRemote.remote.attemptOf' => ({required Object current}) => 'Tentativo ${current} di 5', 'companionRemote.remote.retryNow' => 'Riprova ora', 'companionRemote.remote.tabRemote' => 'Telecomando', 'companionRemote.remote.tabPlay' => 'Riproduci', diff --git a/lib/i18n/strings_ja.g.dart b/lib/i18n/strings_ja.g.dart index b9d1c793..a10203c7 100644 --- a/lib/i18n/strings_ja.g.dart +++ b/lib/i18n/strings_ja.g.dart @@ -1758,6 +1758,7 @@ class _TranslationsLibrariesSortLabelsJa extends TranslationsLibrariesSortLabels @override String get random => 'ランダム'; @override String get dateShared => '共有日'; @override String get latestEpisodeAirDate => '最新エピソード放送日'; + @override String get lastEpisodeDateAdded => '最新エピソード追加日'; } // Path: companionRemote.session @@ -2644,6 +2645,7 @@ extension on TranslationsJa { 'libraries.sortLabels.random' => 'ランダム', 'libraries.sortLabels.dateShared' => '共有日', 'libraries.sortLabels.latestEpisodeAirDate' => '最新エピソード放送日', + 'libraries.sortLabels.lastEpisodeDateAdded' => '最新エピソード追加日', 'about.title' => 'アプリについて', 'about.openSourceLicenses' => 'オープンソースライセンス', 'about.versionLabel' => ({required Object version}) => 'バージョン ${version}', @@ -2949,9 +2951,9 @@ extension on TranslationsJa { 'companionRemote.pairing.failedToConnect' => ({required Object error}) => '接続に失敗しました: ${error}', 'companionRemote.remote.disconnectConfirm' => 'リモートセッションから切断しますか?', 'companionRemote.remote.reconnecting' => '再接続中...', - 'companionRemote.remote.attemptOf' => ({required Object current}) => '試行 ${current}/5', _ => null, } ?? switch (path) { + 'companionRemote.remote.attemptOf' => ({required Object current}) => '試行 ${current}/5', 'companionRemote.remote.retryNow' => '今すぐ再試行', 'companionRemote.remote.tabRemote' => 'リモート', 'companionRemote.remote.tabPlay' => '再生', diff --git a/lib/i18n/strings_ko.g.dart b/lib/i18n/strings_ko.g.dart index b2f23748..f51f8ef6 100644 --- a/lib/i18n/strings_ko.g.dart +++ b/lib/i18n/strings_ko.g.dart @@ -1758,6 +1758,7 @@ class _TranslationsLibrariesSortLabelsKo extends TranslationsLibrariesSortLabels @override String get random => '무작위'; @override String get dateShared => '공유된 날짜'; @override String get latestEpisodeAirDate => '최신 에피소드 방영일'; + @override String get lastEpisodeDateAdded => '최신 에피소드 추가일'; } // Path: companionRemote.session @@ -2644,6 +2645,7 @@ extension on TranslationsKo { 'libraries.sortLabels.random' => '무작위', 'libraries.sortLabels.dateShared' => '공유된 날짜', 'libraries.sortLabels.latestEpisodeAirDate' => '최신 에피소드 방영일', + 'libraries.sortLabels.lastEpisodeDateAdded' => '최신 에피소드 추가일', 'about.title' => '소개', 'about.openSourceLicenses' => '오픈소스 라이선스', 'about.versionLabel' => ({required Object version}) => '버전 ${version}', @@ -2949,9 +2951,9 @@ extension on TranslationsKo { 'companionRemote.pairing.failedToConnect' => ({required Object error}) => '연결 실패: ${error}', 'companionRemote.remote.disconnectConfirm' => '원격 세션 연결을 해제하시겠습니까?', 'companionRemote.remote.reconnecting' => '재연결 중...', - 'companionRemote.remote.attemptOf' => ({required Object current}) => '${current}/5 시도 중', _ => null, } ?? switch (path) { + 'companionRemote.remote.attemptOf' => ({required Object current}) => '${current}/5 시도 중', 'companionRemote.remote.retryNow' => '지금 재시도', 'companionRemote.remote.tabRemote' => '리모컨', 'companionRemote.remote.tabPlay' => '재생', diff --git a/lib/i18n/strings_nb.g.dart b/lib/i18n/strings_nb.g.dart index c57907b3..ae57f3ac 100644 --- a/lib/i18n/strings_nb.g.dart +++ b/lib/i18n/strings_nb.g.dart @@ -1758,6 +1758,7 @@ class _TranslationsLibrariesSortLabelsNb extends TranslationsLibrariesSortLabels @override String get random => 'Tilfeldig'; @override String get dateShared => 'Delingsdato'; @override String get latestEpisodeAirDate => 'Siste episodes sendedato'; + @override String get lastEpisodeDateAdded => 'Dato for sist lagt til episode'; } // Path: companionRemote.session @@ -2644,6 +2645,7 @@ extension on TranslationsNb { 'libraries.sortLabels.random' => 'Tilfeldig', 'libraries.sortLabels.dateShared' => 'Delingsdato', 'libraries.sortLabels.latestEpisodeAirDate' => 'Siste episodes sendedato', + 'libraries.sortLabels.lastEpisodeDateAdded' => 'Dato for sist lagt til episode', 'about.title' => 'Om', 'about.openSourceLicenses' => 'Åpen kildekode-lisenser', 'about.versionLabel' => ({required Object version}) => 'Versjon ${version}', @@ -2949,9 +2951,9 @@ extension on TranslationsNb { 'companionRemote.pairing.failedToConnect' => ({required Object error}) => 'Kunne ikke koble til: ${error}', 'companionRemote.remote.disconnectConfirm' => 'Vil du koble fra fjernøkten?', 'companionRemote.remote.reconnecting' => 'Kobler til på nytt...', - 'companionRemote.remote.attemptOf' => ({required Object current}) => 'Forsøk ${current} av 5', _ => null, } ?? switch (path) { + 'companionRemote.remote.attemptOf' => ({required Object current}) => 'Forsøk ${current} av 5', 'companionRemote.remote.retryNow' => 'Prøv nå', 'companionRemote.remote.tabRemote' => 'Fjernkontroll', 'companionRemote.remote.tabPlay' => 'Spill av', diff --git a/lib/i18n/strings_nl.g.dart b/lib/i18n/strings_nl.g.dart index c8736a5a..9ccacc18 100644 --- a/lib/i18n/strings_nl.g.dart +++ b/lib/i18n/strings_nl.g.dart @@ -1758,6 +1758,7 @@ class _TranslationsLibrariesSortLabelsNl extends TranslationsLibrariesSortLabels @override String get random => 'Willekeurig'; @override String get dateShared => 'Gedeeld op'; @override String get latestEpisodeAirDate => 'Laatste afleveringsuitzending'; + @override String get lastEpisodeDateAdded => 'Datum laatst toegevoegde aflevering'; } // Path: companionRemote.session @@ -2644,6 +2645,7 @@ extension on TranslationsNl { 'libraries.sortLabels.random' => 'Willekeurig', 'libraries.sortLabels.dateShared' => 'Gedeeld op', 'libraries.sortLabels.latestEpisodeAirDate' => 'Laatste afleveringsuitzending', + 'libraries.sortLabels.lastEpisodeDateAdded' => 'Datum laatst toegevoegde aflevering', 'about.title' => 'Over', 'about.openSourceLicenses' => 'Open Source licenties', 'about.versionLabel' => ({required Object version}) => 'Versie ${version}', @@ -2949,9 +2951,9 @@ extension on TranslationsNl { 'companionRemote.pairing.failedToConnect' => ({required Object error}) => 'Kan niet verbinden: ${error}', 'companionRemote.remote.disconnectConfirm' => 'Wil je de verbinding met de externe sessie verbreken?', 'companionRemote.remote.reconnecting' => 'Opnieuw verbinden...', - 'companionRemote.remote.attemptOf' => ({required Object current}) => 'Poging ${current} van 5', _ => null, } ?? switch (path) { + 'companionRemote.remote.attemptOf' => ({required Object current}) => 'Poging ${current} van 5', 'companionRemote.remote.retryNow' => 'Nu opnieuw proberen', 'companionRemote.remote.tabRemote' => 'Afstandsbediening', 'companionRemote.remote.tabPlay' => 'Afspelen', diff --git a/lib/i18n/strings_pl.g.dart b/lib/i18n/strings_pl.g.dart index 094cf224..60a7b226 100644 --- a/lib/i18n/strings_pl.g.dart +++ b/lib/i18n/strings_pl.g.dart @@ -1758,6 +1758,7 @@ class _TranslationsLibrariesSortLabelsPl extends TranslationsLibrariesSortLabels @override String get random => 'Losowo'; @override String get dateShared => 'Data udostępnienia'; @override String get latestEpisodeAirDate => 'Data emisji ostatniego odcinka'; + @override String get lastEpisodeDateAdded => 'Data dodania ostatniego odcinka'; } // Path: companionRemote.session @@ -2644,6 +2645,7 @@ extension on TranslationsPl { 'libraries.sortLabels.random' => 'Losowo', 'libraries.sortLabels.dateShared' => 'Data udostępnienia', 'libraries.sortLabels.latestEpisodeAirDate' => 'Data emisji ostatniego odcinka', + 'libraries.sortLabels.lastEpisodeDateAdded' => 'Data dodania ostatniego odcinka', 'about.title' => 'O aplikacji', 'about.openSourceLicenses' => 'Licencje open source', 'about.versionLabel' => ({required Object version}) => 'Wersja ${version}', @@ -2949,9 +2951,9 @@ extension on TranslationsPl { 'companionRemote.pairing.failedToConnect' => ({required Object error}) => 'Nie udało się połączyć: ${error}', 'companionRemote.remote.disconnectConfirm' => 'Czy chcesz się rozłączyć od sesji zdalnej?', 'companionRemote.remote.reconnecting' => 'Ponowne łączenie...', - 'companionRemote.remote.attemptOf' => ({required Object current}) => 'Próba ${current} z 5', _ => null, } ?? switch (path) { + 'companionRemote.remote.attemptOf' => ({required Object current}) => 'Próba ${current} z 5', 'companionRemote.remote.retryNow' => 'Ponów teraz', 'companionRemote.remote.tabRemote' => 'Pilot', 'companionRemote.remote.tabPlay' => 'Odtwórz', diff --git a/lib/i18n/strings_pt.g.dart b/lib/i18n/strings_pt.g.dart index 42a85cca..4f4550c8 100644 --- a/lib/i18n/strings_pt.g.dart +++ b/lib/i18n/strings_pt.g.dart @@ -1758,6 +1758,7 @@ class _TranslationsLibrariesSortLabelsPt extends TranslationsLibrariesSortLabels @override String get random => 'Aleatório'; @override String get dateShared => 'Data de compartilhamento'; @override String get latestEpisodeAirDate => 'Última data de exibição do episódio'; + @override String get lastEpisodeDateAdded => 'Data de adição do último episódio'; } // Path: companionRemote.session @@ -2644,6 +2645,7 @@ extension on TranslationsPt { 'libraries.sortLabels.random' => 'Aleatório', 'libraries.sortLabels.dateShared' => 'Data de compartilhamento', 'libraries.sortLabels.latestEpisodeAirDate' => 'Última data de exibição do episódio', + 'libraries.sortLabels.lastEpisodeDateAdded' => 'Data de adição do último episódio', 'about.title' => 'Sobre', 'about.openSourceLicenses' => 'Licenças Open Source', 'about.versionLabel' => ({required Object version}) => 'Versão ${version}', @@ -2949,9 +2951,9 @@ extension on TranslationsPt { 'companionRemote.pairing.failedToConnect' => ({required Object error}) => 'Falha ao conectar: ${error}', 'companionRemote.remote.disconnectConfirm' => 'Deseja desconectar da sessão remota?', 'companionRemote.remote.reconnecting' => 'Reconectando...', - 'companionRemote.remote.attemptOf' => ({required Object current}) => 'Tentativa ${current} de 5', _ => null, } ?? switch (path) { + 'companionRemote.remote.attemptOf' => ({required Object current}) => 'Tentativa ${current} de 5', 'companionRemote.remote.retryNow' => 'Tentar Agora', 'companionRemote.remote.tabRemote' => 'Remoto', 'companionRemote.remote.tabPlay' => 'Reproduzir', diff --git a/lib/i18n/strings_ru.g.dart b/lib/i18n/strings_ru.g.dart index dd4523b7..4ab93129 100644 --- a/lib/i18n/strings_ru.g.dart +++ b/lib/i18n/strings_ru.g.dart @@ -1758,6 +1758,7 @@ class _TranslationsLibrariesSortLabelsRu extends TranslationsLibrariesSortLabels @override String get random => 'Случайно'; @override String get dateShared => 'Дата открытия доступа'; @override String get latestEpisodeAirDate => 'Дата выхода последнего эпизода'; + @override String get lastEpisodeDateAdded => 'Дата добавления последнего эпизода'; } // Path: companionRemote.session @@ -2644,6 +2645,7 @@ extension on TranslationsRu { 'libraries.sortLabels.random' => 'Случайно', 'libraries.sortLabels.dateShared' => 'Дата открытия доступа', 'libraries.sortLabels.latestEpisodeAirDate' => 'Дата выхода последнего эпизода', + 'libraries.sortLabels.lastEpisodeDateAdded' => 'Дата добавления последнего эпизода', 'about.title' => 'О приложении', 'about.openSourceLicenses' => 'Лицензии открытого ПО', 'about.versionLabel' => ({required Object version}) => 'Версия ${version}', @@ -2949,9 +2951,9 @@ extension on TranslationsRu { 'companionRemote.pairing.failedToConnect' => ({required Object error}) => 'Не удалось подключиться: ${error}', 'companionRemote.remote.disconnectConfirm' => 'Отключиться от удалённой сессии?', 'companionRemote.remote.reconnecting' => 'Переподключение...', - 'companionRemote.remote.attemptOf' => ({required Object current}) => 'Попытка ${current} из 5', _ => null, } ?? switch (path) { + 'companionRemote.remote.attemptOf' => ({required Object current}) => 'Попытка ${current} из 5', 'companionRemote.remote.retryNow' => 'Повторить сейчас', 'companionRemote.remote.tabRemote' => 'Пульт', 'companionRemote.remote.tabPlay' => 'Воспроизведение', diff --git a/lib/i18n/strings_sv.g.dart b/lib/i18n/strings_sv.g.dart index 4b8a682a..2ec771c0 100644 --- a/lib/i18n/strings_sv.g.dart +++ b/lib/i18n/strings_sv.g.dart @@ -1758,6 +1758,7 @@ class _TranslationsLibrariesSortLabelsSv extends TranslationsLibrariesSortLabels @override String get random => 'Slumpmässigt'; @override String get dateShared => 'Delningsdatum'; @override String get latestEpisodeAirDate => 'Senaste avsnittets sändningsdatum'; + @override String get lastEpisodeDateAdded => 'Datum då senaste avsnittet lades till'; } // Path: companionRemote.session @@ -2644,6 +2645,7 @@ extension on TranslationsSv { 'libraries.sortLabels.random' => 'Slumpmässigt', 'libraries.sortLabels.dateShared' => 'Delningsdatum', 'libraries.sortLabels.latestEpisodeAirDate' => 'Senaste avsnittets sändningsdatum', + 'libraries.sortLabels.lastEpisodeDateAdded' => 'Datum då senaste avsnittet lades till', 'about.title' => 'Om', 'about.openSourceLicenses' => 'Öppen källkod-licenser', 'about.versionLabel' => ({required Object version}) => 'Version ${version}', @@ -2949,9 +2951,9 @@ extension on TranslationsSv { 'companionRemote.pairing.failedToConnect' => ({required Object error}) => 'Kunde inte ansluta: ${error}', 'companionRemote.remote.disconnectConfirm' => 'Vill du koppla från fjärrsessionen?', 'companionRemote.remote.reconnecting' => 'Återansluter...', - 'companionRemote.remote.attemptOf' => ({required Object current}) => 'Försök ${current} av 5', _ => null, } ?? switch (path) { + 'companionRemote.remote.attemptOf' => ({required Object current}) => 'Försök ${current} av 5', 'companionRemote.remote.retryNow' => 'Försök nu', 'companionRemote.remote.tabRemote' => 'Fjärrkontroll', 'companionRemote.remote.tabPlay' => 'Spela', diff --git a/lib/i18n/strings_zh.g.dart b/lib/i18n/strings_zh.g.dart index f1185de1..7c0fc3f5 100644 --- a/lib/i18n/strings_zh.g.dart +++ b/lib/i18n/strings_zh.g.dart @@ -1758,6 +1758,7 @@ class _TranslationsLibrariesSortLabelsZh extends TranslationsLibrariesSortLabels @override String get random => '随机'; @override String get dateShared => '共享日期'; @override String get latestEpisodeAirDate => '最新一集播出日期'; + @override String get lastEpisodeDateAdded => '最新一集添加日期'; } // Path: companionRemote.session @@ -2644,6 +2645,7 @@ extension on TranslationsZh { 'libraries.sortLabels.random' => '随机', 'libraries.sortLabels.dateShared' => '共享日期', 'libraries.sortLabels.latestEpisodeAirDate' => '最新一集播出日期', + 'libraries.sortLabels.lastEpisodeDateAdded' => '最新一集添加日期', 'about.title' => '关于', 'about.openSourceLicenses' => '开源许可证', 'about.versionLabel' => ({required Object version}) => '版本 ${version}', @@ -2949,9 +2951,9 @@ extension on TranslationsZh { 'companionRemote.pairing.failedToConnect' => ({required Object error}) => '连接失败:${error}', 'companionRemote.remote.disconnectConfirm' => '是否要断开远程会话的连接?', 'companionRemote.remote.reconnecting' => '重新连接中...', - 'companionRemote.remote.attemptOf' => ({required Object current}) => '第 ${current} 次尝试,共 5 次', _ => null, } ?? switch (path) { + 'companionRemote.remote.attemptOf' => ({required Object current}) => '第 ${current} 次尝试,共 5 次', 'companionRemote.remote.retryNow' => '立即重试', 'companionRemote.remote.tabRemote' => '遥控', 'companionRemote.remote.tabPlay' => '播放', diff --git a/lib/i18n/sv.i18n.json b/lib/i18n/sv.i18n.json index 76352341..ac63b1f0 100644 --- a/lib/i18n/sv.i18n.json +++ b/lib/i18n/sv.i18n.json @@ -774,7 +774,8 @@ "studio": "Studio", "random": "Slumpmässigt", "dateShared": "Delningsdatum", - "latestEpisodeAirDate": "Senaste avsnittets sändningsdatum" + "latestEpisodeAirDate": "Senaste avsnittets sändningsdatum", + "lastEpisodeDateAdded": "Datum då senaste avsnittet lades till" } }, "about": { diff --git a/lib/i18n/zh.i18n.json b/lib/i18n/zh.i18n.json index 1ce0d177..6ccede69 100644 --- a/lib/i18n/zh.i18n.json +++ b/lib/i18n/zh.i18n.json @@ -774,7 +774,8 @@ "studio": "工作室", "random": "随机", "dateShared": "共享日期", - "latestEpisodeAirDate": "最新一集播出日期" + "latestEpisodeAirDate": "最新一集播出日期", + "lastEpisodeDateAdded": "最新一集添加日期" } }, "about": { diff --git a/lib/services/jellyfin_client/parts/browse.dart b/lib/services/jellyfin_client/parts/browse.dart index ff677f61..e401de68 100644 --- a/lib/services/jellyfin_client/parts/browse.dart +++ b/lib/services/jellyfin_client/parts/browse.dart @@ -272,7 +272,7 @@ mixin _JellyfinBrowseMethods on MediaServerCacheMixin { /// Jellyfin's `SortBy`/`SortOrder` at request time. @override Future> fetchSortOptions(String libraryId, {String? libraryType}) async { - return [ + final sorts = [ MediaSort(key: 'title', descKey: 'title:desc', title: t.libraries.sortLabels.title, defaultDirection: 'asc'), MediaSort( key: 'rating', @@ -343,6 +343,20 @@ mixin _JellyfinBrowseMethods on MediaServerCacheMixin { MediaSort(key: 'studio', descKey: 'studio:desc', title: t.libraries.sortLabels.studio, defaultDirection: 'asc'), MediaSort(key: 'random', title: t.libraries.sortLabels.random, defaultDirection: 'asc'), ]; + + if (libraryType?.toLowerCase() == 'show') { + sorts.insert( + 4, + MediaSort( + key: 'episode.addedAt', + descKey: 'episode.addedAt:desc', + title: t.libraries.sortLabels.lastEpisodeDateAdded, + defaultDirection: 'desc', + ), + ); + } + + return sorts; } /// Jellyfin internalisation of the Plex-style filter map → [LibraryQuery] diff --git a/lib/services/library_query_translator.dart b/lib/services/library_query_translator.dart index 162a6d8f..833b1385 100644 --- a/lib/services/library_query_translator.dart +++ b/lib/services/library_query_translator.dart @@ -278,6 +278,7 @@ class JellyfinLibraryQueryTranslator implements LibraryQueryTranslator { static String _sortFieldFor(String neutral, MediaKind? kind) { return switch (neutral) { 'addedAt' => 'DateCreated', + 'episode.addedAt' => 'DateLastContentAdded,SortName', 'dateCreated' => 'DateCreated', 'originallyAvailableAt' => 'PremiereDate', 'premiereDate' => 'PremiereDate', diff --git a/test/services/jellyfin_client_urls_test.dart b/test/services/jellyfin_client_urls_test.dart index 53c54c72..5fca2895 100644 --- a/test/services/jellyfin_client_urls_test.dart +++ b/test/services/jellyfin_client_urls_test.dart @@ -104,6 +104,30 @@ void main() { ]); }); + test('fetchSortOptions adds episode added sort only for shows', () async { + final showSorts = await client.fetchSortOptions('lib-1', libraryType: 'show'); + expect(showSorts.map((sort) => sort.key).toList(), [ + 'title', + 'rating', + 'criticRating', + 'addedAt', + 'episode.addedAt', + 'lastViewedAt', + 'viewCount', + 'productionYear', + 'runtime', + 'officialRating', + 'originallyAvailableAt', + 'startDate', + 'airTime', + 'studio', + 'random', + ]); + + final movieSorts = await client.fetchSortOptions('lib-1', libraryType: 'movie'); + expect(movieSorts.map((sort) => sort.key), isNot(contains('episode.addedAt'))); + }); + test('fetchExtras combines local trailers and special features as playable videos', () async { const itemId = 'movie/id #1?x'; final encodedItemId = Uri.encodeComponent(itemId); diff --git a/test/services/library_query_translator_test.dart b/test/services/library_query_translator_test.dart index a91622e8..ad57d083 100644 --- a/test/services/library_query_translator_test.dart +++ b/test/services/library_query_translator_test.dart @@ -146,6 +146,7 @@ void main() { 'startDate': 'StartDate', 'airTime': 'AirTime', 'studio': 'Studio', + 'episode.addedAt': 'DateLastContentAdded,SortName', }; for (final entry in cases.entries) { @@ -172,6 +173,26 @@ void main() { expect(movieSort['SortBy'], 'DatePlayed'); }); + test('episode added sort maps to Jellyfin series content added sort', () { + final descending = translator.toQueryParameters( + const LibraryQuery( + kind: MediaKind.show, + sort: LibrarySort(field: 'episode.addedAt'), + ), + ); + expect(descending['SortBy'], 'DateLastContentAdded,SortName'); + expect(descending['SortOrder'], 'Descending'); + + final ascending = translator.toQueryParameters( + const LibraryQuery( + kind: MediaKind.show, + sort: LibrarySort(field: 'episode.addedAt', direction: LibrarySortDirection.ascending), + ), + ); + expect(ascending['SortBy'], 'DateLastContentAdded,SortName'); + expect(ascending['SortOrder'], 'Ascending'); + }); + test('nameStartsWith="#" maps to NameLessThan=A', () { final params = translator.toQueryParameters(const LibraryQuery(nameStartsWith: '#')); expect(params['NameLessThan'], 'A');