Mobile-Integration
Nutzen Sie die ADN-API mit Client-Side-API-Keys aus Ihrer iOS-, Android- oder Flutter-App. Wiedergabe und Upload mit nativen Medienelementen.
Ideal für
iOS-, Android- und Flutter-Apps. Die Einrichtung dauert etwa 30 Minuten.
Tracks abspielen
Erstellen Sie Wiedergabesessions und streamen Sie Audio mit nativen Medienplayern.
Rufen Sie die Wiedergabe-API von ADN direkt aus Ihrer mobilen App mit einem Client-Side-API-Key auf. Erstellen Sie Wiedergabesessions, rufen Sie signierte Varianten-URLs ab und streamen Sie Audio mit nativen Medienplayern.
1. Client-Side-Player-API-Key erstellen
Erstellen Sie unter Settings → API Keys einen Client-Side Player-Key. Beschränken Sie ihn auf die Varianten und Inhalte, auf die Ihre mobile App zugreifen soll.
2. Wiedergabesession erstellen
import Foundation
struct PlaySessionRequest: Encodable {
let collectionId: String
let variants: [String]
let isDownloadable: Bool
let expiresIn: Int
enum CodingKeys: String, CodingKey {
case collectionId = "collection_id"; case variants
case isDownloadable = "is_downloadable"; case expiresIn = "expires_in"
}
}
struct PlaySessionResponse: Decodable {
let playSessionId: String
let tracks: [Track]
enum CodingKeys: String, CodingKey { case playSessionId = "play_session_id"; case tracks }
struct Track: Decodable { let id: String }
}
func createPlaySession() async throws -> (playSessionId: String, tracks: [PlaySessionResponse.Track]) {
var request = URLRequest(url: URL(string: "https://api.audiodelivery.net/v1/play_session/collection")!)
request.httpMethod = "POST"
request.setValue("Bearer CLIENT-SIDE-PLAYER-API-KEY", forHTTPHeaderField: "Authorization")
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
let encoder = JSONEncoder()
encoder.keyEncodingStrategy = .convertToSnakeCase
request.httpBody = try encoder.encode(PlaySessionRequest(
collectionId: "COLLECTION-ID", variants: ["hq", "lq"], isDownloadable: false, expiresIn: 3600))
let (data, _) = try await URLSession.shared.data(for: request)
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let session = try decoder.decode(PlaySessionResponse.self, from: data)
return (session.playSessionId, session.tracks)
} 3. Track-Varianten-URLs abrufen
struct TrackVariantsResponse: Decodable {
let variants: [Variant]
struct Variant: Decodable {
let url: String
let variant: VariantIndex
struct VariantIndex: Decodable { let id: String }
}
}
// No auth needed — the session ID acts as a bearer token
func getAudioUrl(playSessionId: String, trackId: String) async throws -> String {
let url = URL(string: "https://api.audiodelivery.net/v1/play/\(playSessionId)/\(trackId)")!
let (data, _) = try await URLSession.shared.data(from: url)
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let res = try decoder.decode(TrackVariantsResponse.self, from: data)
let hq = res.variants.first { $0.variant.id == "hq" }!
return hq.url
} 4. Mit nativem Player abspielen
import AVFoundation
let player = AVPlayer(url: URL(string: audioUrl)!)
player.play() Die signierte URL funktioniert mit jedem nativen Medienplayer. ADN übernimmt die CDN-Auslieferung und die URL-Verifizierung.
Wellenform-Daten
ADN erzeugt automatisch normalisierte RMS-Wellenform-Daten (320 Samples) für jeden Track.
Das Feld levels in der Track-Antwort enthält die Daten — nutzen Sie sie, um Wellenformen
in Ihrem eigenen Player darzustellen, oder erzeugen Sie individuelle Wellenformen über den Audio-Analyse-Variantentyp.
Coverbilder & Theme-Farben
ADN scannt jeden hochgeladenen Track auf eingebettetes Cover-Artwork und stellt es als cover_image
in der Track-Antwort bereit (in den Größen icon/small/regular/large). Sie können ein Coverbild auch
separat über die API hochladen. Wenn ein Coverbild vorhanden ist, extrahiert ADN eine Farbpalette
und wählt eine primäre player_color — nutzen Sie diese, um Ihre Player-UI zu stylen. Zusätzlich
enthalten Antworten player_color_light und player_color_dark, kontrastangepasste
Varianten zum Darstellen der Farbe auf hellem bzw. dunklem Hintergrund. Das vollständige
theme-Array enthält alle extrahierten Farben mit Hex-Werten, Fläche, Helligkeit und Sättigungsdaten.
Tracks hochladen
Laden Sie Audiodateien aus nativen Apps mit der Upload-API von ADN hoch.
Rufen Sie die Upload-API von ADN direkt aus Ihrer mobilen App mit einem Client-Side-API-Key auf. Erstellen Sie Upload-Sessions, erhalten Sie vorsignierte URLs und laden Sie Audiodateien hoch — alles aus nativem Code.
1. Client-Side-Upload-API-Key erstellen
Melden Sie sich bei ADN an, gehen Sie zu Settings → API Keys und erstellen Sie einen Client-Side Upload-Key. Beschränken Sie ihn auf die Sammlung, in die Ihre App hochladen soll.
2. Upload-Session erstellen
import Foundation
struct UploadSessionRequest: Encodable {
let collectionId: String
let expiresIn: Int
enum CodingKeys: String, CodingKey { case collectionId = "collection_id"; case expiresIn = "expires_in" }
}
struct UploadSessionResponse: Decodable {
let uploadSession: UploadSession
enum CodingKeys: String, CodingKey { case uploadSession = "upload_session" }
struct UploadSession: Decodable { let id: String }
}
func createUploadSession() async throws -> String {
var request = URLRequest(url: URL(string: "https://api.audiodelivery.net/v1/upload_session")!)
request.httpMethod = "POST"
request.setValue("Bearer CLIENT-SIDE-UPLOAD-API-KEY", forHTTPHeaderField: "Authorization")
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
let encoder = JSONEncoder()
encoder.keyEncodingStrategy = .convertToSnakeCase
request.httpBody = try encoder.encode(UploadSessionRequest(collectionId: "COLLECTION-ID", expiresIn: 3600))
let (data, _) = try await URLSession.shared.data(for: request)
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let session = try decoder.decode(UploadSessionResponse.self, from: data)
return session.uploadSession.id
} 3. Track-Upload-URL abrufen
struct TrackUploadRequest: Encodable {
let fileName: String
enum CodingKeys: String, CodingKey { case fileName = "file_name" }
}
struct TrackUploadResponse: Decodable {
let trackUpload: TrackUpload
enum CodingKeys: String, CodingKey { case trackUpload = "track_upload" }
struct TrackUpload: Decodable { let uploadUrl: String; let method: String
enum CodingKeys: String, CodingKey { case uploadUrl = "upload_url"; case method }
}
}
func getTrackUploadUrl(sessionId: String) async throws -> (url: String, method: String) {
var request = URLRequest(url: URL(string: "https://api.audiodelivery.net/v1/upload/\(sessionId)/track")!)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
let encoder = JSONEncoder()
encoder.keyEncodingStrategy = .convertToSnakeCase
request.httpBody = try encoder.encode(TrackUploadRequest(fileName: "recording.m4a"))
let (data, _) = try await URLSession.shared.data(for: request)
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let res = try decoder.decode(TrackUploadResponse.self, from: data)
return (res.trackUpload.uploadUrl, res.trackUpload.method)
} 4. Datei hochladen
// Prefer streaming for large files instead of loading into memory
func uploadAudio(fileURL: URL, uploadURL: URL, method: String) async throws {
var request = URLRequest(url: uploadURL)
request.httpMethod = method
request.setValue("audio/mp4", forHTTPHeaderField: "Content-Type")
request.httpBodyStream = InputStream(url: fileURL)
let (_, uploadResponse) = try await URLSession.shared.data(for: request)
let httpResponse = uploadResponse as! HTTPURLResponse
print("Upload status: \(httpResponse.statusCode)") // 200 on success
} Wiederholen Sie Schritt 3 und 4 für jede Datei — jeder Track benötigt seine eigene Upload-Anfrage und seine eigene signierte URL. Sie können auch ein verschachteltes track-Objekt bei der Session-Erstellung mitsenden, um den ersten Track direkt zu erstellen, und dann Schritt 3 für weitere Dateien nutzen.
5. Warten, bis der Track bereit ist
Die Verarbeitung beginnt automatisch nach dem Upload. Warten Sie, bevor Sie den Track abspielen, bis er bereit ist — fragen Sie GET /v1/track/{track_id} ab, bis track.track_status_id den Wert ready hat, oder konfigurieren Sie einen Webhook (nächster Schritt), um statt Polling benachrichtigt zu werden.
6. Optional: Webhooks
Fügen Sie unter Settings → Webhook einen Webhook hinzu, um benachrichtigt zu werden, wenn ein Track ein terminales Ergebnis erreicht (ready, incomplete, error oder init_error) und wenn sein vollständiger Dateisatz fertig ist. Siehe die Docs zum Track-Processing-Webhook.
Coverbilder
ADN scannt hochgeladene Tracks automatisch auf eingebettetes Cover-Artwork. Sie können ein Coverbild auch
separat über die Covers-API hochladen. Wenn ein Bild vorhanden ist, extrahiert ADN Farben (verfügbar als theme),
die zum Stylen Ihrer Player-UI verwendet werden können.