How To Add Multiple Songs/Playlist to the Queue?

A couple of weeks ago I got help here to play one song and the solution to my problem was that I wasn't adding the song (Track Type) to the queue correctly, so now I want to be able to add a playlist worth of songs to the queue. The problem is when I try to add an array of the Track type I get an error. The other part of this issue for me is how do I access an individual song off of the queue after I add it? I see I can do ApplicationMusicPlayer.shared.queue.currentItem but I think I'm missing/misunderstanding something here. Anyway's I'll post the code I have to show how I'm attempting to do this at this moment.

In this scenario we're getting passed in a playlist from another view.

import SwiftUI
import MusicKit
struct PlayBackView: View {
@State var song: Track?
@State private var songs: [Track] = []
@State var playlist: Playlist
private let player = ApplicationMusicPlayer.shared
VStack {
// Album Cover
HStack(spacing: 20) {
if let artwork = player.queue.currentEntry?.artwork {
ArtworkImage(artwork, height: 100)
} else {
Image(systemName: "music.note")
.resizable()
.frame(width: 100, height: 100)
}
VStack(alignment: .leading) {
// Song Title
Text(player.queue.currentEntry?.title ?? "Song Title Not Found")
.font(.title)
.fixedSize(horizontal: false, vertical: true)
}
}
}
.padding()
.task {
await loadTracks()
// It's Here I thought I could do something like this
player.queue = tracks
// Since I can do this with one singular track
player.queue = [song]
do {
try await player.queue.insert(songs, position: .afterCurrentEntry)
} catch {
print(error.localizedDescription)
}
}
}
@MainActor
private func loadTracks() async {
do {
let detailedPlaylist = try await playlist.with([.tracks])
let tracks = detailedPlaylist.tracks ?? []
setTracks(tracks)
} catch {
print(error.localizedDescription)
}
}
@MainActor
private func setTracks(_ tracks: MusicItemCollection<Track>) {
songs = Array(tracks)
}
}

Hello @JB184351, you asked:

[...] so now I want to be able to add a playlist worth of songs to the queue.

If you have a Playlist, you can take advantage of the init(playlist:startingAt:) initializer. For example:

let request = MusicLibraryRequest<Playlist>()
let response = try await request.response()
if let firstPlaylist = response.items.first, let firstEntry = firstPlaylist.entries?.first {
player.queue = .init(playlist: firstPlaylist, startingAt: firstEntry)
}

Your other question was:

The other part of this issue for me is how do I access an individual song off of the queue after I add it?

Please see this forum post for a detailed answer. In short, since you are using ApplicationMusicPlayer, you can get all its entries.

How To Add Multiple Songs/Playlist to the Queue?
 
 
Q