From 8c38987d923af784a6d59de3b2eb98896c01161b Mon Sep 17 00:00:00 2001 From: advplyr Date: Tue, 22 Jul 2025 14:44:36 -0500 Subject: [PATCH 1/7] Fix podcast episode track index null in playback session --- server/controllers/SessionController.js | 7 ++++++- server/models/PodcastEpisode.js | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/server/controllers/SessionController.js b/server/controllers/SessionController.js index 7160eace1..ed662ee8d 100644 --- a/server/controllers/SessionController.js +++ b/server/controllers/SessionController.js @@ -288,7 +288,12 @@ class SessionController { return res.sendStatus(404) } - const audioTrack = playbackSession.audioTracks.find((t) => t.index === audioTrackIndex) + let audioTrack = playbackSession.audioTracks.find((t) => toNumber(t.index, 1) === audioTrackIndex) + + // Support clients passing 0 or 1 for podcast episode audio track index (handles old episodes pre-v2.21.0 having null index) + if (!audioTrack && playbackSession.mediaType === 'podcast' && audioTrackIndex === 0) { + audioTrack = playbackSession.audioTracks[0] + } if (!audioTrack) { Logger.error(`[SessionController] Unable to find audio track with index=${audioTrackIndex}`) return res.sendStatus(404) diff --git a/server/models/PodcastEpisode.js b/server/models/PodcastEpisode.js index 27e702a10..996f55f58 100644 --- a/server/models/PodcastEpisode.js +++ b/server/models/PodcastEpisode.js @@ -185,6 +185,7 @@ class PodcastEpisode extends Model { const track = structuredClone(this.audioFile) track.startOffset = 0 track.title = this.audioFile.metadata.filename + track.index = 1 // Podcast episodes only have one track track.contentUrl = `/api/items/${libraryItemId}/file/${track.ino}` return track } From 45e8e727596f73144620fdd8db09d1c2dc6ae39e Mon Sep 17 00:00:00 2001 From: advplyr Date: Tue, 22 Jul 2025 15:17:00 -0500 Subject: [PATCH 2/7] Update change password to support null or empty string passwords #4522 --- server/controllers/MeController.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/controllers/MeController.js b/server/controllers/MeController.js index 9451a7654..20d032429 100644 --- a/server/controllers/MeController.js +++ b/server/controllers/MeController.js @@ -280,7 +280,7 @@ class MeController { } const { password, newPassword } = req.body - if (!password || !newPassword || typeof password !== 'string' || typeof newPassword !== 'string') { + if ((typeof password !== 'string' && password !== null) || (typeof newPassword !== 'string' && newPassword !== null)) { return res.status(400).send('Missing or invalid password or new password') } From b156ebeb9f0935f49e93d4cf1f8aba82687ea919 Mon Sep 17 00:00:00 2001 From: Daniel Schosser Date: Tue, 22 Jul 2025 10:15:55 +0200 Subject: [PATCH 3/7] Translated using Weblate (German) Currently translated at 99.9% (1129 of 1130 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/de/ --- client/strings/de.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/client/strings/de.json b/client/strings/de.json index c455a1203..2e913c11f 100644 --- a/client/strings/de.json +++ b/client/strings/de.json @@ -438,6 +438,7 @@ "LabelLogLevelWarn": "Warnungen", "LabelLookForNewEpisodesAfterDate": "Suche nach neuen Episoden nach diesem Datum", "LabelLowestPriority": "Niedrigste Priorität", + "LabelMatchConfidence": "Zuversicht", "LabelMatchExistingUsersBy": "Zuordnen existierender Benutzer mit", "LabelMatchExistingUsersByDescription": "Wird zum Verbinden vorhandener Benutzer verwendet. Sobald die Verbindung hergestellt ist, wird den Benutzern eine eindeutige ID vom SSO-Anbieter zugeordnet", "LabelMaxEpisodesToDownload": "Max. Anzahl an Episoden zum Herunterladen, 0 für unbegrenzte Episoden.", @@ -723,6 +724,7 @@ "MessageAddToPlayerQueue": "Zur Abspielwarteliste hinzufügen", "MessageAppriseDescription": "Um diese Funktion nutzen zu können, musst du eine Instanz von Apprise API laufen haben oder eine API verwenden welche dieselbe Anfragen bearbeiten kann.
Die Apprise API Url muss der vollständige URL-Pfad sein, an den die Benachrichtigung gesendet werden soll, z.B. wenn Ihre API-Instanz unter http://192.168.1.1:8337 läuft, würdest du http://192.168.1.1:8337/notify eingeben.", "MessageAsinCheck": "Stellen Sie sicher, dass Sie die ASIN aus der richtigen Audible Region verwenden, nicht Amazon.", + "MessageAuthenticationLegacyTokenWarning": "Alte API tokens werden in Zukunft entfernt. Benutze stattdessen API Keys.", "MessageAuthenticationOIDCChangesRestart": "Nach dem Speichern muss der Server neugestartet werden um die OIDC Änderungen zu übernehmen.", "MessageAuthenticationSecurityMessage": "Die Anmeldung wurde abgesichert. Benutzersitzungen werden getrennt, alle Benutzer müssen sich erneut anmelden.", "MessageBackupsDescription": "In einer Sicherung werden Benutzer, Benutzerfortschritte, Details zu den Bibliotheksobjekten, Servereinstellungen und Bilder welche in /metadata/items & /metadata/authors gespeichert sind gespeichert. Sicherungen enthalten keine Dateien welche in den einzelnen Bibliotheksordnern (Medien-Ordnern) gespeichert sind.", From c3f0fb8e5e4fdf8c815cb5d09d167898941059cb Mon Sep 17 00:00:00 2001 From: Dmitry Date: Tue, 22 Jul 2025 00:55:00 +0200 Subject: [PATCH 4/7] Translated using Weblate (Russian) Currently translated at 100.0% (1130 of 1130 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/ru/ --- client/strings/ru.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/client/strings/ru.json b/client/strings/ru.json index ce03bdc4a..4caceacf4 100644 --- a/client/strings/ru.json +++ b/client/strings/ru.json @@ -438,6 +438,7 @@ "LabelLogLevelWarn": "Предупреждение", "LabelLookForNewEpisodesAfterDate": "Искать новые эпизоды после этой даты", "LabelLowestPriority": "Самый низкий приоритет", + "LabelMatchConfidence": "Уверенность", "LabelMatchExistingUsersBy": "Сопоставление существующих пользователей по", "LabelMatchExistingUsersByDescription": "Используется для подключения существующих пользователей. После подключения пользователям будет присвоен уникальный идентификатор от поставщика единого входа", "LabelMaxEpisodesToDownload": "Максимальное количество эпизодов для загрузки. Используйте 0 для неограниченного количества.", @@ -723,6 +724,7 @@ "MessageAddToPlayerQueue": "Добавить в очередь проигрывателя", "MessageAppriseDescription": "Для использования этой функции необходимо иметь запущенный экземпляр Apprise API или api которое обрабатывает те же самые запросы.
URL-адрес API Apprise должен быть полным URL-адресом для отправки уведомления, т.е., если API запущено по адресу http://192.168.1.1:8337 тогда нужно указать http://192.168.1.1:8337/notify.", "MessageAsinCheck": "Убедитесь, что вы используете ASIN из правильной региональной зоны Audible, а не из Amazon.", + "MessageAuthenticationLegacyTokenWarning": "Устаревшие токены API в будущем будут удалены. Вместо них используйте API-ключи.", "MessageAuthenticationOIDCChangesRestart": "Перезапустите ваш сервер после сохранения для применения изменений в OIDC.", "MessageAuthenticationSecurityMessage": "В целях безопасности была улучшена аутентификация. Всем пользователям необходимо повторно войти в систему.", "MessageBackupsDescription": "Бэкап включает пользователей, прогресс пользователей, данные элементов библиотеки, настройки сервера и изображения хранящиеся в /metadata/items и /metadata/authors. Бэкапы НЕ сохраняют файлы из папок библиотек.", From 472240f99402310af418203fc0780e51c9158d5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D0=BA=D1=81=D0=B8=D0=BC=20=D0=93=D0=BE=D1=80?= =?UTF-8?q?=D0=BF=D0=B8=D0=BD=D1=96=D1=87?= Date: Tue, 22 Jul 2025 06:44:15 +0200 Subject: [PATCH 5/7] Translated using Weblate (Ukrainian) Currently translated at 100.0% (1130 of 1130 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/uk/ --- client/strings/uk.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/client/strings/uk.json b/client/strings/uk.json index c7f760892..94e01e3d9 100644 --- a/client/strings/uk.json +++ b/client/strings/uk.json @@ -438,6 +438,7 @@ "LabelLogLevelWarn": "Увага", "LabelLookForNewEpisodesAfterDate": "Шукати нові епізоди після вказаної дати", "LabelLowestPriority": "Найнижчий пріоритет", + "LabelMatchConfidence": "Впевненість", "LabelMatchExistingUsersBy": "Шукати наявних користувачів за", "LabelMatchExistingUsersByDescription": "Використовується для підключення наявних користувачів. Після підключення користувач отримає унікальний id від вашого сервісу SSO", "LabelMaxEpisodesToDownload": "Максимальна кількість епізодів для скачування. Використовуйте 0 для необмеженої кількості.", @@ -837,7 +838,7 @@ "MessageNoItems": "Елементи відсутні", "MessageNoItemsFound": "Елементів не знайдено", "MessageNoListeningSessions": "Сеанси прослуховування відсутні", - "MessageNoLogs": "Немає журнали", + "MessageNoLogs": "Немає журналів'", "MessageNoMediaProgress": "Прогрес відсутній", "MessageNoNotifications": "Сповіщення відсутні", "MessageNoPodcastFeed": "Некоректний подкаст: немає каналу", From 93160b83bfbb65c0609dfa718d2d4e29a0bb0c0d Mon Sep 17 00:00:00 2001 From: FiendFEARing Date: Tue, 22 Jul 2025 02:25:07 +0200 Subject: [PATCH 6/7] Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (1130 of 1130 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/zh_Hans/ --- client/strings/zh-cn.json | 1 + 1 file changed, 1 insertion(+) diff --git a/client/strings/zh-cn.json b/client/strings/zh-cn.json index 5138e84e3..4d86781ec 100644 --- a/client/strings/zh-cn.json +++ b/client/strings/zh-cn.json @@ -438,6 +438,7 @@ "LabelLogLevelWarn": "警告", "LabelLookForNewEpisodesAfterDate": "在此日期后查找新剧集", "LabelLowestPriority": "最低优先级", + "LabelMatchConfidence": "置信度", "LabelMatchExistingUsersBy": "匹配现有用户", "LabelMatchExistingUsersByDescription": "用于连接现有用户. 连接后, 用户将通过 SSO 提供商提供的唯一 id 进行匹配", "LabelMaxEpisodesToDownload": "可下载的最大集数. 输入 0 表示无限制.", From a7a3a565098791a8157ed54b46b5258bb97c141d Mon Sep 17 00:00:00 2001 From: advplyr Date: Wed, 23 Jul 2025 17:18:51 -0500 Subject: [PATCH 7/7] Version bump v2.26.3 --- client/package-lock.json | 4 ++-- client/package.json | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/client/package-lock.json b/client/package-lock.json index 37fb4903a..5dc4883af 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -1,12 +1,12 @@ { "name": "audiobookshelf-client", - "version": "2.26.2", + "version": "2.26.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "audiobookshelf-client", - "version": "2.26.2", + "version": "2.26.3", "license": "ISC", "dependencies": { "@nuxtjs/axios": "^5.13.6", diff --git a/client/package.json b/client/package.json index 828fedf96..788117101 100644 --- a/client/package.json +++ b/client/package.json @@ -1,6 +1,6 @@ { "name": "audiobookshelf-client", - "version": "2.26.2", + "version": "2.26.3", "buildNumber": 1, "description": "Self-hosted audiobook and podcast client", "main": "index.js", diff --git a/package-lock.json b/package-lock.json index 10e3389e3..ac3b1f6a7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "audiobookshelf", - "version": "2.26.2", + "version": "2.26.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "audiobookshelf", - "version": "2.26.2", + "version": "2.26.3", "license": "GPL-3.0", "dependencies": { "axios": "^0.27.2", diff --git a/package.json b/package.json index 5e7d4bc34..87c052c28 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "audiobookshelf", - "version": "2.26.2", + "version": "2.26.3", "buildNumber": 1, "description": "Self-hosted audiobook and podcast server", "main": "index.js",