Why Aren't All Songs Being Added to the Queue?

Hi, I've recently been working with the Apple Music API and have had success in loading all the playlists on my account, loading songs from each playlist, and adding songs to the ApplicationMusicPlayer.share.queue. The problem I'm running into is that not all songs from the playlist are being added to the queue, despite confirming all the songs are being based on the PlaybackView.swift I'm about to share with you. I would also like to answer other underlying questions if possible. I am also open to any other suggestions. In this scenario were also assuming isShuffled is true every time.

  1. How can I determine when a song has ended?
  2. How can I get the album title information?
  3. How can I get the current song title, album information, and artist information without pressing play? I can only seem to update the screen when I select my play meaning ApplicationMusicPlayer.shared.play() is being called.
  4. How do I get the endTime of the song? I believe it should be ApplicationMusicPlayer.shared.queue.currentEntry.endTime but this doesn't seem to work.
//
//  PlayBackView.swift
//
//  Created by Justin on 8/16/24.
//

import SwiftUI
import MusicKit
import Foundation

enum PlayState {
    case play
    case pause
}

struct PlayBackView: View {    
    @State var song: Track
    @Binding var songs: [Track]?
    @State var isShuffled = false
    @State private var playState: PlayState = .pause
    @State private var isFirstPlay = true
    
    private let player = ApplicationMusicPlayer.shared
    
    private var isPlaying: Bool {
        return (player.state.playbackStatus == .playing)
    }
    
    var body: some View {
        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)
                        
                        // How do I get AlbumTitle from here??
                    
                    // Artist Name
                    Text(player.queue.currentEntry?.subtitle ?? "Artist Name Not Found")
                        .font(.caption)
                }
            }
            .padding()
            
            Spacer()
            
            // Progress View
            // endTime doesn't work and not sure why.
            ProgressView(value: player.playbackTime, total: player.queue.currentEntry?.endTime ?? 1.00)
                .progressViewStyle(.linear)
                .tint(.red.opacity(0.5))
            
            // Duration View
            HStack {
                Text(durationStr(from: player.playbackTime))
                    .font(.caption)
                
                Spacer()
                
                if let duration = player.queue.currentEntry?.endTime {
                    Text(durationStr(from: duration))
                        .font(.caption)
                }
            }
            
            Spacer()
            
            Button {
                Task {
                    do {
                        try await player.skipToNextEntry()
                    } catch {
                        print(error.localizedDescription)
                    }
                }
            } label: {
                Label("", systemImage: "forward.fill")
                    .tint(.white)
            }
            
            Spacer()
            
            // Play/Pause Button
            Button(action: {
                handlePlayButton()
                isFirstPlay = false
            }, label: {
                Text(playState == .play ? "Pause" : isFirstPlay ? "Play" : "Resume")
                    .frame(maxWidth: .infinity)
            })
            .buttonStyle(.borderedProminent)
            .padding()
            .font(.largeTitle)
            .tint(.red)
        }
        .padding()
        .onAppear {
            if isShuffled {
                songs = songs?.shuffled()
                
                if let songs, let firstSong = songs.first {
                    player.queue = .init(for: songs, startingAt: firstSong)
                    player.state.shuffleMode = .songs
                }
            }
        }
        .onDisappear {
            player.stop()
            player.queue = []
            player.playbackTime = .zero
        }
    }
    
    private func handlePlayButton() {
        Task {
            if isPlaying {
                player.pause()
                playState = .pause
            } else {
                playState = .play
                await playTrack()
            }
        }
    }
    
    @MainActor
    private func playTrack() async {
        do {
            try await player.play()
        } catch {
            print(error.localizedDescription)
        }
    }
    
    private func durationStr(from duration: TimeInterval) -> String {
        let seconds = Int(duration)
        let minutes = seconds / 60
        let remainder = seconds % 60
        
        // Format the string to ensure two digits for the remainder (seconds)
        return String(format: "%d:%02d", minutes, remainder)
    }
}

//#Preview {
//    PlayBackView()
//}

iOS18 bug. If you have that song already in your library, it will stop queuing at that point. One of my frustrations with APPLE API's in general, they have bugs and you wait till they fix it, you expect them to be pretty solid on stuff as simple as queuing songs, but it absolutely breaks the entire point of the API, which is to queue songs to play!

Interesting, I thought I was doing something wrong or missing something since I'm more of a newbie developer. I might take time to submit that as feedback if I see this working on iOS 17.

Why Aren't All Songs Being Added to the Queue?
 
 
Q