fix: add Jellyfin episode-added sort

close #1274
This commit is contained in:
edde746
2026-06-18 16:22:01 +02:00
parent 94f2daa22e
commit 7e1d5ad4c4
37 changed files with 144 additions and 34 deletions
+2 -1
View File
@@ -774,7 +774,8 @@
"studio": "Студио",
"random": "Случайно",
"dateShared": "Дата на споделяне",
"latestEpisodeAirDate": "Дата на излъчване на последния епизод"
"latestEpisodeAirDate": "Дата на излъчване на последния епизод",
"lastEpisodeDateAdded": "Дата на добавяне на последния епизод"
}
},
"about": {
+2 -1
View File
@@ -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": {
+2 -1
View File
@@ -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": {
+2 -1
View File
@@ -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": {
+2 -1
View File
@@ -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": {
+2 -1
View File
@@ -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": {
+2 -1
View File
@@ -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": {
+2 -1
View File
@@ -774,7 +774,8 @@
"studio": "スタジオ",
"random": "ランダム",
"dateShared": "共有日",
"latestEpisodeAirDate": "最新エピソード放送日"
"latestEpisodeAirDate": "最新エピソード放送日",
"lastEpisodeDateAdded": "最新エピソード追加日"
}
},
"about": {
+2 -1
View File
@@ -774,7 +774,8 @@
"studio": "스튜디오",
"random": "무작위",
"dateShared": "공유된 날짜",
"latestEpisodeAirDate": "최신 에피소드 방영일"
"latestEpisodeAirDate": "최신 에피소드 방영일",
"lastEpisodeDateAdded": "최신 에피소드 추가일"
}
},
"about": {
+2 -1
View File
@@ -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": {
+2 -1
View File
@@ -774,7 +774,8 @@
"studio": "Studio",
"random": "Willekeurig",
"dateShared": "Gedeeld op",
"latestEpisodeAirDate": "Laatste afleveringsuitzending"
"latestEpisodeAirDate": "Laatste afleveringsuitzending",
"lastEpisodeDateAdded": "Datum laatst toegevoegde aflevering"
}
},
"about": {
+2 -1
View File
@@ -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": {
+2 -1
View File
@@ -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": {
+2 -1
View File
@@ -774,7 +774,8 @@
"studio": "Студия",
"random": "Случайно",
"dateShared": "Дата открытия доступа",
"latestEpisodeAirDate": "Дата выхода последнего эпизода"
"latestEpisodeAirDate": "Дата выхода последнего эпизода",
"lastEpisodeDateAdded": "Дата добавления последнего эпизода"
}
},
"about": {
+1 -1
View File
@@ -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
+3 -1
View File
@@ -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' => 'Пускане',
+3 -1
View File
@@ -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',
+3 -1
View File
@@ -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',
+5 -1
View File
@@ -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.',
+3 -1
View File
@@ -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',
+3 -1
View File
@@ -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',
+3 -1
View File
@@ -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',
+3 -1
View File
@@ -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' => '再生',
+3 -1
View File
@@ -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' => '재생',
+3 -1
View File
@@ -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',
+3 -1
View File
@@ -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',
+3 -1
View File
@@ -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',
+3 -1
View File
@@ -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',
+3 -1
View File
@@ -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' => 'Воспроизведение',
+3 -1
View File
@@ -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',
+3 -1
View File
@@ -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' => '播放',
+2 -1
View File
@@ -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": {
+2 -1
View File
@@ -774,7 +774,8 @@
"studio": "工作室",
"random": "随机",
"dateShared": "共享日期",
"latestEpisodeAirDate": "最新一集播出日期"
"latestEpisodeAirDate": "最新一集播出日期",
"lastEpisodeDateAdded": "最新一集添加日期"
}
},
"about": {
+15 -1
View File
@@ -272,7 +272,7 @@ mixin _JellyfinBrowseMethods on MediaServerCacheMixin {
/// Jellyfin's `SortBy`/`SortOrder` at request time.
@override
Future<List<MediaSort>> 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]
@@ -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',
@@ -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);
@@ -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');