mirror of
https://github.com/advplyr/audiobookshelf.git
synced 2026-03-06 07:59:43 +00:00
Compare commits
No commits in common. "e24eaab3f187eaa8cac3b9bc73d710d1303154f3" and "e59babdf24cfa3283b9ea6fd6c8f0e22a76f15ec" have entirely different histories.
e24eaab3f1
...
e59babdf24
20 changed files with 152 additions and 256 deletions
|
|
@ -778,6 +778,10 @@ export default {
|
|||
windowResize() {
|
||||
this.executeRebuild()
|
||||
},
|
||||
socketInit() {
|
||||
// Server settings are set on socket init
|
||||
this.executeRebuild()
|
||||
},
|
||||
initListeners() {
|
||||
window.addEventListener('resize', this.windowResize)
|
||||
|
||||
|
|
@ -790,6 +794,7 @@ export default {
|
|||
})
|
||||
|
||||
this.$eventBus.$on('bookshelf_clear_selection', this.clearSelectedEntities)
|
||||
this.$eventBus.$on('socket_init', this.socketInit)
|
||||
this.$eventBus.$on('user-settings', this.settingsUpdated)
|
||||
|
||||
if (this.$root.socket) {
|
||||
|
|
@ -821,6 +826,7 @@ export default {
|
|||
}
|
||||
|
||||
this.$eventBus.$off('bookshelf_clear_selection', this.clearSelectedEntities)
|
||||
this.$eventBus.$off('socket_init', this.socketInit)
|
||||
this.$eventBus.$off('user-settings', this.settingsUpdated)
|
||||
|
||||
if (this.$root.socket) {
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@
|
|||
{{ $getString('MessageConfirmRemoveEpisode', [episodeTitle]) }}
|
||||
</p>
|
||||
<p v-else class="text-lg text-gray-200 mb-4">{{ $getString('MessageConfirmRemoveEpisodes', [episodes.length]) }}</p>
|
||||
<p class="text-xs font-semibold text-warning/90">{{ $strings.MessageConfirmRemoveEpisodeNote }}</p>
|
||||
<p class="text-xs font-semibold text-warning/90">Note: This does not delete the audio file unless toggling "Hard delete file"</p>
|
||||
</div>
|
||||
<div class="flex justify-between items-center pt-4">
|
||||
<ui-checkbox v-model="hardDeleteFile" :label="$strings.LabelHardDeleteFile" check-color="error" checkbox-bg="bg" small label-class="text-base text-gray-200 pl-3" />
|
||||
|
|
|
|||
|
|
@ -93,7 +93,7 @@ export default {
|
|||
this.$toast.error(data.error)
|
||||
} else {
|
||||
this.removeApiKey(apiKey.id)
|
||||
this.$emit('numApiKeys', this.apiKeys.length)
|
||||
this.$emit('deleted', apiKey.id)
|
||||
}
|
||||
})
|
||||
.catch((error) => {
|
||||
|
|
|
|||
|
|
@ -33,7 +33,6 @@ export default {
|
|||
return {
|
||||
socket: null,
|
||||
isSocketConnected: false,
|
||||
isSocketAuthenticated: false,
|
||||
isFirstSocketConnection: true,
|
||||
socketConnectionToastId: null,
|
||||
currentLang: null,
|
||||
|
|
@ -82,28 +81,9 @@ export default {
|
|||
document.body.classList.add('app-bar')
|
||||
}
|
||||
},
|
||||
tokenRefreshed(newAccessToken) {
|
||||
if (this.isSocketConnected && !this.isSocketAuthenticated) {
|
||||
console.log('[SOCKET] Re-authenticating socket after token refresh')
|
||||
this.socket.emit('auth', newAccessToken)
|
||||
}
|
||||
},
|
||||
updateSocketConnectionToast(content, type, timeout) {
|
||||
if (this.socketConnectionToastId !== null && this.socketConnectionToastId !== undefined) {
|
||||
const toastUpdateOptions = {
|
||||
content: content,
|
||||
options: {
|
||||
timeout: timeout,
|
||||
type: type,
|
||||
closeButton: false,
|
||||
position: 'bottom-center',
|
||||
onClose: () => {
|
||||
this.socketConnectionToastId = null
|
||||
},
|
||||
closeOnClick: timeout !== null
|
||||
}
|
||||
}
|
||||
this.$toast.update(this.socketConnectionToastId, toastUpdateOptions, false)
|
||||
this.$toast.update(this.socketConnectionToastId, { content: content, options: { timeout: timeout, type: type, closeButton: false, position: 'bottom-center', onClose: () => null, closeOnClick: timeout !== null } }, false)
|
||||
} else {
|
||||
this.socketConnectionToastId = this.$toast[type](content, { position: 'bottom-center', timeout: timeout, closeButton: false, closeOnClick: timeout !== null })
|
||||
}
|
||||
|
|
@ -129,7 +109,7 @@ export default {
|
|||
this.updateSocketConnectionToast(this.$strings.ToastSocketDisconnected, 'error', null)
|
||||
},
|
||||
reconnect() {
|
||||
console.log('[SOCKET] reconnected')
|
||||
console.error('[SOCKET] reconnected')
|
||||
},
|
||||
reconnectAttempt(val) {
|
||||
console.log(`[SOCKET] reconnect attempt ${val}`)
|
||||
|
|
@ -140,10 +120,6 @@ export default {
|
|||
reconnectFailed() {
|
||||
console.error('[SOCKET] reconnect failed')
|
||||
},
|
||||
authFailed(payload) {
|
||||
console.error('[SOCKET] auth failed', payload.message)
|
||||
this.isSocketAuthenticated = false
|
||||
},
|
||||
init(payload) {
|
||||
console.log('Init Payload', payload)
|
||||
|
||||
|
|
@ -151,7 +127,7 @@ export default {
|
|||
this.$store.commit('users/setUsersOnline', payload.usersOnline)
|
||||
}
|
||||
|
||||
this.isSocketAuthenticated = true
|
||||
this.$eventBus.$emit('socket_init')
|
||||
},
|
||||
streamOpen(stream) {
|
||||
if (this.$refs.mediaPlayerContainer) this.$refs.mediaPlayerContainer.streamOpen(stream)
|
||||
|
|
@ -378,15 +354,6 @@ export default {
|
|||
this.$store.commit('scanners/removeCustomMetadataProvider', provider)
|
||||
},
|
||||
initializeSocket() {
|
||||
if (this.$root.socket) {
|
||||
// Can happen in dev due to hot reload
|
||||
console.warn('Socket already initialized')
|
||||
this.socket = this.$root.socket
|
||||
this.isSocketConnected = this.$root.socket?.connected
|
||||
this.isFirstSocketConnection = false
|
||||
this.socketConnectionToastId = null
|
||||
return
|
||||
}
|
||||
this.socket = this.$nuxtSocket({
|
||||
name: process.env.NODE_ENV === 'development' ? 'dev' : 'prod',
|
||||
persist: 'main',
|
||||
|
|
@ -397,7 +364,6 @@ export default {
|
|||
path: `${this.$config.routerBasePath}/socket.io`
|
||||
})
|
||||
this.$root.socket = this.socket
|
||||
this.isSocketAuthenticated = false
|
||||
console.log('Socket initialized')
|
||||
|
||||
// Pre-defined socket events
|
||||
|
|
@ -411,7 +377,6 @@ export default {
|
|||
|
||||
// Event received after authorizing socket
|
||||
this.socket.on('init', this.init)
|
||||
this.socket.on('auth_failed', this.authFailed)
|
||||
|
||||
// Stream Listeners
|
||||
this.socket.on('stream_open', this.streamOpen)
|
||||
|
|
@ -606,7 +571,6 @@ export default {
|
|||
this.updateBodyClass()
|
||||
this.resize()
|
||||
this.$eventBus.$on('change-lang', this.changeLanguage)
|
||||
this.$eventBus.$on('token_refreshed', this.tokenRefreshed)
|
||||
window.addEventListener('resize', this.resize)
|
||||
window.addEventListener('keydown', this.keyDown)
|
||||
|
||||
|
|
@ -630,7 +594,6 @@ export default {
|
|||
},
|
||||
beforeDestroy() {
|
||||
this.$eventBus.$off('change-lang', this.changeLanguage)
|
||||
this.$eventBus.$off('token_refreshed', this.tokenRefreshed)
|
||||
window.removeEventListener('resize', this.resize)
|
||||
window.removeEventListener('keydown', this.keyDown)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@
|
|||
|
||||
<tables-api-keys-table ref="apiKeysTable" class="pt-2" @edit="setShowApiKeyModal" @numApiKeys="(count) => (numApiKeys = count)" />
|
||||
</app-settings-content>
|
||||
<modals-api-key-modal ref="apiKeyModal" v-model="showApiKeyModal" :api-key="selectedApiKey" :users="users" @created="apiKeyCreated" @updated="apiKeyUpdated" />
|
||||
<modals-api-key-modal ref="apiKeyModal" v-model="showApiKeyModal" :api-key="selectedApiKey" :users="users" @created="apiKeyCreated" @deleted="apiKeyDeleted" @updated="apiKeyUpdated" />
|
||||
<modals-api-key-created-modal ref="apiKeyCreatedModal" v-model="showApiKeyCreatedModal" :api-key="selectedApiKey" />
|
||||
</div>
|
||||
</template>
|
||||
|
|
@ -50,6 +50,9 @@ export default {
|
|||
this.$refs.apiKeysTable.addApiKey(apiKey)
|
||||
}
|
||||
},
|
||||
apiKeyDeleted() {
|
||||
this.numApiKeys--
|
||||
},
|
||||
apiKeyUpdated(apiKey) {
|
||||
if (this.$refs.apiKeysTable) {
|
||||
this.$refs.apiKeysTable.updateApiKey(apiKey)
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@
|
|||
</tr>
|
||||
<tr v-for="narrator in narrators" :key="narrator.id">
|
||||
<td>
|
||||
<nuxt-link v-if="selectedNarrator?.id !== narrator.id" :to="`/library/${currentLibraryId}/bookshelf?filter=narrators.${narrator.id}`" class="text-sm md:text-base text-gray-100 hover:underline">{{ narrator.name }}</nuxt-link>
|
||||
<p v-if="selectedNarrator?.id !== narrator.id" class="text-sm md:text-base text-gray-100">{{ narrator.name }}</p>
|
||||
<form v-else @submit.prevent="saveClick">
|
||||
<ui-text-input v-model="newNarratorName" />
|
||||
</form>
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
export default function ({ $axios, store, $root, app }) {
|
||||
export default function ({ $axios, store, $config, app }) {
|
||||
// Track if we're currently refreshing to prevent multiple refresh attempts
|
||||
let isRefreshing = false
|
||||
let failedQueue = []
|
||||
|
|
@ -82,11 +82,6 @@ export default function ({ $axios, store, $root, app }) {
|
|||
// Update the token in store and localStorage
|
||||
store.commit('user/setUser', response.user)
|
||||
|
||||
// Emit event used to re-authenticate socket in default.vue since $root is not available here
|
||||
if (app.$eventBus) {
|
||||
app.$eventBus.$emit('token_refreshed', newAccessToken)
|
||||
}
|
||||
|
||||
// Update the original request with new token
|
||||
if (!originalRequest.headers) {
|
||||
originalRequest.headers = {}
|
||||
|
|
|
|||
|
|
@ -918,8 +918,6 @@
|
|||
"NotificationOnBackupCompletedDescription": "Spuštěno po dokončení zálohování",
|
||||
"NotificationOnBackupFailedDescription": "Spuštěno pokud zálohování selže",
|
||||
"NotificationOnEpisodeDownloadedDescription": "Spuštěno při automatickém stažení epizody podcastu",
|
||||
"NotificationOnRSSFeedDisabledDescription": "Aktivováno když je automatické stahování pozastaveno z důvodu příliš mnoho neůspěšných pokusů",
|
||||
"NotificationOnRSSFeedFailedDescription": "Aktivováno když selže RSS kanál pro stahování epizod",
|
||||
"NotificationOnTestDescription": "Akce pro otestování upozorňovacího systému",
|
||||
"PlaceholderNewCollection": "Nový název kolekce",
|
||||
"PlaceholderNewFolderPath": "Nová cesta ke složce",
|
||||
|
|
@ -964,7 +962,7 @@
|
|||
"ToastBackupRestoreFailed": "Nepodařilo se obnovit zálohu",
|
||||
"ToastBackupUploadFailed": "Nepodařilo se nahrát zálohu",
|
||||
"ToastBackupUploadSuccess": "Záloha nahrána",
|
||||
"ToastBatchApplyDetailsToItemsSuccess": "Detaily byly aplikované na položky",
|
||||
"ToastBatchApplyDetailsToItemsSuccess": "Detaily aplikované na položky",
|
||||
"ToastBatchDeleteFailed": "Hromadné smazání selhalo",
|
||||
"ToastBatchDeleteSuccess": "Hromadné smazání proběhlo úspěšně",
|
||||
"ToastBatchQuickMatchFailed": "Rychlá schoda dávky se nezdařila!",
|
||||
|
|
@ -978,7 +976,7 @@
|
|||
"ToastCachePurgeSuccess": "Vyrovnávací paměť úspěšně vyčištěna",
|
||||
"ToastChaptersHaveErrors": "Kapitoly obsahují chyby",
|
||||
"ToastChaptersInvalidShiftAmountLast": "Nesprávná délka posunu. Čas začátku poslední kapitoly by přesáhl dobu trvání této audioknihy.",
|
||||
"ToastChaptersInvalidShiftAmountStart": "Nesprávná délka posunu. První kapitola by měla nulovou nebo zápornou délku a byla by přepsána druhou kapitolou. Zvětšete čas začátku druhé kapitoly.",
|
||||
"ToastChaptersInvalidShiftAmountStart": "Nesprávná délka posunu. První kapitola by měla nulovou nebo zápornou délku a byla by přepsána druhou kapitolou. Zvětšete počáteční délku druhé kapitoly.",
|
||||
"ToastChaptersMustHaveTitles": "Kapitoly musí mít názvy",
|
||||
"ToastChaptersRemoved": "Kapitoly odstraněny",
|
||||
"ToastChaptersUpdated": "Kapitola aktualizována",
|
||||
|
|
|
|||
|
|
@ -177,7 +177,6 @@
|
|||
"HeaderPlaylist": "Afspilningsliste",
|
||||
"HeaderPlaylistItems": "Afspilningsliste Elementer",
|
||||
"HeaderPodcastsToAdd": "Podcasts til Tilføjelse",
|
||||
"HeaderPresets": "Forudindstillinger",
|
||||
"HeaderPreviewCover": "Forhåndsvis Omslag",
|
||||
"HeaderRSSFeedGeneral": "RSS Detaljer",
|
||||
"HeaderRSSFeedIsOpen": "RSS Feed er Åben",
|
||||
|
|
@ -531,7 +530,6 @@
|
|||
"LabelReleaseDate": "Udgivelsesdato",
|
||||
"LabelRemoveAllMetadataAbs": "Fjern alle metadata.abs filer",
|
||||
"LabelRemoveAllMetadataJson": "Fjern alle metadata.json filer",
|
||||
"LabelRemoveAudibleBranding": "Fjern Audible intro og outro fra kapitler",
|
||||
"LabelRemoveCover": "Fjern omslag",
|
||||
"LabelRemoveMetadataFile": "Fjern alle metadata filer i biblioteksmapper",
|
||||
"LabelRemoveMetadataFileHelp": "Fjern alle metadata.json og metadata.abs filer i dine {0} mapper.",
|
||||
|
|
@ -606,7 +604,6 @@
|
|||
"LabelSlug": "Snegl",
|
||||
"LabelSortAscending": "Stigende",
|
||||
"LabelSortDescending": "Faldende",
|
||||
"LabelSortPubDate": "Sortér Pub Dato",
|
||||
"LabelStart": "Start",
|
||||
"LabelStartTime": "Starttid",
|
||||
"LabelStarted": "Startet",
|
||||
|
|
@ -707,8 +704,6 @@
|
|||
"LabelYourProgress": "Din fremgang",
|
||||
"MessageAddToPlayerQueue": "Tilføj til afspilningskø",
|
||||
"MessageAppriseDescription": "For at bruge denne funktion skal du have en instans af <a href=\"https://github.com/caronc/apprise-api\" target=\"_blank\">Apprise API</a> kørende eller en API, der håndterer de samme anmodninger. <br /> Apprise API-webadressen skal være den fulde URL-sti for at sende underretningen, f.eks. hvis din API-instans er tilgængelig på <code>http://192.168.1.1:8337</code>, så skal du bruge <code>http://192.168.1.1:8337/notify</code>.",
|
||||
"MessageAsinCheck": "Sikr dig at du bruger ASIN fra den korrekte Audible region, ikke Amazon.",
|
||||
"MessageAuthenticationOIDCChangesRestart": "Genstart sin server efter du har gemt for at bekræfte OIDC ændringer.",
|
||||
"MessageBackupsDescription": "Backups inkluderer brugere, brugerfremskridt, biblioteksvareoplysninger, serverindstillinger og billeder gemt i <code>/metadata/items</code> og <code>/metadata/authors</code>. Backups inkluderer <strong>ikke</strong> nogen filer gemt i dine biblioteksmapper.",
|
||||
"MessageBackupsLocationEditNote": "Note: Opdatering af backup sti vil ikke fjerne eller modificere eksisterende backups",
|
||||
"MessageBackupsLocationNoEditNote": "Note: Backup sti er sat igennem miljøvariabel og kan ikke ændres her.",
|
||||
|
|
@ -727,7 +722,6 @@
|
|||
"MessageChapterErrorStartGteDuration": "Ugyldig starttid skal være mindre end lydbogens varighed",
|
||||
"MessageChapterErrorStartLtPrev": "Ugyldig starttid skal være større end eller lig med den foregående kapitels starttid",
|
||||
"MessageChapterStartIsAfter": "Kapitelstarten er efter slutningen af din lydbog",
|
||||
"MessageChaptersNotFound": "Kapitler ikke fundet",
|
||||
"MessageCheckingCron": "Tjekker cron...",
|
||||
"MessageConfirmCloseFeed": "Er du sikker på, at du vil lukke dette feed?",
|
||||
"MessageConfirmDeleteBackup": "Er du sikker på, at du vil slette backup for {0}?",
|
||||
|
|
@ -784,7 +778,6 @@
|
|||
"MessageForceReScanDescription": "vil scanne alle filer igen som en frisk scanning. Lydfilens ID3-tags, OPF-filer og tekstfiler scannes som nye.",
|
||||
"MessageImportantNotice": "Vigtig besked!",
|
||||
"MessageInsertChapterBelow": "Indsæt kapitel nedenfor",
|
||||
"MessageInvalidAsin": "Ugyldig ASIN",
|
||||
"MessageItemsSelected": "{0} elementer valgt",
|
||||
"MessageItemsUpdated": "{0} elementer opdateret",
|
||||
"MessageJoinUsOn": "Deltag i os på",
|
||||
|
|
@ -856,7 +849,6 @@
|
|||
"MessageScheduleRunEveryWeekdayAtTime": "Kør hvert {0} af {1}",
|
||||
"MessageSearchResultsFor": "Søgeresultater for",
|
||||
"MessageSelected": "{0} valgt",
|
||||
"MessageSeriesSequenceCannotContainSpaces": "Serie sekvens kan ikke indeholde mellemrum",
|
||||
"MessageServerCouldNotBeReached": "Serveren kunne ikke nås",
|
||||
"MessageSetChaptersFromTracksDescription": "Indstil kapitler ved at bruge hver lydfil som et kapitel og kapiteloverskrift som lydfilnavn",
|
||||
"MessageShareExpirationWillBe": "Udløb vil være <strong>{0}</strong>",
|
||||
|
|
@ -918,8 +910,6 @@
|
|||
"NotificationOnBackupCompletedDescription": "Udløst når backup er færdig",
|
||||
"NotificationOnBackupFailedDescription": "Udløst når backup fejler",
|
||||
"NotificationOnEpisodeDownloadedDescription": "Udløst når et podcast afsnit er automatisk downloadet",
|
||||
"NotificationOnRSSFeedDisabledDescription": "Aktiveret når automatiske episode-downloads er slået fra, på grund af for mange forsøg",
|
||||
"NotificationOnRSSFeedFailedDescription": "Aktiveret når anmodning om RSS-feedet fejler for en automatisk episode-download",
|
||||
"NotificationOnTestDescription": "Event for test af notifikationssystemet",
|
||||
"PlaceholderNewCollection": "Nyt samlingnavn",
|
||||
"PlaceholderNewFolderPath": "Ny mappes sti",
|
||||
|
|
@ -964,7 +954,6 @@
|
|||
"ToastBackupRestoreFailed": "Mislykkedes gendannelse af sikkerhedskopi",
|
||||
"ToastBackupUploadFailed": "Mislykkedes upload af sikkerhedskopi",
|
||||
"ToastBackupUploadSuccess": "Sikkerhedskopi uploadet",
|
||||
"ToastBatchApplyDetailsToItemsSuccess": "Detaljer bekræftet på element",
|
||||
"ToastBatchDeleteFailed": "Batch slet fejlede",
|
||||
"ToastBatchDeleteSuccess": "Batch slet succes",
|
||||
"ToastBatchQuickMatchFailed": "Batch Hurtig Match fejlede!",
|
||||
|
|
|
|||
|
|
@ -53,7 +53,7 @@
|
|||
"ButtonNext": "Vor",
|
||||
"ButtonNextChapter": "Nächstes Kapitel",
|
||||
"ButtonNextItemInQueue": "Das nächste Element in der Warteschlange",
|
||||
"ButtonOk": "Ok",
|
||||
"ButtonOk": "Einverstanden",
|
||||
"ButtonOpenFeed": "Feed öffnen",
|
||||
"ButtonOpenManager": "Manager öffnen",
|
||||
"ButtonPause": "Pausieren",
|
||||
|
|
@ -708,7 +708,7 @@
|
|||
"MessageAddToPlayerQueue": "Zur Abspielwarteliste hinzufügen",
|
||||
"MessageAppriseDescription": "Um diese Funktion nutzen zu können, musst du eine Instanz von <a href=\"https://github.com/caronc/apprise-api\" target=\"_blank\">Apprise API</a> laufen haben oder eine API verwenden welche dieselbe Anfragen bearbeiten kann. <br />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 <code>http://192.168.1.1:8337</code> läuft, würdest du <code>http://192.168.1.1:8337/notify</code> eingeben.",
|
||||
"MessageAsinCheck": "Stellen Sie sicher, dass Sie die ASIN aus der richtigen Audible Region verwenden, nicht Amazon.",
|
||||
"MessageAuthenticationOIDCChangesRestart": "Nach dem Speichern muss der Server neugestartet werden um die OIDC Änderungen zu übernehmen.",
|
||||
"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 <code>/metadata/items</code> & <code>/metadata/authors</code> 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.",
|
||||
|
|
@ -852,7 +852,7 @@
|
|||
"MessageResetChaptersConfirm": "Kapitel und vorgenommenen Änderungen werden zurückgesetzt und rückgängig gemacht! Bist du dir sicher?",
|
||||
"MessageRestoreBackupConfirm": "Bist du dir sicher, dass du die Sicherung wiederherstellen willst, welche am",
|
||||
"MessageRestoreBackupWarning": "Bei der Wiederherstellung einer Sicherung wird die gesamte Datenbank unter /config und die Titelbilder in /metadata/items und /metadata/authors überschrieben.<br /><br />Bei der Sicherung werden keine Dateien in deinen Bibliotheksordnern verändert. Wenn du die Servereinstellungen aktiviert hast, um Cover und Metadaten in deinen Bibliotheksordnern zu speichern, werden diese nicht gesichert oder überschrieben.<br /><br />Alle Clients, die Ihren Server nutzen, werden automatisch aktualisiert.",
|
||||
"MessageScheduleLibraryScanNote": "Für die meisten Anwender wird empfohlen, diese Funktion deaktiviert und die Ordnerüberwachung aktiviert zu lassen. Die Ordnerüberwachung wird Änderungen in den Bibliotheksordnern automatisch erkennen. Die Ordnerüberwachung funktioniert nicht mit allen Dateisystemen (wie NFS), hier kann stattdessen die automatischen Bibliothekssuchen verwendet werden.",
|
||||
"MessageScheduleLibraryScanNote": "Für die meisten Nutzer wird empfohlen, diese Funktion deaktiviert zu lassen und stattdessen die Ordnerüberwachung aktiviert zu lassen. Die Ordnerüberwachung erkennt automatisch Änderungen in deinen Bibliotheksordnern. Da die Ordnerüberwachung jedoch nicht mit jedem Dateisystem (z.B. NFS) funktioniert, können alternativ hier geplante Bibliotheks-Scans aktiviert werden.",
|
||||
"MessageScheduleRunEveryWeekdayAtTime": "Immer {0} um {1} ausführen",
|
||||
"MessageSearchResultsFor": "Suchergebnisse für",
|
||||
"MessageSelected": "{0} ausgewählt",
|
||||
|
|
@ -918,8 +918,6 @@
|
|||
"NotificationOnBackupCompletedDescription": "Wird ausgeführt wenn ein Backup erstellt wurde",
|
||||
"NotificationOnBackupFailedDescription": "Wird ausgeführt wenn ein Backup fehlgeschlagen ist",
|
||||
"NotificationOnEpisodeDownloadedDescription": "Wird ausgeführt wenn eine Podcast Folge automatisch heruntergeladen wird",
|
||||
"NotificationOnRSSFeedDisabledDescription": "Wird ausgeführt wenn automatische Downloads von Episoden wegen zu vielen fehlgeschlagenen Versuchen deaktiviert sind",
|
||||
"NotificationOnRSSFeedFailedDescription": "Wird ausgelöst, wenn die RSS-Feed-Anforderung für einen automatischen Episoden-Download fehlschlägt",
|
||||
"NotificationOnTestDescription": "Wird ausgeführt wenn das Benachrichtigungssystem getestet wird",
|
||||
"PlaceholderNewCollection": "Neuer Sammlungsname",
|
||||
"PlaceholderNewFolderPath": "Neuer Ordnerpfad",
|
||||
|
|
|
|||
|
|
@ -773,7 +773,6 @@
|
|||
"MessageConfirmRemoveAuthor": "Are you sure you want to remove author \"{0}\"?",
|
||||
"MessageConfirmRemoveCollection": "Are you sure you want to remove collection \"{0}\"?",
|
||||
"MessageConfirmRemoveEpisode": "Are you sure you want to remove episode \"{0}\"?",
|
||||
"MessageConfirmRemoveEpisodeNote": "Note: This does not delete the audio file unless toggling \"Hard delete file\"",
|
||||
"MessageConfirmRemoveEpisodes": "Are you sure you want to remove {0} episodes?",
|
||||
"MessageConfirmRemoveListeningSessions": "Are you sure you want to remove {0} listening sessions?",
|
||||
"MessageConfirmRemoveMetadataFiles": "Are you sure you want to remove all metadata.{0} files in your library item folders?",
|
||||
|
|
|
|||
|
|
@ -918,8 +918,6 @@
|
|||
"NotificationOnBackupCompletedDescription": "Pokreće se po završetku sigurnosnog kopiranja",
|
||||
"NotificationOnBackupFailedDescription": "Pokreće se kada sigurnosno kopiranje ne uspije",
|
||||
"NotificationOnEpisodeDownloadedDescription": "Pokreće se kada se nastavak podcasta automatski preuzme",
|
||||
"NotificationOnRSSFeedDisabledDescription": "Pokreće se kada su automatska preuzimanja nastavaka onemogućena zbog previše neuspjelih pokušaja",
|
||||
"NotificationOnRSSFeedFailedDescription": "Pokreće se u slučaju pogreške pri pokušaju automatskog preuzimanja nastavka s RSS izvora",
|
||||
"NotificationOnTestDescription": "Događaj za testiranje sustava obavijesti",
|
||||
"PlaceholderNewCollection": "Ime nove zbirke",
|
||||
"PlaceholderNewFolderPath": "Nova putanja mape",
|
||||
|
|
|
|||
|
|
@ -514,7 +514,7 @@
|
|||
"LabelPublishers": "Editori",
|
||||
"LabelRSSFeedCustomOwnerEmail": "E-mail del proprietario personalizzato",
|
||||
"LabelRSSFeedCustomOwnerName": "Nome del proprietario personalizzato",
|
||||
"LabelRSSFeedOpen": "Feed RSS aperto",
|
||||
"LabelRSSFeedOpen": "Flusso RSS aperto",
|
||||
"LabelRSSFeedPreventIndexing": "Impedisci l'indicizzazione",
|
||||
"LabelRSSFeedSlug": "Parole chiave del flusso RSS",
|
||||
"LabelRSSFeedURL": "URL del flusso RSS",
|
||||
|
|
@ -918,8 +918,6 @@
|
|||
"NotificationOnBackupCompletedDescription": "Attivato al completamento di un backup",
|
||||
"NotificationOnBackupFailedDescription": "Attivato quando un backup fallisce",
|
||||
"NotificationOnEpisodeDownloadedDescription": "Attivato quando un episodio di podcast viene scaricato automaticamente",
|
||||
"NotificationOnRSSFeedDisabledDescription": "Attivato quando i download automatici degli episodi vengono disabilitati a causa di troppi tentativi falliti",
|
||||
"NotificationOnRSSFeedFailedDescription": "Attivato quando la richiesta del feed RSS per il download automatico di un episodio fallisce",
|
||||
"NotificationOnTestDescription": "test il sistema di notifica",
|
||||
"PlaceholderNewCollection": "Nome Nuova Raccolta",
|
||||
"PlaceholderNewFolderPath": "Nuovo Percorso Cartella",
|
||||
|
|
|
|||
|
|
@ -177,7 +177,6 @@
|
|||
"HeaderPlaylist": "Afspeellijst",
|
||||
"HeaderPlaylistItems": "Onderdelen in afspeellijst",
|
||||
"HeaderPodcastsToAdd": "Toe te voegen podcasts",
|
||||
"HeaderPresets": "Voorinstellingen",
|
||||
"HeaderPreviewCover": "Preview cover",
|
||||
"HeaderRSSFeedGeneral": "RSS-details",
|
||||
"HeaderRSSFeedIsOpen": "RSS-feed is open",
|
||||
|
|
@ -514,7 +513,7 @@
|
|||
"LabelPublishers": "Uitgevers",
|
||||
"LabelRSSFeedCustomOwnerEmail": "Aangepast e-mailadres eigenaar",
|
||||
"LabelRSSFeedCustomOwnerName": "Aangepaste naam eigenaar",
|
||||
"LabelRSSFeedOpen": "RSS Feed Open",
|
||||
"LabelRSSFeedOpen": "RSS-feed open",
|
||||
"LabelRSSFeedPreventIndexing": "Voorkom indexering",
|
||||
"LabelRSSFeedSlug": "RSS-feed slug",
|
||||
"LabelRSSFeedURL": "RSS-feed URL",
|
||||
|
|
@ -606,7 +605,6 @@
|
|||
"LabelSlug": "Slak",
|
||||
"LabelSortAscending": "Oplopend",
|
||||
"LabelSortDescending": "Aflopend",
|
||||
"LabelSortPubDate": "Sorteer Pub Datum",
|
||||
"LabelStart": "Start",
|
||||
"LabelStartTime": "Starttijd",
|
||||
"LabelStarted": "Gestart",
|
||||
|
|
@ -707,8 +705,6 @@
|
|||
"LabelYourProgress": "Je voortgang",
|
||||
"MessageAddToPlayerQueue": "Toevoegen aan wachtrij",
|
||||
"MessageAppriseDescription": "Om deze functie te gebruiken heb je een draaiende instantie van <a href=\"https://github.com/caronc/apprise-api\" target=\"_blank\">Apprise API</a> nodig of een api die dezelfde requests afhandelt. <br />De Apprise API Url moet het volledige URL-pad zijn om de notificatie te verzenden, b.v., als je API-instantie draait op <code>http://192.168.1.1:8337</code> dan zou je <code>http://192.168.1.1:8337/notify</code> gebruiken.",
|
||||
"MessageAsinCheck": "Zorg ervoor dat u de ASIN van de juiste Audible-regio gebruikt, niet die van Amazon.",
|
||||
"MessageAuthenticationOIDCChangesRestart": "Start uw server opnieuw op nadat u het opslaan hebt uitgevoerd, om de OIDC-wijzigingen toe te passen.",
|
||||
"MessageBackupsDescription": "Back-ups omvatten gebruikers, gebruikers' voortgang, bibliotheekonderdeeldetails, serverinstellingen en afbeeldingen bewaard in <code>/metadata/items</code> & <code>/metadata/authors</code>. Back-ups <strong>bevatten niet</strong> de bestanden bewaard in je bibliotheekmappen.",
|
||||
"MessageBackupsLocationEditNote": "Let op: het bijwerken van de back-uplocatie zal bestaande back-ups niet verplaatsen of wijzigen",
|
||||
"MessageBackupsLocationNoEditNote": "Let op: De back-uplocatie wordt ingesteld via een omgevingsvariabele en kan hier niet worden gewijzigd.",
|
||||
|
|
@ -785,8 +781,8 @@
|
|||
"MessageImportantNotice": "Belangrijke opmerking!",
|
||||
"MessageInsertChapterBelow": "Hoofdstuk hieronder invoegen",
|
||||
"MessageInvalidAsin": "Ongeldige ASIN",
|
||||
"MessageItemsSelected": "{0} items geselecteerd",
|
||||
"MessageItemsUpdated": "{0} items bijgewerkt",
|
||||
"MessageItemsSelected": "{0} onderdelen geselecteerd",
|
||||
"MessageItemsUpdated": "{0} onderdelen bijgewerkt",
|
||||
"MessageJoinUsOn": "Doe mee op",
|
||||
"MessageLoading": "Aan het laden...",
|
||||
"MessageLoadingFolders": "Mappen aan het laden...",
|
||||
|
|
@ -853,10 +849,8 @@
|
|||
"MessageRestoreBackupConfirm": "Weet je zeker dat je wil herstellen met behulp van de back-up gemaakt op",
|
||||
"MessageRestoreBackupWarning": "Herstellen met een back-up zal de volledige database in /config en de covers in /metadata/items & /metadata/authors overschrijven.<br /><br />Back-ups wijzigen geen bestanden in je bibliotheekmappen. Als je de serverinstelling gebruikt om covers en metadata in je bibliotheekmappen te bewaren dan worden deze niet geback-upt of overschreven.<br /><br />Alle clients die van je server gebruik maken zullen automatisch worden ververst.",
|
||||
"MessageScheduleLibraryScanNote": "Voor de meeste gebruikers is het raadzaam om deze functie uitgeschakeld te laten en de folder watcher-instelling ingeschakeld te houden. De folder watcher detecteert automatisch wijzigingen in uw bibliotheekmappen. De folder watcher werkt niet voor elk bestandssysteem (zoals NFS), dus geplande bibliotheekscans kunnen in plaats daarvan worden gebruikt.",
|
||||
"MessageScheduleRunEveryWeekdayAtTime": "Elke {0} uitvoeren op {1}",
|
||||
"MessageSearchResultsFor": "Zoekresultaten voor",
|
||||
"MessageSelected": "{0} geselecteerd",
|
||||
"MessageSeriesSequenceCannotContainSpaces": "Serievolgorde mag geen spaties bevatten",
|
||||
"MessageServerCouldNotBeReached": "Server niet bereikbaar",
|
||||
"MessageSetChaptersFromTracksDescription": "Stel hoofdstukken in met ieder audiobestand als een hoofdstuk en de audiobestandsnaam als hoofdstuktitel",
|
||||
"MessageShareExpirationWillBe": "Vervaldatum is <strong>{0}</strong>",
|
||||
|
|
@ -918,8 +912,6 @@
|
|||
"NotificationOnBackupCompletedDescription": "Wordt geactiveerd wanneer een back-up is voltooid",
|
||||
"NotificationOnBackupFailedDescription": "Wordt geactiveerd wanneer een back-up mislukt",
|
||||
"NotificationOnEpisodeDownloadedDescription": "Wordt geactiveerd wanneer een podcastaflevering automatisch wordt gedownload",
|
||||
"NotificationOnRSSFeedDisabledDescription": "Wordt geactiveerd wanneer automatische afleveringsdownloads zijn uitgeschakeld vanwege te veel mislukte pogingen",
|
||||
"NotificationOnRSSFeedFailedDescription": "Getriggerd wanneer de RSS feed aanvraag faalt voor een automatische aflevering download",
|
||||
"NotificationOnTestDescription": "Event voor het testen van het notificatiesysteem",
|
||||
"PlaceholderNewCollection": "Nieuwe naam collectie",
|
||||
"PlaceholderNewFolderPath": "Nieuwe locatie map",
|
||||
|
|
@ -964,7 +956,6 @@
|
|||
"ToastBackupRestoreFailed": "Herstellen back-up mislukt",
|
||||
"ToastBackupUploadFailed": "Uploaden back-up mislukt",
|
||||
"ToastBackupUploadSuccess": "Back-up geüpload",
|
||||
"ToastBatchApplyDetailsToItemsSuccess": "Details toegepast op items",
|
||||
"ToastBatchDeleteFailed": "Batch verwijderen mislukt",
|
||||
"ToastBatchDeleteSuccess": "Batch verwijderen gelukt",
|
||||
"ToastBatchQuickMatchFailed": "Batch Snel Vergelijken mislukt!",
|
||||
|
|
@ -977,8 +968,6 @@
|
|||
"ToastCachePurgeFailed": "Cache wissen is mislukt",
|
||||
"ToastCachePurgeSuccess": "Cache succesvol verwijderd",
|
||||
"ToastChaptersHaveErrors": "Hoofdstukken bevatten fouten",
|
||||
"ToastChaptersInvalidShiftAmountLast": "Ongeldige shift-tijd. De starttijd van het laatste hoofdstuk zou langer zijn dan de duur van dit audioboek.",
|
||||
"ToastChaptersInvalidShiftAmountStart": "Ongeldige shift-lengte. Het eerste hoofdstuk zou nul of een negatieve lengte hebben en zou worden overschreven door het tweede hoofdstuk. Verleng de startduur van het tweede hoofdstuk.",
|
||||
"ToastChaptersMustHaveTitles": "Hoofdstukken moeten titels hebben",
|
||||
"ToastChaptersRemoved": "Hoofdstukken verwijderd",
|
||||
"ToastChaptersUpdated": "Hoofdstukken bijgewerkt",
|
||||
|
|
@ -1079,7 +1068,6 @@
|
|||
"ToastSelectAtLeastOneUser": "Selecteer ten minste een gebruiker",
|
||||
"ToastSendEbookToDeviceFailed": "Ebook naar apparaat sturen mislukt",
|
||||
"ToastSendEbookToDeviceSuccess": "Ebook verstuurd naar apparaat \"{0}\"",
|
||||
"ToastSeriesSubmitFailedSameName": "Kan niet twee series met dezelfde naam toevoegen",
|
||||
"ToastSeriesUpdateFailed": "Bijwerken serie mislukt",
|
||||
"ToastSeriesUpdateSuccess": "Bijwerken serie gelukt",
|
||||
"ToastServerSettingsUpdateSuccess": "Server instellingen bijgewerkt",
|
||||
|
|
@ -1098,8 +1086,6 @@
|
|||
"ToastUnknownError": "Onbekende fout",
|
||||
"ToastUnlinkOpenIdFailed": "Gebruiker ontkoppelen van OpenID mislukt",
|
||||
"ToastUnlinkOpenIdSuccess": "Gebruiker ontkoppeld van OpenID",
|
||||
"ToastUploaderFilepathExistsError": "Bestandspad \"{0}\" bestaat al op de server",
|
||||
"ToastUploaderItemExistsInSubdirectoryError": "Item \"{0}\" gebruikt een submap van het uploadpad.",
|
||||
"ToastUserDeleteFailed": "Verwijderen gebruiker mislukt",
|
||||
"ToastUserDeleteSuccess": "Gebruiker verwijderd",
|
||||
"ToastUserPasswordChangeSuccess": "Wachtwoord succesvol gewijzigd",
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
"ButtonAddChapters": "Додати глави",
|
||||
"ButtonAddDevice": "Додати пристрій",
|
||||
"ButtonAddLibrary": "Додати бібліотеку",
|
||||
"ButtonAddPodcasts": "Додати подкасти",
|
||||
"ButtonAddPodcasts": "Додати подкаст",
|
||||
"ButtonAddUser": "Додати користувача",
|
||||
"ButtonAddYourFirstLibrary": "Додайте вашу першу бібліотеку",
|
||||
"ButtonApply": "Застосувати",
|
||||
|
|
@ -16,7 +16,7 @@
|
|||
"ButtonCancel": "Скасувати",
|
||||
"ButtonCancelEncode": "Скасувати кодування",
|
||||
"ButtonChangeRootPassword": "Змінити кореневий пароль",
|
||||
"ButtonCheckAndDownloadNewEpisodes": "Перевірити та скачати нові епізоди",
|
||||
"ButtonCheckAndDownloadNewEpisodes": "Перевірити та завантажити нові епізоди",
|
||||
"ButtonChooseAFolder": "Обрати теку",
|
||||
"ButtonChooseFiles": "Обрати файли",
|
||||
"ButtonClearFilter": "Очистити фільтр",
|
||||
|
|
@ -32,8 +32,8 @@
|
|||
"ButtonEditChapters": "Редагувати глави",
|
||||
"ButtonEditPodcast": "Редагувати подкаст",
|
||||
"ButtonEnable": "Увімкнути",
|
||||
"ButtonFireAndFail": "Виконати і завершити з помилкою",
|
||||
"ButtonFireOnTest": "Виконати подію onTest",
|
||||
"ButtonFireAndFail": "Вогонь і невдача",
|
||||
"ButtonFireOnTest": "Випробування на вогнестійкість",
|
||||
"ButtonForceReScan": "Примусово сканувати",
|
||||
"ButtonFullPath": "Повний шлях",
|
||||
"ButtonHide": "Приховати",
|
||||
|
|
@ -57,7 +57,7 @@
|
|||
"ButtonOpenFeed": "Відкрити стрічку",
|
||||
"ButtonOpenManager": "Відкрити менеджер",
|
||||
"ButtonPause": "Пауза",
|
||||
"ButtonPlay": "Відтворити",
|
||||
"ButtonPlay": "Слухати",
|
||||
"ButtonPlayAll": "Відтворити все",
|
||||
"ButtonPlaying": "Відтворюється",
|
||||
"ButtonPlaylists": "Списки відтворення",
|
||||
|
|
@ -86,7 +86,7 @@
|
|||
"ButtonResetToDefault": "Скинути до стандартних",
|
||||
"ButtonRestore": "Відновити",
|
||||
"ButtonSave": "Зберегти",
|
||||
"ButtonSaveAndClose": "Зберегти і закрити",
|
||||
"ButtonSaveAndClose": "Зберегти та закрити",
|
||||
"ButtonSaveTracklist": "Зберегти порядок",
|
||||
"ButtonScan": "Сканувати",
|
||||
"ButtonScanLibrary": "Сканувати бібліотеку",
|
||||
|
|
@ -103,7 +103,7 @@
|
|||
"ButtonStartMetadataEmbed": "Почати вбудування метаданих",
|
||||
"ButtonStats": "Статистика",
|
||||
"ButtonSubmit": "Надіслати",
|
||||
"ButtonTest": "Тест",
|
||||
"ButtonTest": "Перевірити",
|
||||
"ButtonUnlinkOpenId": "Вимкнути OpenID",
|
||||
"ButtonUpload": "Завантажити",
|
||||
"ButtonUploadBackup": "Завантажити резервну копію",
|
||||
|
|
@ -115,7 +115,7 @@
|
|||
"ButtonYes": "Так",
|
||||
"ErrorUploadFetchMetadataAPI": "Помилка при отриманні метаданих",
|
||||
"ErrorUploadFetchMetadataNoResults": "Не вдалося отримати метадані — спробуйте оновити заголовок та/або автора",
|
||||
"ErrorUploadLacksTitle": "Потрібна назва",
|
||||
"ErrorUploadLacksTitle": "Назва обов'язкова",
|
||||
"HeaderAccount": "Профіль",
|
||||
"HeaderAddCustomMetadataProvider": "Додати користувацький постачальник метаданих",
|
||||
"HeaderAdvanced": "Розширені",
|
||||
|
|
@ -130,11 +130,11 @@
|
|||
"HeaderCollection": "Добірка",
|
||||
"HeaderCollectionItems": "Елементи добірки",
|
||||
"HeaderCover": "Обкладинка",
|
||||
"HeaderCurrentDownloads": "Поточні скачування",
|
||||
"HeaderCurrentDownloads": "Поточні завантаження",
|
||||
"HeaderCustomMessageOnLogin": "Повідомлення при вході",
|
||||
"HeaderCustomMetadataProviders": "Постачальники метаданих",
|
||||
"HeaderDetails": "Подробиці",
|
||||
"HeaderDownloadQueue": "Черга скачувань",
|
||||
"HeaderDownloadQueue": "Черга завантажень",
|
||||
"HeaderEbookFiles": "Файли електронних книг",
|
||||
"HeaderEmail": "Електронна пошта",
|
||||
"HeaderEmailSettings": "Налаштування електронної пошти",
|
||||
|
|
@ -152,13 +152,13 @@
|
|||
"HeaderLibraryFiles": "Файли бібліотеки",
|
||||
"HeaderLibraryStats": "Статистика бібліотеки",
|
||||
"HeaderListeningSessions": "Сеанси прослуховування",
|
||||
"HeaderListeningStats": "Статистика прослуховування",
|
||||
"HeaderListeningStats": "Статистика відтворення",
|
||||
"HeaderLogin": "Вхід",
|
||||
"HeaderLogs": "Журнал",
|
||||
"HeaderManageGenres": "Керувати жанрами",
|
||||
"HeaderManageTags": "Керувати мітками",
|
||||
"HeaderMapDetails": "Призначити подробиці",
|
||||
"HeaderMatch": "Допасуй",
|
||||
"HeaderMatch": "Пошук",
|
||||
"HeaderMetadataOrderOfPrecedence": "Порядок метаданих",
|
||||
"HeaderMetadataToEmbed": "Вбудувати метадані",
|
||||
"HeaderNewAccount": "Новий профіль",
|
||||
|
|
@ -176,7 +176,7 @@
|
|||
"HeaderPlayerSettings": "Налаштування програвача",
|
||||
"HeaderPlaylist": "Список відтворення",
|
||||
"HeaderPlaylistItems": "Елементи списку відтворення",
|
||||
"HeaderPodcastsToAdd": "Подкасти для додання",
|
||||
"HeaderPodcastsToAdd": "Додати подкасти",
|
||||
"HeaderPresets": "Пресети",
|
||||
"HeaderPreviewCover": "Попередній перегляд",
|
||||
"HeaderRSSFeedGeneral": "Подробиці RSS",
|
||||
|
|
@ -186,7 +186,7 @@
|
|||
"HeaderRemoveEpisodes": "Видалити епізодів: {0}",
|
||||
"HeaderSavedMediaProgress": "Збережений прогрес медіа",
|
||||
"HeaderSchedule": "Розклад",
|
||||
"HeaderScheduleEpisodeDownloads": "Запланувати автоматичне скачування епізодів",
|
||||
"HeaderScheduleEpisodeDownloads": "Запланувати автоматичне завантаження епізодів",
|
||||
"HeaderScheduleLibraryScans": "Розклад автосканування бібліотеки",
|
||||
"HeaderSession": "Сеанс",
|
||||
"HeaderSetBackupSchedule": "Встановити розклад резервного копіювання",
|
||||
|
|
@ -223,21 +223,21 @@
|
|||
"LabelActivities": "Діяльність",
|
||||
"LabelActivity": "Активність",
|
||||
"LabelAddToCollection": "Додати у добірку",
|
||||
"LabelAddToCollectionBatch": "Додати {0} книг до добірки",
|
||||
"LabelAddToCollectionBatch": "Додати книги до добірки: {0}",
|
||||
"LabelAddToPlaylist": "Додати до списку відтворення",
|
||||
"LabelAddToPlaylistBatch": "Додати {0} елементів до списку відтворення",
|
||||
"LabelAddToPlaylistBatch": "Додано елементів у список відтворення: {0}",
|
||||
"LabelAddedAt": "Дата додавання",
|
||||
"LabelAddedDate": "Додано {0}",
|
||||
"LabelAdminUsersOnly": "Тільки для адміністраторів",
|
||||
"LabelAll": "Усе",
|
||||
"LabelAllEpisodesDownloaded": "Усі епізоди скачано",
|
||||
"LabelAllEpisodesDownloaded": "Усі серії завантажено",
|
||||
"LabelAllUsers": "Усі користувачі",
|
||||
"LabelAllUsersExcludingGuests": "Усі, крім гостей",
|
||||
"LabelAllUsersIncludingGuests": "Усі, включно з гостями",
|
||||
"LabelAlreadyInYourLibrary": "Вже у вашій бібліотеці",
|
||||
"LabelApiToken": "Токен API",
|
||||
"LabelAppend": "Додати",
|
||||
"LabelAudioBitrate": "Бітрейт аудіо (наприклад, 128k)",
|
||||
"LabelAudioBitrate": "Бітрейт аудіо (напр. 128k)",
|
||||
"LabelAudioChannels": "Канали аудіо (1 або 2)",
|
||||
"LabelAudioCodec": "Аудіокодек",
|
||||
"LabelAuthor": "Автор",
|
||||
|
|
@ -256,18 +256,18 @@
|
|||
"LabelBackupLocation": "Розташування резервних копій",
|
||||
"LabelBackupsEnableAutomaticBackups": "Автоматичне резервне копіювання",
|
||||
"LabelBackupsEnableAutomaticBackupsHelp": "Резервні копії збережено у /metadata/backups",
|
||||
"LabelBackupsMaxBackupSize": "Максимальний розмір резервної копії (у ГБ) (0 — без обмежень)",
|
||||
"LabelBackupsMaxBackupSize": "Максимальний розмір резервної копії (у ГБ) (0 — необмежене)",
|
||||
"LabelBackupsMaxBackupSizeHelp": "У якості захисту від неправильного налаштування, резервну копію не буде збережено, якщо її розмір перевищуватиме вказаний.",
|
||||
"LabelBackupsNumberToKeep": "Кількість резервних копій",
|
||||
"LabelBackupsNumberToKeepHelp": "Видаляється лише 1 резервна копія за раз, тому якщо у вас більше копій, видаліть їх вручну.",
|
||||
"LabelBackupsNumberToKeepHelp": "Лиш 1 резервну копію буде видалено за раз, тож якщо їх багато, то вам варто видалити їх вручну.",
|
||||
"LabelBitrate": "Бітрейт",
|
||||
"LabelBonus": "Бонус",
|
||||
"LabelBooks": "Книг",
|
||||
"LabelBooks": "Книги",
|
||||
"LabelButtonText": "Текст кнопки",
|
||||
"LabelByAuthor": "від {0}",
|
||||
"LabelChangePassword": "Змінити пароль",
|
||||
"LabelChannels": "Канали",
|
||||
"LabelChapterCount": "{0} глав",
|
||||
"LabelChapterCount": "{0} Глав",
|
||||
"LabelChapterTitle": "Назва глави",
|
||||
"LabelChapters": "Глави",
|
||||
"LabelChaptersFound": "глав знайдено",
|
||||
|
|
@ -304,9 +304,9 @@
|
|||
"LabelDiscFromFilename": "Диск за назвою файлу",
|
||||
"LabelDiscFromMetadata": "Диск за метаданими",
|
||||
"LabelDiscover": "Огляд",
|
||||
"LabelDownload": "Скачати",
|
||||
"LabelDownloadNEpisodes": "Скачати {0} епізодів",
|
||||
"LabelDownloadable": "Можна скачати",
|
||||
"LabelDownload": "Завантажити",
|
||||
"LabelDownloadNEpisodes": "Завантажити епізодів: {0}",
|
||||
"LabelDownloadable": "Можна завантажити",
|
||||
"LabelDuration": "Тривалість",
|
||||
"LabelDurationComparisonExactMatch": "(повний збіг)",
|
||||
"LabelDurationComparisonLonger": "(на {0} довше)",
|
||||
|
|
@ -353,9 +353,9 @@
|
|||
"LabelFeedURL": "Адреса стрічки",
|
||||
"LabelFetchingMetadata": "Отримання метаданих",
|
||||
"LabelFile": "Файл",
|
||||
"LabelFileBirthtime": "Дата створення файлу",
|
||||
"LabelFileBirthtime": "Дата створення",
|
||||
"LabelFileBornDate": "Народився {0}",
|
||||
"LabelFileModified": "Дата зміни файлу",
|
||||
"LabelFileModified": "Дата змінення",
|
||||
"LabelFileModifiedDate": "Змінено {0}",
|
||||
"LabelFilename": "Ім'я файлу",
|
||||
"LabelFilterByUser": "Фільтрувати за користувачем",
|
||||
|
|
@ -395,7 +395,7 @@
|
|||
"LabelIntervalEvery6Hours": "Кожні 6 годин",
|
||||
"LabelIntervalEveryDay": "Щодня",
|
||||
"LabelIntervalEveryHour": "Щогодини",
|
||||
"LabelIntervalEveryMinute": "Щохвилини",
|
||||
"LabelIntervalEveryMinute": "Кожну хвилину",
|
||||
"LabelInvert": "Інвертувати",
|
||||
"LabelItem": "Елемент",
|
||||
"LabelJumpBackwardAmount": "Час переходу назад",
|
||||
|
|
@ -427,10 +427,10 @@
|
|||
"LabelLowestPriority": "Найнижчий пріоритет",
|
||||
"LabelMatchExistingUsersBy": "Шукати наявних користувачів за",
|
||||
"LabelMatchExistingUsersByDescription": "Використовується для підключення наявних користувачів. Після підключення користувач отримає унікальний id від вашого сервісу SSO",
|
||||
"LabelMaxEpisodesToDownload": "Максимальна кількість епізодів для скачування. Використовуйте 0 для необмеженої кількості.",
|
||||
"LabelMaxEpisodesToDownloadPerCheck": "Максимальна кількість нових епізодів для скачування за перевірку",
|
||||
"LabelMaxEpisodesToDownload": "Максимальна кількість епізодів для завантаження. Використовуйте 0 для необмеженої кількості.",
|
||||
"LabelMaxEpisodesToDownloadPerCheck": "Максимальна кількість нових епізодів для завантаження за перевірку",
|
||||
"LabelMaxEpisodesToKeep": "Максимальна кількість епізодів для зберігання",
|
||||
"LabelMaxEpisodesToKeepHelp": "Значення 0 — без обмежень. Після автоматичного завантаження нового епізоду буде видалено найстаріший, якщо їх більше X. Видаляється лише 1 епізод за одне нове завантаження.",
|
||||
"LabelMaxEpisodesToKeepHelp": "Значення 0 не встановлює обмеження. Після автоматичного завантаження нового епізоду, буде видалено найстаріший епізод, якщо у вас більше ніж X епізодів. Видаляється лише 1 епізод за одне нове завантаження.",
|
||||
"LabelMediaPlayer": "Програвач медіа",
|
||||
"LabelMediaType": "Тип медіа",
|
||||
"LabelMetaTag": "Метатег",
|
||||
|
|
@ -485,7 +485,7 @@
|
|||
"LabelPermissionsAccessExplicitContent": "Доступ до відвертого вмісту",
|
||||
"LabelPermissionsCreateEreader": "Можна створити читалку",
|
||||
"LabelPermissionsDelete": "Може видаляти",
|
||||
"LabelPermissionsDownload": "Може скачувати",
|
||||
"LabelPermissionsDownload": "Може завантажувати",
|
||||
"LabelPermissionsUpdate": "Може оновлювати",
|
||||
"LabelPermissionsUpload": "Може завантажувати",
|
||||
"LabelPersonalYearReview": "Ваші підсумки року ({0})",
|
||||
|
|
@ -542,8 +542,8 @@
|
|||
"LabelSeason": "Сезон",
|
||||
"LabelSeasonNumber": "Сезон #{0}",
|
||||
"LabelSelectAll": "Вибрати все",
|
||||
"LabelSelectAllEpisodes": "Вибрати всі епізоди",
|
||||
"LabelSelectEpisodesShowing": "Вибрати {0} показаних епізодів",
|
||||
"LabelSelectAllEpisodes": "Вибрати всі серії",
|
||||
"LabelSelectEpisodesShowing": "Обрати показані епізоди: {0}",
|
||||
"LabelSelectUsers": "Вибрати користувачів",
|
||||
"LabelSendEbookToDevice": "Надіслати електронну книгу на...",
|
||||
"LabelSequence": "Послідовність",
|
||||
|
|
@ -595,7 +595,7 @@
|
|||
"LabelSettingsStoreMetadataWithItemHelp": "За замовчуванням файли метаданих зберігаються у /metadata/items. Цей параметр увімкне збереження метаданих у теці елемента бібліотеки",
|
||||
"LabelSettingsTimeFormat": "Формат часу",
|
||||
"LabelShare": "Поділитися",
|
||||
"LabelShareDownloadableHelp": "Дозволяє користувачам із посиланням для спільного доступу скачування zip-файлу елемента бібліотеки.",
|
||||
"LabelShareDownloadableHelp": "Дозволяє користувачам із посиланням для спільного доступу завантажувати zip-файл елемента бібліотеки.",
|
||||
"LabelShareOpen": "Поділитися відкрито",
|
||||
"LabelShareURL": "Поділитися URL",
|
||||
"LabelShowAll": "Показати все",
|
||||
|
|
@ -714,19 +714,19 @@
|
|||
"MessageBackupsLocationNoEditNote": "Примітка: розташування резервної копії встановлюється за допомогою змінної середовища та не може бути змінене тут.",
|
||||
"MessageBackupsLocationPathEmpty": "Шлях розташування резервної копії не може бути порожнім",
|
||||
"MessageBatchEditPopulateMapDetailsAllHelp": "Заповнити увімкнені поля даними з усіх елементів. Поля з кількома значеннями буде об’єднано",
|
||||
"MessageBatchEditPopulateMapDetailsItemHelp": "Заповнити увімкнені поля деталізації даними з цього елемента",
|
||||
"MessageBatchEditPopulateMapDetailsItemHelp": "Заповніть увімкнені поля деталей карти даними з цього елемента",
|
||||
"MessageBatchQuickMatchDescription": "Швидкий пошук спробує знайти відсутні обкладинки та метадані обраних елементів. Увімкніть налаштування нижче, аби дозволити заміну наявних обкладинок та/або метаданих під час швидкого пошуку.",
|
||||
"MessageBookshelfNoCollections": "Ви ще не створили жодної добірки",
|
||||
"MessageBookshelfNoCollections": "Ви не створили жодної добірки",
|
||||
"MessageBookshelfNoCollectionsHelp": "Колекції публічні. Їх можуть бачити всі користувачі, які мають доступ до бібліотеки.",
|
||||
"MessageBookshelfNoRSSFeeds": "Немає відкритих RSS-каналів",
|
||||
"MessageBookshelfNoResultsForFilter": "Немає результатів з фільтром \"{0}: {1}\"",
|
||||
"MessageBookshelfNoResultsForQuery": "Немає результатів за запитом",
|
||||
"MessageBookshelfNoSeries": "У вас немає серій",
|
||||
"MessageChapterEndIsAfter": "Кінець глави після завершення аудіокниги",
|
||||
"MessageChapterErrorFirstNotZero": "Перша глава повинна починатися з 0",
|
||||
"MessageChapterErrorStartGteDuration": "Час початку має бути меншим за тривалість аудіокниги",
|
||||
"MessageChapterErrorStartLtPrev": "Час початку має бути більшим або рівним часу початку попередньої глави",
|
||||
"MessageChapterStartIsAfter": "Початок глави після завершення аудіокниги",
|
||||
"MessageBookshelfNoSeries": "Серії відсутні",
|
||||
"MessageChapterEndIsAfter": "Кінець глави знаходиться після закінчення книги",
|
||||
"MessageChapterErrorFirstNotZero": "Перша глава мусить починатися з 0",
|
||||
"MessageChapterErrorStartGteDuration": "Час початку мусить бути меншим за тривалість аудіокниги",
|
||||
"MessageChapterErrorStartLtPrev": "Неприпустимий час початку, має бути більшим за час початку попередньої глави",
|
||||
"MessageChapterStartIsAfter": "Початок глави знаходиться після закінчення книги",
|
||||
"MessageChaptersNotFound": "Розділи не знайдені",
|
||||
"MessageCheckingCron": "Перевірка планувальника...",
|
||||
"MessageConfirmCloseFeed": "Ви дійсно бажаєте закрити цей канал?",
|
||||
|
|
@ -734,25 +734,25 @@
|
|||
"MessageConfirmDeleteDevice": "Ви впевнені, що хочете видалити пристрій для читання \"{0}\"?",
|
||||
"MessageConfirmDeleteFile": "Файл буде видалено з вашої файлової системи. Ви впевнені?",
|
||||
"MessageConfirmDeleteLibrary": "Ви дійсно бажаєте назавжди видалити бібліотеку \"{0}\"?",
|
||||
"MessageConfirmDeleteLibraryItem": "Елемент бібліотеки буде видалено з бази даних і файлової системи. Ви впевнені?",
|
||||
"MessageConfirmDeleteLibraryItems": "Буде видалено {0} елементів бібліотеки з бази даних і файлової системи. Ви впевнені?",
|
||||
"MessageConfirmDeleteLibraryItem": "Елемент бібліотеки буде видалено з бази даних та вашої файлової системи. Ви впевнені?",
|
||||
"MessageConfirmDeleteLibraryItems": "З бази даних та вашої файлової системи будуть видалені елементи бібліотеки: {0}. Ви впевнені?",
|
||||
"MessageConfirmDeleteMetadataProvider": "Ви впевнені, що хочете видалити користувацького постачальника метаданих \"{0}\"?",
|
||||
"MessageConfirmDeleteNotification": "Ви впевнені, що хочете видалити це сповіщення?",
|
||||
"MessageConfirmDeleteSession": "Ви дійсно бажаєте видалити цей сеанс?",
|
||||
"MessageConfirmEmbedMetadataInAudioFiles": "Ви впевнені, що хочете вбудувати метадані у {0} аудіофайлів?",
|
||||
"MessageConfirmEmbedMetadataInAudioFiles": "Ви впевнені, що хочете вставити метадані в {0} аудіофайлів?",
|
||||
"MessageConfirmForceReScan": "Ви дійсно бажаєте примусово пересканувати?",
|
||||
"MessageConfirmMarkAllEpisodesFinished": "Ви впевнені, що хочете позначити всі епізоди завершеними?",
|
||||
"MessageConfirmMarkAllEpisodesNotFinished": "Ви впевнені, що хочете позначити всі епізоди незавершеними?",
|
||||
"MessageConfirmMarkAllEpisodesFinished": "Ви дійсно бажаєте позначити усі епізоди завершеними?",
|
||||
"MessageConfirmMarkAllEpisodesNotFinished": "Ви дійсно бажаєте позначити усі епізоди незавершеними?",
|
||||
"MessageConfirmMarkItemFinished": "Ви впевнені, що хочете позначити \"{0}\" як завершене?",
|
||||
"MessageConfirmMarkItemNotFinished": "Ви впевнені, що хочете позначити \"{0}\" як незавершене?",
|
||||
"MessageConfirmMarkSeriesFinished": "Ви дійсно бажаєте позначити усі книги серії завершеними?",
|
||||
"MessageConfirmMarkSeriesNotFinished": "Ви дійсно бажаєте позначити всі книги серії незавершеними?",
|
||||
"MessageConfirmNotificationTestTrigger": "Активувати це сповіщення з тестовими даними?",
|
||||
"MessageConfirmPurgeCache": "Очищення кешу видалить всю теку <code>/metadata/cache</code>. <br /><br />Ви впевнені, що хочете видалити теку кешу?",
|
||||
"MessageConfirmPurgeItemsCache": "Очищення кешу елементів видалить всю теку <code>/metadata/cache/items</code>.<br />Ви впевнені?",
|
||||
"MessageConfirmQuickEmbed": "Увага! Швидке вбудовування не створює резервних копій ваших аудіофайлів. Переконайтеся, що маєте резервну копію. <br><br>Продовжити?",
|
||||
"MessageConfirmQuickMatchEpisodes": "Швидке співставлення епізодів перезапише подробиці, якщо знайдено відповідність. Оновлюються лише невідповідні епізоди. Ви впевнені?",
|
||||
"MessageConfirmReScanLibraryItems": "Ви впевнені, що хочете пересканувати {0} елементів?",
|
||||
"MessageConfirmPurgeCache": "Очищення кешу видалить усю теку <code>/metadata/cache</code>. <br /><br />Ви дійсно бажаєте видалити теку кешу?",
|
||||
"MessageConfirmPurgeItemsCache": "Очищення кешу елементів видалить усю теку <code>/metadata/cache/items</code>. <br />Ви певні?",
|
||||
"MessageConfirmQuickEmbed": "Увага! Швидке вбудування не створює резервних копій ваших аудіо. Переконайтеся, що маєте копію ваших файлів.<br><br>Продовжити?",
|
||||
"MessageConfirmQuickMatchEpisodes": "При виявленні співпадінь інформація про епізоди швидкого пошуку буде перезаписана. Будуть оновлені тільки несуперечливі епізоди. Ви впевнені?",
|
||||
"MessageConfirmReScanLibraryItems": "Ви дійсно бажаєте пересканувати елементи: {0}?",
|
||||
"MessageConfirmRemoveAllChapters": "Ви дійсно бажаєте видалити усі глави?",
|
||||
"MessageConfirmRemoveAuthor": "Ви дійсно бажаєте видалити автора \"{0}\"?",
|
||||
"MessageConfirmRemoveCollection": "Ви дійсно бажаєте видалити добірку \"{0}\"?",
|
||||
|
|
@ -761,44 +761,44 @@
|
|||
"MessageConfirmRemoveListeningSessions": "Ви дійсно бажаєте видалити сеанси прослуховування: {0}?",
|
||||
"MessageConfirmRemoveMetadataFiles": "Ви впевнені, що хочете видалити всі файли metadata.{0} у папках елементів вашої бібліотеки?",
|
||||
"MessageConfirmRemoveNarrator": "Ви дійсно бажаєте видалити читця \"{0}\"?",
|
||||
"MessageConfirmRemovePlaylist": "Ви дійсно бажаєте видалити ваш список відтворення \"{0}\"?",
|
||||
"MessageConfirmRenameGenre": "Ви впевнені, що хочете перейменувати жанр \"{0}\" на \"{1}\" для всіх елементів?",
|
||||
"MessageConfirmRenameGenreMergeNote": "Примітка: Такий жанр вже існує, тому вони будуть об'єднані.",
|
||||
"MessageConfirmRenameGenreWarning": "Увага! Схожий жанр з іншом регістром вже існує \"{0}\".",
|
||||
"MessageConfirmRenameTag": "Ви впевнені, що хочете перейменувати мітку \"{0}\" на \"{1}\" для всіх елементів?",
|
||||
"MessageConfirmRenameTagMergeNote": "Примітка: Така мітка вже існує, тому вони будуть об'єднані.",
|
||||
"MessageConfirmRenameTagWarning": "Увага! Схожа мітка з іншою регістром вже існує \"{0}\".",
|
||||
"MessageConfirmRemovePlaylist": "Ви дійсно бажаєте видалити список відтворення \"{0}\"?",
|
||||
"MessageConfirmRenameGenre": "Ви дійсно бажаєте замінити жанр \"{0}\" на \"{1}\" для усіх елементів?",
|
||||
"MessageConfirmRenameGenreMergeNote": "Примітка: такий жанр вже існує, тож їх буде об'єднано.",
|
||||
"MessageConfirmRenameGenreWarning": "Увага! Вже існує схожий жанр у іншому регістрі \"{0}\".",
|
||||
"MessageConfirmRenameTag": "Ви дійсно бажаєте замінити мітку \"{0}\" на \"{1}\" для усіх елементів?",
|
||||
"MessageConfirmRenameTagMergeNote": "Примітка: така мітка вже існує, тож їх буде об'єднано.",
|
||||
"MessageConfirmRenameTagWarning": "Увага! Вже існує схожа мітка у іншому регістрі \"{0}\".",
|
||||
"MessageConfirmResetProgress": "Ви впевнені, що хочете скинути свій прогрес?",
|
||||
"MessageConfirmSendEbookToDevice": "Ви дійсно хочете відправити на пристрій \"{2}\" електроні книги: {0}, \"{1}\"?",
|
||||
"MessageConfirmUnlinkOpenId": "Ви впевнені, що хочете відв'язати цього користувача від OpenID?",
|
||||
"MessageDaysListenedInTheLastYear": "{0} днів, прослуханих за останній рік",
|
||||
"MessageDownloadingEpisode": "Скачування епізоду",
|
||||
"MessageDownloadingEpisode": "Завантаження епізоду",
|
||||
"MessageDragFilesIntoTrackOrder": "Перетягніть файли до правильного порядку",
|
||||
"MessageEmbedFailed": "Не вдалося вбудувати!",
|
||||
"MessageEmbedFinished": "Вбудовування завершено!",
|
||||
"MessageEmbedQueue": "У черзі на вбудовування метаданих ({0} у черзі)",
|
||||
"MessageEpisodesQueuedForDownload": "{0} епізод(ів) у черзі на завантаження",
|
||||
"MessageEmbedFinished": "Вбудовано!",
|
||||
"MessageEmbedQueue": "В черзі на вбудовування метаданих ({0} в черзі)",
|
||||
"MessageEpisodesQueuedForDownload": "Епізодів у черзі завантаження: {0}",
|
||||
"MessageEreaderDevices": "Аби гарантувати отримання електронних книг, вам може знадобитися додати вказану вище адресу електронної пошти як правильного відправника на кожному з пристроїв зі списку нижче.",
|
||||
"MessageFeedURLWillBe": "URL-адреса каналу буде {0}",
|
||||
"MessageFetching": "Отримання...",
|
||||
"MessageForceReScanDescription": "Просканує всі файли заново, як при першому скануванні. ID3-мітки, OPF-файли та текстові файли будуть проскановані як нові.",
|
||||
"MessageForceReScanDescription": "Просканує усі файли заново, неначе вперше. ID3-мітки, файли OPF та текстові файли будуть проскановані як нові.",
|
||||
"MessageImportantNotice": "Важливе повідомлення!",
|
||||
"MessageInsertChapterBelow": "Введіть главу нижче",
|
||||
"MessageInvalidAsin": "Невірний ASIN",
|
||||
"MessageItemsSelected": "Вибрано {0} елементів",
|
||||
"MessageItemsUpdated": "Оновлено {0} елементів",
|
||||
"MessageItemsSelected": "Вибрано елементів: {0}",
|
||||
"MessageItemsUpdated": "Оновлено елементів: {0}",
|
||||
"MessageJoinUsOn": "Приєднуйтесь до",
|
||||
"MessageLoading": "Завантаження...",
|
||||
"MessageLoadingFolders": "Завантаження папок...",
|
||||
"MessageLoadingFolders": "Завантаження тек...",
|
||||
"MessageLogsDescription": "Журнали зберігаються у <code>/metadata/logs</code> як JSON-файли. Журнали збоїв зберігаються у <code>/metadata/logs/crash_logs.txt</code>.",
|
||||
"MessageM4BFailed": "Помилка M4B!",
|
||||
"MessageM4BFinished": "M4B створено!",
|
||||
"MessageMapChapterTitles": "Встановіть назви глав вашої аудіокниги без зміни часових міток",
|
||||
"MessageMapChapterTitles": "Встановіть назви глав вашої аудіокниги без визначення налаштувань тривалості",
|
||||
"MessageMarkAllEpisodesFinished": "Позначити всі епізоди завершеними",
|
||||
"MessageMarkAllEpisodesNotFinished": "Позначити всі епізоди незавершеними",
|
||||
"MessageMarkAsFinished": "Позначити як завершене",
|
||||
"MessageMarkAsNotFinished": "Позначити як незавершене",
|
||||
"MessageMatchBooksDescription": "Спробує знайти книги у бібліотеці у вибраному джерелі пошуку та заповнити порожні подробиці й обкладинку. Не перезаписує подробиці.",
|
||||
"MessageMarkAsFinished": "Позначити завершеним",
|
||||
"MessageMarkAsNotFinished": "Позначити незавершеним",
|
||||
"MessageMatchBooksDescription": "Спробує віднайти книгу у вказаному джерелі пошуку та встановити подробиці та обкладинку, яких бракує. Не перезаписує подробиці.",
|
||||
"MessageNoAudioTracks": "Аудіодоріжки відсутні",
|
||||
"MessageNoAuthors": "Автори відсутні",
|
||||
"MessageNoBackups": "Резервні копії відсутні",
|
||||
|
|
@ -808,8 +808,8 @@
|
|||
"MessageNoCoversFound": "Обкладинок не знайдено",
|
||||
"MessageNoDescription": "Без опису",
|
||||
"MessageNoDevices": "Немає пристроїв",
|
||||
"MessageNoDownloadsInProgress": "Немає активних скачувань",
|
||||
"MessageNoDownloadsQueued": "Немає скачувань у черзі",
|
||||
"MessageNoDownloadsInProgress": "Немає активних завантажень",
|
||||
"MessageNoDownloadsQueued": "Немає завантажень у черзі",
|
||||
"MessageNoEpisodeMatchesFound": "Відповідних епізодів не знайдено",
|
||||
"MessageNoEpisodes": "Епізоди відсутні",
|
||||
"MessageNoFoldersAvailable": "Немає доступних тек",
|
||||
|
|
@ -818,21 +818,21 @@
|
|||
"MessageNoItems": "Елементи відсутні",
|
||||
"MessageNoItemsFound": "Елементів не знайдено",
|
||||
"MessageNoListeningSessions": "Сеанси прослуховування відсутні",
|
||||
"MessageNoLogs": "Немає журналів",
|
||||
"MessageNoLogs": "Немає журнали",
|
||||
"MessageNoMediaProgress": "Прогрес відсутній",
|
||||
"MessageNoNotifications": "Сповіщення відсутні",
|
||||
"MessageNoPodcastFeed": "Некоректний подкаст: немає каналу",
|
||||
"MessageNoPodcastFeed": "Невірний подкаст: Немає каналу",
|
||||
"MessageNoPodcastsFound": "Подкастів не знайдено",
|
||||
"MessageNoResults": "Немає результатів",
|
||||
"MessageNoSearchResultsFor": "Немає результатів пошуку для \"{0}\"",
|
||||
"MessageNoSeries": "Немає серій",
|
||||
"MessageNoTags": "Немає міток",
|
||||
"MessageNoSeries": "Без серії",
|
||||
"MessageNoTags": "Без міток",
|
||||
"MessageNoTasksRunning": "Немає активних завдань",
|
||||
"MessageNoUpdatesWereNecessary": "Оновлення не потрібні",
|
||||
"MessageNoUpdatesWereNecessary": "Оновлень не потрібно",
|
||||
"MessageNoUserPlaylists": "У вас немає списків відтворення",
|
||||
"MessageNoUserPlaylistsHelp": "Списки відтворення приватні. Лише користувач, який їх створив, може їх бачити.",
|
||||
"MessageNoUserPlaylistsHelp": "Списки відтворення приватні. Лише користувач, який їх створює, може бачити їх.",
|
||||
"MessageNotYetImplemented": "Ще не реалізовано",
|
||||
"MessageOpmlPreviewNote": "Примітка: це попередній перегляд OPML-файлу. Актуальна назва подкасту буде взята з RSS-каналу.",
|
||||
"MessageOpmlPreviewNote": "Примітка: це попередній перегляд OPML-файлу. Актуальна назва подкасту буде завантажена з RSS-каналу.",
|
||||
"MessageOr": "або",
|
||||
"MessagePauseChapter": "Призупинити відтворення глави",
|
||||
"MessagePlayChapter": "Слухати початок глави",
|
||||
|
|
@ -841,7 +841,7 @@
|
|||
"MessagePodcastHasNoRSSFeedForMatching": "Подкаст не має RSS-каналу для пошуку",
|
||||
"MessagePodcastSearchField": "Введіть пошуковий запит або URL RSS-стрічки",
|
||||
"MessageQuickEmbedInProgress": "Швидке вбудовування в процесі",
|
||||
"MessageQuickEmbedQueue": "У черзі на швидке вбудовування ({0} в черзі)",
|
||||
"MessageQuickEmbedQueue": "В черзі на швидке вбудовування ({0} в черзі)",
|
||||
"MessageQuickMatchAllEpisodes": "Швидке співставлення всіх епізодів",
|
||||
"MessageQuickMatchDescription": "Заповнити відсутні подробиці та обкладинку першим результатом пошуку '{0}'. Не перезаписує подробиці, якщо не увімкнено параметр \"Надавати перевагу віднайденим метаданим\".",
|
||||
"MessageRemoveChapter": "Видалити главу",
|
||||
|
|
@ -849,9 +849,9 @@
|
|||
"MessageRemoveFromPlayerQueue": "Вилучити з черги відтворення",
|
||||
"MessageRemoveUserWarning": "Ви дійсно бажаєте назавжди видалити користувача \"{0}\"?",
|
||||
"MessageReportBugsAndContribute": "Повідомляйте про помилки, пропонуйте функції та долучайтеся на",
|
||||
"MessageResetChaptersConfirm": "Ви впевнені, що хочете скинути глави та скасувати внесені зміни?",
|
||||
"MessageRestoreBackupConfirm": "Ви впевнені, що хочете відновити резервну копію, створену",
|
||||
"MessageRestoreBackupWarning": "Відновлення резервної копії перезапише всю базу даних у /config і зображення обкладинок у /metadata/items та /metadata/authors.<br /><br />Резервні копії не змінюють файли у теках бібліотеки. Якщо у налаштуваннях сервера увімкнено збереження обкладинок і метаданих у теках бібліотеки, вони не створюються під час резервного копіювання і не перезаписуються.<br /><br />Всі клієнти, що користуються вашим сервером, будуть автоматично оновлені.",
|
||||
"MessageResetChaptersConfirm": "Ви дійсно бажаєте скинути глави та скасувати внесені зміни?",
|
||||
"MessageRestoreBackupConfirm": "Ви дійсно бажаєте відновити резервну копію від",
|
||||
"MessageRestoreBackupWarning": "Відновлення резервної копії перезапише всю базу даних, розташовану в /config, і зображення обкладинок в /metadata/items та /metadata/authors.<br /><br />Резервні копії не змінюють жодних файлів у теках бібліотеки. Якщо у налаштуваннях сервера увімкнено збереження обкладинок і метаданих у теках бібліотеки, вони не створюються під час резервного копіювання і не перезаписуються..<br /><br />Всі клієнти, що користуються вашим сервером, будуть автоматично оновлені.",
|
||||
"MessageScheduleLibraryScanNote": "Для більшості користувачів рекомендується залишити цю функцію вимкненою та залишити параметр перегляду папок увімкненим. Засіб спостереження за папками автоматично виявить зміни в папках вашої бібліотеки. Засіб спостереження за папками не працює для кожної файлової системи (наприклад, NFS), тому замість нього можна використовувати сканування бібліотек за розкладом.",
|
||||
"MessageScheduleRunEveryWeekdayAtTime": "Запуск кожні {0} о {1}",
|
||||
"MessageSearchResultsFor": "Результати пошуку для",
|
||||
|
|
@ -860,12 +860,12 @@
|
|||
"MessageServerCouldNotBeReached": "Не вдалося підключитися до сервера",
|
||||
"MessageSetChaptersFromTracksDescription": "Створити глави з аудіодоріжок, встановивши назви файлів за заголовки",
|
||||
"MessageShareExpirationWillBe": "Термін сплине за <strong>{0}</strong>",
|
||||
"MessageShareExpiresIn": "Спливає через {0}",
|
||||
"MessageShareURLWillBe": "URL для спільного доступу — <strong>{0}</strong>",
|
||||
"MessageShareExpiresIn": "Сплине за {0}",
|
||||
"MessageShareURLWillBe": "Поширюваний URL - <strong>{0}</strong>",
|
||||
"MessageStartPlaybackAtTime": "Почати відтворення \"{0}\" з {1}?",
|
||||
"MessageTaskAudioFileNotWritable": "Аудіофайл \"{0}\" недоступний для запису",
|
||||
"MessageTaskCanceledByUser": "Завдання скасовано користувачем",
|
||||
"MessageTaskDownloadingEpisodeDescription": "Скачування епізоду \"{0}\"",
|
||||
"MessageTaskCanceledByUser": "Задача скасована користувачем",
|
||||
"MessageTaskDownloadingEpisodeDescription": "Завантаження епізоду \"{0}\"",
|
||||
"MessageTaskEmbeddingMetadata": "Вбудовування метаданих",
|
||||
"MessageTaskEmbeddingMetadataDescription": "Вбудовування метаданих у аудіокнигу \"{0}\"",
|
||||
"MessageTaskEncodingM4b": "Кодування M4B",
|
||||
|
|
@ -880,19 +880,19 @@
|
|||
"MessageTaskMatchingBooksInLibrary": "Відповідність книг у бібліотеці \"{0}\"",
|
||||
"MessageTaskNoFilesToScan": "Немає файлів для сканування",
|
||||
"MessageTaskOpmlImport": "Імпорт OPML",
|
||||
"MessageTaskOpmlImportDescription": "Створення подкастів з {0} RSS-каналів",
|
||||
"MessageTaskOpmlImportFeed": "Імпорт RSS-каналу OPML",
|
||||
"MessageTaskOpmlImportDescription": "Створення подкастів з {0} RSS-стрічок",
|
||||
"MessageTaskOpmlImportFeed": "Канал імпорту OPML",
|
||||
"MessageTaskOpmlImportFeedDescription": "Імпорт RSS-каналу \"{0}\"",
|
||||
"MessageTaskOpmlImportFeedFailed": "Не вдалося отримати подкаст-канал",
|
||||
"MessageTaskOpmlImportFeedFailed": "Не вдалося отримати подкаст-стрічку",
|
||||
"MessageTaskOpmlImportFeedPodcastDescription": "Створення подкасту \"{0}\"",
|
||||
"MessageTaskOpmlImportFeedPodcastExists": "Подкаст вже існує за цим шляхом",
|
||||
"MessageTaskOpmlImportFeedPodcastFailed": "Не вдалося створити подкаст",
|
||||
"MessageTaskOpmlImportFinished": "Додано {0} подкастів",
|
||||
"MessageTaskOpmlParseFailed": "Не вдалося розібрати OPML-файл",
|
||||
"MessageTaskOpmlParseFastFail": "Некоректний OPML-файл: не знайдено тег <opml> або <outline>",
|
||||
"MessageTaskOpmlParseNoneFound": "У OPML-файлі не знайдено жодного каналу",
|
||||
"MessageTaskOpmlParseFailed": "Не вдалося розібрати файл OPML",
|
||||
"MessageTaskOpmlParseFastFail": "Невірний файл OPML: не знайдено тег <opml> або тег <outline>",
|
||||
"MessageTaskOpmlParseNoneFound": "У файлі OPML не знайдено жодного канала",
|
||||
"MessageTaskScanItemsAdded": "{0} додано",
|
||||
"MessageTaskScanItemsMissing": "{0} відсутні",
|
||||
"MessageTaskScanItemsMissing": "{0} відсутній",
|
||||
"MessageTaskScanItemsUpdated": "{0} оновлено",
|
||||
"MessageTaskScanNoChangesNeeded": "Змін не потрібно",
|
||||
"MessageTaskScanningFileChanges": "Сканування змін файлів у \"{0}\"",
|
||||
|
|
@ -902,24 +902,24 @@
|
|||
"MessageUploaderItemFailed": "Не вдалося завантажити",
|
||||
"MessageUploaderItemSuccess": "Успішно завантажено!",
|
||||
"MessageUploading": "Завантаження...",
|
||||
"MessageValidCronExpression": "Коректний cron-вираз",
|
||||
"MessageWatcherIsDisabledGlobally": "Спостерігача вимкнено у глобальних налаштуваннях сервера",
|
||||
"MessageValidCronExpression": "Допустима команда cron",
|
||||
"MessageWatcherIsDisabledGlobally": "Спостерігача вимкнено в налаштуваннях сервера",
|
||||
"MessageXLibraryIsEmpty": "Бібліотека {0} порожня!",
|
||||
"MessageYourAudiobookDurationIsLonger": "Тривалість вашої аудіокниги більша за знайдену",
|
||||
"MessageYourAudiobookDurationIsShorter": "Тривалість вашої аудіокниги менша за знайдену",
|
||||
"NoteChangeRootPassword": "Тільки користувач root може мати порожній пароль",
|
||||
"NoteChapterEditorTimes": "Примітка: Перша глава повинна починатися з 0:00, а час початку останньої глави не може перевищувати тривалість цієї аудіокниги.",
|
||||
"NoteFolderPicker": "Примітка: вже додані папки не відображаються",
|
||||
"NoteRSSFeedPodcastAppsHttps": "Попередження: більшість додатків подкастів вимагають використання HTTPS для RSS-каналу",
|
||||
"NoteRSSFeedPodcastAppsPubDate": "Попередження: один або більше ваших епізодів не мають дати публікації. Деякі додатки подкастів цього вимагають.",
|
||||
"NoteUploaderFoldersWithMediaFiles": "Теки з медіафайлами обробляються як окремі елементи бібліотеки.",
|
||||
"NoteUploaderOnlyAudioFiles": "Якщо завантажувати лише аудіофайли, кожен файл буде окремою аудіокнигою.",
|
||||
"NoteUploaderUnsupportedFiles": "Непідтримувані файли ігноруються. При виборі або перетягуванні теки, файли поза теками елементів ігноруються.",
|
||||
"NotificationOnBackupCompletedDescription": "Виконується після завершення резервного копіювання",
|
||||
"NotificationOnBackupFailedDescription": "Виконується при помилці резервного копіювання",
|
||||
"NotificationOnEpisodeDownloadedDescription": "Виконується при автоматичному завантаженні епізоду подкасту",
|
||||
"NotificationOnRSSFeedDisabledDescription": "Виконується, коли автоматичне завантаження епізодів вимкнено через забагато невдалих спроб",
|
||||
"NotificationOnRSSFeedFailedDescription": "Виконується, коли запит RSS-каналу не вдається для автоматичного завантаження епізоду",
|
||||
"MessageYourAudiobookDurationIsLonger": "Тривалість вашої аудіокниги довша за віднайдену",
|
||||
"MessageYourAudiobookDurationIsShorter": "Тривалість вашої аудіокниги коротша за віднайдену",
|
||||
"NoteChangeRootPassword": "Тільки користувач root — єдиний, хто може мати порожній пароль",
|
||||
"NoteChapterEditorTimes": "Примітка: Перша глава мусить починатися з 0:00, а час початку останньої глави не може бути більшим за зазначену тривалість аудіокниги.",
|
||||
"NoteFolderPicker": "Примітка: вже обрані теки не буде показано",
|
||||
"NoteRSSFeedPodcastAppsHttps": "Попередження: Більшість додатків подкастів вимагатимуть використання протоколу HTTPS від RSS-каналу",
|
||||
"NoteRSSFeedPodcastAppsPubDate": "Попередження: 1 або більше ваших епізодів не мають дати публікації. Деякі додатки подкастів вимагають це.",
|
||||
"NoteUploaderFoldersWithMediaFiles": "Теки з медіафайлами буде оброблено як окремі елементи бібліотеки.",
|
||||
"NoteUploaderOnlyAudioFiles": "Якщо завантажувати лише аудіофайли, то кожен файл буде оброблено як окрему книгу.",
|
||||
"NoteUploaderUnsupportedFiles": "Непідтримувані файли пропущено. Під час вибору або перетягування теки, файли, що знаходяться поза текою, пропускаються.",
|
||||
"NotificationOnBackupCompletedDescription": "Запускається після завершення резервного копіювання",
|
||||
"NotificationOnBackupFailedDescription": "Срабатывает при збої резервного копіювання",
|
||||
"NotificationOnEpisodeDownloadedDescription": "Запускається при автоматичному завантаженні епізоду подкасту",
|
||||
"NotificationOnRSSFeedDisabledDescription": "Активується, коли автоматичне завантаження епізодів вимкнено через занадто багато невдалих спроб",
|
||||
"NotificationOnRSSFeedFailedDescription": "Активується, коли запит RSS-каналу не вдається виконати для автоматичного завантаження епізоду",
|
||||
"NotificationOnTestDescription": "Подія для тестування системи сповіщень",
|
||||
"PlaceholderNewCollection": "Нова назва добірки",
|
||||
"PlaceholderNewFolderPath": "Новий шлях до теки",
|
||||
|
|
@ -997,7 +997,7 @@
|
|||
"ToastEncodeCancelFailed": "Не вдалося скасувати кодування",
|
||||
"ToastEncodeCancelSucces": "Кодування скасовано",
|
||||
"ToastEpisodeDownloadQueueClearFailed": "Не вдалося очистити чергу",
|
||||
"ToastEpisodeDownloadQueueClearSuccess": "Чергу на скачування епізодів очищено",
|
||||
"ToastEpisodeDownloadQueueClearSuccess": "Чергу на завантаження епізодів очищено",
|
||||
"ToastEpisodeUpdateSuccess": "{0} епізодів оновлено",
|
||||
"ToastErrorCannotShare": "Не можна типово поширити на цей пристрій",
|
||||
"ToastFailedToLoadData": "Не вдалося завантажити дані",
|
||||
|
|
@ -1005,7 +1005,7 @@
|
|||
"ToastFailedToShare": "Не вдалося поділитися",
|
||||
"ToastFailedToUpdate": "Не вдалося оновити",
|
||||
"ToastInvalidImageUrl": "Невірний URL зображення",
|
||||
"ToastInvalidMaxEpisodesToDownload": "Невірна кількість епізодів для скачування",
|
||||
"ToastInvalidMaxEpisodesToDownload": "Невірна кількість епізодів для завантаження",
|
||||
"ToastInvalidUrl": "Невірний URL",
|
||||
"ToastItemCoverUpdateSuccess": "Обкладинку елемента оновлено",
|
||||
"ToastItemDeletedFailed": "Не вдалося видалити елемент",
|
||||
|
|
|
|||
|
|
@ -918,8 +918,6 @@
|
|||
"NotificationOnBackupCompletedDescription": "备份完成时触发",
|
||||
"NotificationOnBackupFailedDescription": "备份失败时触发",
|
||||
"NotificationOnEpisodeDownloadedDescription": "当播客节目自动下载时触发",
|
||||
"NotificationOnRSSFeedDisabledDescription": "由于尝试失败次数过多而导致剧集自动下载被禁用时触发",
|
||||
"NotificationOnRSSFeedFailedDescription": "当 RSS 源请求自动下载剧集失败时触发",
|
||||
"NotificationOnTestDescription": "测试通知系统的事件",
|
||||
"PlaceholderNewCollection": "输入收藏夹名称",
|
||||
"PlaceholderNewFolderPath": "输入文件夹路径",
|
||||
|
|
|
|||
|
|
@ -25,12 +25,6 @@ class Auth {
|
|||
|
||||
this.RefreshTokenExpiry = parseInt(process.env.REFRESH_TOKEN_EXPIRY) || 7 * 24 * 60 * 60 // 7 days
|
||||
this.AccessTokenExpiry = parseInt(process.env.ACCESS_TOKEN_EXPIRY) || 12 * 60 * 60 // 12 hours
|
||||
if (parseInt(process.env.REFRESH_TOKEN_EXPIRY) > 0) {
|
||||
Logger.info(`[Auth] Refresh token expiry set from ENV variable to ${this.RefreshTokenExpiry} seconds`)
|
||||
}
|
||||
if (parseInt(process.env.ACCESS_TOKEN_EXPIRY) > 0) {
|
||||
Logger.info(`[Auth] Access token expiry set from ENV variable to ${this.AccessTokenExpiry} seconds`)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -1060,8 +1054,6 @@ class Auth {
|
|||
|
||||
/**
|
||||
* Function to validate a jwt token for a given user
|
||||
* Used to authenticate socket connections
|
||||
* TODO: Support API keys for web socket connections
|
||||
*
|
||||
* @param {string} token
|
||||
* @returns {Object} tokens data
|
||||
|
|
|
|||
|
|
@ -231,9 +231,6 @@ class SocketAuthority {
|
|||
* When setting up a socket connection the user needs to be associated with a socket id
|
||||
* for this the client will send a 'auth' event that includes the users API token
|
||||
*
|
||||
* Sends event 'init' to the socket. For admins this contains an array of users online.
|
||||
* For failed authentication it sends event 'auth_failed' with a message
|
||||
*
|
||||
* @param {SocketIO.Socket} socket
|
||||
* @param {string} token JWT
|
||||
*/
|
||||
|
|
@ -245,7 +242,7 @@ class SocketAuthority {
|
|||
if (!token_data?.userId) {
|
||||
// Token invalid
|
||||
Logger.error('Cannot validate socket - invalid token')
|
||||
return socket.emit('auth_failed', { message: 'Invalid token' })
|
||||
return socket.emit('invalid_token')
|
||||
}
|
||||
|
||||
// get the user via the id from the decoded jwt.
|
||||
|
|
@ -253,11 +250,7 @@ class SocketAuthority {
|
|||
if (!user) {
|
||||
// user not found
|
||||
Logger.error('Cannot validate socket - invalid token')
|
||||
return socket.emit('auth_failed', { message: 'Invalid token' })
|
||||
}
|
||||
if (!user.isActive) {
|
||||
Logger.error('Cannot validate socket - user is not active')
|
||||
return socket.emit('auth_failed', { message: 'Invalid user' })
|
||||
return socket.emit('invalid_token')
|
||||
}
|
||||
|
||||
const client = this.clients[socket.id]
|
||||
|
|
@ -267,18 +260,13 @@ class SocketAuthority {
|
|||
}
|
||||
|
||||
if (client.user !== undefined) {
|
||||
if (client.user.id === user.id) {
|
||||
// Allow re-authentication of a socket to the same user
|
||||
Logger.info(`[SocketAuthority] Authenticating socket already associated to user "${client.user.username}"`)
|
||||
} else {
|
||||
// Allow re-authentication of a socket to a different user but shouldn't happen
|
||||
Logger.warn(`[SocketAuthority] Authenticating socket to user "${user.username}", but is already associated with a different user "${client.user.username}"`)
|
||||
}
|
||||
} else {
|
||||
Logger.debug(`[SocketAuthority] Authenticating socket to user "${user.username}"`)
|
||||
Logger.debug(`[SocketAuthority] Authenticating socket client already has user`, client.user.username)
|
||||
}
|
||||
|
||||
client.user = user
|
||||
|
||||
Logger.debug(`[SocketAuthority] User Online ${client.user.username}`)
|
||||
|
||||
this.adminEmitter('user_online', client.user.toJSONForPublic(this.Server.playbackSessionManager.sessions))
|
||||
|
||||
// Update user lastSeen without firing sequelize bulk update hooks
|
||||
|
|
|
|||
|
|
@ -87,9 +87,6 @@ class ApiKeyController {
|
|||
isActive: !!req.body.isActive,
|
||||
createdByUserId: req.user.id
|
||||
})
|
||||
apiKeyInstance.dataValues.user = await apiKeyInstance.getUser({
|
||||
attributes: ['id', 'username', 'type']
|
||||
})
|
||||
|
||||
Logger.info(`[ApiKeyController] Created API key "${apiKeyInstance.name}"`)
|
||||
return res.json({
|
||||
|
|
@ -155,9 +152,6 @@ class ApiKeyController {
|
|||
|
||||
if (hasUpdates) {
|
||||
await apiKey.save()
|
||||
apiKey.dataValues.user = await apiKey.getUser({
|
||||
attributes: ['id', 'username', 'type']
|
||||
})
|
||||
Logger.info(`[ApiKeyController] Updated API key "${apiKey.name}"`)
|
||||
} else {
|
||||
Logger.info(`[ApiKeyController] No updates needed to API key "${apiKey.name}"`)
|
||||
|
|
|
|||
|
|
@ -183,7 +183,7 @@ class MediaProgress extends Model {
|
|||
* @param {import('./User').ProgressUpdatePayload} progressPayload
|
||||
* @returns {Promise<MediaProgress>}
|
||||
*/
|
||||
async applyProgressUpdate(progressPayload) {
|
||||
applyProgressUpdate(progressPayload) {
|
||||
if (!this.extraData) this.extraData = {}
|
||||
if (progressPayload.isFinished !== undefined) {
|
||||
if (progressPayload.isFinished && !this.isFinished) {
|
||||
|
|
@ -243,23 +243,14 @@ class MediaProgress extends Model {
|
|||
this.finishedAt = null
|
||||
}
|
||||
|
||||
await this.save()
|
||||
|
||||
// For local sync
|
||||
if (progressPayload.lastUpdate) {
|
||||
if (isNaN(new Date(progressPayload.lastUpdate))) {
|
||||
Logger.warn(`[MediaProgress] Invalid date provided for lastUpdate: ${progressPayload.lastUpdate} (media item ${this.mediaItemId})`)
|
||||
} else {
|
||||
const escapedDate = this.sequelize.escape(new Date(progressPayload.lastUpdate))
|
||||
Logger.info(`[MediaProgress] Manually setting updatedAt to ${escapedDate} (media item ${this.mediaItemId})`)
|
||||
|
||||
await this.sequelize.query(`UPDATE "mediaProgresses" SET "updatedAt" = ${escapedDate} WHERE "id" = '${this.id}'`)
|
||||
|
||||
await this.reload()
|
||||
}
|
||||
this.updatedAt = progressPayload.lastUpdate
|
||||
Logger.info(`[MediaProgress] Manually setting updatedAt to ${this.updatedAt} (media item ${this.mediaItemId})`)
|
||||
this.changed('updatedAt', true)
|
||||
}
|
||||
|
||||
return this
|
||||
return this.save({ silent: !!progressPayload.lastUpdate })
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue