I think we're done

This commit is contained in:
cdricms
2026-03-21 18:25:21 +01:00
parent 2d1e8e1044
commit ba9e2db1b9
26 changed files with 281 additions and 63 deletions

View File

@@ -106,10 +106,8 @@ public struct MusicBrainzClient: Sendable {
}
}
public func fetchCoverArt(releaseId: String) async throws(MusicBrainzError) -> CoverArtResponse
{
let data = try await fetchRaw(
baseURL: MusicBrainzClient.caaBaseURL, "/release/\(releaseId)")
public func fetchCoverArt(releaseId: String) async throws(MusicBrainzError) -> CoverArtResponse {
let data = try await fetchRaw(baseURL: MusicBrainzClient.caaBaseURL, "/release/\(releaseId)")
do {
return try JSONDecoder().decode(CoverArtResponse.self, from: data)
} catch {
@@ -117,6 +115,47 @@ public struct MusicBrainzClient: Sendable {
}
}
public func resolveWikimediaImageURL(_ url: URL) async throws(MusicBrainzError) -> URL {
let urlString = url.absoluteString
guard urlString.contains("commons.wikimedia.org/wiki/File:") || urlString.contains("Special:FilePath") else {
return url
}
let filename: String
if urlString.contains("/wiki/File:") {
filename = urlString.components(separatedBy: "/wiki/File:").last ?? ""
} else if urlString.contains("Special:FilePath/") {
filename = urlString.components(separatedBy: "Special:FilePath/").last ?? ""
} else {
return url
}
guard !filename.isEmpty else { return url }
let wikimediaBaseURL = URL(string: "https://commons.wikimedia.org/w/api.php")!
let queryItems = [
URLQueryItem(name: "action", value: "query"),
URLQueryItem(name: "titles", value: "File:\(filename)"),
URLQueryItem(name: "prop", value: "imageinfo"),
URLQueryItem(name: "iiprop", value: "url"),
URLQueryItem(name: "format", value: "json"),
]
let data = try await fetchRaw(baseURL: wikimediaBaseURL, "", queryItems: queryItems)
do {
let response = try JSONDecoder().decode(WikimediaResponse.self, from: data)
if let page = response.query.pages.values.first,
let directURLString = page.imageinfo?.first?.url,
let directURL = URL(string: directURLString)
{
return directURL
}
return url
} catch {
throw .decodingError(error)
}
}
@available(
*, deprecated, message: "Use search(_ action: MusicBrainzSearchAction<T>, ...) instead"
)