32 lines
991 B
Swift
32 lines
991 B
Swift
import Foundation
|
|
|
|
struct ApiClient {
|
|
static let shared = ApiClient()
|
|
|
|
private let base = URL(string: "https://linkster.langhei.de/api")!
|
|
|
|
func resolve(url: String) async throws -> SongResult? {
|
|
var components = URLComponents(url: base.appendingPathComponent("resolve"), resolvingAgainstBaseURL: false)!
|
|
components.queryItems = [URLQueryItem(name: "url", value: url)]
|
|
|
|
let (data, _) = try await URLSession.shared.data(from: components.url!)
|
|
let json = try JSONDecoder().decode(ResolveResponse.self, from: data)
|
|
guard json.found else { return nil }
|
|
|
|
return SongResult(
|
|
title: json.title ?? "",
|
|
artist: json.artist ?? "",
|
|
playlistName: json.playlist ?? "",
|
|
providers: json.providers ?? [:]
|
|
)
|
|
}
|
|
}
|
|
|
|
private struct ResolveResponse: Decodable {
|
|
let found: Bool
|
|
let title: String?
|
|
let artist: String?
|
|
let playlist: String?
|
|
let providers: [String: String]?
|
|
}
|