I tried refreshing before playing, but same thing.
public func playTrack(_ track: Track) async {
// Check for valid PlayParameters
guard track.playParameters != nil else {
print("Error: Track (track.title) is missing PlayParameters. Cannot play.")
return
}
let status = await MusicAuthorization.request()
if status != .authorized {
print("Music authorization not granted.")
return
}
do {
// **Fetch updated track information if needed**
let updatedTrack: Track
if let appleTrack = AppleTrack(from: track) {
if let refreshedTrack = await fetchTrackDetails(for: appleTrack.title) {
print("Fetched updated track details for \(refreshedTrack.title).")
updatedTrack = refreshedTrack
} else {
print("Failed to fetch updated track details. Proceeding with existing track.")
updatedTrack = track
}
} else {
updatedTrack = track
}
// Insert the track into the queue
try await player.queue.insert(updatedTrack, position: .afterCurrentEntry)
print("Queued track: \(updatedTrack.title) with PlayParameters present.")
print("Play Parameters:", updatedTrack.playParameters ?? "None")
// Log the queue state
if player.queue.entries.isEmpty {
print("Queue is still empty after inserting track \(updatedTrack.title).")
return
}
print("Queue contains \(player.queue.entries.count) entries.")
// Notify listeners of track info
self.notifyAppleMusicTrackInfo(updatedTrack)
// Prepare and play
try await player.prepareToPlay()
try await player.play()
print("Playback started for track: \(updatedTrack.title)")
} catch {
print("Error during playback for \(track.title): \(error.localizedDescription)")
}
}
private func fetchTrackDetails(for id: String) async -> Track? {
do {
// Create a search request for the specific track ID
let searchRequest = MusicCatalogSearchRequest(term: id, types: [Song.self]) // Use Song.self
let response = try await searchRequest.response()
// Retrieve the first matching song and convert it to a Track
if let song = response.songs.first {
print("Fetched song: \(song.title) by \(song.artistName)")
return .song(song) // Wrap the Song as a Track
} else {
print("No track found for ID \(id)")
return nil
}
} catch {
print("Error fetching track details for ID \(id): \(error.localizedDescription)")
return nil
}
}
Topic:
Media Technologies
SubTopic:
General
Tags: