mirror of
https://github.com/advplyr/audiobookshelf.git
synced 2026-07-09 10:51:37 +00:00
Compare commits
17 commits
626596b192
...
81e96df9c5
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
81e96df9c5 | ||
|
|
44aff23e1b | ||
|
|
cc48d9f26d | ||
|
|
ac08e897ee | ||
|
|
3c2eec8279 | ||
|
|
7b37c98e88 | ||
|
|
088353ae26 | ||
|
|
e003544edd | ||
|
|
076ece6fe7 | ||
|
|
14f72ab7d4 | ||
|
|
ebcb122eb8 | ||
|
|
648983708e | ||
|
|
961d066bdd | ||
|
|
372c9a5322 | ||
|
|
a5750deaaf | ||
|
|
797dba2448 | ||
|
|
fbe9971a8b |
14 changed files with 268 additions and 32 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.0",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "audiobookshelf-client",
|
"name": "audiobookshelf-client",
|
||||||
"version": "2.31.0",
|
"version": "2.32.0",
|
||||||
"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.0",
|
||||||
"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": "Δεν έχετε λίστες αναπαραγωγής"
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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} 章节",
|
||||||
|
|
|
||||||
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.0",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "audiobookshelf",
|
"name": "audiobookshelf",
|
||||||
"version": "2.31.0",
|
"version": "2.32.0",
|
||||||
"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.0",
|
||||||
"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 = null
|
||||||
const tagsFiltered = genres ? genres.filter((g) => g.type == 'tag').map((g) => g.name) : []
|
let tagsCleaned = null
|
||||||
|
|
||||||
|
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) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue