mirror of
https://github.com/advplyr/audiobookshelf.git
synced 2026-04-19 13:39:42 +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 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"
|
||||
useradd $uid_flags --gid $group --no-create-home --system --shell $shell -c "$descr" $user
|
||||
fi
|
||||
|
|
@ -39,7 +39,7 @@ add_group() {
|
|||
declare -r gid_flags="--gid $gid"
|
||||
fi
|
||||
|
||||
if ! getent group | grep -q "^$group:" ; then
|
||||
if ! getent group "$group" 2>&1 >/dev/null; then
|
||||
echo "Creating system group: $group"
|
||||
groupadd $gid_flags --system $group
|
||||
fi
|
||||
|
|
|
|||
|
|
@ -97,7 +97,10 @@ export default {
|
|||
...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() {
|
||||
return this.selectedPlaylistItems.length > 1
|
||||
|
|
|
|||
|
|
@ -278,7 +278,7 @@ export default {
|
|||
})
|
||||
},
|
||||
insertNewItem(item) {
|
||||
this.selected.push(item)
|
||||
if (!this.selected.includes(item)) this.selected.push(item)
|
||||
this.$emit('input', this.selected)
|
||||
this.$emit('newItem', item)
|
||||
this.textInput = null
|
||||
|
|
|
|||
|
|
@ -287,7 +287,7 @@ export default {
|
|||
})
|
||||
},
|
||||
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('newItem', item)
|
||||
this.textInput = null
|
||||
|
|
|
|||
4
client/package-lock.json
generated
4
client/package-lock.json
generated
|
|
@ -1,12 +1,12 @@
|
|||
{
|
||||
"name": "audiobookshelf-client",
|
||||
"version": "2.31.0",
|
||||
"version": "2.32.0",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "audiobookshelf-client",
|
||||
"version": "2.31.0",
|
||||
"version": "2.32.0",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"@nuxtjs/axios": "^5.13.6",
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "audiobookshelf-client",
|
||||
"version": "2.31.0",
|
||||
"version": "2.32.0",
|
||||
"buildNumber": 1,
|
||||
"description": "Self-hosted audiobook and podcast client",
|
||||
"main": "index.js",
|
||||
|
|
|
|||
|
|
@ -49,6 +49,7 @@
|
|||
"ButtonMapChapterTitles": "Χαρτογράφηση Τίτλων Κεφαλαίων",
|
||||
"ButtonMatchAllAuthors": "Αντιστοίχιση Όλων των Συγγραφέων",
|
||||
"ButtonMatchBooks": "Αντιστοίχιση Βιβλίων",
|
||||
"ButtonNevermind": "Άστο",
|
||||
"ButtonNext": "Επόμενο",
|
||||
"ButtonNextChapter": "Επόμενο Κεφάλαιο",
|
||||
"ButtonNextItemInQueue": "Επόμενο Αντικείμενο στην Ουρά",
|
||||
|
|
@ -62,8 +63,13 @@
|
|||
"ButtonPlaylists": "Λίστες Αναπαραγωγής",
|
||||
"ButtonPrevious": "Προηγούμενο",
|
||||
"ButtonPreviousChapter": "Προηγούμενο Κεφάλαιο",
|
||||
"ButtonProbeAudioFile": "Ανάλυση Αρχείου Ήχου",
|
||||
"ButtonPurgeAllCache": "Εκκαθάριση Όλης της Προσωρινής Μνήμης",
|
||||
"ButtonPurgeItemsCache": "Εκκαθάριση της Μνήμης Αντικειμένων",
|
||||
"ButtonQueueAddItem": "Προσθήκη στην ουρά",
|
||||
"ButtonQueueRemoveItem": "Αφαίρεση απ'την ουρά",
|
||||
"ButtonQuickEmbed": "Γρήγορη Ενσωμάτωση",
|
||||
"ButtonQuickEmbedMetadata": "Γρήγορη Ενσωμάτωση Μεταδεδομένων",
|
||||
"ButtonQuickMatch": "Γρήγορη Αντιστοίχηση",
|
||||
"ButtonReScan": "Επανασάρωση",
|
||||
"ButtonRead": "Ανάγνωση",
|
||||
|
|
@ -73,35 +79,237 @@
|
|||
"ButtonRemove": "Αφαίρεση",
|
||||
"ButtonRemoveAll": "Αφαίρεση Όλων",
|
||||
"ButtonRemoveAllLibraryItems": "Αφαίρεση Όλων των Αντικειμέων Βιβλιοθήκης",
|
||||
"ButtonRemoveFromContinueListening": "Αφαίρεση από τη Συνέχεια Ακρόασης",
|
||||
"ButtonRemoveFromContinueReading": "Αφαίρεση από τη Συνέχεια Ανάγνωσης",
|
||||
"ButtonRemoveSeriesFromContinueSeries": "Αφαίρεση Σειράς από τη Συνέχεια Σειράς",
|
||||
"ButtonReset": "Επαναφορά",
|
||||
"ButtonResetToDefault": "Επαναφορά στις προεπιλογές",
|
||||
"ButtonRestore": "Επαναφορά",
|
||||
"ButtonSave": "Αποθήκευση",
|
||||
"ButtonSaveAndClose": "Αποθήκευση και Κλείσιμο",
|
||||
"ButtonSaveTracklist": "Αποθήκευση Λίστας Κομματιών",
|
||||
"ButtonScan": "Σάρψση",
|
||||
"ButtonScanLibrary": "Σάρωση Βιβλιοθήκης",
|
||||
"ButtonScrollLeft": "Κύλιση Αριστερά",
|
||||
"ButtonScrollRight": "Κύλιση Δεξιά",
|
||||
"ButtonSearch": "Αναζήτηση",
|
||||
"ButtonSelectFolderPath": "Επιλογή Διαδρομής Φακέλου",
|
||||
"ButtonSeries": "Σειρά",
|
||||
"ButtonSetChaptersFromTracks": "Ορισμός κεφαλαίων από τα κομμάτια",
|
||||
"ButtonShare": "Κοινοποίηση",
|
||||
"ButtonShiftTimes": "Χρόνοι Μετακίνησης",
|
||||
"ButtonShow": "Εμφάνιση",
|
||||
"ButtonStartM4BEncode": "Έναρξη Κωδικοποίησης M4B",
|
||||
"ButtonStats": "Στατιστικά",
|
||||
"ButtonSubmit": "Υποβολή",
|
||||
"ButtonTest": "Δοκιμή",
|
||||
"ButtonUpload": "Μεταφόρτωση",
|
||||
"ButtonUploadBackup": "Μεταφόρτωση Αντιγράφου Ασφαλείας",
|
||||
"ButtonUploadCover": "Μεταφόρτωση Εξωφύλλου",
|
||||
"ButtonUploadOPMLFile": "Μεταφόρτωση Αρχείου OPML",
|
||||
"ButtonUserDelete": "Διαγραφή Χρήστη {0}",
|
||||
"ButtonUserEdit": "Επεξεργασίας χρήστη {0}",
|
||||
"ButtonViewAll": "Εμφάνιση Όλων",
|
||||
"ButtonYes": "Ναι",
|
||||
"ErrorUploadLacksTitle": "Πρέπει να έχει τίτλο",
|
||||
"HeaderAccount": "Λογαριασμός",
|
||||
"HeaderAdvanced": "Για Προχωρημένους",
|
||||
"HeaderApiKeys": "Κλειδιά API",
|
||||
"HeaderAudioTracks": "Κομμάτια Ήχου",
|
||||
"HeaderBackups": "Αντίγραφα Ασφαλείας",
|
||||
"HeaderBulkChapterModal": "Προσθήκη Πολλαπλών Κεφαλαίων",
|
||||
"HeaderChangePassword": "Αλλαγή Κωδικού Πρόσβασης",
|
||||
"HeaderChapters": "Κεφάλαια",
|
||||
"HeaderChooseAFolder": "Επιλογή Φακέλου",
|
||||
"HeaderCollection": "Συλλογή",
|
||||
"HeaderCollectionItems": "Αντικείμενα Συλλογής",
|
||||
"HeaderCover": "Εξώφυλλο",
|
||||
"HeaderCurrentDownloads": "Τρέχουσες Λήψεις",
|
||||
"HeaderDetails": "Λεπτομέρειες",
|
||||
"HeaderDownloadQueue": "Ουρά Λήψης",
|
||||
"HeaderEbookFiles": "Αρχεία Ebook",
|
||||
"HeaderEmail": "Ηλεκτρονικό Ταχυδρομίο",
|
||||
"HeaderEmailSettings": "Ρυθμίσεις Ηλεκτρονικού Ταχυδρομίου",
|
||||
"HeaderEpisodes": "Επεισόδια",
|
||||
"HeaderEreaderSettings": "Ρυθμίσεις Ereader",
|
||||
"HeaderFiles": "Αρχεία",
|
||||
"HeaderFindChapters": "Εύρεση Κεφαλαίων",
|
||||
"HeaderItemFiles": "Αρχεία Αντικειμένων",
|
||||
"HeaderLastListeningSession": "Τελευταία Συνεδρία Ακρόασης",
|
||||
"HeaderLatestEpisodes": "Τελευταία Επεισόδια",
|
||||
"HeaderLibraries": "Βιβλιοθήκες",
|
||||
"HeaderLibraryFiles": "Αρχεία Βιβλιοθήκης",
|
||||
"HeaderLibraryStats": "Στατιστικά Βιβλιοθήκης",
|
||||
"HeaderListeningSessions": "Συνεδρίες Ακρόασης",
|
||||
"HeaderListeningStats": "Στατιστικά Ακρόασης",
|
||||
"HeaderMatch": "Ταύτιση",
|
||||
"HeaderNewAccount": "Νέος Λογαριασμός",
|
||||
"HeaderNewApiKey": "Νέο Κλειδί API",
|
||||
"HeaderNewLibrary": "Νέα Βιβλιοθήκη",
|
||||
"HeaderNotificationCreate": "Δημιουργία Ειδοποίησης",
|
||||
"HeaderNotificationUpdate": "Ενημέρωση Ειδοποίησης",
|
||||
"HeaderNotifications": "Ειδοποιήσεις",
|
||||
"HeaderOpenRSSFeed": "Άνοιγμα Τροφοδοσίας RSS",
|
||||
"HeaderOtherFiles": "Άλλα Αρχεία",
|
||||
"HeaderPermissions": "Δικαιώματα",
|
||||
"HeaderPlayerSettings": "Ρυθμίσεις Αναπαραγωγής",
|
||||
"HeaderPlaylist": "Λίστα Αναπαραγωγής",
|
||||
"HeaderPlaylistItems": "Αντικείμενα Λίστας Αναπαραγωγής",
|
||||
"HeaderPresets": "Προεπιλογές",
|
||||
"HeaderRSSFeedGeneral": "Λεπτομέρειες RSS",
|
||||
"HeaderRSSFeedIsOpen": "Η Τροφοδοσία RSS είναι Ανοιχτή",
|
||||
"HeaderRemoveEpisode": "Αφαίρεση Επεισοδίου",
|
||||
"HeaderSession": "Συνεδρία",
|
||||
"HeaderSetBackupSchedule": "Ορισμός Προγράμματος Αντιγράφων Ασφαλείας",
|
||||
"HeaderSettings": "Ρυθμίσεις",
|
||||
"HeaderSettingsDisplay": "Προβολή",
|
||||
"HeaderSettingsGeneral": "Γενικά",
|
||||
"HeaderSettingsSecurity": "Ασφάλεια",
|
||||
"HeaderSleepTimer": "Χρονοδιακόπτης Ύπνου",
|
||||
"HeaderStatsLargestItems": "Μεγαλύτερα Αντικείμενα",
|
||||
"HeaderStatsLongestItems": "Μεγαλύτερα Αντικείμενα (ώρες)",
|
||||
"HeaderStatsMinutesListeningChart": "Λεπτά Ακρόασης (τελευταίες 7 ημέρες)",
|
||||
"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",
|
||||
"LabelAddToPlaylist": "Dodaj do playlisty",
|
||||
"LabelAddToPlaylistBatch": "Dodaj {0} pozycji do playlisty",
|
||||
"LabelAddedAt": "Dodano w",
|
||||
"LabelAddedDate": "Dodano",
|
||||
"LabelAddedAt": "Dodano",
|
||||
"LabelAddedDate": "Dodano {0}",
|
||||
"LabelAdminUsersOnly": "Tylko użytkownicy administracyjni",
|
||||
"LabelAll": "Wszystkie",
|
||||
"LabelAllEpisodesDownloaded": "Wszystkie odcinki pobrane",
|
||||
|
|
|
|||
|
|
@ -275,7 +275,7 @@
|
|||
"LabelBonus": "额外",
|
||||
"LabelBooks": "图书",
|
||||
"LabelButtonText": "按钮文本",
|
||||
"LabelByAuthor": "由 {0}",
|
||||
"LabelByAuthor": "作者: {0}",
|
||||
"LabelChangePassword": "修改密码",
|
||||
"LabelChannels": "声道",
|
||||
"LabelChapterCount": "{0} 章节",
|
||||
|
|
|
|||
4
package-lock.json
generated
4
package-lock.json
generated
|
|
@ -1,12 +1,12 @@
|
|||
{
|
||||
"name": "audiobookshelf",
|
||||
"version": "2.31.0",
|
||||
"version": "2.32.0",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "audiobookshelf",
|
||||
"version": "2.31.0",
|
||||
"version": "2.32.0",
|
||||
"license": "GPL-3.0",
|
||||
"dependencies": {
|
||||
"axios": "^0.27.2",
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "audiobookshelf",
|
||||
"version": "2.31.0",
|
||||
"version": "2.32.0",
|
||||
"buildNumber": 1,
|
||||
"description": "Self-hosted audiobook and podcast server",
|
||||
"main": "index.js",
|
||||
|
|
|
|||
|
|
@ -57,8 +57,13 @@ class Audible {
|
|||
})
|
||||
}
|
||||
|
||||
const genresFiltered = genres ? genres.filter((g) => g.type == 'genre').map((g) => g.name) : []
|
||||
const tagsFiltered = genres ? genres.filter((g) => g.type == 'tag').map((g) => g.name) : []
|
||||
let genresCleaned = null
|
||||
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 {
|
||||
title,
|
||||
|
|
@ -71,8 +76,8 @@ class Audible {
|
|||
cover: image,
|
||||
asin,
|
||||
isbn,
|
||||
genres: genresFiltered.length ? genresFiltered : null,
|
||||
tags: tagsFiltered.length ? tagsFiltered.join(', ') : null,
|
||||
genres: genresCleaned.length ? genresCleaned : null,
|
||||
tags: tagsCleaned.length ? tagsCleaned : null,
|
||||
series: series.length ? series : null,
|
||||
language: language ? language.charAt(0).toUpperCase() + language.slice(1) : null,
|
||||
duration: runtimeLengthMin && !isNaN(runtimeLengthMin) ? Number(runtimeLengthMin) : 0,
|
||||
|
|
|
|||
|
|
@ -89,6 +89,27 @@ class CustomProviderAdapter {
|
|||
})
|
||||
.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
|
||||
return matches.map((match) => {
|
||||
|
|
@ -105,8 +126,8 @@ class CustomProviderAdapter {
|
|||
cover: toStringOrUndefined(cover),
|
||||
isbn: toStringOrUndefined(isbn),
|
||||
asin: toStringOrUndefined(asin),
|
||||
genres: Array.isArray(genres) && genres.every((g) => typeof g === 'string') ? genres : undefined,
|
||||
tags: toStringOrUndefined(tags),
|
||||
genres: validateTagsGenresArray(genres),
|
||||
tags: validateTagsGenresArray(tags),
|
||||
series: validateSeriesArray(series),
|
||||
language: toStringOrUndefined(language),
|
||||
duration: !isNaN(duration) && duration !== null ? Number(duration) : undefined
|
||||
|
|
|
|||
|
|
@ -259,18 +259,17 @@ class Scanner {
|
|||
SocketAuthority.emitter('author_added', author.toOldJSON())
|
||||
// Update filter data
|
||||
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()))
|
||||
if (authorsRemoved.length) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue