Skip to content

Commit 558712e

Browse files
OzGavclaudestvncode
authored
Show ADD TO PLAYLIST for podcast episodes and audiobooks (#1474)
* Add ADD TO PLAYLIST menu support for podcasts and audiobooks Extend the playlist functionality (originally added for radio stations in PR #1356) to also support podcasts, podcast episodes, and audiobooks. Like radio stations, these items can only be added to playlists stored in the builtin provider. https://claude.ai/code/session_01Pme3UUJzT29ZfaJ752c8QM * Remove PODCAST from playlist menu support, keep only PODCAST_EPISODE Only podcast episodes (not the podcast itself) can be added to playlists. https://claude.ai/code/session_01Pme3UUJzT29ZfaJ752c8QM * Use firstItem instead of items[0] in playlist menu checks Consistent with the existing firstItem const defined at the top of getContextMenuItems, which is guarded by the early return on empty items. https://claude.ai/code/session_01Pme3UUJzT29ZfaJ752c8QM --------- Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: Steven Travers <steven.travers20@gmail.com>
1 parent 4a6d61c commit 558712e

File tree

3 files changed

+21
-14
lines changed

3 files changed

+21
-14
lines changed

src/layouts/default/AddToPlaylistDialog.vue

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -141,8 +141,11 @@ const fetchPlaylists = async function () {
141141
);
142142
}
143143
144-
// Check if we're adding radio items - radio can only be added to builtin playlists
145-
const isAddingRadio = refItem?.media_type === MediaType.RADIO;
144+
// Check if we're adding radio/podcast/audiobook items - these can only be added to builtin playlists
145+
const isAddingBuiltinOnly =
146+
refItem?.media_type === MediaType.RADIO ||
147+
refItem?.media_type === MediaType.PODCAST_EPISODE ||
148+
refItem?.media_type === MediaType.AUDIOBOOK;
146149
147150
for (const playlist of playlistResults) {
148151
// skip unavailable playlists
@@ -160,8 +163,8 @@ const fetchPlaylists = async function () {
160163
const playListProvider =
161164
api.providers[playlist.provider_mappings[0].provider_instance];
162165
163-
// For radio items, only show builtin playlists
164-
if (isAddingRadio) {
166+
// For radio/podcast/audiobook items, only show builtin playlists
167+
if (isAddingBuiltinOnly) {
165168
if (playListProvider && playListProvider.domain == "builtin") {
166169
playlists.value.push(playlist);
167170
}
@@ -189,8 +192,8 @@ const fetchPlaylists = async function () {
189192
)
190193
)
191194
continue;
192-
// For radio items, only allow builtin provider
193-
if (isAddingRadio) {
195+
// For radio/podcast/audiobook items, only allow builtin provider
196+
if (isAddingBuiltinOnly) {
194197
if (provider.domain == "builtin") {
195198
createPlaylistProviders.value.push(provider.instance_id);
196199
}

src/layouts/default/ItemContextMenu.vue

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -839,12 +839,14 @@ export const getContextMenuItems = async function (
839839
}
840840
}
841841

842-
// remove from playlist (playlist tracks and radio items)
842+
// remove from playlist (playlist tracks, radio, podcast, podcast episode, and audiobook items)
843843
if (parentItem && parentItem.media_type === MediaType.PLAYLIST) {
844844
const playlist = parentItem as Playlist;
845845
if (
846-
(items[0].media_type === MediaType.TRACK ||
847-
items[0].media_type === MediaType.RADIO) &&
846+
(firstItem.media_type === MediaType.TRACK ||
847+
firstItem.media_type === MediaType.RADIO ||
848+
firstItem.media_type === MediaType.PODCAST_EPISODE ||
849+
firstItem.media_type === MediaType.AUDIOBOOK) &&
848850
playlist.is_editable
849851
) {
850852
contextMenuItems.push({
@@ -860,11 +862,13 @@ export const getContextMenuItems = async function (
860862
});
861863
}
862864
}
863-
// add to playlist action (tracks, albums, and radios)
865+
// add to playlist action (tracks, albums, radios, podcasts, podcast episodes, and audiobooks)
864866
if (
865-
items[0].media_type === MediaType.TRACK ||
866-
items[0].media_type === MediaType.ALBUM ||
867-
items[0].media_type === MediaType.RADIO
867+
firstItem.media_type === MediaType.TRACK ||
868+
firstItem.media_type === MediaType.ALBUM ||
869+
firstItem.media_type === MediaType.RADIO ||
870+
firstItem.media_type === MediaType.PODCAST_EPISODE ||
871+
firstItem.media_type === MediaType.AUDIOBOOK
868872
) {
869873
contextMenuItems.push({
870874
label: "add_playlist",

src/plugins/api/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -707,7 +707,7 @@ export class MusicAssistantApi {
707707
item_id: string,
708708
provider_instance_id_or_domain: string,
709709
force_refresh?: boolean,
710-
): Promise<(Track | Radio)[]> {
710+
): Promise<(Track | Radio | PodcastEpisode | Audiobook)[]> {
711711
return this.sendCommand("music/playlists/playlist_tracks", {
712712
item_id,
713713
provider_instance_id_or_domain,

0 commit comments

Comments
 (0)