diff --git a/client/components/modals/authors/EditModal.vue b/client/components/modals/authors/EditModal.vue
index 09ca7806e..a31cfd872 100644
--- a/client/components/modals/authors/EditModal.vue
+++ b/client/components/modals/authors/EditModal.vue
@@ -9,7 +9,7 @@
-
+
delete
@@ -30,9 +30,6 @@
-
@@ -106,9 +103,9 @@ export default {
methods: {
init() {
this.imageUrl = ''
- this.authorCopy.name = this.author.name
- this.authorCopy.asin = this.author.asin
- this.authorCopy.description = this.author.description
+ this.authorCopy = {
+ ...this.author
+ }
},
removeClick() {
const payload = {
@@ -171,7 +168,9 @@ export default {
.$delete(`/api/authors/${this.authorId}/image`)
.then((data) => {
this.$toast.success(this.$strings.ToastAuthorImageRemoveSuccess)
- this.$store.commit('globals/showEditAuthorModal', data.author)
+
+ this.authorCopy.updatedAt = data.author.updatedAt
+ this.authorCopy.imagePath = data.author.imagePath
})
.catch((error) => {
console.error('Failed', error)
@@ -196,7 +195,9 @@ export default {
.then((data) => {
this.imageUrl = ''
this.$toast.success('Author image updated')
- this.$store.commit('globals/showEditAuthorModal', data.author)
+
+ this.authorCopy.updatedAt = data.author.updatedAt
+ this.authorCopy.imagePath = data.author.imagePath
})
.catch((error) => {
console.error('Failed', error)
@@ -231,8 +232,11 @@ export default {
} else if (response.updated) {
if (response.author.imagePath) {
this.$toast.success(this.$strings.ToastAuthorUpdateSuccess)
- this.$store.commit('globals/showEditAuthorModal', response.author)
} else this.$toast.success(this.$strings.ToastAuthorUpdateSuccessNoImageFound)
+
+ this.authorCopy = {
+ ...response.author
+ }
} else {
this.$toast.info('No updates were made for Author')
}
diff --git a/client/package-lock.json b/client/package-lock.json
index d6fd749a0..6a9d04724 100644
--- a/client/package-lock.json
+++ b/client/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "audiobookshelf-client",
- "version": "2.10.0",
+ "version": "2.10.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "audiobookshelf-client",
- "version": "2.10.0",
+ "version": "2.10.1",
"license": "ISC",
"dependencies": {
"@nuxtjs/axios": "^5.13.6",
diff --git a/client/package.json b/client/package.json
index 9b2b4f11b..f26282a31 100644
--- a/client/package.json
+++ b/client/package.json
@@ -1,6 +1,6 @@
{
"name": "audiobookshelf-client",
- "version": "2.10.0",
+ "version": "2.10.1",
"buildNumber": 1,
"description": "Self-hosted audiobook and podcast client",
"main": "index.js",
diff --git a/client/pages/library/_library/authors/index.vue b/client/pages/library/_library/authors/index.vue
index 27ba3ffe1..9adcce5b0 100644
--- a/client/pages/library/_library/authors/index.vue
+++ b/client/pages/library/_library/authors/index.vue
@@ -79,9 +79,6 @@ export default {
}
},
authorUpdated(author) {
- if (this.selectedAuthor && this.selectedAuthor.id === author.id) {
- this.$store.commit('globals/setSelectedAuthor', author)
- }
this.authors = this.authors.map((au) => {
if (au.id === author.id) {
return author
diff --git a/client/strings/de.json b/client/strings/de.json
index 4ce822ddd..50bb4c3b3 100644
--- a/client/strings/de.json
+++ b/client/strings/de.json
@@ -191,7 +191,7 @@
"LabelAbridged": "Gekürzt",
"LabelAbridgedChecked": "Gekürzt (angehakt)",
"LabelAbridgedUnchecked": "Ungekürzt (nicht angehakt)",
- "LabelAccessibleBy": "Accessible by",
+ "LabelAccessibleBy": "Zugänglich für",
"LabelAccountType": "Kontoart",
"LabelAccountTypeAdmin": "Admin",
"LabelAccountTypeGuest": "Gast",
@@ -271,7 +271,7 @@
"LabelDownloadNEpisodes": "Download {0} Episoden",
"LabelDuration": "Laufzeit",
"LabelDurationComparisonExactMatch": "(genauer Treffer)",
- "LabelDurationComparisonLonger": "({0} änger)",
+ "LabelDurationComparisonLonger": "({0} länger)",
"LabelDurationComparisonShorter": "({0} kürzer)",
"LabelDurationFound": "Gefundene Laufzeit:",
"LabelEbook": "E-Book",
@@ -471,8 +471,8 @@
"LabelSettingsEnableWatcher": "Überwachung aktivieren",
"LabelSettingsEnableWatcherForLibrary": "Ordnerüberwachung für die Bibliothek aktivieren",
"LabelSettingsEnableWatcherHelp": "Aktiviert das automatische Hinzufügen/Aktualisieren von Elementen, wenn Dateiänderungen erkannt werden. *Erfordert einen Server-Neustart",
- "LabelSettingsEpubsAllowScriptedContent": "Allow scripted content in epubs",
- "LabelSettingsEpubsAllowScriptedContentHelp": "Allow epub files to execute scripts. It is recommended to keep this setting disabled unless you trust the source of the epub files.",
+ "LabelSettingsEpubsAllowScriptedContent": "Skriptinhalte in Epubs zulassen",
+ "LabelSettingsEpubsAllowScriptedContentHelp": "Erlaube Epub-Dateien, Skripte auszuführen. Es wird empfohlen, diese Einstellung deaktiviert zu lassen, es sei denn, du vertraust der Quelle der Epub-Dateien.",
"LabelSettingsExperimentalFeatures": "Experimentelle Funktionen",
"LabelSettingsExperimentalFeaturesHelp": "Funktionen welche sich in der Entwicklung befinden, benötigen dein Feedback und deine Hilfe beim Testen. Klicke hier, um die Github-Diskussion zu öffnen.",
"LabelSettingsFindCovers": "Suche Titelbilder",
@@ -501,7 +501,7 @@
"LabelShowAll": "Alles anzeigen",
"LabelShowSeconds": "Zeige Sekunden",
"LabelSize": "Größe",
- "LabelSleepTimer": "Sleep-Timer",
+ "LabelSleepTimer": "Schlummerfunktion",
"LabelSlug": "URL Teil",
"LabelStart": "Start",
"LabelStarted": "Gestartet",
@@ -633,7 +633,7 @@
"MessageDragFilesIntoTrackOrder": "Verschiebe die Dateien in die richtige Reihenfolge",
"MessageEmbedFinished": "Einbettung abgeschlossen!",
"MessageEpisodesQueuedForDownload": "{0} Episode(n) in der Warteschlange zum Herunterladen",
- "MessageEreaderDevices": "To ensure delivery of ebooks, you may need to add the above email address as a valid sender for each device listed below.",
+ "MessageEreaderDevices": "Um die Zustellung von E-Books sicherzustellen, musst du eventuell die oben genannte E-Mail-Adresse als gültigen Absender für jedes unten aufgeführte Gerät hinzufügen.",
"MessageFeedURLWillBe": "Feed-URL wird {0} sein",
"MessageFetching": "Abrufen...",
"MessageForceReScanDescription": "Durchsucht alle Dateien erneut, wie bei einem frischen Scan. ID3-Tags von Audiodateien, OPF-Dateien und Textdateien werden neu durchsucht.",
@@ -807,4 +807,4 @@
"ToastSortingPrefixesUpdateSuccess": "Die Sortier-Prefixe wirden geupdated ({0} Einträge)",
"ToastUserDeleteFailed": "Benutzer konnte nicht gelöscht werden",
"ToastUserDeleteSuccess": "Benutzer gelöscht"
-}
\ No newline at end of file
+}
diff --git a/package-lock.json b/package-lock.json
index cf38355c1..41bbdf54b 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "audiobookshelf",
- "version": "2.10.0",
+ "version": "2.10.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "audiobookshelf",
- "version": "2.10.0",
+ "version": "2.10.1",
"license": "GPL-3.0",
"dependencies": {
"axios": "^0.27.2",
diff --git a/package.json b/package.json
index 22357a8e8..e31a28fc1 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "audiobookshelf",
- "version": "2.10.0",
+ "version": "2.10.1",
"buildNumber": 1,
"description": "Self-hosted audiobook and podcast server",
"main": "index.js",
diff --git a/server/controllers/LibraryController.js b/server/controllers/LibraryController.js
index 8451de155..0f30c410d 100644
--- a/server/controllers/LibraryController.js
+++ b/server/controllers/LibraryController.js
@@ -512,8 +512,7 @@ class LibraryController {
* @param {*} res
*/
async getUserPlaylistsForLibrary(req, res) {
- let playlistsForUser = await Database.playlistModel.getPlaylistsForUserAndLibrary(req.user.id, req.library.id)
- playlistsForUser = await Promise.all(playlistsForUser.map(async (p) => p.getOldJsonExpanded()))
+ let playlistsForUser = await Database.playlistModel.getOldPlaylistsForUserAndLibrary(req.user.id, req.library.id)
const payload = {
results: [],
diff --git a/server/models/Playlist.js b/server/models/Playlist.js
index d6a86d689..fedc83b2d 100644
--- a/server/models/Playlist.js
+++ b/server/models/Playlist.js
@@ -43,21 +43,24 @@ class Playlist extends Model {
},
order: [['playlistMediaItems', 'order', 'ASC']]
})
- return playlists.map(p => this.getOldPlaylist(p))
+ return playlists.map((p) => this.getOldPlaylist(p))
}
static getOldPlaylist(playlistExpanded) {
- const items = playlistExpanded.playlistMediaItems.map(pmi => {
- const libraryItemId = pmi.mediaItem?.podcast?.libraryItem?.id || pmi.mediaItem?.libraryItem?.id || null
- if (!libraryItemId) {
- Logger.error(`[Playlist] Invalid playlist media item - No library item id found`, JSON.stringify(pmi, null, 2))
- return null
- }
- return {
- episodeId: pmi.mediaItemType === 'podcastEpisode' ? pmi.mediaItemId : '',
- libraryItemId
- }
- }).filter(pmi => pmi)
+ const items = playlistExpanded.playlistMediaItems
+ .map((pmi) => {
+ const mediaItem = pmi.mediaItem || pmi.dataValues?.mediaItem
+ const libraryItemId = mediaItem?.podcast?.libraryItem?.id || mediaItem?.libraryItem?.id || null
+ if (!libraryItemId) {
+ Logger.error(`[Playlist] Invalid playlist media item - No library item id found`, JSON.stringify(pmi, null, 2))
+ return null
+ }
+ return {
+ episodeId: pmi.mediaItemType === 'podcastEpisode' ? pmi.mediaItemId : '',
+ libraryItemId
+ }
+ })
+ .filter((pmi) => pmi)
return new oldPlaylist({
id: playlistExpanded.id,
@@ -77,25 +80,26 @@ class Playlist extends Model {
* @returns {Promise