diff --git a/Dockerfile b/Dockerfile
index 1ba107fd8..f9c461174 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,5 +1,9 @@
+ARG NUSQLITE3_DIR="/usr/local/lib/nusqlite3"
+ARG NUSQLITE3_PATH="${NUSQLITE3_DIR}/libnusqlite3.so"
+
### STAGE 0: Build client ###
FROM node:20-alpine AS build-client
+
WORKDIR /client
COPY /client /client
RUN npm ci && npm cache clean --force
@@ -8,6 +12,9 @@ RUN npm run generate
### STAGE 1: Build server ###
FROM node:20-alpine AS build-server
+ARG NUSQLITE3_DIR
+ARG TARGETPLATFORM
+
ENV NODE_ENV=production
RUN apk add --no-cache --update \
@@ -21,11 +28,6 @@ WORKDIR /server
COPY index.js package* /server
COPY /server /server/server
-ARG TARGETPLATFORM
-
-ENV NUSQLITE3_DIR="/usr/local/lib/nusqlite3"
-ENV NUSQLITE3_PATH="${NUSQLITE3_DIR}/libnusqlite3.so"
-
RUN case "$TARGETPLATFORM" in \
"linux/amd64") \
curl -L -o /tmp/library.zip "https://github.com/mikiher/nunicode-sqlite/releases/download/v1.2/libnusqlite3-linux-musl-x64.zip" ;; \
@@ -41,6 +43,9 @@ RUN npm ci --only=production
### STAGE 2: Create minimal runtime image ###
FROM node:20-alpine
+ARG NUSQLITE3_DIR
+ARG NUSQLITE3_PATH
+
# Install only runtime dependencies
RUN apk add --no-cache --update \
tzdata \
@@ -52,13 +57,17 @@ WORKDIR /app
# Copy compiled frontend and server from build stages
COPY --from=build-client /client/dist /app/client/dist
COPY --from=build-server /server /app
+COPY --from=build-server /usr/local/lib/nusqlite3 /usr/local/lib/nusqlite3
EXPOSE 80
ENV PORT=80
+ENV NODE_ENV=production
ENV CONFIG_PATH="/config"
ENV METADATA_PATH="/metadata"
ENV SOURCE="docker"
+ENV NUSQLITE3_DIR=${NUSQLITE3_DIR}
+ENV NUSQLITE3_PATH=${NUSQLITE3_PATH}
ENTRYPOINT ["tini", "--"]
CMD ["node", "index.js"]
diff --git a/client/components/modals/EditSeriesInputInnerModal.vue b/client/components/modals/EditSeriesInputInnerModal.vue
index 6190551e1..bd568321f 100644
--- a/client/components/modals/EditSeriesInputInnerModal.vue
+++ b/client/components/modals/EditSeriesInputInnerModal.vue
@@ -14,6 +14,7 @@
http://192.168.1.1:8337
, llavors posaries http://192.168.1.1:8337/notify
.",
+ "MessageAuthenticationOIDCChangesRestart": "Reengegueu el servidor després de desar perquè s'hi apliquin els canvis d'OIDC.",
"MessageBackupsDescription": "Les còpies de seguretat inclouen: usuaris, progrés dels usuaris, detalls dels elements de la biblioteca, configuració del servidor i imatges a /metadata/items
i /metadata/authors
. Les còpies de seguretat NO inclouen cap fitxer guardat a la carpeta de la teva biblioteca.",
"MessageBackupsLocationEditNote": "Nota: Actualitzar la ubicació de la còpia de seguretat no mourà ni modificarà les còpies existents",
"MessageBackupsLocationNoEditNote": "Nota: La ubicació de la còpia de seguretat es defineix mitjançant una variable d'entorn i no es pot modificar aquí.",
@@ -685,7 +687,7 @@
"MessageBookshelfNoRSSFeeds": "Cap font RSS està oberta",
"MessageBookshelfNoResultsForFilter": "Cap resultat per al filtre «{0}: {1}»",
"MessageBookshelfNoResultsForQuery": "Cap resultat per a la consulta",
- "MessageBookshelfNoSeries": "No tens cap sèrie",
+ "MessageBookshelfNoSeries": "No teniu cap sèrie",
"MessageChapterEndIsAfter": "El final del capítol és després del final del teu audiollibre",
"MessageChapterErrorFirstNotZero": "El primer capítol ha de començar a 0",
"MessageChapterErrorStartGteDuration": "El temps d'inici no és vàlid: ha de ser inferior a la durada de l'audiollibre",
@@ -712,7 +714,7 @@
"MessageConfirmMarkSeriesFinished": "Segur que voleu marcar tots els llibres d'aquesta sèrie com a acabats?",
"MessageConfirmMarkSeriesNotFinished": "Segur que voleu marcar tots els llibres d'aquesta sèrie com a no acabats?",
"MessageConfirmNotificationTestTrigger": "Voleu activar aquesta notificació amb dades de prova?",
- "MessageConfirmPurgeCache": "Esborrar la memòria cau eliminarà tot el directori localitzat a /metadata/cache
. /metadata/cache
. /metadata/cache/items
.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.",
+ "MessageAuthenticationOIDCChangesRestart": "Nach dem Speichern muß der Server neugestartet werden um die OIDC Änderungen zu übernehmen.",
"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.",
"MessageBackupsLocationEditNote": "Hinweis: Durch das Aktualisieren des Backup-Speicherorts werden vorhandene Sicherungen nicht verschoben oder geändert",
"MessageBackupsLocationNoEditNote": "Hinweis: Der Sicherungsspeicherort wird über eine Umgebungsvariable festgelegt und kann hier nicht geändert werden.",
diff --git a/client/strings/en-us.json b/client/strings/en-us.json
index 47b64c1a4..939eb9f4b 100644
--- a/client/strings/en-us.json
+++ b/client/strings/en-us.json
@@ -856,6 +856,7 @@
"MessageScheduleRunEveryWeekdayAtTime": "Run every {0} at {1}",
"MessageSearchResultsFor": "Search results for",
"MessageSelected": "{0} selected",
+ "MessageSeriesSequenceCannotContainSpaces": "Series sequence cannot contain spaces",
"MessageServerCouldNotBeReached": "Server could not be reached",
"MessageSetChaptersFromTracksDescription": "Set chapters using each audio file as a chapter and chapter title as the audio file name",
"MessageShareExpirationWillBe": "Expiration will be {0}",
diff --git a/client/strings/es.json b/client/strings/es.json
index 5f358c6a7..80652f39e 100644
--- a/client/strings/es.json
+++ b/client/strings/es.json
@@ -462,17 +462,17 @@
"LabelNotes": "Notas",
"LabelNotificationAppriseURL": "URL(s) de Apprise",
"LabelNotificationAvailableVariables": "Variables disponibles",
- "LabelNotificationBodyTemplate": "Plantilla de Cuerpo",
- "LabelNotificationEvent": "Evento de Notificación",
- "LabelNotificationTitleTemplate": "Plantilla de Titulo",
- "LabelNotificationsMaxFailedAttempts": "Máximo de Intentos Fallidos",
+ "LabelNotificationBodyTemplate": "Plantilla de cuerpo",
+ "LabelNotificationEvent": "Evento de notificación",
+ "LabelNotificationTitleTemplate": "Plantilla de título",
+ "LabelNotificationsMaxFailedAttempts": "Máximo de intentos fallidos",
"LabelNotificationsMaxFailedAttemptsHelp": "Las notificaciones se desactivan después de fallar este número de veces",
"LabelNotificationsMaxQueueSize": "Tamaño máximo de la cola de notificaciones",
"LabelNotificationsMaxQueueSizeHelp": "Las notificaciones están limitadas a 1 por segundo. Las notificaciones serán ignoradas si llegan al numero máximo de cola para prevenir spam de eventos.",
"LabelNumberOfBooks": "Número de libros",
"LabelNumberOfEpisodes": "N.º de episodios",
"LabelOpenIDAdvancedPermsClaimDescription": "Nombre de la notificación de OpenID que contiene permisos avanzados para acciones de usuario dentro de la aplicación que se aplicarán a roles que no sean de administrador (si están configurados). Si el reclamo no aparece en la respuesta, se denegará el acceso a ABS. Si falta una sola opción, se tratará como falsa
. Asegúrese de que la notificación del proveedor de identidades coincida con la estructura esperada:",
- "LabelOpenIDClaims": "Deje las siguientes opciones vacías para deshabilitar la asignación avanzada de grupos y permisos, lo que asignaría de manera automática al grupo 'Usuario'.",
+ "LabelOpenIDClaims": "Deje las siguientes opciones vacías para desactivar la asignación avanzada de grupos y permisos, lo que asignaría de manera automática al grupo «Usuario».",
"LabelOpenIDGroupClaimDescription": "Nombre de la declaración OpenID que contiene una lista de grupos del usuario. Comúnmente conocidos como grupos
. Si se configura, la aplicación asignará automáticamente roles en función de la pertenencia a grupos del usuario, siempre que estos grupos se denominen \"admin\", \"user\" o \"guest\" en la notificación. La solicitud debe contener una lista, y si un usuario pertenece a varios grupos, la aplicación asignará el rol correspondiente al mayor nivel de acceso. Si ningún grupo coincide, se denegará el acceso.",
"LabelOpenRSSFeed": "Abrir suministro RSS",
"LabelOverwrite": "Sobrescribir",
@@ -707,6 +707,7 @@
"MessageAddToPlayerQueue": "Agregar a fila del Reproductor",
"MessageAppriseDescription": "Para usar esta función deberás tener la API de Apprise corriendo o una API que maneje los mismos resultados. http://192.168.1.1:8337
entonces pondría http://192.168.1.1:8337/notify
.",
"MessageAsinCheck": "Cerciórese de usar el ASIN de la región correcta de Audible, no de Amazon.",
+ "MessageAuthenticationOIDCChangesRestart": "Reinicie el servidor tras el guardado para aplicar los cambios de OIDC.",
"MessageBackupsDescription": "Los respaldos incluyen: usuarios, el progreso del los usuarios, los detalles de los elementos de la biblioteca, la configuración del servidor y las imágenes en /metadata/items
y /metadata/authors
. Los Respaldos NO incluyen ningún archivo guardado en la carpeta de tu biblioteca.",
"MessageBackupsLocationEditNote": "Nota: actualizar la ubicación de la copia de respaldo no moverá ni modificará los respaldos existentes",
"MessageBackupsLocationNoEditNote": "Nota: la ubicación de la copia de respaldo se establece a través de una variable de entorno y no se puede cambiar aquí.",
@@ -960,27 +961,28 @@
"ToastBackupUploadFailed": "Error al subir el respaldo",
"ToastBackupUploadSuccess": "Respaldo cargado",
"ToastBatchApplyDetailsToItemsSuccess": "Detalles aplicados a los elementos",
- "ToastBatchDeleteFailed": "Error al eliminar por lotes",
+ "ToastBatchDeleteFailed": "Falló la eliminación por lotes",
"ToastBatchDeleteSuccess": "Borrado por lotes correcto",
"ToastBatchQuickMatchFailed": "¡Error en la sincronización rápida por lotes!",
"ToastBatchQuickMatchStarted": "¡Se inició el lote de búsqueda rápida de {0} libros!",
- "ToastBatchUpdateFailed": "Subida masiva fallida",
- "ToastBatchUpdateSuccess": "Subida masiva exitosa",
- "ToastBookmarkCreateFailed": "Error al crear marcador",
- "ToastBookmarkCreateSuccess": "Marcador Agregado",
+ "ToastBatchUpdateFailed": "Falló la actualización por lotes",
+ "ToastBatchUpdateSuccess": "Se actualizó por lotes correctamente",
+ "ToastBookmarkCreateFailed": "No se pudo crear el marcador",
+ "ToastBookmarkCreateSuccess": "Marcador añadido",
"ToastBookmarkRemoveSuccess": "Marcador eliminado",
- "ToastCachePurgeFailed": "Error al purgar el caché",
- "ToastCachePurgeSuccess": "Caché purgado de manera exitosa",
+ "ToastCachePurgeFailed": "No se pudo purgar la antememoria",
+ "ToastCachePurgeSuccess": "Se purgó la antememoria correctamente",
"ToastChaptersHaveErrors": "Los capítulos tienen errores",
- "ToastChaptersMustHaveTitles": "Los capítulos tienen que tener un título",
+ "ToastChaptersInvalidShiftAmountLast": "Cantidad de desplazamiento no válida. La hora de inicio del último capítulo se extendería más allá de la duración de este audiolibro.",
+ "ToastChaptersMustHaveTitles": "Los capítulos deben tener título",
"ToastChaptersRemoved": "Capítulos eliminados",
"ToastChaptersUpdated": "Capítulos actualizados",
"ToastCollectionItemsAddFailed": "Artículo(s) añadido(s) a la colección fallido(s)",
"ToastCollectionRemoveSuccess": "Colección quitada",
"ToastCollectionUpdateSuccess": "Colección actualizada",
"ToastCoverUpdateFailed": "Error al actualizar la cubierta",
- "ToastDateTimeInvalidOrIncomplete": "Fecha y hora inválidas o incompletas",
- "ToastDeleteFileFailed": "Error el eliminar archivo",
+ "ToastDateTimeInvalidOrIncomplete": "Fecha y hora no válidas o incompletas",
+ "ToastDeleteFileFailed": "Falló la eliminación del archivo",
"ToastDeleteFileSuccess": "Archivo eliminado",
"ToastDeviceAddFailed": "Error al añadir dispositivo",
"ToastDeviceNameAlreadyExists": "Un libro electrónico ya existe con ese nombre",
diff --git a/client/strings/fr.json b/client/strings/fr.json
index 7bbcfad59..c6a28dddd 100644
--- a/client/strings/fr.json
+++ b/client/strings/fr.json
@@ -280,7 +280,7 @@
"LabelCollections": "Collections",
"LabelComplete": "Complet",
"LabelConfirmPassword": "Confirmer le mot de passe",
- "LabelContinueListening": "Continuer la lecture",
+ "LabelContinueListening": "Continuer l'écoute",
"LabelContinueReading": "Continuer la lecture",
"LabelContinueSeries": "Continuer les séries",
"LabelCover": "Couverture",
@@ -303,7 +303,7 @@
"LabelDiscFromFilename": "Depuis le fichier",
"LabelDiscFromMetadata": "Depuis les métadonnées",
"LabelDiscover": "Découvrir",
- "LabelDownload": "Téléchargement",
+ "LabelDownload": "Télécharger",
"LabelDownloadNEpisodes": "Télécharger {0} épisode(s)",
"LabelDownloadable": "Téléchargeable",
"LabelDuration": "Durée",
diff --git a/client/strings/hr.json b/client/strings/hr.json
index 6b867312d..7e4e82c41 100644
--- a/client/strings/hr.json
+++ b/client/strings/hr.json
@@ -177,6 +177,7 @@
"HeaderPlaylist": "Popis za izvođenje",
"HeaderPlaylistItems": "Stavke popisa za izvođenje",
"HeaderPodcastsToAdd": "Podcasti za dodavanje",
+ "HeaderPresets": "Predlošci postavki",
"HeaderPreviewCover": "Pretpregled naslovnice",
"HeaderRSSFeedGeneral": "RSS pojedinosti",
"HeaderRSSFeedIsOpen": "RSS izvor je otvoren",
@@ -530,6 +531,7 @@
"LabelReleaseDate": "Datum izlaska",
"LabelRemoveAllMetadataAbs": "Ukloni sve datoteke metadata.abs",
"LabelRemoveAllMetadataJson": "Ukloni sve datoteke metadata.json",
+ "LabelRemoveAudibleBranding": "Ukloni Audibleove najave i odjave iz poglavlja",
"LabelRemoveCover": "Ukloni naslovnicu",
"LabelRemoveMetadataFile": "Ukloni datoteke s meta-podatcima iz mapa knjižničkih stavki",
"LabelRemoveMetadataFileHelp": "Uklanjanje svih datoteka metadata.json i metadata.abs u vaših {0} mapa.",
@@ -706,6 +708,7 @@
"MessageAddToPlayerQueue": "Dodaj u redoslijed izvođenja",
"MessageAppriseDescription": "Da biste se koristili ovom značajkom, treba vam instanca Apprise API-ja ili API koji može rukovati istom vrstom zahtjeva.http://192.168.1.1:8337
trebate upisati http://192.168.1.1:8337/notify
.",
"MessageAsinCheck": "Upišite ASIN iz odgovarajuće Audibleove regije, ne s Amazonov.",
+ "MessageAuthenticationOIDCChangesRestart": "Ponovno pokrenite poslužitelj da biste primijenili OIDC promjene.",
"MessageBackupsDescription": "Sigurnosne kopije sadrže korisnike, korisnikov napredak medija, pojedinosti knjižničke građe, postavke poslužitelja i slike koje se spremaju u /metadata/items
& /metadata/authors
. Sigurnosne kopije ne sadrže niti jednu datoteku iz mapa knjižnice.",
"MessageBackupsLocationEditNote": "Napomena: Uređivanje lokacije za sigurnosne kopije ne premješta ili mijenja postojeće sigurnosne kopije",
"MessageBackupsLocationNoEditNote": "Napomena: Lokacija za sigurnosne kopije zadana je kroz varijablu okoline i ovdje se ne može izmijeniti.",
@@ -971,6 +974,8 @@
"ToastCachePurgeFailed": "Čišćenje predmemorije nije uspjelo",
"ToastCachePurgeSuccess": "Predmemorija uspješno očišćena",
"ToastChaptersHaveErrors": "Poglavlja imaju pogreške",
+ "ToastChaptersInvalidShiftAmountLast": "Neispravna vrijednost pomaka. Početak zadnjeg poglavlja bio bi nakon duljine trajanja ove zvučne knjige.",
+ "ToastChaptersInvalidShiftAmountStart": "Neispravna vrijednost pomaka. Trajanje prvog poglavlja bilo bi nula ili negativno i drugo poglavlje bi ga prepisalo. Povećajte vrijeme početka drugog poglavlja.",
"ToastChaptersMustHaveTitles": "Poglavlja moraju imati naslove",
"ToastChaptersRemoved": "Poglavlja uklonjena",
"ToastChaptersUpdated": "Poglavlja su ažurirana",
diff --git a/client/strings/it.json b/client/strings/it.json
index da73d66fa..ae2facd12 100644
--- a/client/strings/it.json
+++ b/client/strings/it.json
@@ -13,7 +13,7 @@
"ButtonBatchEditPopulateFromExisting": "Popola da esistente",
"ButtonBatchEditPopulateMapDetails": "Inserisci i dettagli della mappa",
"ButtonBrowseForFolder": "Per Cartella",
- "ButtonCancel": "Cancella",
+ "ButtonCancel": "Annulla",
"ButtonCancelEncode": "Ferma la codifica",
"ButtonChangeRootPassword": "Cambia la Password di root",
"ButtonCheckAndDownloadNewEpisodes": "Controlla & scarica i nuovi episodi",
@@ -281,8 +281,8 @@
"LabelCollections": "Raccolte",
"LabelComplete": "Completo",
"LabelConfirmPassword": "Conferma Password",
- "LabelContinueListening": "Continua ad Ascoltare",
- "LabelContinueReading": "Continua la Lettura",
+ "LabelContinueListening": "Continua l'ascolto",
+ "LabelContinueReading": "Continua la lettura",
"LabelContinueSeries": "Continua serie",
"LabelCover": "Copertina",
"LabelCoverImageURL": "Indirizzo della cover URL",
diff --git a/client/strings/ru.json b/client/strings/ru.json
index ccfc15f07..1af0c642a 100644
--- a/client/strings/ru.json
+++ b/client/strings/ru.json
@@ -177,6 +177,7 @@
"HeaderPlaylist": "Плейлист",
"HeaderPlaylistItems": "Элементы списка воспроизведения",
"HeaderPodcastsToAdd": "Подкасты для добавления",
+ "HeaderPresets": "Пресеты",
"HeaderPreviewCover": "Предпросмотр обложки",
"HeaderRSSFeedGeneral": "Сведения о RSS",
"HeaderRSSFeedIsOpen": "RSS-канал открыт",
@@ -219,7 +220,7 @@
"LabelAccountTypeAdmin": "Администратор",
"LabelAccountTypeGuest": "Гость",
"LabelAccountTypeUser": "Пользователь",
- "LabelActivities": "Мероприятия",
+ "LabelActivities": "События",
"LabelActivity": "Активность",
"LabelAddToCollection": "Добавить в коллекцию",
"LabelAddToCollectionBatch": "Добавить {0} книг в коллекцию",
@@ -530,6 +531,7 @@
"LabelReleaseDate": "Дата выхода",
"LabelRemoveAllMetadataAbs": "Удалите все файлы metadata.abs",
"LabelRemoveAllMetadataJson": "Удалите все файлы metadata.json",
+ "LabelRemoveAudibleBranding": "Удалить вступление и концовку Audible из глав",
"LabelRemoveCover": "Удалить обложку",
"LabelRemoveMetadataFile": "Удаление файлов метаданных в папках элементов библиотеки",
"LabelRemoveMetadataFileHelp": "Удалите все файлы metadata.json и metadata.abs из ваших папок {0}.",
@@ -706,6 +708,7 @@
"MessageAddToPlayerQueue": "Добавить в очередь проигрывателя",
"MessageAppriseDescription": "Для использования этой функции необходимо иметь запущенный экземпляр Apprise API или api которое обрабатывает те же самые запросы. http://192.168.1.1:8337
тогда нужно указать http://192.168.1.1:8337/notify
.",
"MessageAsinCheck": "Убедитесь, что вы используете ASIN из правильной региональной зоны Audible, а не из Amazon.",
+ "MessageAuthenticationOIDCChangesRestart": "Перезапустите ваш сервер после сохранения для применения изменений в OIDC.",
"MessageBackupsDescription": "Бэкап включает пользователей, прогресс пользователей, данные элементов библиотеки, настройки сервера и изображения хранящиеся в /metadata/items
и /metadata/authors
. Бэкапы НЕ сохраняют файлы из папок библиотек.",
"MessageBackupsLocationEditNote": "Примечание: Обновление местоположения резервной копии не приведет к перемещению или изменению существующих резервных копий",
"MessageBackupsLocationNoEditNote": "Примечание: Местоположение резервного копирования задается с помощью переменной среды и не может быть изменено здесь.",
@@ -971,6 +974,8 @@
"ToastCachePurgeFailed": "Не удалось очистить кэш",
"ToastCachePurgeSuccess": "Кэш успешно очищен",
"ToastChaptersHaveErrors": "Главы имеют ошибки",
+ "ToastChaptersInvalidShiftAmountLast": "Некорректное значение сдвига. Начало последней главы будет превышать продолжительность этой аудиокниги.",
+ "ToastChaptersInvalidShiftAmountStart": "Некорректное значение сдвига. Первая глава будет иметь нулевую или отрицательную длину и будет перезаписана второй главой. Увеличьте начальную продолжительность второй главы.",
"ToastChaptersMustHaveTitles": "Главы должны содержать названия",
"ToastChaptersRemoved": "Удалены главы",
"ToastChaptersUpdated": "Обновленные главы",
diff --git a/client/strings/sk.json b/client/strings/sk.json
index 0cca39736..714ad88a1 100644
--- a/client/strings/sk.json
+++ b/client/strings/sk.json
@@ -470,7 +470,7 @@
"LabelNotificationsMaxQueueSize": "Maximálna dĺžka fronty oznámení",
"LabelNotificationsMaxQueueSizeHelp": "Odosielanie udalostí je ohraničené na jedno oznámenie za sekundu. Novovzniknuté udalosti budú ignorované, ak bude fronta oznámení naplnená. Toto nastavenie zabraňuje nevyžiadanému zahlteniu oznámeniami.",
"LabelNumberOfBooks": "Počet kníh",
- "LabelNumberOfEpisodes": "# epizód",
+ "LabelNumberOfEpisodes": "# z epizód",
"LabelOpenIDAdvancedPermsClaimDescription": "Názov OpenID predpokladá prítomnosť pokročilých povolení pre užívateľské akcie v rámci aplikácie, ktoré sú aplikovateľné na ne-administrátorské role (ak sú nakonfigurované). Ak potvrdenie takýchto pokročilých povolení nie je v odozve prítomné, prístup do ABS bude automaticky zamietnutý. Ak v odozve chýba len niektoré z očakávaných nastavení, tak bude jeho hodnota automaticky nastavená na false
. Uistite sa prosím, že forma odozvy poskytovateľa identity má nasledovnú štruktúru:",
"LabelOpenIDClaims": "Ak ponecháte nasledujúce nastavenia prázdne, pokročilé nastavenia skupín a povolení nebudú aktivované a automaticky bude nastavená skupina 'Užívateľ'.",
"LabelOpenIDGroupClaimDescription": "Pri názve požiadavky OpenID sa predpokladá, že obsahuje zoznam užívateľských skupín. Bežne označovaný ako groups
. Ak je správne nakonfigurovaný, aplikácia automaticky pridelí role podľa príslušnosti k užívateľským skupinám pod podmienkou, že sú tieto skupiny v požiadavke nazvané (bez ohľadu na veľkosť písmen) ako 'admin', 'user' alebo 'guest'. Požiadavka musí obsahovať zoznam skupín a ak užívateľ patrí do viacerých skupín, aplikácia mu priradí rolu, ktorá zodpovedá skupine s najvyššími prístupovými právami. Ak sa žiadna z poskytnutých skupín nezhoduje, prístup bude zamietnutý.",
@@ -500,12 +500,12 @@
"LabelPodcasts": "Podcasty",
"LabelPort": "Prístav",
"LabelPrefixesToIgnore": "Ignorované predpony (bez ohľadu na veľkosť písmen)",
- "LabelPreventIndexing": "Zabráňte indexovaniu Vášho zdroja službami iTunes a Google podcasts directories",
+ "LabelPreventIndexing": "Zabráni indexácii vašich zdrojov službami iTunes a Google podcast directories",
"LabelPrimaryEbook": "Primárny e-book",
- "LabelProgress": "Pokrok",
+ "LabelProgress": "Stav",
"LabelProvider": "Poskytovateľ",
"LabelProviderAuthorizationValue": "Obsah hlavičky autorizácie",
- "LabelPubDate": "Dátum vydania",
+ "LabelPubDate": "Dátum publikovania",
"LabelPublishYear": "Rok vydania",
"LabelPublishedDate": "Vydané {0}",
"LabelPublishedDecade": "Dekáda vydania",
@@ -520,7 +520,7 @@
"LabelRSSFeedURL": "URL RSS zdroja",
"LabelRandomly": "Náhodne",
"LabelReAddSeriesToContinueListening": "Znova pridať série do pokračujúceho počúvania",
- "LabelRead": "Čítať",
+ "LabelRead": "Načítať",
"LabelReadAgain": "Čítať znova",
"LabelReadEbookWithoutProgress": "Čítať e-knihu bez sledovania pokroku",
"LabelRecentSeries": "Posledné série",
@@ -547,7 +547,7 @@
"LabelSendEbookToDevice": "Poslať e-knihu do...",
"LabelSequence": "Postupnosť",
"LabelSerial": "Na pokračovanie",
- "LabelSeries": "Séria",
+ "LabelSeries": "Série",
"LabelSeriesName": "Názov série",
"LabelSeriesProgress": "Pokrok série",
"LabelServerLogLevel": "Úroveň logovania servera",
@@ -606,7 +606,7 @@
"LabelSortAscending": "Vzostupne",
"LabelSortDescending": "Zostupne",
"LabelSortPubDate": "Zoradiť podľa dátumu vydania",
- "LabelStart": "Začiatok",
+ "LabelStart": "Spustiť",
"LabelStartTime": "Čas spustenia",
"LabelStarted": "Začaté",
"LabelStartedAt": "Začaté v",
@@ -614,7 +614,7 @@
"LabelStatsAuthors": "Autori",
"LabelStatsBestDay": "Najlepší deň",
"LabelStatsDailyAverage": "Denný priemer",
- "LabelStatsDays": "Dni",
+ "LabelStatsDays": "Dní",
"LabelStatsDaysListened": "Dní počúvania",
"LabelStatsHours": "Hodiny",
"LabelStatsInARow": "v rade",
@@ -647,7 +647,7 @@
"LabelTimeLeft": "{0} ponechaných",
"LabelTimeListened": "Čas počúvania",
"LabelTimeListenedToday": "Dnešný čas počúvania",
- "LabelTimeRemaining": "{0} zostávajúcich",
+ "LabelTimeRemaining": "Zostáva {0}",
"LabelTimeToShift": "Čas posunutia v sekundách",
"LabelTitle": "Názov",
"LabelToolsEmbedMetadata": "Vlož metadáta",
@@ -684,7 +684,7 @@
"LabelUseChapterTrack": "Použiť stopu kapitoly",
"LabelUseFullTrack": "Použiť celú stopu",
"LabelUseZeroForUnlimited": "Použito 0 pre neobmedzené",
- "LabelUser": "Užívateľ",
+ "LabelUser": "Používateľ",
"LabelUsername": "Prihlasovacie meno",
"LabelValue": "Hodnota",
"LabelVersion": "Verzia",
@@ -703,7 +703,7 @@
"LabelYourAudiobookDuration": "Dĺžka Vašej audioknihy",
"LabelYourBookmarks": "Vaše záložky",
"LabelYourPlaylists": "Vaše playlisty",
- "LabelYourProgress": "Váš pokrok",
+ "LabelYourProgress": "Váš aktuálny stav",
"MessageAddToPlayerQueue": "Pridať do zoznamu prehrávania",
"MessageAppriseDescription": "Aby ste mohli používať túto funkciumusíte mať k dispozícii inštanciu Apprise API alebo inú, ktorá dokáže spracovávať rovnaké požiadavky/requesty.http://192.168.1.1:8337
, vložte do daného poľa http://192.168.1.1:8337/notify
.",
"MessageAsinCheck": "Uistite sa, že používate ASIN zo správneho regiónu Audible, nie Amazonu.",
@@ -775,10 +775,10 @@
"MessageEmbedFailed": "Vloženie zlyhalo!",
"MessageEmbedFinished": "Vloženie skončené!",
"MessageEmbedQueue": "Zaradené do fronty na vloženie metadát ({0} v zozname)",
- "MessageEpisodesQueuedForDownload": "{0} epizód(-a) v zozname na sťahovanie",
+ "MessageEpisodesQueuedForDownload": "{0} epizód(a) v zozname na sťahovanie",
"MessageEreaderDevices": "Na zaistenie dodania e-kníh môže byť nutné zadanie vyššie uvedenej e-mailovej adresy ako overeného odosielateľa v každom z nižšie vypísaných zariadení.",
"MessageFeedURLWillBe": "URL zdroja bude {0}",
- "MessageFetching": "Prebieha načítanie...",
+ "MessageFetching": "Získavam...",
"MessageForceReScanDescription": "preskenuje všetky súbory ako pri prvom skenovaní. ID3 štítky zvukových súborov, OPF súbory a textové súbory budú nanovo naskenované.",
"MessageImportantNotice": "Dôležité upozornenie!",
"MessageInsertChapterBelow": "Vložte kapitolu nižšie",
diff --git a/client/strings/sl.json b/client/strings/sl.json
index 8e0d23acc..2794e0805 100644
--- a/client/strings/sl.json
+++ b/client/strings/sl.json
@@ -531,6 +531,7 @@
"LabelReleaseDate": "Datum izdaje",
"LabelRemoveAllMetadataAbs": "Odstrani vse datoteke metadata.abs",
"LabelRemoveAllMetadataJson": "Odstrani vse datoteke metadata.json",
+ "LabelRemoveAudibleBranding": "Odstrani Audible uvod in zaključek iz poglavij",
"LabelRemoveCover": "Odstrani naslovnico",
"LabelRemoveMetadataFile": "Odstrani datoteke z metapodatki v mapah elementov knjižnice",
"LabelRemoveMetadataFileHelp": "Odstrani vse datoteke metadata.json in metadata.abs v svojih mapah {0}.",
@@ -707,6 +708,7 @@
"MessageAddToPlayerQueue": "Dodaj v čakalno vrsto predvajalnika",
"MessageAppriseDescription": "Če želite uporabljati to funkcijo, morate imeti zagnano namestitev API Apprise ali API, ki bo obravnavala te iste zahteve. http://192.168.1.1:8337
, bi morali vnesti http://192.168.1.1:8337/notify
.",
"MessageAsinCheck": "Prepričajte se, da uporabljate ASIN iz pravilne zvočne regije, ne iz Amazona.",
+ "MessageAuthenticationOIDCChangesRestart": "Za uveljavitev OIDC sprememb, po shranjevanju znova zaženite strežnik.",
"MessageBackupsDescription": "Varnostne kopije vključujejo uporabnike, napredek uporabnikov, podrobnosti elementov knjižnice, nastavitve strežnika in slike, shranjene v /metadata/items
& /metadata/authors
. Varnostne kopije ne vključujejo datotek, shranjenih v mapah vaše knjižnice.",
"MessageBackupsLocationEditNote": "Opomba: Posodabljanje lokacije varnostne kopije ne bo premaknilo ali spremenilo obstoječih varnostnih kopij",
"MessageBackupsLocationNoEditNote": "Opomba: Lokacija varnostne kopije je nastavljena s spremenljivko okolja in je tu ni mogoče spremeniti.",
@@ -972,6 +974,8 @@
"ToastCachePurgeFailed": "Čiščenje predpomnilnika ni uspelo",
"ToastCachePurgeSuccess": "Predpomnilnik je bil uspešno očiščen",
"ToastChaptersHaveErrors": "Poglavja imajo napake",
+ "ToastChaptersInvalidShiftAmountLast": "Neveljavna vrednost zamika. Začetni čas zadnjega poglavja bi presegel trajanje te zvočne knjige.",
+ "ToastChaptersInvalidShiftAmountStart": "Neveljavna vrednost zamika. Prvo poglavje bi imelo ničelno ali negativno dolžino in bi ga prepisalo drugo poglavje. Povečajte začetno trajanje drugega poglavja.",
"ToastChaptersMustHaveTitles": "Poglavja morajo imeti naslove",
"ToastChaptersRemoved": "Poglavja so odstranjena",
"ToastChaptersUpdated": "Poglavja so posodobljena",
diff --git a/client/strings/uk.json b/client/strings/uk.json
index 4a906b78a..5b652049e 100644
--- a/client/strings/uk.json
+++ b/client/strings/uk.json
@@ -708,6 +708,7 @@
"MessageAddToPlayerQueue": "Додати до черги відтворення",
"MessageAppriseDescription": "Щоб скористатися цією функцією, вам потрібно мати запущену Apprise API або API, що оброблятиме ті ж запити. http://192.168.1.1:8337
, то необхідно вказати адресу http://192.168.1.1:8337/notify
.",
"MessageAsinCheck": "Переконайтесь, що ви використовуєте ASIN з правильної регіональної Audible зони, а не з Amazon.",
+ "MessageAuthenticationOIDCChangesRestart": "Перезавантажте сервер після збереження, щоб застосувати зміни OIDC.",
"MessageBackupsDescription": "Резервні копії містять користувачів, прогрес, подробиці елементів бібліотеки, налаштування сервера та зображення з /metadata/items
та /metadata/authors
. Резервні копії не містять жодних файлів з тек бібліотеки.",
"MessageBackupsLocationEditNote": "Примітка: оновлення розташування резервної копії не переносить та не змінює існуючих копій",
"MessageBackupsLocationNoEditNote": "Примітка: розташування резервної копії встановлюється за допомогою змінної середовища та не може бути змінене тут.",
@@ -817,7 +818,7 @@
"MessageNoItems": "Елементи відсутні",
"MessageNoItemsFound": "Елементів не знайдено",
"MessageNoListeningSessions": "Сеанси прослуховування відсутні",
- "MessageNoLogs": "Немає журнал",
+ "MessageNoLogs": "Немає журнали",
"MessageNoMediaProgress": "Прогрес відсутній",
"MessageNoNotifications": "Сповіщення відсутні",
"MessageNoPodcastFeed": "Невірний подкаст: Немає каналу",
diff --git a/package-lock.json b/package-lock.json
index 63c8fbc7a..91a5f2835 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "audiobookshelf",
- "version": "2.22.0",
+ "version": "2.23.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "audiobookshelf",
- "version": "2.22.0",
+ "version": "2.23.0",
"license": "GPL-3.0",
"dependencies": {
"axios": "^0.27.2",
diff --git a/package.json b/package.json
index c68aa981d..9b08daee8 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "audiobookshelf",
- "version": "2.22.0",
+ "version": "2.23.0",
"buildNumber": 1,
"description": "Self-hosted audiobook and podcast server",
"main": "index.js",
diff --git a/server/Server.js b/server/Server.js
index 0e53d3e9d..ef6ecb8ac 100644
--- a/server/Server.js
+++ b/server/Server.js
@@ -395,10 +395,19 @@ class Server {
})
router.get('/healthcheck', (req, res) => res.sendStatus(200))
- this.server.listen(this.Port, this.Host, () => {
- if (this.Host) Logger.info(`Listening on http://${this.Host}:${this.Port}`)
- else Logger.info(`Listening on port :${this.Port}`)
- })
+ const unixSocketPrefix = 'unix/'
+ if (this.Host?.startsWith(unixSocketPrefix)) {
+ const sockPath = this.Host.slice(unixSocketPrefix.length)
+ this.server.listen(sockPath, async () => {
+ await fs.chmod(sockPath, 0o666)
+ Logger.info(`Listening on unix socket ${sockPath}`)
+ })
+ } else {
+ this.server.listen(this.Port, this.Host, () => {
+ if (this.Host) Logger.info(`Listening on http://${this.Host}:${this.Port}`)
+ else Logger.info(`Listening on port :${this.Port}`)
+ })
+ }
// Start listening for socket connections
SocketAuthority.initialize(this)