mirror of
https://github.com/advplyr/audiobookshelf.git
synced 2026-05-19 18:01:37 +00:00
Merge branch 'advplyr:master' into inode-bug-fix
This commit is contained in:
commit
4e808e6770
18 changed files with 302 additions and 39 deletions
|
|
@ -22,7 +22,7 @@ add_user() {
|
||||||
declare -r descr="${4:-No description}"
|
declare -r descr="${4:-No description}"
|
||||||
declare -r shell="${5:-/bin/false}"
|
declare -r shell="${5:-/bin/false}"
|
||||||
|
|
||||||
if ! getent passwd | grep -q "^$user:"; then
|
if ! getent passwd "$user" 2>&1 >/dev/null; then
|
||||||
echo "Creating system user: $user in $group with $descr and shell $shell"
|
echo "Creating system user: $user in $group with $descr and shell $shell"
|
||||||
useradd $uid_flags --gid $group --no-create-home --system --shell $shell -c "$descr" $user
|
useradd $uid_flags --gid $group --no-create-home --system --shell $shell -c "$descr" $user
|
||||||
fi
|
fi
|
||||||
|
|
@ -39,7 +39,7 @@ add_group() {
|
||||||
declare -r gid_flags="--gid $gid"
|
declare -r gid_flags="--gid $gid"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if ! getent group | grep -q "^$group:" ; then
|
if ! getent group "$group" 2>&1 >/dev/null; then
|
||||||
echo "Creating system group: $group"
|
echo "Creating system group: $group"
|
||||||
groupadd $gid_flags --system $group
|
groupadd $gid_flags --system $group
|
||||||
fi
|
fi
|
||||||
|
|
|
||||||
|
|
@ -97,7 +97,10 @@ export default {
|
||||||
...playlist
|
...playlist
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.sort((a, b) => (a.isItemIncluded ? -1 : 1))
|
.sort((a, b) => {
|
||||||
|
if (a.isItemIncluded !== b.isItemIncluded) return a.isItemIncluded ? -1 : 1
|
||||||
|
return a.name.localeCompare(b.name)
|
||||||
|
})
|
||||||
},
|
},
|
||||||
isBatch() {
|
isBatch() {
|
||||||
return this.selectedPlaylistItems.length > 1
|
return this.selectedPlaylistItems.length > 1
|
||||||
|
|
|
||||||
|
|
@ -278,7 +278,7 @@ export default {
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
insertNewItem(item) {
|
insertNewItem(item) {
|
||||||
this.selected.push(item)
|
if (!this.selected.includes(item)) this.selected.push(item)
|
||||||
this.$emit('input', this.selected)
|
this.$emit('input', this.selected)
|
||||||
this.$emit('newItem', item)
|
this.$emit('newItem', item)
|
||||||
this.textInput = null
|
this.textInput = null
|
||||||
|
|
|
||||||
|
|
@ -287,7 +287,7 @@ export default {
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
insertNewItem(item) {
|
insertNewItem(item) {
|
||||||
this.selected.push(item)
|
if (!this.selected.find((i) => i.name === item.name)) this.selected.push(item)
|
||||||
this.$emit('input', this.selected)
|
this.$emit('input', this.selected)
|
||||||
this.$emit('newItem', item)
|
this.$emit('newItem', item)
|
||||||
this.textInput = null
|
this.textInput = null
|
||||||
|
|
|
||||||
4
client/package-lock.json
generated
4
client/package-lock.json
generated
|
|
@ -1,12 +1,12 @@
|
||||||
{
|
{
|
||||||
"name": "audiobookshelf-client",
|
"name": "audiobookshelf-client",
|
||||||
"version": "2.31.0",
|
"version": "2.32.1",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "audiobookshelf-client",
|
"name": "audiobookshelf-client",
|
||||||
"version": "2.31.0",
|
"version": "2.32.1",
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@nuxtjs/axios": "^5.13.6",
|
"@nuxtjs/axios": "^5.13.6",
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "audiobookshelf-client",
|
"name": "audiobookshelf-client",
|
||||||
"version": "2.31.0",
|
"version": "2.32.1",
|
||||||
"buildNumber": 1,
|
"buildNumber": 1,
|
||||||
"description": "Self-hosted audiobook and podcast client",
|
"description": "Self-hosted audiobook and podcast client",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
|
|
|
||||||
|
|
@ -49,6 +49,7 @@
|
||||||
"ButtonMapChapterTitles": "Χαρτογράφηση Τίτλων Κεφαλαίων",
|
"ButtonMapChapterTitles": "Χαρτογράφηση Τίτλων Κεφαλαίων",
|
||||||
"ButtonMatchAllAuthors": "Αντιστοίχιση Όλων των Συγγραφέων",
|
"ButtonMatchAllAuthors": "Αντιστοίχιση Όλων των Συγγραφέων",
|
||||||
"ButtonMatchBooks": "Αντιστοίχιση Βιβλίων",
|
"ButtonMatchBooks": "Αντιστοίχιση Βιβλίων",
|
||||||
|
"ButtonNevermind": "Άστο",
|
||||||
"ButtonNext": "Επόμενο",
|
"ButtonNext": "Επόμενο",
|
||||||
"ButtonNextChapter": "Επόμενο Κεφάλαιο",
|
"ButtonNextChapter": "Επόμενο Κεφάλαιο",
|
||||||
"ButtonNextItemInQueue": "Επόμενο Αντικείμενο στην Ουρά",
|
"ButtonNextItemInQueue": "Επόμενο Αντικείμενο στην Ουρά",
|
||||||
|
|
@ -62,8 +63,13 @@
|
||||||
"ButtonPlaylists": "Λίστες Αναπαραγωγής",
|
"ButtonPlaylists": "Λίστες Αναπαραγωγής",
|
||||||
"ButtonPrevious": "Προηγούμενο",
|
"ButtonPrevious": "Προηγούμενο",
|
||||||
"ButtonPreviousChapter": "Προηγούμενο Κεφάλαιο",
|
"ButtonPreviousChapter": "Προηγούμενο Κεφάλαιο",
|
||||||
|
"ButtonProbeAudioFile": "Ανάλυση Αρχείου Ήχου",
|
||||||
|
"ButtonPurgeAllCache": "Εκκαθάριση Όλης της Προσωρινής Μνήμης",
|
||||||
|
"ButtonPurgeItemsCache": "Εκκαθάριση της Μνήμης Αντικειμένων",
|
||||||
"ButtonQueueAddItem": "Προσθήκη στην ουρά",
|
"ButtonQueueAddItem": "Προσθήκη στην ουρά",
|
||||||
"ButtonQueueRemoveItem": "Αφαίρεση απ'την ουρά",
|
"ButtonQueueRemoveItem": "Αφαίρεση απ'την ουρά",
|
||||||
|
"ButtonQuickEmbed": "Γρήγορη Ενσωμάτωση",
|
||||||
|
"ButtonQuickEmbedMetadata": "Γρήγορη Ενσωμάτωση Μεταδεδομένων",
|
||||||
"ButtonQuickMatch": "Γρήγορη Αντιστοίχηση",
|
"ButtonQuickMatch": "Γρήγορη Αντιστοίχηση",
|
||||||
"ButtonReScan": "Επανασάρωση",
|
"ButtonReScan": "Επανασάρωση",
|
||||||
"ButtonRead": "Ανάγνωση",
|
"ButtonRead": "Ανάγνωση",
|
||||||
|
|
@ -73,35 +79,237 @@
|
||||||
"ButtonRemove": "Αφαίρεση",
|
"ButtonRemove": "Αφαίρεση",
|
||||||
"ButtonRemoveAll": "Αφαίρεση Όλων",
|
"ButtonRemoveAll": "Αφαίρεση Όλων",
|
||||||
"ButtonRemoveAllLibraryItems": "Αφαίρεση Όλων των Αντικειμέων Βιβλιοθήκης",
|
"ButtonRemoveAllLibraryItems": "Αφαίρεση Όλων των Αντικειμέων Βιβλιοθήκης",
|
||||||
|
"ButtonRemoveFromContinueListening": "Αφαίρεση από τη Συνέχεια Ακρόασης",
|
||||||
|
"ButtonRemoveFromContinueReading": "Αφαίρεση από τη Συνέχεια Ανάγνωσης",
|
||||||
|
"ButtonRemoveSeriesFromContinueSeries": "Αφαίρεση Σειράς από τη Συνέχεια Σειράς",
|
||||||
"ButtonReset": "Επαναφορά",
|
"ButtonReset": "Επαναφορά",
|
||||||
"ButtonResetToDefault": "Επαναφορά στις προεπιλογές",
|
"ButtonResetToDefault": "Επαναφορά στις προεπιλογές",
|
||||||
"ButtonRestore": "Επαναφορά",
|
"ButtonRestore": "Επαναφορά",
|
||||||
"ButtonSave": "Αποθήκευση",
|
"ButtonSave": "Αποθήκευση",
|
||||||
"ButtonSaveAndClose": "Αποθήκευση και Κλείσιμο",
|
"ButtonSaveAndClose": "Αποθήκευση και Κλείσιμο",
|
||||||
|
"ButtonSaveTracklist": "Αποθήκευση Λίστας Κομματιών",
|
||||||
"ButtonScan": "Σάρψση",
|
"ButtonScan": "Σάρψση",
|
||||||
|
"ButtonScanLibrary": "Σάρωση Βιβλιοθήκης",
|
||||||
|
"ButtonScrollLeft": "Κύλιση Αριστερά",
|
||||||
|
"ButtonScrollRight": "Κύλιση Δεξιά",
|
||||||
"ButtonSearch": "Αναζήτηση",
|
"ButtonSearch": "Αναζήτηση",
|
||||||
|
"ButtonSelectFolderPath": "Επιλογή Διαδρομής Φακέλου",
|
||||||
"ButtonSeries": "Σειρά",
|
"ButtonSeries": "Σειρά",
|
||||||
|
"ButtonSetChaptersFromTracks": "Ορισμός κεφαλαίων από τα κομμάτια",
|
||||||
|
"ButtonShare": "Κοινοποίηση",
|
||||||
|
"ButtonShiftTimes": "Χρόνοι Μετακίνησης",
|
||||||
|
"ButtonShow": "Εμφάνιση",
|
||||||
|
"ButtonStartM4BEncode": "Έναρξη Κωδικοποίησης M4B",
|
||||||
|
"ButtonStats": "Στατιστικά",
|
||||||
"ButtonSubmit": "Υποβολή",
|
"ButtonSubmit": "Υποβολή",
|
||||||
|
"ButtonTest": "Δοκιμή",
|
||||||
|
"ButtonUpload": "Μεταφόρτωση",
|
||||||
|
"ButtonUploadBackup": "Μεταφόρτωση Αντιγράφου Ασφαλείας",
|
||||||
|
"ButtonUploadCover": "Μεταφόρτωση Εξωφύλλου",
|
||||||
|
"ButtonUploadOPMLFile": "Μεταφόρτωση Αρχείου OPML",
|
||||||
|
"ButtonUserDelete": "Διαγραφή Χρήστη {0}",
|
||||||
|
"ButtonUserEdit": "Επεξεργασίας χρήστη {0}",
|
||||||
|
"ButtonViewAll": "Εμφάνιση Όλων",
|
||||||
"ButtonYes": "Ναι",
|
"ButtonYes": "Ναι",
|
||||||
|
"ErrorUploadLacksTitle": "Πρέπει να έχει τίτλο",
|
||||||
"HeaderAccount": "Λογαριασμός",
|
"HeaderAccount": "Λογαριασμός",
|
||||||
"HeaderAdvanced": "Για Προχωρημένους",
|
"HeaderAdvanced": "Για Προχωρημένους",
|
||||||
|
"HeaderApiKeys": "Κλειδιά API",
|
||||||
"HeaderAudioTracks": "Κομμάτια Ήχου",
|
"HeaderAudioTracks": "Κομμάτια Ήχου",
|
||||||
|
"HeaderBackups": "Αντίγραφα Ασφαλείας",
|
||||||
|
"HeaderBulkChapterModal": "Προσθήκη Πολλαπλών Κεφαλαίων",
|
||||||
|
"HeaderChangePassword": "Αλλαγή Κωδικού Πρόσβασης",
|
||||||
"HeaderChapters": "Κεφάλαια",
|
"HeaderChapters": "Κεφάλαια",
|
||||||
|
"HeaderChooseAFolder": "Επιλογή Φακέλου",
|
||||||
"HeaderCollection": "Συλλογή",
|
"HeaderCollection": "Συλλογή",
|
||||||
"HeaderCollectionItems": "Αντικείμενα Συλλογής",
|
"HeaderCollectionItems": "Αντικείμενα Συλλογής",
|
||||||
|
"HeaderCover": "Εξώφυλλο",
|
||||||
|
"HeaderCurrentDownloads": "Τρέχουσες Λήψεις",
|
||||||
"HeaderDetails": "Λεπτομέρειες",
|
"HeaderDetails": "Λεπτομέρειες",
|
||||||
|
"HeaderDownloadQueue": "Ουρά Λήψης",
|
||||||
"HeaderEbookFiles": "Αρχεία Ebook",
|
"HeaderEbookFiles": "Αρχεία Ebook",
|
||||||
|
"HeaderEmail": "Ηλεκτρονικό Ταχυδρομίο",
|
||||||
|
"HeaderEmailSettings": "Ρυθμίσεις Ηλεκτρονικού Ταχυδρομίου",
|
||||||
"HeaderEpisodes": "Επεισόδια",
|
"HeaderEpisodes": "Επεισόδια",
|
||||||
"HeaderEreaderSettings": "Ρυθμίσεις Ereader",
|
"HeaderEreaderSettings": "Ρυθμίσεις Ereader",
|
||||||
|
"HeaderFiles": "Αρχεία",
|
||||||
|
"HeaderFindChapters": "Εύρεση Κεφαλαίων",
|
||||||
|
"HeaderItemFiles": "Αρχεία Αντικειμένων",
|
||||||
|
"HeaderLastListeningSession": "Τελευταία Συνεδρία Ακρόασης",
|
||||||
"HeaderLatestEpisodes": "Τελευταία Επεισόδια",
|
"HeaderLatestEpisodes": "Τελευταία Επεισόδια",
|
||||||
"HeaderLibraries": "Βιβλιοθήκες",
|
"HeaderLibraries": "Βιβλιοθήκες",
|
||||||
|
"HeaderLibraryFiles": "Αρχεία Βιβλιοθήκης",
|
||||||
|
"HeaderLibraryStats": "Στατιστικά Βιβλιοθήκης",
|
||||||
|
"HeaderListeningSessions": "Συνεδρίες Ακρόασης",
|
||||||
|
"HeaderListeningStats": "Στατιστικά Ακρόασης",
|
||||||
|
"HeaderMatch": "Ταύτιση",
|
||||||
|
"HeaderNewAccount": "Νέος Λογαριασμός",
|
||||||
|
"HeaderNewApiKey": "Νέο Κλειδί API",
|
||||||
|
"HeaderNewLibrary": "Νέα Βιβλιοθήκη",
|
||||||
|
"HeaderNotificationCreate": "Δημιουργία Ειδοποίησης",
|
||||||
|
"HeaderNotificationUpdate": "Ενημέρωση Ειδοποίησης",
|
||||||
|
"HeaderNotifications": "Ειδοποιήσεις",
|
||||||
"HeaderOpenRSSFeed": "Άνοιγμα Τροφοδοσίας RSS",
|
"HeaderOpenRSSFeed": "Άνοιγμα Τροφοδοσίας RSS",
|
||||||
|
"HeaderOtherFiles": "Άλλα Αρχεία",
|
||||||
|
"HeaderPermissions": "Δικαιώματα",
|
||||||
|
"HeaderPlayerSettings": "Ρυθμίσεις Αναπαραγωγής",
|
||||||
"HeaderPlaylist": "Λίστα Αναπαραγωγής",
|
"HeaderPlaylist": "Λίστα Αναπαραγωγής",
|
||||||
"HeaderPlaylistItems": "Αντικείμενα Λίστας Αναπαραγωγής",
|
"HeaderPlaylistItems": "Αντικείμενα Λίστας Αναπαραγωγής",
|
||||||
|
"HeaderPresets": "Προεπιλογές",
|
||||||
"HeaderRSSFeedGeneral": "Λεπτομέρειες RSS",
|
"HeaderRSSFeedGeneral": "Λεπτομέρειες RSS",
|
||||||
"HeaderRSSFeedIsOpen": "Η Τροφοδοσία RSS είναι Ανοιχτή",
|
"HeaderRSSFeedIsOpen": "Η Τροφοδοσία RSS είναι Ανοιχτή",
|
||||||
|
"HeaderRemoveEpisode": "Αφαίρεση Επεισοδίου",
|
||||||
|
"HeaderSession": "Συνεδρία",
|
||||||
|
"HeaderSetBackupSchedule": "Ορισμός Προγράμματος Αντιγράφων Ασφαλείας",
|
||||||
"HeaderSettings": "Ρυθμίσεις",
|
"HeaderSettings": "Ρυθμίσεις",
|
||||||
|
"HeaderSettingsDisplay": "Προβολή",
|
||||||
|
"HeaderSettingsGeneral": "Γενικά",
|
||||||
|
"HeaderSettingsSecurity": "Ασφάλεια",
|
||||||
|
"HeaderSleepTimer": "Χρονοδιακόπτης Ύπνου",
|
||||||
|
"HeaderStatsLargestItems": "Μεγαλύτερα Αντικείμενα",
|
||||||
|
"HeaderStatsLongestItems": "Μεγαλύτερα Αντικείμενα (ώρες)",
|
||||||
"HeaderStatsMinutesListeningChart": "Λεπτά Ακρόασης (τελευταίες 7 ημέρες)",
|
"HeaderStatsMinutesListeningChart": "Λεπτά Ακρόασης (τελευταίες 7 ημέρες)",
|
||||||
"HeaderStatsRecentSessions": "Πρόσφατες Συνεδρίες",
|
"HeaderStatsRecentSessions": "Πρόσφατες Συνεδρίες",
|
||||||
"HeaderTableOfContents": "Πίνακας Περιεχομένων"
|
"HeaderStatsTop10Authors": "10 Κορυφαίου Συγγραφείς",
|
||||||
|
"HeaderStatsTop5Genres": "5 Κορυφαία Είδη",
|
||||||
|
"HeaderTableOfContents": "Πίνακας Περιεχομένων",
|
||||||
|
"HeaderTools": "Εργαλεία",
|
||||||
|
"HeaderUpdateAccount": "Ενημέρωση Λογαριασμού",
|
||||||
|
"HeaderUpdateApiKey": "Ενημέρωση Κλειδιού API",
|
||||||
|
"HeaderUpdateAuthor": "Ενημέρωση Συγγραφέα",
|
||||||
|
"HeaderUpdateDetails": "Ενημέρωση Λεπτομερειεών",
|
||||||
|
"HeaderUpdateLibrary": "Ενημέρωση Βιβλιοθήκης",
|
||||||
|
"HeaderUsers": "Χρήστες",
|
||||||
|
"HeaderYourStats": "Τα Στατιστικά Σας",
|
||||||
|
"LabelAbridged": "Συνοπτικό",
|
||||||
|
"LabelAccessibleBy": "Προσβάσιμο από",
|
||||||
|
"LabelAccountType": "Τύπος Λογαριασμού",
|
||||||
|
"LabelAccountTypeAdmin": "Διαχειριστής",
|
||||||
|
"LabelAccountTypeGuest": "Επισκέπτης",
|
||||||
|
"LabelAccountTypeUser": "Χρήστης",
|
||||||
|
"LabelAddToCollection": "Προσθήκη σε Συλλογή",
|
||||||
|
"LabelAddToCollectionBatch": "Προσθήκη {0} Βιβλίων στην Συλλογή",
|
||||||
|
"LabelAddToPlaylist": "Προσθήκη στην Λίστα Αναπαραγωγής",
|
||||||
|
"LabelAddedAt": "Προστέθηκε Στις",
|
||||||
|
"LabelAddedDate": "Προστέθηκε {0}",
|
||||||
|
"LabelAll": "Όλα",
|
||||||
|
"LabelAllEpisodesDownloaded": "Όλα τα επεισόδια λήφθηκαν",
|
||||||
|
"LabelAllUsers": "Όλοι οι Χρήστες",
|
||||||
|
"LabelAlreadyInYourLibrary": "Υπάρχει ήδη στην βιβλιοθήκη",
|
||||||
|
"LabelAudioChannels": "Κανάλια Ήχου (1 ή 2)",
|
||||||
|
"LabelAuthor": "Συγγραφέας",
|
||||||
|
"LabelAuthorFirstLast": "Συγγραφέας (Όνομα Επώνυμο)",
|
||||||
|
"LabelAuthorLastFirst": "Συγγραφέας (Επώνυμο, Όνομα)",
|
||||||
|
"LabelAuthors": "Συγγραφείς",
|
||||||
|
"LabelAutoDownloadEpisodes": "Αυτόματο Κατέβασμα Επεισοδίων",
|
||||||
|
"LabelAutoLaunch": "Αυτόματη Εκκίνηση",
|
||||||
|
"LabelBackupLocation": "Τοποθεσία Αντιγράφου Ασφαλείας",
|
||||||
|
"LabelBackupsEnableAutomaticBackups": "Αυτόματα αντίγραφα ασφαλείας",
|
||||||
|
"LabelBackupsNumberToKeep": "Αριθμός αντιγράφων ασφαλείας προς διατήρηση",
|
||||||
|
"LabelBooks": "Βιβλία",
|
||||||
|
"LabelButtonText": "Κείμενο Κουμπιού",
|
||||||
|
"LabelByAuthor": "κατά {0}",
|
||||||
|
"LabelChangePassword": "Αλλαγή Κωδικού Πρόσβασης",
|
||||||
|
"LabelChannels": "Κανάλια",
|
||||||
|
"LabelChapterCount": "{0} Κεφάλαια",
|
||||||
|
"LabelChapterTitle": "Τίτλος Κεφαλαίου",
|
||||||
|
"LabelChapters": "Κεφάλαια",
|
||||||
|
"LabelChaptersFound": "κεφάλαια βρέθηκαν",
|
||||||
|
"LabelClosePlayer": "Κλείσιμο αναπαραγωγής",
|
||||||
|
"LabelCollection": "Συλλογή",
|
||||||
|
"LabelCollections": "Συλλογές",
|
||||||
|
"LabelComplete": "Ολοκλήρωση",
|
||||||
|
"LabelConfirmPassword": "Επιβεβαίωση Κωδικού Πρόσβασης",
|
||||||
|
"LabelContinueListening": "Συνέχεια Ακρόασης",
|
||||||
|
"LabelContinueReading": "Συνέχεια Ανάγνωσης",
|
||||||
|
"LabelContinueSeries": "Συνέχεια Σειράς",
|
||||||
|
"LabelCover": "Εξώφυλλο",
|
||||||
|
"LabelCoverImageURL": "URL Εικόνας Εξωφύλλου",
|
||||||
|
"LabelCoverProvider": "Πάροχος Εξωφύλλου",
|
||||||
|
"LabelCreatedAt": "Δημιουρήθηκε Στις",
|
||||||
|
"LabelCurrent": "Τρέχων",
|
||||||
|
"LabelCurrently": "Τρέχων:",
|
||||||
|
"LabelDays": "Ημέρες",
|
||||||
|
"LabelDescription": "Περιγραφή",
|
||||||
|
"LabelDevice": "Συσκευή",
|
||||||
|
"LabelDeviceInfo": "Πληροφορίες Συσκευής",
|
||||||
|
"LabelDownload": "Λήψη",
|
||||||
|
"LabelDownloadNEpisodes": "Λήψη {0} επεισοδίων",
|
||||||
|
"LabelDuration": "Διάρκεια",
|
||||||
|
"LabelDurationComparisonExactMatch": "(ακριβής ταύτιση)",
|
||||||
|
"LabelEbook": "Ebook",
|
||||||
|
"LabelEbooks": "Ebooks",
|
||||||
|
"LabelEdit": "Επεξεργασία",
|
||||||
|
"LabelEmail": "Ηλεκτρονικό Ταχυδρομίο",
|
||||||
|
"LabelEmailSettingsFromAddress": "Από Διεύθυνση",
|
||||||
|
"LabelEmailSettingsSecure": "Ασφαλές",
|
||||||
|
"LabelEmailSettingsTestAddress": "Δοκιμή Διεύθυνσης",
|
||||||
|
"LabelEmbeddedCover": "Ενσωματωμένο Εξώφυλλο",
|
||||||
|
"LabelEnable": "Ενεργοποίηση",
|
||||||
|
"LabelEnd": "Τέλος",
|
||||||
|
"LabelEndOfChapter": "Τέλος Κεφαλαίου",
|
||||||
|
"LabelEpisode": "Επεισόδιο",
|
||||||
|
"LabelFile": "Αρχείο",
|
||||||
|
"LabelFilename": "Όνομα Αρχείου",
|
||||||
|
"LabelFinished": "Ολοκληρώθηκε",
|
||||||
|
"LabelFolder": "Φάκελος",
|
||||||
|
"LabelFontFamily": "Οικογένεια Γραμματοσειράς",
|
||||||
|
"LabelGenre": "Είδος",
|
||||||
|
"LabelGenres": "Είδη",
|
||||||
|
"LabelHost": "Διακομιστής",
|
||||||
|
"LabelInProgress": "Σε Εξέλιξη",
|
||||||
|
"LabelLanguage": "Γλώσσα",
|
||||||
|
"LabelLayoutSinglePage": "Μονή Σελίδα",
|
||||||
|
"LabelListenAgain": "Επανάληψη Ακρόασης",
|
||||||
|
"LabelMediaType": "Τύπος Πολυμέσων",
|
||||||
|
"LabelMore": "Περισσότερα",
|
||||||
|
"LabelMoreInfo": "Περισσότερες Πληροφορίες",
|
||||||
|
"LabelName": "Όνομα",
|
||||||
|
"LabelNarrator": "Αφηγητής",
|
||||||
|
"LabelNarrators": "Αφηγητές",
|
||||||
|
"LabelNewestAuthors": "Πρόσφατοι Συγγραφείς",
|
||||||
|
"LabelNewestEpisodes": "Πρόσφατα Επεισόδια",
|
||||||
|
"LabelNotStarted": "Δεν Έχει Ξεκινήσει",
|
||||||
|
"LabelNumberOfEpisodes": "# Επεισοδίων",
|
||||||
|
"LabelPassword": "Κωδικός Πρόσβασης",
|
||||||
|
"LabelPath": "Διαδρομή",
|
||||||
|
"LabelProgress": "Πρόοδος",
|
||||||
|
"LabelPublishYear": "Χρονολογία Έκδοσης",
|
||||||
|
"LabelPublishedDate": "Εκδόθηκε {0}",
|
||||||
|
"LabelRandomly": "Τυχαία",
|
||||||
|
"LabelRead": "Ανάγνωση",
|
||||||
|
"LabelReadAgain": "Ανάγνωση Ξανά",
|
||||||
|
"LabelRecentSeries": "Πρόσφατη Σειρά",
|
||||||
|
"LabelRecentlyAdded": "Προστέθηκαν Πρόσφατα",
|
||||||
|
"LabelSeries": "Σειρά",
|
||||||
|
"LabelSetEbookAsPrimary": "Ορισμός ως πρωτεύων",
|
||||||
|
"LabelShowAll": "Εμφάνιση Όλων",
|
||||||
|
"LabelSize": "Μέγεθος",
|
||||||
|
"LabelSleepTimer": "Χρονοδιακόπτης Ύπνου",
|
||||||
|
"LabelStart": "Έναρξη",
|
||||||
|
"LabelStatsBestDay": "Καλύτερη Ημέρα",
|
||||||
|
"LabelStatsDailyAverage": "Ημερήσιος Μέσος Όρος",
|
||||||
|
"LabelStatsDays": "Ημέρες",
|
||||||
|
"LabelStatsDaysListened": "Ημέρες Ακρόασης",
|
||||||
|
"LabelStatsInARow": "Σε σειρά",
|
||||||
|
"LabelStatsItemsFinished": "Ολοκληρωμένα Αντικείμενα",
|
||||||
|
"LabelStatsMinutes": "λεπτά",
|
||||||
|
"LabelStatsMinutesListening": "Λεπτά Ακρόασης",
|
||||||
|
"LabelStatsWeekListening": "Εβδομαδιαία Ακρόαση",
|
||||||
|
"LabelTheme": "Θέμα",
|
||||||
|
"LabelThemeDark": "Σκοτεινό",
|
||||||
|
"LabelThemeLight": "Φωτεινό",
|
||||||
|
"LabelTimeRemaining": "{0} απομένουν",
|
||||||
|
"LabelTitle": "Τίτλος",
|
||||||
|
"LabelTracks": "Κομμάτια",
|
||||||
|
"LabelType": "Τύπος",
|
||||||
|
"LabelUnknown": "Άγνωστο",
|
||||||
|
"LabelUser": "Χρήστης",
|
||||||
|
"LabelUsername": "Όνομα Χρήστη",
|
||||||
|
"LabelYourProgress": "Η Πρόοδος Σας",
|
||||||
|
"MessageDownloadingEpisode": "Λήψη επεισοδίου",
|
||||||
|
"MessageLoading": "Φόρτωση...",
|
||||||
|
"MessageMarkAsFinished": "Σήμανση ως Ολοκληρωμένο",
|
||||||
|
"MessageNoItemsFound": "Δεν βρέθηκαν αντικείμενα",
|
||||||
|
"MessageNoUserPlaylists": "Δεν έχετε λίστες αναπαραγωγής"
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -275,7 +275,7 @@
|
||||||
"LabelBonus": "Bonus",
|
"LabelBonus": "Bonus",
|
||||||
"LabelBooks": "Kirjat",
|
"LabelBooks": "Kirjat",
|
||||||
"LabelButtonText": "Painikkeen teksti",
|
"LabelButtonText": "Painikkeen teksti",
|
||||||
"LabelByAuthor": "tekijältä {0}",
|
"LabelByAuthor": "Tekijältä: {0}",
|
||||||
"LabelChangePassword": "Vaihda salasana",
|
"LabelChangePassword": "Vaihda salasana",
|
||||||
"LabelChannels": "Kanavat",
|
"LabelChannels": "Kanavat",
|
||||||
"LabelChapterCount": "{0} lukua",
|
"LabelChapterCount": "{0} lukua",
|
||||||
|
|
@ -790,6 +790,7 @@
|
||||||
"MessageConfirmRemoveAuthor": "Oletko varma, että haluat poistaa tekijän \"{0}\"?",
|
"MessageConfirmRemoveAuthor": "Oletko varma, että haluat poistaa tekijän \"{0}\"?",
|
||||||
"MessageConfirmRemoveCollection": "Oletko varma, että haluat poistaa kokoelman \"{0}\"?",
|
"MessageConfirmRemoveCollection": "Oletko varma, että haluat poistaa kokoelman \"{0}\"?",
|
||||||
"MessageConfirmRemoveEpisode": "Oletko varma, että haluat poistaa jakson \"{0}\"?",
|
"MessageConfirmRemoveEpisode": "Oletko varma, että haluat poistaa jakson \"{0}\"?",
|
||||||
|
"MessageConfirmRemoveEpisodeNote": "Huomioi: Tämä ei poista äänitiedostoa, ellei \"Poista tiedosto pysyvästi\" -asetusta ole valittuna",
|
||||||
"MessageConfirmRemoveEpisodes": "Oletko varma, että haluat poistaa {0} jaksoa?",
|
"MessageConfirmRemoveEpisodes": "Oletko varma, että haluat poistaa {0} jaksoa?",
|
||||||
"MessageConfirmRemoveListeningSessions": "Oletko varma, että haluat poistaa {0} kuuntelukertaa?",
|
"MessageConfirmRemoveListeningSessions": "Oletko varma, että haluat poistaa {0} kuuntelukertaa?",
|
||||||
"MessageConfirmRemoveMetadataFiles": "Oletko varma, että haluat poistaa kaikki metadata.{0}-tiedostot kirjaston kohdekansioista?",
|
"MessageConfirmRemoveMetadataFiles": "Oletko varma, että haluat poistaa kaikki metadata.{0}-tiedostot kirjaston kohdekansioista?",
|
||||||
|
|
@ -816,6 +817,7 @@
|
||||||
"MessageFetching": "Haetaan...",
|
"MessageFetching": "Haetaan...",
|
||||||
"MessageForceReScanDescription": "skannaa kaikki tiedostot uudelleen kuten uusi tarkistus. Äänitiedoston ID3-tunnisteet, OPF-tiedostot ja tekstitiedostot skannataan uusina.",
|
"MessageForceReScanDescription": "skannaa kaikki tiedostot uudelleen kuten uusi tarkistus. Äänitiedoston ID3-tunnisteet, OPF-tiedostot ja tekstitiedostot skannataan uusina.",
|
||||||
"MessageHeatmapListeningTimeTooltip": "<strong>{0} kuunnellaan</strong> on {1}",
|
"MessageHeatmapListeningTimeTooltip": "<strong>{0} kuunnellaan</strong> on {1}",
|
||||||
|
"MessageHeatmapNoListeningSessions": "Ei kuuntelujaksoja {0}",
|
||||||
"MessageImportantNotice": "Tärkeä huomautus!",
|
"MessageImportantNotice": "Tärkeä huomautus!",
|
||||||
"MessageInsertChapterBelow": "Syötä luku alle",
|
"MessageInsertChapterBelow": "Syötä luku alle",
|
||||||
"MessageInvalidAsin": "Virheellinen ASIN",
|
"MessageInvalidAsin": "Virheellinen ASIN",
|
||||||
|
|
@ -886,10 +888,11 @@
|
||||||
"MessageResetChaptersConfirm": "Oletko varma, että haluat nollata luvut ja kumota tekemäsi muutokset?",
|
"MessageResetChaptersConfirm": "Oletko varma, että haluat nollata luvut ja kumota tekemäsi muutokset?",
|
||||||
"MessageRestoreBackupConfirm": "Oletko varma, että haluat palauttaa varmuuskopion, joka on luotu",
|
"MessageRestoreBackupConfirm": "Oletko varma, että haluat palauttaa varmuuskopion, joka on luotu",
|
||||||
"MessageRestoreBackupWarning": "Varmuuskopion palauttaminen korvaa koko /config:ssa sijaitsevan tietokannan, ja kansikuvat /metadata/items & /metadata/authors:ssa.<br /><br />Varmuuskopiot eivät muuta kirjastokansioissasi olevia tiedostoja. Jos olet ottanut käyttöön palvelinasetuksissa kansikuvien ja metatietojen tallentamisen kirjaston kansioihin, niitä ei varmuuskopioida tai korvata.<br /><br />Kaikki palvelintasi käyttävät asiakkaat virkistetään automaattisesti.",
|
"MessageRestoreBackupWarning": "Varmuuskopion palauttaminen korvaa koko /config:ssa sijaitsevan tietokannan, ja kansikuvat /metadata/items & /metadata/authors:ssa.<br /><br />Varmuuskopiot eivät muuta kirjastokansioissasi olevia tiedostoja. Jos olet ottanut käyttöön palvelinasetuksissa kansikuvien ja metatietojen tallentamisen kirjaston kansioihin, niitä ei varmuuskopioida tai korvata.<br /><br />Kaikki palvelintasi käyttävät asiakkaat virkistetään automaattisesti.",
|
||||||
"MessageScheduleLibraryScanNote": "Suurimmalle osaa käyttäjistä on suositeltavaa jättää tämä ominaisuus pois päältä ja \"Tarkkaile kirjaston muutoksia automaattisesti\" -asetus pidetään käytössä - se havaitsee muutokset kirjastokansioissasi automaattisesti. Ota tämä ominaisuus käyttöön, jos \"Tarkkaile kirjaston muutoksia automaattisesti\" ei toimi tiedostojärjestelmässäsi (kuten NFS).\"",
|
"MessageScheduleLibraryScanNote": "Suurimmalle osaa käyttäjistä on suositeltavaa jättää tämä ominaisuus pois päältä ja \"Tarkkaile kirjaston muutoksia automaattisesti\" -asetus pidetään käytössä - se havaitsee muutokset kirjastokansioissasi automaattisesti. Ota tämä ominaisuus käyttöön, jos \"Tarkkaile kirjaston muutoksia automaattisesti\" ei toimi tiedostojärjestelmässäsi (kuten NFS).",
|
||||||
"MessageScheduleRunEveryWeekdayAtTime": "Suorita joka {0} klo {1}",
|
"MessageScheduleRunEveryWeekdayAtTime": "Suorita joka {0} klo {1}",
|
||||||
"MessageSearchResultsFor": "Hakutulokset haulle",
|
"MessageSearchResultsFor": "Hakutulokset haulle",
|
||||||
"MessageSelected": "{0} valittuna",
|
"MessageSelected": "{0} valittuna",
|
||||||
|
"MessageSeriesSequenceCannotContainSpaces": "Sarjan sekvenssi ei voi sisältää välilyöntejä",
|
||||||
"MessageServerCouldNotBeReached": "Palvelimelle ei saatu yhteyttä",
|
"MessageServerCouldNotBeReached": "Palvelimelle ei saatu yhteyttä",
|
||||||
"MessageSetChaptersFromTracksDescription": "Aseta luvut käyttämällä kutakin äänitiedostoa lukuna ja luvun otsikkoa äänitiedoston nimenä",
|
"MessageSetChaptersFromTracksDescription": "Aseta luvut käyttämällä kutakin äänitiedostoa lukuna ja luvun otsikkoa äänitiedoston nimenä",
|
||||||
"MessageShareExpirationWillBe": "Umpeutuminen on <strong>{0}</strong>",
|
"MessageShareExpirationWillBe": "Umpeutuminen on <strong>{0}</strong>",
|
||||||
|
|
@ -951,7 +954,10 @@
|
||||||
"NotificationOnBackupCompletedDescription": "Laukaistu, kun varmuuskopiointi on valmis",
|
"NotificationOnBackupCompletedDescription": "Laukaistu, kun varmuuskopiointi on valmis",
|
||||||
"NotificationOnBackupFailedDescription": "Laukaistu, kun varmuuskopiointi epäonnistuu",
|
"NotificationOnBackupFailedDescription": "Laukaistu, kun varmuuskopiointi epäonnistuu",
|
||||||
"NotificationOnEpisodeDownloadedDescription": "Laukaistu, kun podcast-jakso ladataan automaattisesti",
|
"NotificationOnEpisodeDownloadedDescription": "Laukaistu, kun podcast-jakso ladataan automaattisesti",
|
||||||
|
"NotificationOnRSSFeedDisabledDescription": "Laukaistaan, kun automaattiset jaksolataukset poistetaan käytöstä liian monen epäonnistuneen yrityksen vuoksi",
|
||||||
|
"NotificationOnRSSFeedFailedDescription": "Laukaistaan, kun RRS-syötteen pyyntö epäonnistuu automaattisessa jaksolatauksessa",
|
||||||
"NotificationOnTestDescription": "Tapahtuma ilmoitusjärjestelmän testaamista varten",
|
"NotificationOnTestDescription": "Tapahtuma ilmoitusjärjestelmän testaamista varten",
|
||||||
|
"PlaceholderBulkChapterInput": "Syötä luvun otsikko tai käytä numerointia (esim. 'Episodi 1', 'Luku 10', '1.')",
|
||||||
"PlaceholderNewCollection": "Uusi kokoelman nimi",
|
"PlaceholderNewCollection": "Uusi kokoelman nimi",
|
||||||
"PlaceholderNewFolderPath": "Uusi kansion polku",
|
"PlaceholderNewFolderPath": "Uusi kansion polku",
|
||||||
"PlaceholderNewPlaylist": "Uusi soittolistan nimi",
|
"PlaceholderNewPlaylist": "Uusi soittolistan nimi",
|
||||||
|
|
@ -1005,15 +1011,23 @@
|
||||||
"ToastBookmarkCreateFailed": "Kirjanmerkin luominen epäonnistui",
|
"ToastBookmarkCreateFailed": "Kirjanmerkin luominen epäonnistui",
|
||||||
"ToastBookmarkCreateSuccess": "Kirjanmerkki lisätty",
|
"ToastBookmarkCreateSuccess": "Kirjanmerkki lisätty",
|
||||||
"ToastBookmarkRemoveSuccess": "Kirjanmerkki poistettu",
|
"ToastBookmarkRemoveSuccess": "Kirjanmerkki poistettu",
|
||||||
|
"ToastBulkChapterInvalidCount": "Syötä numero 1 ja 150 välillä",
|
||||||
"ToastCachePurgeFailed": "Välimuistin tyhjentäminen epäonnistui",
|
"ToastCachePurgeFailed": "Välimuistin tyhjentäminen epäonnistui",
|
||||||
"ToastCachePurgeSuccess": "Välimuisti tyhjennetty onnistuneesti",
|
"ToastCachePurgeSuccess": "Välimuisti tyhjennetty onnistuneesti",
|
||||||
|
"ToastChapterLocked": "Luku on lukittu.",
|
||||||
|
"ToastChapterStartTimeAdjusted": "Luvun aloitusaikaa on säädetty {0} sekunnilla",
|
||||||
|
"ToastChaptersAllLocked": "Kaikki luvut ovat lukittuina. Avaa lukuja vaihtaaksesi niiden aikoja.",
|
||||||
"ToastChaptersHaveErrors": "Luvuissa on virheitä",
|
"ToastChaptersHaveErrors": "Luvuissa on virheitä",
|
||||||
|
"ToastChaptersInvalidShiftAmountLast": "Virheellinen siirtomäärä. Viimeisen luvun aloitusaika ylittäisi tämän äänikirjan keston.",
|
||||||
|
"ToastChaptersInvalidShiftAmountStart": "Virheellinen siirtomäärä. Ensimmäisen luvun pituudeksi tulisi nolla tai negatiivinen arvo, ja toinen luku kirjoittaisi sen päälle. Kasvata toisen luvun aloitusaikaa.",
|
||||||
"ToastChaptersMustHaveTitles": "Lukuilla on oltava otsikot",
|
"ToastChaptersMustHaveTitles": "Lukuilla on oltava otsikot",
|
||||||
"ToastChaptersRemoved": "Luvut poistettu",
|
"ToastChaptersRemoved": "Luvut poistettu",
|
||||||
"ToastChaptersUpdated": "Luvut päivitetty",
|
"ToastChaptersUpdated": "Luvut päivitetty",
|
||||||
"ToastCollectionItemsAddFailed": "Kohteen/kohteiden lisääminen kokoelmaan epäonnistui",
|
"ToastCollectionItemsAddFailed": "Kohteen/kohteiden lisääminen kokoelmaan epäonnistui",
|
||||||
"ToastCollectionRemoveSuccess": "Kokoelma poistettu",
|
"ToastCollectionRemoveSuccess": "Kokoelma poistettu",
|
||||||
"ToastCollectionUpdateSuccess": "Kokoelma päivitetty",
|
"ToastCollectionUpdateSuccess": "Kokoelma päivitetty",
|
||||||
|
"ToastConnectionNotAvailable": "Verkkoyhteyttä ei saatavilla. Yritä hetken päästä uudelleen",
|
||||||
|
"ToastCoverSearchFailed": "Kansikuvan haku epäonnistui",
|
||||||
"ToastCoverUpdateFailed": "Kansikuvan päivitys epäonnistui",
|
"ToastCoverUpdateFailed": "Kansikuvan päivitys epäonnistui",
|
||||||
"ToastDateTimeInvalidOrIncomplete": "Päivämäärä ja aika ovat epäkelvolliset tai puutteelliset",
|
"ToastDateTimeInvalidOrIncomplete": "Päivämäärä ja aika ovat epäkelvolliset tai puutteelliset",
|
||||||
"ToastDeleteFileFailed": "Tiedoston poistaminen epäonnistui",
|
"ToastDeleteFileFailed": "Tiedoston poistaminen epäonnistui",
|
||||||
|
|
@ -1029,6 +1043,8 @@
|
||||||
"ToastEpisodeDownloadQueueClearSuccess": "Jakson latausjono tyhjennetty",
|
"ToastEpisodeDownloadQueueClearSuccess": "Jakson latausjono tyhjennetty",
|
||||||
"ToastEpisodeUpdateSuccess": "{0} jaksoa päivitetty",
|
"ToastEpisodeUpdateSuccess": "{0} jaksoa päivitetty",
|
||||||
"ToastErrorCannotShare": "Ei voi jakaa alkuperäisesti tällä laitteella",
|
"ToastErrorCannotShare": "Ei voi jakaa alkuperäisesti tällä laitteella",
|
||||||
|
"ToastFailedToCreate": "Luonti epäonnistui",
|
||||||
|
"ToastFailedToDelete": "Poisto epäonnistui",
|
||||||
"ToastFailedToLoadData": "Tietojen lataaminen epäonnistui",
|
"ToastFailedToLoadData": "Tietojen lataaminen epäonnistui",
|
||||||
"ToastFailedToMatch": "Vastaaminen epäonnistui",
|
"ToastFailedToMatch": "Vastaaminen epäonnistui",
|
||||||
"ToastFailedToShare": "Jakaminen epäonnistui",
|
"ToastFailedToShare": "Jakaminen epäonnistui",
|
||||||
|
|
@ -1036,6 +1052,7 @@
|
||||||
"ToastInvalidImageUrl": "Epäkelvollinen kuvan URL-osoite",
|
"ToastInvalidImageUrl": "Epäkelvollinen kuvan URL-osoite",
|
||||||
"ToastInvalidMaxEpisodesToDownload": "Ladattavien jaksojen enimmäismäärä on epäkelvollinen",
|
"ToastInvalidMaxEpisodesToDownload": "Ladattavien jaksojen enimmäismäärä on epäkelvollinen",
|
||||||
"ToastInvalidUrl": "Epäkelvollinen URL-osoite",
|
"ToastInvalidUrl": "Epäkelvollinen URL-osoite",
|
||||||
|
"ToastInvalidUrls": "Yksi tai useampi URL on virheellinen",
|
||||||
"ToastItemCoverUpdateSuccess": "Kohteen kansikuva päivitetty",
|
"ToastItemCoverUpdateSuccess": "Kohteen kansikuva päivitetty",
|
||||||
"ToastItemDeletedFailed": "Kohteen poistaminen epäonnistui",
|
"ToastItemDeletedFailed": "Kohteen poistaminen epäonnistui",
|
||||||
"ToastItemDeletedSuccess": "Poistettu kohde",
|
"ToastItemDeletedSuccess": "Poistettu kohde",
|
||||||
|
|
@ -1060,6 +1077,7 @@
|
||||||
"ToastMustHaveAtLeastOnePath": "On oltava vähintään yksi polku",
|
"ToastMustHaveAtLeastOnePath": "On oltava vähintään yksi polku",
|
||||||
"ToastNameEmailRequired": "Nimi ja sähköpostiosoite vaaditaan",
|
"ToastNameEmailRequired": "Nimi ja sähköpostiosoite vaaditaan",
|
||||||
"ToastNameRequired": "Nimi vaaditaan",
|
"ToastNameRequired": "Nimi vaaditaan",
|
||||||
|
"ToastNewApiKeyUserError": "Täytyy valita käyttäjä",
|
||||||
"ToastNewEpisodesFound": "{0} uutta jaksoa löydetty",
|
"ToastNewEpisodesFound": "{0} uutta jaksoa löydetty",
|
||||||
"ToastNewUserCreatedFailed": "Tilin \"{0}\" luominen epäonnistui",
|
"ToastNewUserCreatedFailed": "Tilin \"{0}\" luominen epäonnistui",
|
||||||
"ToastNewUserCreatedSuccess": "Uusi tili luotu",
|
"ToastNewUserCreatedSuccess": "Uusi tili luotu",
|
||||||
|
|
@ -1084,6 +1102,7 @@
|
||||||
"ToastPlaylistUpdateSuccess": "Soittolista päivitetty",
|
"ToastPlaylistUpdateSuccess": "Soittolista päivitetty",
|
||||||
"ToastPodcastCreateFailed": "Podcastin luominen epäonnistui",
|
"ToastPodcastCreateFailed": "Podcastin luominen epäonnistui",
|
||||||
"ToastPodcastCreateSuccess": "Podcastin luominen onnistui",
|
"ToastPodcastCreateSuccess": "Podcastin luominen onnistui",
|
||||||
|
"ToastPodcastEpisodeUpdated": "Episodi päivitetty",
|
||||||
"ToastPodcastGetFeedFailed": "Podcast-syötteen saaminen epäonnistui",
|
"ToastPodcastGetFeedFailed": "Podcast-syötteen saaminen epäonnistui",
|
||||||
"ToastPodcastNoEpisodesInFeed": "RSS-syötteestä ei löytynyt jaksoja",
|
"ToastPodcastNoEpisodesInFeed": "RSS-syötteestä ei löytynyt jaksoja",
|
||||||
"ToastPodcastNoRssFeed": "Podcastilla ei ole RSS-syötettä",
|
"ToastPodcastNoRssFeed": "Podcastilla ei ole RSS-syötettä",
|
||||||
|
|
@ -1134,5 +1153,13 @@
|
||||||
"ToastUserPasswordChangeSuccess": "Salasana vaihdettu onnistuneesti",
|
"ToastUserPasswordChangeSuccess": "Salasana vaihdettu onnistuneesti",
|
||||||
"ToastUserPasswordMismatch": "Salasanat eivät täsmää",
|
"ToastUserPasswordMismatch": "Salasanat eivät täsmää",
|
||||||
"ToastUserPasswordMustChange": "Uusi salasana ei voi olla sama kuin vanha salasana",
|
"ToastUserPasswordMustChange": "Uusi salasana ei voi olla sama kuin vanha salasana",
|
||||||
"ToastUserRootRequireName": "Pääkäyttäjän nimi on pakollinen"
|
"ToastUserRootRequireName": "Pääkäyttäjän nimi on pakollinen",
|
||||||
|
"TooltipAddChapters": "Lisää luku tai lukuja",
|
||||||
|
"TooltipAddOneSecond": "Lisää 1 sekunti",
|
||||||
|
"TooltipAdjustChapterStart": "Napauta säätääksesi aloitusaikaa",
|
||||||
|
"TooltipLockAllChapters": "Lukitse kaikki luvut",
|
||||||
|
"TooltipLockChapter": "Lukitse luku (Shift+napauta valitaksesi alueen)",
|
||||||
|
"TooltipSubtractOneSecond": "Vähennä 1 sekunti",
|
||||||
|
"TooltipUnlockAllChapters": "Avaa kaikki luvut",
|
||||||
|
"TooltipUnlockChapter": "Avaa luku (Shift+napauta valitaksesi alueen)"
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -96,7 +96,7 @@
|
||||||
"ButtonScrollRight": "Przewiń w prawo",
|
"ButtonScrollRight": "Przewiń w prawo",
|
||||||
"ButtonSearch": "Szukaj",
|
"ButtonSearch": "Szukaj",
|
||||||
"ButtonSelectFolderPath": "Wybierz ścieżkę folderu",
|
"ButtonSelectFolderPath": "Wybierz ścieżkę folderu",
|
||||||
"ButtonSeries": "Serial",
|
"ButtonSeries": "Serie",
|
||||||
"ButtonSetChaptersFromTracks": "Ustawiaj rozdziały na podstawie utworów",
|
"ButtonSetChaptersFromTracks": "Ustawiaj rozdziały na podstawie utworów",
|
||||||
"ButtonShare": "Udostępnij",
|
"ButtonShare": "Udostępnij",
|
||||||
"ButtonShiftTimes": "Przesunięcie czasowe",
|
"ButtonShiftTimes": "Przesunięcie czasowe",
|
||||||
|
|
@ -233,8 +233,8 @@
|
||||||
"LabelAddToCollectionBatch": "Dodaj {0} książki do kolekcji",
|
"LabelAddToCollectionBatch": "Dodaj {0} książki do kolekcji",
|
||||||
"LabelAddToPlaylist": "Dodaj do playlisty",
|
"LabelAddToPlaylist": "Dodaj do playlisty",
|
||||||
"LabelAddToPlaylistBatch": "Dodaj {0} pozycji do playlisty",
|
"LabelAddToPlaylistBatch": "Dodaj {0} pozycji do playlisty",
|
||||||
"LabelAddedAt": "Dodano w",
|
"LabelAddedAt": "Dodano",
|
||||||
"LabelAddedDate": "Dodano",
|
"LabelAddedDate": "Dodano {0}",
|
||||||
"LabelAdminUsersOnly": "Tylko użytkownicy administracyjni",
|
"LabelAdminUsersOnly": "Tylko użytkownicy administracyjni",
|
||||||
"LabelAll": "Wszystkie",
|
"LabelAll": "Wszystkie",
|
||||||
"LabelAllEpisodesDownloaded": "Wszystkie odcinki pobrane",
|
"LabelAllEpisodesDownloaded": "Wszystkie odcinki pobrane",
|
||||||
|
|
|
||||||
|
|
@ -275,7 +275,7 @@
|
||||||
"LabelBonus": "Бонус",
|
"LabelBonus": "Бонус",
|
||||||
"LabelBooks": "Книги",
|
"LabelBooks": "Книги",
|
||||||
"LabelButtonText": "Текст кнопки",
|
"LabelButtonText": "Текст кнопки",
|
||||||
"LabelByAuthor": "{0}",
|
"LabelByAuthor": "от {0}",
|
||||||
"LabelChangePassword": "Изменить пароль",
|
"LabelChangePassword": "Изменить пароль",
|
||||||
"LabelChannels": "Ленты",
|
"LabelChannels": "Ленты",
|
||||||
"LabelChapterCount": "{0} Главы",
|
"LabelChapterCount": "{0} Главы",
|
||||||
|
|
|
||||||
|
|
@ -821,7 +821,7 @@
|
||||||
"MessageImportantNotice": "Viktig meddelande!",
|
"MessageImportantNotice": "Viktig meddelande!",
|
||||||
"MessageInsertChapterBelow": "Infoga kapitel nedanför",
|
"MessageInsertChapterBelow": "Infoga kapitel nedanför",
|
||||||
"MessageInvalidAsin": "Felaktig ASIN-kod",
|
"MessageInvalidAsin": "Felaktig ASIN-kod",
|
||||||
"MessageItemsSelected": "{0} objekt markerade",
|
"MessageItemsSelected": "{0} objekt valda",
|
||||||
"MessageItemsUpdated": "{0} objekt uppdaterade",
|
"MessageItemsUpdated": "{0} objekt uppdaterade",
|
||||||
"MessageJoinUsOn": "Anslut dig till oss på",
|
"MessageJoinUsOn": "Anslut dig till oss på",
|
||||||
"MessageLoading": "Laddar...",
|
"MessageLoading": "Laddar...",
|
||||||
|
|
|
||||||
|
|
@ -275,7 +275,7 @@
|
||||||
"LabelBonus": "额外",
|
"LabelBonus": "额外",
|
||||||
"LabelBooks": "图书",
|
"LabelBooks": "图书",
|
||||||
"LabelButtonText": "按钮文本",
|
"LabelButtonText": "按钮文本",
|
||||||
"LabelByAuthor": "由 {0}",
|
"LabelByAuthor": "作者: {0}",
|
||||||
"LabelChangePassword": "修改密码",
|
"LabelChangePassword": "修改密码",
|
||||||
"LabelChannels": "声道",
|
"LabelChannels": "声道",
|
||||||
"LabelChapterCount": "{0} 章节",
|
"LabelChapterCount": "{0} 章节",
|
||||||
|
|
|
||||||
4
package-lock.json
generated
4
package-lock.json
generated
|
|
@ -1,12 +1,12 @@
|
||||||
{
|
{
|
||||||
"name": "audiobookshelf",
|
"name": "audiobookshelf",
|
||||||
"version": "2.31.0",
|
"version": "2.32.1",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "audiobookshelf",
|
"name": "audiobookshelf",
|
||||||
"version": "2.31.0",
|
"version": "2.32.1",
|
||||||
"license": "GPL-3.0",
|
"license": "GPL-3.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"axios": "^0.27.2",
|
"axios": "^0.27.2",
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "audiobookshelf",
|
"name": "audiobookshelf",
|
||||||
"version": "2.31.0",
|
"version": "2.32.1",
|
||||||
"buildNumber": 1,
|
"buildNumber": 1,
|
||||||
"description": "Self-hosted audiobook and podcast server",
|
"description": "Self-hosted audiobook and podcast server",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
|
|
|
||||||
|
|
@ -57,8 +57,13 @@ class Audible {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
const genresFiltered = genres ? genres.filter((g) => g.type == 'genre').map((g) => g.name) : []
|
let genresCleaned = []
|
||||||
const tagsFiltered = genres ? genres.filter((g) => g.type == 'tag').map((g) => g.name) : []
|
let tagsCleaned = []
|
||||||
|
|
||||||
|
if (genres && Array.isArray(genres)) {
|
||||||
|
genresCleaned = [...new Set(genres.filter((g) => g.type == 'genre').map((g) => g.name))]
|
||||||
|
tagsCleaned = [...new Set(genres.filter((g) => g.type == 'tag').map((g) => g.name))]
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
title,
|
title,
|
||||||
|
|
@ -71,8 +76,8 @@ class Audible {
|
||||||
cover: image,
|
cover: image,
|
||||||
asin,
|
asin,
|
||||||
isbn,
|
isbn,
|
||||||
genres: genresFiltered.length ? genresFiltered : null,
|
genres: genresCleaned.length ? genresCleaned : null,
|
||||||
tags: tagsFiltered.length ? tagsFiltered.join(', ') : null,
|
tags: tagsCleaned.length ? tagsCleaned : null,
|
||||||
series: series.length ? series : null,
|
series: series.length ? series : null,
|
||||||
language: language ? language.charAt(0).toUpperCase() + language.slice(1) : null,
|
language: language ? language.charAt(0).toUpperCase() + language.slice(1) : null,
|
||||||
duration: runtimeLengthMin && !isNaN(runtimeLengthMin) ? Number(runtimeLengthMin) : 0,
|
duration: runtimeLengthMin && !isNaN(runtimeLengthMin) ? Number(runtimeLengthMin) : 0,
|
||||||
|
|
|
||||||
|
|
@ -89,6 +89,27 @@ class CustomProviderAdapter {
|
||||||
})
|
})
|
||||||
.filter((s) => s !== undefined)
|
.filter((s) => s !== undefined)
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* Validates and dedupes tags/genres array
|
||||||
|
* Can be comma separated string or array of strings
|
||||||
|
* @param {string|string[]} tagsGenres
|
||||||
|
* @returns {string[]}
|
||||||
|
*/
|
||||||
|
const validateTagsGenresArray = (tagsGenres) => {
|
||||||
|
if (!tagsGenres || (typeof tagsGenres !== 'string' && !Array.isArray(tagsGenres))) return undefined
|
||||||
|
|
||||||
|
// If string, split by comma and trim each item
|
||||||
|
if (typeof tagsGenres === 'string') tagsGenres = tagsGenres.split(',')
|
||||||
|
// If array, ensure all items are strings
|
||||||
|
else if (!tagsGenres.every((t) => typeof t === 'string')) return undefined
|
||||||
|
|
||||||
|
// Trim and filter out empty strings
|
||||||
|
tagsGenres = tagsGenres.map((t) => t.trim()).filter(Boolean)
|
||||||
|
if (!tagsGenres.length) return undefined
|
||||||
|
|
||||||
|
// Dedup
|
||||||
|
return [...new Set(tagsGenres)]
|
||||||
|
}
|
||||||
|
|
||||||
// re-map keys to throw out
|
// re-map keys to throw out
|
||||||
return matches.map((match) => {
|
return matches.map((match) => {
|
||||||
|
|
@ -105,8 +126,8 @@ class CustomProviderAdapter {
|
||||||
cover: toStringOrUndefined(cover),
|
cover: toStringOrUndefined(cover),
|
||||||
isbn: toStringOrUndefined(isbn),
|
isbn: toStringOrUndefined(isbn),
|
||||||
asin: toStringOrUndefined(asin),
|
asin: toStringOrUndefined(asin),
|
||||||
genres: Array.isArray(genres) && genres.every((g) => typeof g === 'string') ? genres : undefined,
|
genres: validateTagsGenresArray(genres),
|
||||||
tags: toStringOrUndefined(tags),
|
tags: validateTagsGenresArray(tags),
|
||||||
series: validateSeriesArray(series),
|
series: validateSeriesArray(series),
|
||||||
language: toStringOrUndefined(language),
|
language: toStringOrUndefined(language),
|
||||||
duration: !isNaN(duration) && duration !== null ? Number(duration) : undefined
|
duration: !isNaN(duration) && duration !== null ? Number(duration) : undefined
|
||||||
|
|
|
||||||
|
|
@ -259,18 +259,17 @@ class Scanner {
|
||||||
SocketAuthority.emitter('author_added', author.toOldJSON())
|
SocketAuthority.emitter('author_added', author.toOldJSON())
|
||||||
// Update filter data
|
// Update filter data
|
||||||
Database.addAuthorToFilterData(libraryItem.libraryId, author.name, author.id)
|
Database.addAuthorToFilterData(libraryItem.libraryId, author.name, author.id)
|
||||||
|
|
||||||
await Database.bookAuthorModel
|
|
||||||
.create({
|
|
||||||
authorId: author.id,
|
|
||||||
bookId: libraryItem.media.id
|
|
||||||
})
|
|
||||||
.then(() => {
|
|
||||||
Logger.info(`[Scanner] quickMatchBookBuildUpdatePayload: Added author "${author.name}" to "${libraryItem.media.title}"`)
|
|
||||||
libraryItem.media.authors.push(author)
|
|
||||||
hasAuthorUpdates = true
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
await Database.bookAuthorModel
|
||||||
|
.create({
|
||||||
|
authorId: author.id,
|
||||||
|
bookId: libraryItem.media.id
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
Logger.info(`[Scanner] quickMatchBookBuildUpdatePayload: Added author "${author.name}" to "${libraryItem.media.title}"`)
|
||||||
|
libraryItem.media.authors.push(author)
|
||||||
|
hasAuthorUpdates = true
|
||||||
|
})
|
||||||
}
|
}
|
||||||
const authorsRemoved = libraryItem.media.authors.filter((a) => !matchData.author.find((ma) => ma.toLowerCase() === a.name.toLowerCase()))
|
const authorsRemoved = libraryItem.media.authors.filter((a) => !matchData.author.find((ma) => ma.toLowerCase() === a.name.toLowerCase()))
|
||||||
if (authorsRemoved.length) {
|
if (authorsRemoved.length) {
|
||||||
|
|
|
||||||
|
|
@ -236,7 +236,7 @@ module.exports = {
|
||||||
} else if (group === 'publishedDecades') {
|
} else if (group === 'publishedDecades') {
|
||||||
const startYear = parseInt(value)
|
const startYear = parseInt(value)
|
||||||
const endYear = parseInt(value, 10) + 9
|
const endYear = parseInt(value, 10) + 9
|
||||||
mediaWhere = Sequelize.where(Sequelize.literal('CAST(`book`.`publishedYear` AS INTEGER)'), {
|
mediaWhere = Sequelize.where(Sequelize.literal('CAST(publishedYear AS INTEGER)'), {
|
||||||
[Sequelize.Op.between]: [startYear, endYear]
|
[Sequelize.Op.between]: [startYear, endYear]
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue