mirror of
https://github.com/advplyr/audiobookshelf.git
synced 2025-12-26 05:39:38 +00:00
Merge branch 'advplyr:master' into feat/metadata-id-matching
This commit is contained in:
commit
9934537173
26 changed files with 1278 additions and 64 deletions
4
client/package-lock.json
generated
4
client/package-lock.json
generated
|
|
@ -1,12 +1,12 @@
|
|||
{
|
||||
"name": "audiobookshelf-client",
|
||||
"version": "2.30.0",
|
||||
"version": "2.31.0",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "audiobookshelf-client",
|
||||
"version": "2.30.0",
|
||||
"version": "2.31.0",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"@nuxtjs/axios": "^5.13.6",
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "audiobookshelf-client",
|
||||
"version": "2.30.0",
|
||||
"version": "2.31.0",
|
||||
"buildNumber": 1,
|
||||
"description": "Self-hosted audiobook and podcast client",
|
||||
"main": "index.js",
|
||||
|
|
|
|||
|
|
@ -22,6 +22,7 @@ const languageCodeMap = {
|
|||
it: { label: 'Italiano', dateFnsLocale: 'it' },
|
||||
lt: { label: 'Lietuvių', dateFnsLocale: 'lt' },
|
||||
hu: { label: 'Magyar', dateFnsLocale: 'hu' },
|
||||
ko: { label: '한국어', dateFnsLocale: 'ko' },
|
||||
nl: { label: 'Nederlands', dateFnsLocale: 'nl' },
|
||||
no: { label: 'Norsk', dateFnsLocale: 'no' },
|
||||
pl: { label: 'Polski', dateFnsLocale: 'pl' },
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
{
|
||||
"ButtonAdd": "Afegeix",
|
||||
"ButtonAddApiKey": "Afegeix clau API",
|
||||
"ButtonAddChapters": "Afegeix capítols",
|
||||
"ButtonAddDevice": "Afegeix un aparell",
|
||||
"ButtonAddLibrary": "Afegeix una biblioteca",
|
||||
|
|
@ -20,6 +21,7 @@
|
|||
"ButtonChooseAFolder": "Trieu una carpeta",
|
||||
"ButtonChooseFiles": "Trieu fitxers",
|
||||
"ButtonClearFilter": "Neteja el filtre",
|
||||
"ButtonClose": "Tanca",
|
||||
"ButtonCloseFeed": "Tanca el canal",
|
||||
"ButtonCloseSession": "Tanca la sessió oberta",
|
||||
"ButtonCollections": "Col·leccions",
|
||||
|
|
@ -119,11 +121,13 @@
|
|||
"HeaderAccount": "Compte",
|
||||
"HeaderAddCustomMetadataProvider": "Afegeix un proveïdor de metadades personalitzat",
|
||||
"HeaderAdvanced": "Avançat",
|
||||
"HeaderApiKeys": "Claus API",
|
||||
"HeaderAppriseNotificationSettings": "Paràmetres de notificacions Apprise",
|
||||
"HeaderAudioTracks": "Pistes d'àudio",
|
||||
"HeaderAudiobookTools": "Eines de gestió de fitxers de l'audiollibre",
|
||||
"HeaderAuthentication": "Autenticació",
|
||||
"HeaderBackups": "Còpies de Seguretat",
|
||||
"HeaderBulkChapterModal": "Afegeix capítols múltiples",
|
||||
"HeaderChangePassword": "Canvia Contrasenya",
|
||||
"HeaderChapters": "Capítols",
|
||||
"HeaderChooseAFolder": "Tria una Carpeta",
|
||||
|
|
|
|||
|
|
@ -392,7 +392,7 @@
|
|||
"LabelGenre": "Žánr",
|
||||
"LabelGenres": "Žánry",
|
||||
"LabelHardDeleteFile": "Trvale smazat soubor",
|
||||
"LabelHasEbook": "Obsahuje elektronickou knihu",
|
||||
"LabelHasEbook": "Má e-knihu",
|
||||
"LabelHasSupplementaryEbook": "Obsahuje doplňkovou e-knihu",
|
||||
"LabelHideSubtitles": "Skrýt titulky",
|
||||
"LabelHighestPriority": "Nejvyšší priorita",
|
||||
|
|
@ -589,7 +589,7 @@
|
|||
"LabelSettingsChromecastSupport": "Podpora Chromecastu",
|
||||
"LabelSettingsDateFormat": "Formát data",
|
||||
"LabelSettingsEnableWatcher": "Automaticky skenovat změny v knihovnách",
|
||||
"LabelSettingsEnableWatcherForLibrary": "Automaticky skenovat změny v knihovně",
|
||||
"LabelSettingsEnableWatcherForLibrary": "Automaticky sledovat změny v knihovně",
|
||||
"LabelSettingsEnableWatcherHelp": "Povoluje automatické přidávání/aktualizaci položek, když jsou zjištěny změny souborů. *Vyžaduje restart serveru",
|
||||
"LabelSettingsEpubsAllowScriptedContent": "Povolení skriptovaného obsahu v epubu",
|
||||
"LabelSettingsEpubsAllowScriptedContentHelp": "Povolení spouštění skriptů v souborech epub. Doporučujeme toto nastavení vypnout, pokud nedůvěřujete zdroji souborů epub.",
|
||||
|
|
@ -1026,6 +1026,8 @@
|
|||
"ToastCollectionItemsAddFailed": "Přidávání položek do kolekce selhalo",
|
||||
"ToastCollectionRemoveSuccess": "Kolekce odstraněna",
|
||||
"ToastCollectionUpdateSuccess": "Kolekce aktualizována",
|
||||
"ToastConnectionNotAvailable": "Připojení není k dispozici. Zkuste to prosím znovu později",
|
||||
"ToastCoverSearchFailed": "Hledání obálky se nezdařilo",
|
||||
"ToastCoverUpdateFailed": "Aktualizace obálky selhala",
|
||||
"ToastDateTimeInvalidOrIncomplete": "Datum a čas jsou chybné nebo nekompletní",
|
||||
"ToastDeleteFileFailed": "Nepodařilo se smazat soubor",
|
||||
|
|
|
|||
|
|
@ -588,7 +588,7 @@
|
|||
"LabelSettingsBookshelfViewHelp": "Skeumorphes Design mit Holzeinlegeböden",
|
||||
"LabelSettingsChromecastSupport": "Chromecastunterstützung",
|
||||
"LabelSettingsDateFormat": "Datumsformat",
|
||||
"LabelSettingsEnableWatcher": "Bibliotheken automatisch nach Änderungen durchsuchen",
|
||||
"LabelSettingsEnableWatcher": "Bibliotheken automatisch nach Änderungen überwachen",
|
||||
"LabelSettingsEnableWatcherForLibrary": "Bibliothek automatisch auf Änderungen überwachen",
|
||||
"LabelSettingsEnableWatcherHelp": "Aktiviert das automatische Hinzufügen/Aktualisieren von Elementen, wenn Dateiänderungen erkannt werden. *Erfordert einen Server-Neustart",
|
||||
"LabelSettingsEpubsAllowScriptedContent": "Skriptinhalte in Epubs zulassen",
|
||||
|
|
|
|||
|
|
@ -383,7 +383,7 @@
|
|||
"LabelFolders": "Kansiot",
|
||||
"LabelFontBold": "Lihavoitu",
|
||||
"LabelFontBoldness": "Kirjasintyyppien lihavointi",
|
||||
"LabelFontFamily": "Kirjasinperhe",
|
||||
"LabelFontFamily": "Fonttiperhe",
|
||||
"LabelFontItalic": "Kursiivi",
|
||||
"LabelFontScale": "Kirjasintyyppien skaalautuminen",
|
||||
"LabelFontStrikethrough": "Yliviivattu",
|
||||
|
|
@ -588,8 +588,8 @@
|
|||
"LabelSettingsBookshelfViewHelp": "Skeuomorfinen muotoilu puisilla hyllyillä",
|
||||
"LabelSettingsChromecastSupport": "Chromecast-tuki",
|
||||
"LabelSettingsDateFormat": "Päivämäärän muoto",
|
||||
"LabelSettingsEnableWatcher": "Skannaa kirjastot automaattisesti muutoksien varalta",
|
||||
"LabelSettingsEnableWatcherForLibrary": "Skannaa kirjastot automaattisesti muutoksien varalta",
|
||||
"LabelSettingsEnableWatcher": "Vahdi kirjastoja automaattisesti muutoksien varalta",
|
||||
"LabelSettingsEnableWatcherForLibrary": "Vahdi kirjastoja automaattisesti muutoksien varalta",
|
||||
"LabelSettingsEnableWatcherHelp": "Ottaa käyttöön kohteiden automaattisen lisäämisen ja päivityksen kun tiedostomuutoksia havaitaan. *Tarvitsee palvelimen uudelleenkäynnistyksen",
|
||||
"LabelSettingsEpubsAllowScriptedContent": "Salli komentosarjamuotoinen sisältö epubissa",
|
||||
"LabelSettingsEpubsAllowScriptedContentHelp": "Salli epub-tiedostojen suorittaa komentosarjoja. On suositeltavaa pitää tämä asetus pois käytöstä, ellet luota epub-tiedostojen lähteeseen.",
|
||||
|
|
@ -738,6 +738,8 @@
|
|||
"MessageAppriseDescription": "Käyttääksesi tätä toimintoa tarvitset <a href=\"https://github.com/caronc/apprise-api\" target=\"_blank\">Apprise API</a> -instanssin tai rajapinnan joka käsittelee samoja pyyntöjä. <br />Apprise rajapinnan osoite tulee olla täysi URL polku ilmoituksen lähetykseen, esim. jos rajapinta on osoitteessa <code>http://192.168.1.1:8337</code>,niin arvoksi tulee antaa <code>http://192.168.1.1:8337/notify</code>.",
|
||||
"MessageAsinCheck": "Varmista, että käytät ASIN-tunnusta oikealta Audible-alueelta, ei Amazonista.",
|
||||
"MessageAuthenticationLegacyTokenWarning": "Vanhat API-tunnukset poistetaan tulevaisuudessa. Käytä sen sijaan <a href=\"/config/api-keys\">API-avaimia</a>.",
|
||||
"MessageAuthenticationOIDCChangesRestart": "Käynnistä palvelin uudelleen tallennuksen jälkeen ottaaksesi OIDC-muutokset käyttöön.",
|
||||
"MessageAuthenticationSecurityMessage": "Tunnistautumisen tietoturvaa on parannettu. Kaikkien käyttäjien tulee kirjautua sisään uudelleen.",
|
||||
"MessageBackupsDescription": "Varmuuskopiot sisältävät käyttäjät, käyttäjien edistymisen, kirjastokohteiden tiedot, palvelinasetukset ja <code>/metadata/items</code>- ja <code>/metadata/authors</code> -kansioihin tallennetut kuvat. Varmuuskopiot <strong>eivät sisällä</strong> kirjastosi kansioihin tallennettuja tiedostoja.",
|
||||
"MessageBackupsLocationEditNote": "Huomautus: Varmuuskopion sijainnin päivittäminen ei siirrä tai muokkaa olemassa olevia varmuuskopioita",
|
||||
"MessageBackupsLocationNoEditNote": "Huomautus: Varmuuskopion sijainti asetetaan ympäristömuuttujan kautta, eikä sitä voi muuttaa tässä.",
|
||||
|
|
@ -751,6 +753,7 @@
|
|||
"MessageBookshelfNoResultsForFilter": "Ei tuloksia suodattimelle \"{0}: {1}\"",
|
||||
"MessageBookshelfNoResultsForQuery": "Ei tuloksia kyselylle",
|
||||
"MessageBookshelfNoSeries": "Sinulla ei ole sarjoja",
|
||||
"MessageBulkChapterPattern": "Kuinka monta lukua haluaisit lisätä tällä numerointimallilla?",
|
||||
"MessageChapterEndIsAfter": "Luvun loppu sijaitsee äänikirjan lopun jälkeen",
|
||||
"MessageChapterErrorFirstNotZero": "Ensimmäisen luvun tulee alkaa nollasta",
|
||||
"MessageChapterErrorStartGteDuration": "Epäkelvollinen aloitusaika; on oltava lyhyempi kuin äänikirjan kesto",
|
||||
|
|
@ -759,6 +762,7 @@
|
|||
"MessageChaptersNotFound": "Kappaleita ei löydy",
|
||||
"MessageCheckingCron": "Tarkistetaan cronia...",
|
||||
"MessageConfirmCloseFeed": "Oletko varma, että haluat sulkea tämän syötteen?",
|
||||
"MessageConfirmDeleteApiKey": "Haluatko varmasti poistaa API-avaimen \"{0}\"?",
|
||||
"MessageConfirmDeleteBackup": "Oletko varma, että haluat poistaa varmuuskopion {0}:lle?",
|
||||
"MessageConfirmDeleteDevice": "Oletko varma, että haluat poistaa s-lukulaitteen \"{0}\"?",
|
||||
"MessageConfirmDeleteFile": "Tämä poistaa tiedoston tiedostojärjestelmästäsi. Oletko varma?",
|
||||
|
|
|
|||
|
|
@ -383,9 +383,9 @@
|
|||
"LabelFolders": "Dossiers",
|
||||
"LabelFontBold": "Gras",
|
||||
"LabelFontBoldness": "Graisse de la police",
|
||||
"LabelFontFamily": "Polices de caractères",
|
||||
"LabelFontFamily": "Famille de caractères",
|
||||
"LabelFontItalic": "Italique",
|
||||
"LabelFontScale": "Taille de la police de caractère",
|
||||
"LabelFontScale": "Taille de la police",
|
||||
"LabelFontStrikethrough": "Barrer",
|
||||
"LabelFormat": "Format",
|
||||
"LabelFull": "Complet",
|
||||
|
|
|
|||
|
|
@ -383,7 +383,7 @@
|
|||
"LabelFolders": "Mappák",
|
||||
"LabelFontBold": "Félkövér",
|
||||
"LabelFontBoldness": "Betű vastagság",
|
||||
"LabelFontFamily": "Betűtípus család",
|
||||
"LabelFontFamily": "Betűcsalád",
|
||||
"LabelFontItalic": "Dőlt",
|
||||
"LabelFontScale": "Betűméret skála",
|
||||
"LabelFontStrikethrough": "Áthúzott",
|
||||
|
|
@ -588,8 +588,8 @@
|
|||
"LabelSettingsBookshelfViewHelp": "Skeuomorfikus dizájn fa polcokkal",
|
||||
"LabelSettingsChromecastSupport": "Chromecast támogatás",
|
||||
"LabelSettingsDateFormat": "Dátumformátum",
|
||||
"LabelSettingsEnableWatcher": "Változások automatikus vizsgálata a könyvtárakban",
|
||||
"LabelSettingsEnableWatcherForLibrary": "Változások automatikus vizsgálata a könyvtárban",
|
||||
"LabelSettingsEnableWatcher": "Változások automatikus figyelése a könyvtárakban",
|
||||
"LabelSettingsEnableWatcherForLibrary": "Változások automatikus figyelése a könyvtárban",
|
||||
"LabelSettingsEnableWatcherHelp": "Engedélyezi az automatikus elem hozzáadás/frissítés funkciót, amikor fájlváltozásokat észlel. *Szerver újraindítása szükséges",
|
||||
"LabelSettingsEpubsAllowScriptedContent": "Szkriptelt tartalmak engedélyezése epub-okban",
|
||||
"LabelSettingsEpubsAllowScriptedContentHelp": "Megengedi, hogy az epub fájlok szkripteket hajtsanak végre. Ezt a beállítást kikapcsolva ajánlott tartani, kivéve, ha megbízik az epub fájlok forrásában.",
|
||||
|
|
@ -888,7 +888,7 @@
|
|||
"MessageResetChaptersConfirm": "Biztosan alaphelyzetbe szeretné állítani a fejezeteket és visszavonni a módosításokat?",
|
||||
"MessageRestoreBackupConfirm": "Biztosan vissza szeretné állítani a biztonsági másolatot, amely ekkor készült:",
|
||||
"MessageRestoreBackupWarning": "A biztonsági mentés visszaállítása felülírja az egész adatbázist, amely a /config mappában található, valamint a borítóképeket a /metadata/items és /metadata/authors mappákban.<br /><br />A biztonsági mentések nem módosítják a könyvtár mappáiban található fájlokat. Ha engedélyezte a szerverbeállításokat a borítóképek és a metaadatok könyvtármappákban való tárolására, akkor ezek nem kerülnek biztonsági mentésre vagy felülírásra.<br /><br />A szerver használó összes kliens automatikusan frissül.",
|
||||
"MessageScheduleLibraryScanNote": "A legtöbb felhasználó számára ajánlott ezt a funkciót kikapcsolva hagyni, és engedélyezni a mappafigyelő beállítást. A mappafigyelő automatikusan észleli a könyvtári mappák változásait. A mappafigyelő nem működik minden fájlrendszernél (mint például az NFS), ezért helyette ütemezett könyvtárellenőrzéseket lehet használni.",
|
||||
"MessageScheduleLibraryScanNote": "A legtöbb felhasználó számára ajánlott ezt a funkciót kikapcsolva hagyni, és engedélyezni a mappafigyelő beállítást. A mappafigyelő automatikusan észleli a könyvtári mappák változásait. Kapcsolja be ezt a funkciót, ha az „Automatikus könyvtárfigyelés” nem működik a fájlrendszerén (például NFS).",
|
||||
"MessageScheduleRunEveryWeekdayAtTime": "Futás minden {1} óra {0}-kor",
|
||||
"MessageSearchResultsFor": "Keresési eredmények",
|
||||
"MessageSelected": "{0} kiválasztva",
|
||||
|
|
|
|||
1
client/strings/is.json
Normal file
1
client/strings/is.json
Normal file
|
|
@ -0,0 +1 @@
|
|||
{}
|
||||
File diff suppressed because it is too large
Load diff
|
|
@ -18,6 +18,7 @@
|
|||
"ButtonChooseAFolder": "Pasirinkite aplanką",
|
||||
"ButtonChooseFiles": "Pasirinkite failus",
|
||||
"ButtonClearFilter": "Valyti filtrą",
|
||||
"ButtonClose": "Uždaryti",
|
||||
"ButtonCloseFeed": "Uždaryti srautą",
|
||||
"ButtonCloseSession": "Uždaryti Atidarytą sesiją",
|
||||
"ButtonCollections": "Kolekcijos",
|
||||
|
|
@ -251,7 +252,7 @@
|
|||
"LabelDuration": "Trukmė",
|
||||
"LabelDurationFound": "Rasta trukmė:",
|
||||
"LabelEbook": "Elektroninė knyga",
|
||||
"LabelEbooks": "Elektroninės knygos",
|
||||
"LabelEbooks": "El. knygos",
|
||||
"LabelEdit": "Redaguoti",
|
||||
"LabelEmail": "El. paštas",
|
||||
"LabelEmailSettingsFromAddress": "Siuntėjo adresas",
|
||||
|
|
@ -261,6 +262,7 @@
|
|||
"LabelEmbeddedCover": "Įterptas viršelis",
|
||||
"LabelEnable": "Įjungti",
|
||||
"LabelEnd": "Pabaiga",
|
||||
"LabelEndOfChapter": "Skyriaus pabaiga",
|
||||
"LabelEpisode": "Epizodas",
|
||||
"LabelEpisodeTitle": "Epizodo pavadinimas",
|
||||
"LabelEpisodeType": "Epizodo tipas",
|
||||
|
|
@ -282,8 +284,8 @@
|
|||
"LabelGenre": "Žanras",
|
||||
"LabelGenres": "Žanrai",
|
||||
"LabelHardDeleteFile": "Galutinai ištrinti failą",
|
||||
"LabelHasEbook": "Turi e-knygą",
|
||||
"LabelHasSupplementaryEbook": "Turi papildomą e-knygą",
|
||||
"LabelHasEbook": "Turi el. knygą",
|
||||
"LabelHasSupplementaryEbook": "Turi papildomą el. knygą",
|
||||
"LabelHost": "Serveris",
|
||||
"LabelHour": "Valanda",
|
||||
"LabelIcon": "Piktograma",
|
||||
|
|
|
|||
|
|
@ -76,7 +76,7 @@
|
|||
"ButtonReScan": "Ponowne skanowanie",
|
||||
"ButtonRead": "Czytaj",
|
||||
"ButtonReadLess": "Pokaż mniej",
|
||||
"ButtonReadMore": "Pokaż więcej",
|
||||
"ButtonReadMore": "Czytaj więcej",
|
||||
"ButtonRefresh": "Odśwież",
|
||||
"ButtonRemove": "Usuń",
|
||||
"ButtonRemoveAll": "Usuń wszystko",
|
||||
|
|
@ -96,7 +96,7 @@
|
|||
"ButtonScrollRight": "Przewiń w prawo",
|
||||
"ButtonSearch": "Szukaj",
|
||||
"ButtonSelectFolderPath": "Wybierz ścieżkę folderu",
|
||||
"ButtonSeries": "Seria",
|
||||
"ButtonSeries": "Serial",
|
||||
"ButtonSetChaptersFromTracks": "Ustawiaj rozdziały na podstawie utworów",
|
||||
"ButtonShare": "Udostępnij",
|
||||
"ButtonShiftTimes": "Przesunięcie czasowe",
|
||||
|
|
@ -363,7 +363,7 @@
|
|||
"LabelExpiresAt": "Wygasa w",
|
||||
"LabelExpiresInSeconds": "Wygasa za (sekund)",
|
||||
"LabelExpiresNever": "Nigdy",
|
||||
"LabelExplicit": "Nieprzyzwoite",
|
||||
"LabelExplicit": "18+",
|
||||
"LabelExplicitChecked": "Nieprzyzwoite (sprawdzone)",
|
||||
"LabelExplicitUnchecked": "Przyzwoite (niesprawdzone)",
|
||||
"LabelExportOPML": "Wyeksportuj OPML",
|
||||
|
|
@ -383,7 +383,7 @@
|
|||
"LabelFolders": "Foldery",
|
||||
"LabelFontBold": "Pogrubiony",
|
||||
"LabelFontBoldness": "Grubość czcionki",
|
||||
"LabelFontFamily": "Rodzina czcionek",
|
||||
"LabelFontFamily": "Krój pisma",
|
||||
"LabelFontItalic": "Kursywa",
|
||||
"LabelFontScale": "Rozmiar czcionki",
|
||||
"LabelFontStrikethrough": "Przekreślony",
|
||||
|
|
@ -587,8 +587,8 @@
|
|||
"LabelSettingsBookshelfViewHelp": "Widok półki z książkami",
|
||||
"LabelSettingsChromecastSupport": "Wsparcie Chromecast",
|
||||
"LabelSettingsDateFormat": "Format daty",
|
||||
"LabelSettingsEnableWatcher": "Automatyczne skanowanie bibliotek w poszukiwaniu zmian",
|
||||
"LabelSettingsEnableWatcherForLibrary": "Automatyczne skanowanie biblioteki w poszukiwaniu zmian",
|
||||
"LabelSettingsEnableWatcher": "Automatyczne monitorowanie bibliotek w poszukiwaniu zmian",
|
||||
"LabelSettingsEnableWatcherForLibrary": "Automatyczne monitorowanie biblioteki w poszukiwaniu zmian",
|
||||
"LabelSettingsEnableWatcherHelp": "Włącza automatyczne dodawanie/aktualizację pozycji gdy wykryte zostaną zmiany w plikach. Wymaga restartu serwera",
|
||||
"LabelSettingsEpubsAllowScriptedContent": "Zezwalanie na skrypty w plikach epub",
|
||||
"LabelSettingsEpubsAllowScriptedContentHelp": "Zezwala plikom epub na wykonywanie skryptów. Zaleca się mieć to ustawienie wyłączone, chyba że ma się zaufanie do źródła plików epub.",
|
||||
|
|
@ -629,6 +629,7 @@
|
|||
"LabelShowSubtitles": "Pokaż Napisy",
|
||||
"LabelSize": "Rozmiar",
|
||||
"LabelSleepTimer": "Wyłącznik czasowy",
|
||||
"LabelSlug": "slug (części URL która identyfikuje konkretny zasób)",
|
||||
"LabelSortAscending": "Rosnąco",
|
||||
"LabelSortDescending": "Malejąco",
|
||||
"LabelSortPubDate": "Sortuj według daty publikacji",
|
||||
|
|
@ -667,6 +668,7 @@
|
|||
"LabelThemeDark": "Ciemny",
|
||||
"LabelThemeLight": "Jasny",
|
||||
"LabelThemeSepia": "Sepia",
|
||||
"LabelTimeBase": "Podstawa czasu",
|
||||
"LabelTimeDurationXHours": "{0} godzin",
|
||||
"LabelTimeDurationXMinutes": "{0} minuty",
|
||||
"LabelTimeDurationXSeconds": "{0} sekundy",
|
||||
|
|
@ -720,6 +722,7 @@
|
|||
"LabelViewPlayerSettings": "Zobacz ustawienia odtwarzacza",
|
||||
"LabelViewQueue": "Wyświetlaj kolejkę odtwarzania",
|
||||
"LabelVolume": "Głośność",
|
||||
"LabelWebRedirectURLsDescription": "Zezwól na te adresy URL w swoim dostawcy OAuth, aby umożliwić przekierowanie z powrotem do aplikacji internetowej po zalogowaniu:",
|
||||
"LabelWeekdaysToRun": "Dni tygodnia",
|
||||
"LabelXBooks": "{0} książek",
|
||||
"LabelXItems": "{0} elementów",
|
||||
|
|
@ -740,6 +743,7 @@
|
|||
"MessageBackupsLocationNoEditNote": "Uwaga: Lokalizacja kopii zapasowej jest ustawiona poprzez zmienną środowiskową i nie może być tutaj zmieniona.",
|
||||
"MessageBackupsLocationPathEmpty": "Ścieżka do kopii zapasowej nie może być pusta",
|
||||
"MessageBatchEditPopulateMapDetailsAllHelp": "Wypełnij włączone pola danymi ze wszystkich elementów. Pola z wieloma wartościami zostaną scalone.",
|
||||
"MessageBatchEditPopulateMapDetailsItemHelp": "Wypełnij pola szczegółów mapy włączonej danymi z tego elementu",
|
||||
"MessageBatchQuickMatchDescription": "Quick Match będzie próbował dodać brakujące okładki i metadane dla wybranych elementów. Włącz poniższe opcje, aby umożliwić Quick Match nadpisanie istniejących okładek i/lub metadanych.",
|
||||
"MessageBookshelfNoCollections": "Nie posiadasz jeszcze żadnych kolekcji",
|
||||
"MessageBookshelfNoCollectionsHelp": "Kolekcje są publiczne. Wszyscy użytkownicy mający dostęp do biblioteki mogą je zobaczyć.",
|
||||
|
|
@ -811,6 +815,7 @@
|
|||
"MessageFetching": "Pobieranie...",
|
||||
"MessageForceReScanDescription": "przeskanuje wszystkie pliki ponownie, jak przy świeżym skanowaniu. Tagi ID3 plików audio, pliki OPF i pliki tekstowe będą skanowane jak nowe.",
|
||||
"MessageHeatmapListeningTimeTooltip": "<strong>{0} słucha</strong> na {1}",
|
||||
"MessageHeatmapNoListeningSessions": "Brak sesji słuchania na {0}",
|
||||
"MessageImportantNotice": "Ważna informacja!",
|
||||
"MessageInsertChapterBelow": "Wstaw rozdział poniżej",
|
||||
"MessageInvalidAsin": "Nieprawidłowy ASIN",
|
||||
|
|
@ -885,6 +890,7 @@
|
|||
"MessageScheduleRunEveryWeekdayAtTime": "Uruchom w każdy {0} o {1}",
|
||||
"MessageSearchResultsFor": "Wyniki wyszukiwania dla",
|
||||
"MessageSelected": "{0} wybranych",
|
||||
"MessageSeriesSequenceCannotContainSpaces": "Sekwencja serii nie może zawierać spacji",
|
||||
"MessageServerCouldNotBeReached": "Nie udało się uzyskać połączenia z serwerem",
|
||||
"MessageSetChaptersFromTracksDescription": "Ustaw rozdziały, używając każdego pliku audio jako rozdziału, a tytuł rozdziału jako nazwy pliku audio.",
|
||||
"MessageShareExpirationWillBe": "Czas udostępniania <strong>{0}</strong>",
|
||||
|
|
@ -902,8 +908,13 @@
|
|||
"MessageTaskFailedToBackupAudioFile": "Nieudana próba wykonania kopii zapasowego pliku audio \"{0}\"",
|
||||
"MessageTaskFailedToCreateCacheDirectory": "Nie udało się utworzyć katalogu cache",
|
||||
"MessageTaskFailedToEmbedMetadataInFile": "Nie udało się wbudować metadanych do pliku \"{0}\"",
|
||||
"MessageTaskFailedToMergeAudioFiles": "Nie udało się połączyć plików audio",
|
||||
"MessageTaskFailedToMoveM4bFile": "Nie udało się przenieść pliku m4b",
|
||||
"MessageTaskFailedToWriteMetadataFile": "Niepowodzenie zapisania pliku metadanych",
|
||||
"MessageTaskMatchingBooksInLibrary": "Pasujące książki w bibliotece \"{0}\"",
|
||||
"MessageTaskNoFilesToScan": "Brak plików do skanowania",
|
||||
"MessageTaskOpmlImport": "Importuj OPML",
|
||||
"MessageTaskOpmlImportDescription": "Tworzenie {0} podcastów z kanałów RSS",
|
||||
"MessageTaskScanItemsAdded": "Dodano {0}",
|
||||
"MessageTaskScanItemsMissing": "Brakuje {0}",
|
||||
"MessageTaskScanItemsUpdated": "Zaktualizowano {0}",
|
||||
|
|
|
|||
|
|
@ -383,7 +383,7 @@
|
|||
"LabelFolders": "Папки",
|
||||
"LabelFontBold": "Жирный",
|
||||
"LabelFontBoldness": "Жирность шрифта",
|
||||
"LabelFontFamily": "Семейство шрифтов",
|
||||
"LabelFontFamily": "Семейство шрифта",
|
||||
"LabelFontItalic": "Курсив",
|
||||
"LabelFontScale": "Масштаб шрифта",
|
||||
"LabelFontStrikethrough": "Зачеркнутый",
|
||||
|
|
@ -588,8 +588,8 @@
|
|||
"LabelSettingsBookshelfViewHelp": "Конструкция с деревянными полками",
|
||||
"LabelSettingsChromecastSupport": "Поддержка Chromecast",
|
||||
"LabelSettingsDateFormat": "Формат даты",
|
||||
"LabelSettingsEnableWatcher": "Автоматическое сканирование библиотек на изменение",
|
||||
"LabelSettingsEnableWatcherForLibrary": "Автоматическое сканирование библиотеки на изменение",
|
||||
"LabelSettingsEnableWatcher": "Автоматически отслеживать изменения в библиотеках",
|
||||
"LabelSettingsEnableWatcherForLibrary": "Автоматический просмотр библиотеки на изменение",
|
||||
"LabelSettingsEnableWatcherHelp": "Включает автоматическое добавление/обновление элементов при обнаружении изменений файлов. *Требуется перезапуск сервера",
|
||||
"LabelSettingsEpubsAllowScriptedContent": "Разрешение содержимого epub с скриптами",
|
||||
"LabelSettingsEpubsAllowScriptedContentHelp": "Разрешить файлам epub выполнять скрипты. Рекомендуется отключать этот параметр, если вы не доверяете источнику файлов epub.",
|
||||
|
|
@ -888,7 +888,7 @@
|
|||
"MessageResetChaptersConfirm": "Вы уверены, что хотите сбросить главы и отменить внесенные изменения?",
|
||||
"MessageRestoreBackupConfirm": "Вы уверены, что хотите восстановить резервную копию, созданную",
|
||||
"MessageRestoreBackupWarning": "Восстановление резервной копии перезапишет всю базу данных, расположенную в /config, и обложки изображений в /metadata/items и /metadata/authors.<br/><br/>Бэкапы не изменяют файлы в папках библиотеки. Если вы включили параметры сервера для хранения обложек и метаданных в папках библиотеки, то они не резервируются и не перезаписываются.<br/><br/>Все клиенты, использующие ваш сервер, будут автоматически обновлены.",
|
||||
"MessageScheduleLibraryScanNote": "Большинству пользователей рекомендуется отключить эту функцию и включить функцию просмотра папок. Программа просмотра папок автоматически обнаружит изменения в папках вашей библиотеки. Программа просмотра папок работает не для каждой файловой системы (например, NFS), поэтому вместо этого можно использовать запланированные проверки библиотеки.",
|
||||
"MessageScheduleLibraryScanNote": "Большинству пользователей рекомендуется отключить эту функцию и оставить включённой функцию \"Автоматически отслеживать изменения в библиотеках\" - она будет автоматически обнаруживать изменения в папках вашей библиотеки. Включите эту функцию если \"Автоматически отслеживать изменения в библиотеках\" не работает для вашей файловой системы (например, NFS).",
|
||||
"MessageScheduleRunEveryWeekdayAtTime": "Запуск каждые {0} по {1}",
|
||||
"MessageSearchResultsFor": "Результаты поиска для",
|
||||
"MessageSelected": "{0} выбрано",
|
||||
|
|
|
|||
|
|
@ -385,13 +385,13 @@
|
|||
"LabelFontBoldness": "Fetstil",
|
||||
"LabelFontFamily": "Typsnittsfamilj",
|
||||
"LabelFontItalic": "Kursiv",
|
||||
"LabelFontScale": "Skala på typsnitt",
|
||||
"LabelFontScale": "Storlek på typsnitt",
|
||||
"LabelFontStrikethrough": "Genomstruken",
|
||||
"LabelFormat": "Format",
|
||||
"LabelFull": "Komplett",
|
||||
"LabelGenre": "Kategori",
|
||||
"LabelGenres": "Kategorier",
|
||||
"LabelHardDeleteFile": "Hård radering av fil",
|
||||
"LabelHardDeleteFile": "Permanent radering av fil",
|
||||
"LabelHasEbook": "Har e-bok",
|
||||
"LabelHasSupplementaryEbook": "Har kompletterande e-bok",
|
||||
"LabelHideSubtitles": "Dölj underrubriker",
|
||||
|
|
@ -588,7 +588,7 @@
|
|||
"LabelSettingsBookshelfViewHelp": "Bakgrund med ett utseende liknande en bokhylla i trä",
|
||||
"LabelSettingsChromecastSupport": "Stöd för Chromecast",
|
||||
"LabelSettingsDateFormat": "Datumformat",
|
||||
"LabelSettingsEnableWatcher": "Bevaka biblioteken automatiskt efter ändringar",
|
||||
"LabelSettingsEnableWatcher": "Bevaka automatiskt förändringar i biblioteken",
|
||||
"LabelSettingsEnableWatcherForLibrary": "Bevaka biblioteket automatiskt efter ändringar",
|
||||
"LabelSettingsEnableWatcherHelp": "Aktiverar automatik att upptäcka när objekt<br>adderas, uppdateras eller raderas.<br>OBS: Kräver en omstart av servern",
|
||||
"LabelSettingsEpubsAllowScriptedContent": "Tillåt e-böcker i epubs-format som innehåller script",
|
||||
|
|
@ -790,7 +790,7 @@
|
|||
"MessageConfirmRemoveAuthor": "Är du säker på att du vill ta bort författaren \"{0}\"?",
|
||||
"MessageConfirmRemoveCollection": "Är du säker på att du vill ta bort samlingen \"{0}\"?",
|
||||
"MessageConfirmRemoveEpisode": "Är du säker på att du vill radera avsnittet \"{0}\"?",
|
||||
"MessageConfirmRemoveEpisodeNote": "Anmärkning: Detta tar inte bort ljudfilen om inte \"Hard delete file\" är aktivt",
|
||||
"MessageConfirmRemoveEpisodeNote": "OBSERERA: Detta tar inte bort ljudfilen om inte \"Permanent radering av fil\" är aktiverad",
|
||||
"MessageConfirmRemoveEpisodes": "Är du säker på att du vill radera {0} avsnitt?",
|
||||
"MessageConfirmRemoveListeningSessions": "Är du säker på att du vill radera {0} lyssningstillfällen?",
|
||||
"MessageConfirmRemoveMetadataFiles": "Är du säker på att du vill radera filerna 'metadata.{0}' i alla mappar i ditt bibliotek?",
|
||||
|
|
|
|||
|
|
@ -383,7 +383,7 @@
|
|||
"LabelFolders": "Теки",
|
||||
"LabelFontBold": "Жирний",
|
||||
"LabelFontBoldness": "Товщина шрифту",
|
||||
"LabelFontFamily": "Гарнітура",
|
||||
"LabelFontFamily": "Сімейство шрифтів",
|
||||
"LabelFontItalic": "Курсив",
|
||||
"LabelFontScale": "Розмір шрифту",
|
||||
"LabelFontStrikethrough": "Закреслений",
|
||||
|
|
|
|||
|
|
@ -383,7 +383,7 @@
|
|||
"LabelFolders": "文件夹",
|
||||
"LabelFontBold": "加粗",
|
||||
"LabelFontBoldness": "字体粗细",
|
||||
"LabelFontFamily": "字体系列",
|
||||
"LabelFontFamily": "字体",
|
||||
"LabelFontItalic": "斜体",
|
||||
"LabelFontScale": "字体比例",
|
||||
"LabelFontStrikethrough": "删除线",
|
||||
|
|
|
|||
4
package-lock.json
generated
4
package-lock.json
generated
|
|
@ -1,12 +1,12 @@
|
|||
{
|
||||
"name": "audiobookshelf",
|
||||
"version": "2.30.0",
|
||||
"version": "2.31.0",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "audiobookshelf",
|
||||
"version": "2.30.0",
|
||||
"version": "2.31.0",
|
||||
"license": "GPL-3.0",
|
||||
"dependencies": {
|
||||
"axios": "^0.27.2",
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "audiobookshelf",
|
||||
"version": "2.30.0",
|
||||
"version": "2.31.0",
|
||||
"buildNumber": 1,
|
||||
"description": "Self-hosted audiobook and podcast server",
|
||||
"main": "index.js",
|
||||
|
|
|
|||
|
|
@ -88,10 +88,10 @@ class SearchController {
|
|||
const provider = getQueryParamAsString(query, 'provider', 'google')
|
||||
const title = getQueryParamAsString(query, 'title', '')
|
||||
const author = getQueryParamAsString(query, 'author', '')
|
||||
const id = getQueryParamAsString(query, 'id', '', true)
|
||||
const id = getQueryParamAsString(query, 'id', undefined)
|
||||
|
||||
// Fetch library item
|
||||
const libraryItem = await SearchController.fetchLibraryItem(id)
|
||||
const libraryItem = id ? await SearchController.fetchLibraryItem(id) : null
|
||||
|
||||
const results = await BookFinder.search(libraryItem, provider, title, author)
|
||||
res.json(results)
|
||||
|
|
@ -187,7 +187,7 @@ class SearchController {
|
|||
try {
|
||||
const query = req.query
|
||||
const asin = getQueryParamAsString(query, 'asin', '', true)
|
||||
const region = getQueryParamAsString(req.query.region, 'us').toLowerCase()
|
||||
const region = getQueryParamAsString(query, 'region', 'us').toLowerCase()
|
||||
|
||||
if (!isValidASIN(asin.toUpperCase())) throw new ValidationError('asin', 'is invalid')
|
||||
|
||||
|
|
|
|||
|
|
@ -428,7 +428,7 @@ class BookFinder {
|
|||
}
|
||||
}
|
||||
|
||||
if (books.length) {
|
||||
if (books.length && libraryItem) {
|
||||
const isAudibleProvider = provider.startsWith('audible')
|
||||
const libraryItemDurationMinutes = libraryItem?.media?.duration ? libraryItem.media.duration / 60 : null
|
||||
|
||||
|
|
|
|||
|
|
@ -48,9 +48,14 @@ class BackupManager {
|
|||
}
|
||||
|
||||
async init() {
|
||||
const backupsDirExists = await fs.pathExists(this.backupPath)
|
||||
if (!backupsDirExists) {
|
||||
await fs.ensureDir(this.backupPath)
|
||||
try {
|
||||
const backupsDirExists = await fs.pathExists(this.backupPath)
|
||||
if (!backupsDirExists) {
|
||||
await fs.ensureDir(this.backupPath)
|
||||
}
|
||||
} catch (error) {
|
||||
Logger.error(`[BackupManager] Failed to ensure backup directory at "${this.backupPath}": ${error.message}`)
|
||||
throw new Error(`[BackupManager] Failed to ensure backup directory at "${this.backupPath}"`, { cause: error })
|
||||
}
|
||||
|
||||
await this.loadBackups()
|
||||
|
|
|
|||
|
|
@ -24,10 +24,15 @@ class CacheManager {
|
|||
this.ImageCachePath = Path.join(this.CachePath, 'images')
|
||||
this.ItemCachePath = Path.join(this.CachePath, 'items')
|
||||
|
||||
await fs.ensureDir(this.CachePath)
|
||||
await fs.ensureDir(this.CoverCachePath)
|
||||
await fs.ensureDir(this.ImageCachePath)
|
||||
await fs.ensureDir(this.ItemCachePath)
|
||||
try {
|
||||
await fs.ensureDir(this.CachePath)
|
||||
await fs.ensureDir(this.CoverCachePath)
|
||||
await fs.ensureDir(this.ImageCachePath)
|
||||
await fs.ensureDir(this.ItemCachePath)
|
||||
} catch (error) {
|
||||
Logger.error(`[CacheManager] Failed to create cache directories at "${this.CachePath}": ${error.message}`)
|
||||
throw new Error(`[CacheManager] Failed to create cache directories at "${this.CachePath}"`, { cause: error })
|
||||
}
|
||||
}
|
||||
|
||||
async handleCoverCache(res, libraryItemId, options = {}) {
|
||||
|
|
|
|||
|
|
@ -37,8 +37,13 @@ class LogManager {
|
|||
}
|
||||
|
||||
async ensureLogDirs() {
|
||||
await fs.ensureDir(this.DailyLogPath)
|
||||
await fs.ensureDir(this.ScanLogPath)
|
||||
try {
|
||||
await fs.ensureDir(this.DailyLogPath)
|
||||
await fs.ensureDir(this.ScanLogPath)
|
||||
} catch (error) {
|
||||
console.error(`[LogManager] Failed to create log directories at "${this.DailyLogPath}": ${error.message}`)
|
||||
throw new Error(`[LogManager] Failed to create log directories at "${this.DailyLogPath}"`, { cause: error })
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -102,20 +107,20 @@ class LogManager {
|
|||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {string} filename
|
||||
*
|
||||
* @param {string} filename
|
||||
*/
|
||||
async removeLogFile(filename) {
|
||||
const fullPath = Path.join(this.DailyLogPath, filename)
|
||||
const exists = await fs.pathExists(fullPath)
|
||||
if (!exists) {
|
||||
Logger.error(TAG, 'Invalid log dne ' + fullPath)
|
||||
this.dailyLogFiles = this.dailyLogFiles.filter(dlf => dlf !== filename)
|
||||
this.dailyLogFiles = this.dailyLogFiles.filter((dlf) => dlf !== filename)
|
||||
} else {
|
||||
try {
|
||||
await fs.unlink(fullPath)
|
||||
Logger.info(TAG, 'Removed daily log: ' + filename)
|
||||
this.dailyLogFiles = this.dailyLogFiles.filter(dlf => dlf !== filename)
|
||||
this.dailyLogFiles = this.dailyLogFiles.filter((dlf) => dlf !== filename)
|
||||
} catch (error) {
|
||||
Logger.error(TAG, 'Failed to unlink log file ' + fullPath)
|
||||
}
|
||||
|
|
@ -123,8 +128,8 @@ class LogManager {
|
|||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {LogObject} logObj
|
||||
*
|
||||
* @param {LogObject} logObj
|
||||
*/
|
||||
async logToFile(logObj) {
|
||||
// Fatal crashes get logged to a separate file
|
||||
|
|
@ -152,8 +157,8 @@ class LogManager {
|
|||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {LogObject} logObj
|
||||
*
|
||||
* @param {LogObject} logObj
|
||||
*/
|
||||
async logCrashToFile(logObj) {
|
||||
const line = JSON.stringify(logObj) + '\n'
|
||||
|
|
@ -161,18 +166,18 @@ class LogManager {
|
|||
const logsDir = Path.join(global.MetadataPath, 'logs')
|
||||
await fs.ensureDir(logsDir)
|
||||
const crashLogPath = Path.join(logsDir, 'crash_logs.txt')
|
||||
return fs.writeFile(crashLogPath, line, { flag: "a+" }).catch((error) => {
|
||||
return fs.writeFile(crashLogPath, line, { flag: 'a+' }).catch((error) => {
|
||||
console.log('[LogManager] Appended crash log', error)
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* Most recent 5000 daily logs
|
||||
*
|
||||
*
|
||||
* @returns {string}
|
||||
*/
|
||||
getMostRecentCurrentDailyLogs() {
|
||||
return this.currentDailyLog?.logs.slice(-5000) || ''
|
||||
}
|
||||
}
|
||||
module.exports = LogManager
|
||||
module.exports = LogManager
|
||||
|
|
|
|||
|
|
@ -38,7 +38,12 @@ class MigrationManager {
|
|||
if (!(await fs.pathExists(this.configPath))) throw new Error(`Config path does not exist: ${this.configPath}`)
|
||||
|
||||
this.migrationsDir = path.join(this.configPath, 'migrations')
|
||||
await fs.ensureDir(this.migrationsDir)
|
||||
try {
|
||||
await fs.ensureDir(this.migrationsDir)
|
||||
} catch (error) {
|
||||
Logger.error(`[MigrationManager] Failed to create migrations directory at "${this.migrationsDir}": ${error.message}`)
|
||||
throw new Error(`[MigrationManager] Failed to create migrations directory at "${this.migrationsDir}"`, { cause: error })
|
||||
}
|
||||
|
||||
this.serverVersion = this.extractVersionFromTag(serverVersion)
|
||||
if (!this.serverVersion) throw new Error(`Invalid server version: ${serverVersion}. Expected a version tag like v1.2.3.`)
|
||||
|
|
|
|||
|
|
@ -459,7 +459,12 @@ class PlaybackSessionManager {
|
|||
* Remove all stream folders in `/metadata/streams`
|
||||
*/
|
||||
async removeOrphanStreams() {
|
||||
await fs.ensureDir(this.StreamsPath)
|
||||
try {
|
||||
await fs.ensureDir(this.StreamsPath)
|
||||
} catch (error) {
|
||||
Logger.error(`[PlaybackSessionManager] Failed to create streams directory at "${this.StreamsPath}": ${error.message}`)
|
||||
throw new Error(`[PlaybackSessionManager] Failed to create streams directory at "${this.StreamsPath}"`, { cause: error })
|
||||
}
|
||||
try {
|
||||
const streamsInPath = await fs.readdir(this.StreamsPath)
|
||||
for (const streamId of streamsInPath) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue