3.7 KiB
3.7 KiB
Music Assistant Audio Streaming Integration
Übersicht
Um Audio vom Music Assistant Server auf dem iPhone abzuspielen, müssen wir:
- Stream-URL vom Server anfordern
- AVPlayer mit dieser URL konfigurieren
- Playback-Status zum Server zurückmelden
Stream-URL erhalten
API Call: player_queues/cmd/get_stream_url
func getStreamURL(queueId: String, queueItemId: String) async throws -> URL {
let response = try await webSocketClient.sendCommand(
"player_queues/cmd/get_stream_url",
args: [
"queue_id": queueId,
"queue_item_id": queueItemId
]
)
guard let result = response.result,
let urlString = result.value as? String,
let url = URL(string: urlString) else {
throw ClientError.serverError("Invalid stream URL")
}
return url
}
Beispiel Stream-URL Format
http://MA_SERVER:8095/api/stream/<queue_id>/<queue_item_id>
Implementierungsschritte
1. Stream-URL in MAService hinzufügen
// In MAService.swift
func getStreamURL(queueId: String, queueItemId: String) async throws -> URL {
let response = try await webSocketClient.sendCommand(
"player_queues/cmd/get_stream_url",
args: [
"queue_id": queueId,
"queue_item_id": queueItemId
]
)
guard let result = response.result else {
throw MAWebSocketClient.ClientError.serverError("No result")
}
// Try to extract URL from response
if let urlString = result.value as? String,
let url = URL(string: urlString) {
return url
}
throw MAWebSocketClient.ClientError.serverError("Invalid stream URL format")
}
2. Integration in MAAudioPlayer
// In MAAudioPlayer.swift
func playQueueItem(_ item: MAQueueItem, queueId: String) async throws {
logger.info("Playing queue item: \(item.name)")
// Get stream URL from server
let streamURL = try await service.getStreamURL(
queueId: queueId,
queueItemId: item.queueItemId
)
// Load and play
loadAndPlay(item: item, streamURL: streamURL)
}
3. Status-Updates zum Server senden
// Player-Status synchronisieren
func syncPlayerState() async throws {
try await service.webSocketClient.sendCommand(
"players/cmd/update_state",
args: [
"player_id": "ios_device",
"state": isPlaying ? "playing" : "paused",
"current_time": currentTime,
"volume": Int(volume * 100)
]
)
}
Format-Unterstützung
AVPlayer unterstützt nativ:
- ✅ MP3
- ✅ AAC
- ✅ M4A
- ✅ WAV
- ✅ AIFF
- ✅ HLS Streams
Für FLAC benötigt man:
- ⚠️ Server-seitige Transcoding (MA kann das automatisch)
- 🔧 Oder: Third-party Decoder (z.B. via AudioToolbox)
Authentifizierung für Stream-URLs
Stream-URLs erfordern möglicherweise den Auth-Token:
var request = URLRequest(url: streamURL)
if let token = service.authManager.currentToken {
request.setValue("Bearer \(token)", forHTTPHeaderField: "Authorization")
}
let playerItem = AVPlayerItem(asset: AVURLAsset(url: streamURL, options: [
"AVURLAssetHTTPHeaderFieldsKey": request.allHTTPHeaderFields ?? [:]
]))
Nächste Schritte
- ✅ Implementiere
getStreamURL()in MAService - ✅ Update
MAAudioPlayer.playQueueItem() - ✅ Teste mit verschiedenen Audio-Formaten
- ✅ Implementiere Player-State-Sync zum Server
- ✅ Handle Netzwerk-Fehler & Buffering