mirror of
https://github.com/advplyr/audiobookshelf.git
synced 2026-07-28 20:21:48 +00:00
Compare commits
No commits in common. "81e96df9c5f8db502e3d9740ee8cb6b718c5a074" and "626596b192013ba9f5a011dd110e288124c95ebe" have entirely different histories.
81e96df9c5
...
626596b192
14 changed files with 32 additions and 268 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 "$user" 2>&1 >/dev/null; then
|
if ! getent passwd | grep -q "^$user:"; 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 "$group" 2>&1 >/dev/null; then
|
if ! getent group | grep -q "^$group:" ; then
|
||||||
echo "Creating system group: $group"
|
echo "Creating system group: $group"
|
||||||
groupadd $gid_flags --system $group
|
groupadd $gid_flags --system $group
|
||||||
fi
|
fi
|
||||||
|
|
|
||||||
|
|
@ -97,10 +97,7 @@ export default {
|
||||||
...playlist
|
...playlist
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.sort((a, b) => {
|
.sort((a, b) => (a.isItemIncluded ? -1 : 1))
|
||||||
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) {
|
||||||
if (!this.selected.includes(item)) this.selected.push(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) {
|
||||||
if (!this.selected.find((i) => i.name === item.name)) this.selected.push(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
|
||||||
|
|
|
||||||
4
client/package-lock.json
generated
4
client/package-lock.json
generated
|
|
@ -1,12 +1,12 @@
|
||||||
{
|
{
|
||||||
"name": "audiobookshelf-client",
|
"name": "audiobookshelf-client",
|
||||||
"version": "2.32.0",
|
"version": "2.31.0",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "audiobookshelf-client",
|
"name": "audiobookshelf-client",
|
||||||
"version": "2.32.0",
|
"version": "2.31.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.32.0",
|
"version": "2.31.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,7 +49,6 @@
|
||||||
"ButtonMapChapterTitles": "Χαρτογράφηση Τίτλων Κεφαλαίων",
|
"ButtonMapChapterTitles": "Χαρτογράφηση Τίτλων Κεφαλαίων",
|
||||||
"ButtonMatchAllAuthors": "Αντιστοίχιση Όλων των Συγγραφέων",
|
"ButtonMatchAllAuthors": "Αντιστοίχιση Όλων των Συγγραφέων",
|
||||||
"ButtonMatchBooks": "Αντιστοίχιση Βιβλίων",
|
"ButtonMatchBooks": "Αντιστοίχιση Βιβλίων",
|
||||||
"ButtonNevermind": "Άστο",
|
|
||||||
"ButtonNext": "Επόμενο",
|
"ButtonNext": "Επόμενο",
|
||||||
"ButtonNextChapter": "Επόμενο Κεφάλαιο",
|
"ButtonNextChapter": "Επόμενο Κεφάλαιο",
|
||||||
"ButtonNextItemInQueue": "Επόμενο Αντικείμενο στην Ουρά",
|
"ButtonNextItemInQueue": "Επόμενο Αντικείμενο στην Ουρά",
|
||||||
|
|
@ -63,13 +62,8 @@
|
||||||
"ButtonPlaylists": "Λίστες Αναπαραγωγής",
|
"ButtonPlaylists": "Λίστες Αναπαραγωγής",
|
||||||
"ButtonPrevious": "Προηγούμενο",
|
"ButtonPrevious": "Προηγούμενο",
|
||||||
"ButtonPreviousChapter": "Προηγούμενο Κεφάλαιο",
|
"ButtonPreviousChapter": "Προηγούμενο Κεφάλαιο",
|
||||||
"ButtonProbeAudioFile": "Ανάλυση Αρχείου Ήχου",
|
|
||||||
"ButtonPurgeAllCache": "Εκκαθάριση Όλης της Προσωρινής Μνήμης",
|
|
||||||
"ButtonPurgeItemsCache": "Εκκαθάριση της Μνήμης Αντικειμένων",
|
|
||||||
"ButtonQueueAddItem": "Προσθήκη στην ουρά",
|
"ButtonQueueAddItem": "Προσθήκη στην ουρά",
|
||||||
"ButtonQueueRemoveItem": "Αφαίρεση απ'την ουρά",
|
"ButtonQueueRemoveItem": "Αφαίρεση απ'την ουρά",
|
||||||
"ButtonQuickEmbed": "Γρήγορη Ενσωμάτωση",
|
|
||||||
"ButtonQuickEmbedMetadata": "Γρήγορη Ενσωμάτωση Μεταδεδομένων",
|
|
||||||
"ButtonQuickMatch": "Γρήγορη Αντιστοίχηση",
|
"ButtonQuickMatch": "Γρήγορη Αντιστοίχηση",
|
||||||
"ButtonReScan": "Επανασάρωση",
|
"ButtonReScan": "Επανασάρωση",
|
||||||
"ButtonRead": "Ανάγνωση",
|
"ButtonRead": "Ανάγνωση",
|
||||||
|
|
@ -79,237 +73,35 @@
|
||||||
"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": "Πρόσφατες Συνεδρίες",
|
||||||
"HeaderStatsTop10Authors": "10 Κορυφαίου Συγγραφείς",
|
"HeaderTableOfContents": "Πίνακας Περιεχομένων"
|
||||||
"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",
|
"LabelAddedAt": "Dodano w",
|
||||||
"LabelAddedDate": "Dodano {0}",
|
"LabelAddedDate": "Dodano",
|
||||||
"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.32.0",
|
"version": "2.31.0",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "audiobookshelf",
|
"name": "audiobookshelf",
|
||||||
"version": "2.32.0",
|
"version": "2.31.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.32.0",
|
"version": "2.31.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,13 +57,8 @@ class Audible {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
let genresCleaned = null
|
const genresFiltered = genres ? genres.filter((g) => g.type == 'genre').map((g) => g.name) : []
|
||||||
let tagsCleaned = null
|
const tagsFiltered = genres ? genres.filter((g) => g.type == 'tag').map((g) => g.name) : []
|
||||||
|
|
||||||
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,
|
||||||
|
|
@ -76,8 +71,8 @@ class Audible {
|
||||||
cover: image,
|
cover: image,
|
||||||
asin,
|
asin,
|
||||||
isbn,
|
isbn,
|
||||||
genres: genresCleaned.length ? genresCleaned : null,
|
genres: genresFiltered.length ? genresFiltered : null,
|
||||||
tags: tagsCleaned.length ? tagsCleaned : null,
|
tags: tagsFiltered.length ? tagsFiltered.join(', ') : 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,27 +89,6 @@ 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) => {
|
||||||
|
|
@ -126,8 +105,8 @@ class CustomProviderAdapter {
|
||||||
cover: toStringOrUndefined(cover),
|
cover: toStringOrUndefined(cover),
|
||||||
isbn: toStringOrUndefined(isbn),
|
isbn: toStringOrUndefined(isbn),
|
||||||
asin: toStringOrUndefined(asin),
|
asin: toStringOrUndefined(asin),
|
||||||
genres: validateTagsGenresArray(genres),
|
genres: Array.isArray(genres) && genres.every((g) => typeof g === 'string') ? genres : undefined,
|
||||||
tags: validateTagsGenresArray(tags),
|
tags: toStringOrUndefined(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,17 +259,18 @@ 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