diff --git a/components/modals/ItemMoreMenuModal.vue b/components/modals/ItemMoreMenuModal.vue index 319598bc..87a3a993 100644 --- a/components/modals/ItemMoreMenuModal.vue +++ b/components/modals/ItemMoreMenuModal.vue @@ -26,6 +26,10 @@ export default { type: Object, default: () => null }, + playlist: { + type: Object, + default: () => null + }, hideRssFeedOption: Boolean }, data() { @@ -92,6 +96,15 @@ export default { } } + // If on playlist page show remove from playlist option + if (this.playlist) { + items.push({ + text: this.$strings.LabelRemoveFromPlaylist, + value: 'removeFromPlaylist', + icon: 'playlist_remove' + }) + } + if (this.showRSSFeedOption) { items.push({ text: this.rssFeed ? this.$strings.HeaderRSSFeed : this.$strings.HeaderOpenRSSFeed, @@ -255,6 +268,8 @@ export default { } else if (action === 'playlist') { this.$store.commit('globals/setSelectedPlaylistItems', [{ libraryItem: this.libraryItem, episode: this.episode }]) this.$store.commit('globals/setShowPlaylistsAddCreateModal', true) + } else if (action === 'removeFromPlaylist') { + this.removeFromPlaylistClick() } else if (action === 'markFinished') { if (this.episode) this.toggleEpisodeFinished() else this.toggleFinished() @@ -456,6 +471,29 @@ export default { .finally(() => { this.$emit('update:processing', false) }) + }, + removeFromPlaylistClick() { + if (!this.playlist) { + this.$toast.error('Invalid: No Playlist') + return + } + + this.$emit('update:processing', true) + let url = `/api/playlists/${this.playlist.id}/item/${this.serverLibraryItemId}` + if (this.serverEpisodeId) url += `/${this.serverEpisodeId}` + this.$axios + .$delete(url) + .then(() => { + this.$toast.success('Item removed from playlist') + }) + .catch((error) => { + const errorMsg = error.response?.data || 'Unknown error' + console.error('Failed to remove item from playlist', error) + this.$toast.error('Failed to remove from playlist: ' + errorMsg) + }) + .finally(() => { + this.$emit('update:processing', false) + }) } }, mounted() {} diff --git a/pages/playlist/_id.vue b/pages/playlist/_id.vue index 14be40d3..e56f083b 100644 --- a/pages/playlist/_id.vue +++ b/pages/playlist/_id.vue @@ -24,7 +24,7 @@ - +
@@ -140,8 +140,24 @@ export default { this.$eventBus.$emit('play-item', { libraryItemId: nextItem.libraryItemId, episodeId: nextItem.episodeId }) } } + }, + playlistUpdated(playlist) { + if (this.playlist.id !== playlist.id) return + this.playlist = playlist + }, + playlistRemoved(playlist) { + if (this.playlist.id === playlist.id) { + this.$router.replace('/bookshelf/playlists') + } } }, - mounted() {} + mounted() { + this.$socket.$on('playlist_updated', this.playlistUpdated) + this.$socket.$on('playlist_removed', this.playlistRemoved) + }, + beforeDestroy() { + this.$socket.$off('playlist_updated', this.playlistUpdated) + this.$socket.$off('playlist_removed', this.playlistRemoved) + } } \ No newline at end of file diff --git a/strings/cs.json b/strings/cs.json index 31e72bdf..2c342dc5 100644 --- a/strings/cs.json +++ b/strings/cs.json @@ -191,6 +191,7 @@ "LabelReadAgain": "Číst znovu", "LabelRecentlyAdded": "Nedávno přidáno", "LabelRecentSeries": "Nedávné série", + "LabelRemoveFromPlaylist": "Remove from Playlist", "LabelRSSFeedCustomOwnerEmail": "Vlastní e-mail vlastníka", "LabelRSSFeedCustomOwnerName": "Vlastní jméno vlastníka", "LabelRSSFeedPreventIndexing": "Zabránit indexování", diff --git a/strings/da.json b/strings/da.json index 8a314f2f..285d9298 100644 --- a/strings/da.json +++ b/strings/da.json @@ -191,6 +191,7 @@ "LabelReadAgain": "Read Again", "LabelRecentlyAdded": "Recently Added", "LabelRecentSeries": "Recent Series", + "LabelRemoveFromPlaylist": "Remove from Playlist", "LabelRSSFeedCustomOwnerEmail": "Brugerdefineret ejerens e-mail", "LabelRSSFeedCustomOwnerName": "Brugerdefineret ejerens navn", "LabelRSSFeedPreventIndexing": "Forhindrer indeksering", diff --git a/strings/de.json b/strings/de.json index 1e94df10..2e5d5cd3 100644 --- a/strings/de.json +++ b/strings/de.json @@ -191,6 +191,7 @@ "LabelReadAgain": "Erneut lesen", "LabelRecentlyAdded": "Kürzlich hinzugefügt", "LabelRecentSeries": "Aktuelle Serien", + "LabelRemoveFromPlaylist": "Remove from Playlist", "LabelRSSFeedCustomOwnerEmail": "Benutzerdefinierte Eigentümer-E-Mail", "LabelRSSFeedCustomOwnerName": "Benutzerdefinierter Name des Eigentümers", "LabelRSSFeedPreventIndexing": "Indizierung verhindern", diff --git a/strings/en-us.json b/strings/en-us.json index eeab4b7b..c48c5907 100644 --- a/strings/en-us.json +++ b/strings/en-us.json @@ -191,6 +191,7 @@ "LabelReadAgain": "Read Again", "LabelRecentlyAdded": "Recently Added", "LabelRecentSeries": "Recent Series", + "LabelRemoveFromPlaylist": "Remove from Playlist", "LabelRSSFeedCustomOwnerEmail": "Custom owner Email", "LabelRSSFeedCustomOwnerName": "Custom owner Name", "LabelRSSFeedPreventIndexing": "Prevent Indexing", diff --git a/strings/es.json b/strings/es.json index e22cc00f..9a09bdd5 100644 --- a/strings/es.json +++ b/strings/es.json @@ -191,6 +191,7 @@ "LabelReadAgain": "Read Again", "LabelRecentlyAdded": "Recently Added", "LabelRecentSeries": "Recent Series", + "LabelRemoveFromPlaylist": "Remove from Playlist", "LabelRSSFeedCustomOwnerEmail": "Email de dueño personalizado", "LabelRSSFeedCustomOwnerName": "Nombre de dueño personalizado", "LabelRSSFeedPreventIndexing": "Prevenir Indexado", diff --git a/strings/fr.json b/strings/fr.json index 512c387f..437fe1e2 100644 --- a/strings/fr.json +++ b/strings/fr.json @@ -191,6 +191,7 @@ "LabelReadAgain": "Read Again", "LabelRecentlyAdded": "Recently Added", "LabelRecentSeries": "Recent Series", + "LabelRemoveFromPlaylist": "Remove from Playlist", "LabelRSSFeedCustomOwnerEmail": "Courriel du propriétaire personnalisé", "LabelRSSFeedCustomOwnerName": "Nom propriétaire personnalisé", "LabelRSSFeedPreventIndexing": "Empêcher l’indexation", diff --git a/strings/gu.json b/strings/gu.json index 965bc350..0b011652 100644 --- a/strings/gu.json +++ b/strings/gu.json @@ -191,6 +191,7 @@ "LabelReadAgain": "Read Again", "LabelRecentlyAdded": "Recently Added", "LabelRecentSeries": "Recent Series", + "LabelRemoveFromPlaylist": "Remove from Playlist", "LabelRSSFeedCustomOwnerEmail": "Custom owner Email", "LabelRSSFeedCustomOwnerName": "Custom owner Name", "LabelRSSFeedPreventIndexing": "Prevent Indexing", diff --git a/strings/hi.json b/strings/hi.json index 11ceb47d..eaa8fea2 100644 --- a/strings/hi.json +++ b/strings/hi.json @@ -191,6 +191,7 @@ "LabelReadAgain": "Read Again", "LabelRecentlyAdded": "Recently Added", "LabelRecentSeries": "Recent Series", + "LabelRemoveFromPlaylist": "Remove from Playlist", "LabelRSSFeedCustomOwnerEmail": "Custom owner Email", "LabelRSSFeedCustomOwnerName": "Custom owner Name", "LabelRSSFeedPreventIndexing": "Prevent Indexing", diff --git a/strings/hr.json b/strings/hr.json index a5145122..9acf4b2a 100644 --- a/strings/hr.json +++ b/strings/hr.json @@ -191,6 +191,7 @@ "LabelReadAgain": "Read Again", "LabelRecentlyAdded": "Recently Added", "LabelRecentSeries": "Recent Series", + "LabelRemoveFromPlaylist": "Remove from Playlist", "LabelRSSFeedCustomOwnerEmail": "Custom owner Email", "LabelRSSFeedCustomOwnerName": "Custom owner Name", "LabelRSSFeedPreventIndexing": "Prevent Indexing", diff --git a/strings/hu.json b/strings/hu.json index 58869039..0b8ffb4b 100644 --- a/strings/hu.json +++ b/strings/hu.json @@ -191,9 +191,7 @@ "LabelReadAgain": "Újraolvasás", "LabelRecentlyAdded": "Legutóbb hozzáadva", "LabelRecentSeries": "Legutóbbi sorozatok", - "MessageConfirmMarkAsFinished": "Biztosan befejezettnek jelöli ezt az elemet?", - "MessageConfirmRemoveBookmark": "Biztosan eltávolítja a könyvjelzőt?", - "MessageDiscardProgress": "Haladás elvetése", + "LabelRemoveFromPlaylist": "Remove from Playlist", "LabelRSSFeedCustomOwnerEmail": "Egyéni tulajdonos e-mail", "LabelRSSFeedCustomOwnerName": "Egyéni tulajdonos neve", "LabelRSSFeedPreventIndexing": "Indexelés megakadályozása", @@ -246,6 +244,9 @@ "MessageConfirmDeleteLocalEpisode": "\"{0}\" helyi epizód eltávolítása az eszközről? A szerveren lévő fájl nem érintett.", "MessageConfirmDeleteLocalFiles": "Ezen elem helyi fájljainak eltávolítása az eszközről? A szerveren lévő fájlok és a haladás nem érintettek.", "MessageConfirmDiscardProgress": "Biztosan alaphelyzetbe akarja állítani a haladást?", + "MessageConfirmMarkAsFinished": "Biztosan befejezettnek jelöli ezt az elemet?", + "MessageConfirmRemoveBookmark": "Biztosan eltávolítja a könyvjelzőt?", + "MessageDiscardProgress": "Haladás elvetése", "MessageDownloadCompleteProcessing": "Letöltés kész. Feldolgozás...", "MessageDownloading": "Letöltés...", "MessageDownloadingEpisode": "Epizód letöltése", diff --git a/strings/it.json b/strings/it.json index 87ea31b3..efb01ef6 100644 --- a/strings/it.json +++ b/strings/it.json @@ -191,6 +191,7 @@ "LabelReadAgain": "Leggi Ancora", "LabelRecentlyAdded": "Aggiunti Recentemente", "LabelRecentSeries": "Serie Recenti", + "LabelRemoveFromPlaylist": "Remove from Playlist", "LabelRSSFeedCustomOwnerEmail": "Email del proprietario personalizzato", "LabelRSSFeedCustomOwnerName": "Nome del proprietario personalizzato", "LabelRSSFeedPreventIndexing": "Impedisci l'indicizzazione", diff --git a/strings/lt.json b/strings/lt.json index 1adce67a..bbd58b36 100644 --- a/strings/lt.json +++ b/strings/lt.json @@ -191,6 +191,7 @@ "LabelReadAgain": "Read Again", "LabelRecentlyAdded": "Recently Added", "LabelRecentSeries": "Recent Series", + "LabelRemoveFromPlaylist": "Remove from Playlist", "LabelRSSFeedCustomOwnerEmail": "Pasirinktinis savininko el. paštas", "LabelRSSFeedCustomOwnerName": "Pasirinktinis savininko vardas", "LabelRSSFeedPreventIndexing": "Neleisti indeksuoti", diff --git a/strings/nl.json b/strings/nl.json index d8de3f5b..8b8e212d 100644 --- a/strings/nl.json +++ b/strings/nl.json @@ -191,6 +191,7 @@ "LabelReadAgain": "Read Again", "LabelRecentlyAdded": "Recently Added", "LabelRecentSeries": "Recent Series", + "LabelRemoveFromPlaylist": "Remove from Playlist", "LabelRSSFeedCustomOwnerEmail": "Aangepast e-mailadres eigenaar", "LabelRSSFeedCustomOwnerName": "Aangepaste naam eigenaar", "LabelRSSFeedPreventIndexing": "Voorkom indexering", diff --git a/strings/no.json b/strings/no.json index 0e5deac7..535642e3 100644 --- a/strings/no.json +++ b/strings/no.json @@ -191,6 +191,7 @@ "LabelReadAgain": "Read Again", "LabelRecentlyAdded": "Recently Added", "LabelRecentSeries": "Recent Series", + "LabelRemoveFromPlaylist": "Remove from Playlist", "LabelRSSFeedCustomOwnerEmail": "Tilpasset eier Epost", "LabelRSSFeedCustomOwnerName": "Tilpasset eier Navn", "LabelRSSFeedPreventIndexing": "Forhindre indeksering", diff --git a/strings/pl.json b/strings/pl.json index 1bbe746b..9a347c82 100644 --- a/strings/pl.json +++ b/strings/pl.json @@ -191,6 +191,7 @@ "LabelReadAgain": "Czytaj ponownie", "LabelRecentlyAdded": "Ostatnio dodane", "LabelRecentSeries": "Najnowsze serie", + "LabelRemoveFromPlaylist": "Remove from Playlist", "LabelRSSFeedCustomOwnerEmail": "Custom owner Email", "LabelRSSFeedCustomOwnerName": "Custom owner Name", "LabelRSSFeedPreventIndexing": "Zapobiegaj indeksowaniu", diff --git a/strings/pt-br.json b/strings/pt-br.json index c82ff2f4..88e975f4 100644 --- a/strings/pt-br.json +++ b/strings/pt-br.json @@ -191,6 +191,7 @@ "LabelReadAgain": "Ler Novamente", "LabelRecentlyAdded": "Novidades", "LabelRecentSeries": "Séries Recentes", + "LabelRemoveFromPlaylist": "Remove from Playlist", "LabelRSSFeedCustomOwnerEmail": "Email do dono personalizado", "LabelRSSFeedCustomOwnerName": "Nome do dono personalizado", "LabelRSSFeedPreventIndexing": "Impedir Indexação", @@ -290,4 +291,4 @@ "ToastPodcastCreateSuccess": "Podcast criado", "ToastRSSFeedCloseFailed": "Falha ao fechar feed RSS", "ToastRSSFeedCloseSuccess": "Feed RSS fechado" -} +} \ No newline at end of file diff --git a/strings/ru.json b/strings/ru.json index d1ffabc0..39d008fe 100644 --- a/strings/ru.json +++ b/strings/ru.json @@ -191,6 +191,7 @@ "LabelReadAgain": "Read Again", "LabelRecentlyAdded": "Недавно добавленные", "LabelRecentSeries": "Недавние серии", + "LabelRemoveFromPlaylist": "Remove from Playlist", "LabelRSSFeedCustomOwnerEmail": "Пользовательский Email владельца", "LabelRSSFeedCustomOwnerName": "Пользовательское Имя владельца", "LabelRSSFeedPreventIndexing": "Запретить индексирование", diff --git a/strings/sv.json b/strings/sv.json index f5b44b1d..816ab080 100644 --- a/strings/sv.json +++ b/strings/sv.json @@ -191,6 +191,7 @@ "LabelReadAgain": "Read Again", "LabelRecentlyAdded": "Recently Added", "LabelRecentSeries": "Recent Series", + "LabelRemoveFromPlaylist": "Remove from Playlist", "LabelRSSFeedCustomOwnerEmail": "Anpassad ägarens e-post", "LabelRSSFeedCustomOwnerName": "Anpassat ägarnamn", "LabelRSSFeedPreventIndexing": "Förhindra indexering", diff --git a/strings/zh-cn.json b/strings/zh-cn.json index c3b30aa5..79149b9f 100644 --- a/strings/zh-cn.json +++ b/strings/zh-cn.json @@ -191,6 +191,7 @@ "LabelReadAgain": "再次阅读", "LabelRecentlyAdded": "最近添加", "LabelRecentSeries": "最近添加系列", + "LabelRemoveFromPlaylist": "Remove from Playlist", "LabelRSSFeedCustomOwnerEmail": "自定义所有者电子邮件", "LabelRSSFeedCustomOwnerName": "自定义所有者名称", "LabelRSSFeedPreventIndexing": "防止索引",