Everything works well and good structure.

This commit is contained in:
cdricms
2026-03-21 17:41:59 +01:00
parent ada1c12f57
commit 2d1e8e1044
30 changed files with 1068 additions and 875 deletions

View File

@@ -0,0 +1,20 @@
import Foundation
public struct Area: MusicBrainzSearchable {
public static let entityType: MusicBrainzEntity = .area
public let id: String
public let type: String?
public let name: String
public let sortName: String?
public let disambiguation: String?
public let lifeSpan: LifeSpan?
public let relations: [Relation]?
public let score: Int?
enum CodingKeys: String, CodingKey {
case id, type, name, disambiguation, score, relations
case sortName = "sort-name"
case lifeSpan = "life-span"
}
}

View File

@@ -0,0 +1,40 @@
import Foundation
public struct Artist: MusicBrainzSearchable {
public static let entityType: MusicBrainzEntity = .artist
public let id: String
public let name: String
public let sortName: String?
public let type: String?
public let country: String?
public let disambiguation: String?
public let lifeSpan: LifeSpan?
public let relations: [Relation]?
public let score: Int?
enum CodingKeys: String, CodingKey {
case id
case name
case sortName = "sort-name"
case type
case country
case disambiguation
case lifeSpan = "life-span"
case relations
case score
}
public var imageURL: URL? {
guard let relations else { return nil }
// Look for 'image' or 'wikimedia commons'
for rel in relations {
if rel.type == "image" || rel.type == "wikimedia commons" {
if let resource = rel.url?.resource {
return URL(string: resource)
}
}
}
return nil
}
}

View File

@@ -0,0 +1,18 @@
import Foundation
public struct Event: MusicBrainzSearchable {
public static let entityType: MusicBrainzEntity = .event
public let id: String
public let name: String
public let time: String?
public let disambiguation: String?
public let lifeSpan: LifeSpan?
public let relations: [Relation]?
public let score: Int?
enum CodingKeys: String, CodingKey {
case id, name, time, disambiguation, score, relations
case lifeSpan = "life-span"
}
}

View File

@@ -0,0 +1,17 @@
import Foundation
public struct Instrument: MusicBrainzSearchable {
public static let entityType: MusicBrainzEntity = .instrument
public let id: String
public let name: String
public let type: String?
public let description: String?
public let disambiguation: String?
public let relations: [Relation]?
public let score: Int?
enum CodingKeys: String, CodingKey {
case id, name, type, description, disambiguation, score, relations
}
}

View File

@@ -0,0 +1,21 @@
import Foundation
public struct Label: MusicBrainzSearchable {
public static let entityType: MusicBrainzEntity = .label
public let id: String
public let name: String
public let type: String?
public let labelCode: Int?
public let country: String?
public let disambiguation: String?
public let lifeSpan: LifeSpan?
public let relations: [Relation]?
public let score: Int?
enum CodingKeys: String, CodingKey {
case id, name, type, country, disambiguation, score, relations
case labelCode = "label-code"
case lifeSpan = "life-span"
}
}

View File

@@ -0,0 +1,18 @@
import Foundation
public struct Place: MusicBrainzSearchable {
public static let entityType: MusicBrainzEntity = .place
public let id: String
public let name: String
public let type: String?
public let address: String?
public let area: Area?
public let disambiguation: String?
public let relations: [Relation]?
public let score: Int?
enum CodingKeys: String, CodingKey {
case id, name, type, address, area, disambiguation, score, relations
}
}

View File

@@ -0,0 +1,25 @@
import Foundation
public struct Recording: MusicBrainzSearchable {
public static let entityType: MusicBrainzEntity = .recording
public let id: String
public let title: String
public let length: Int?
public let video: Bool?
public let disambiguation: String?
public let firstReleaseDate: String?
public let relations: [Relation]?
public let score: Int?
enum CodingKeys: String, CodingKey {
case id
case title
case length
case video
case disambiguation
case firstReleaseDate = "first-release-date"
case relations
case score
}
}

View File

@@ -0,0 +1,27 @@
import Foundation
public struct Release: MusicBrainzSearchable {
public static let entityType: MusicBrainzEntity = .release
public let id: String
public let title: String
public let status: String?
public let date: String?
public let country: String?
public let barcode: String?
public let disambiguation: String?
public let relations: [Relation]?
public let score: Int?
enum CodingKeys: String, CodingKey {
case id
case title
case status
case date
case country
case barcode
case disambiguation
case relations
case score
}
}

View File

@@ -0,0 +1,19 @@
import Foundation
public struct ReleaseGroup: MusicBrainzSearchable {
public static let entityType: MusicBrainzEntity = .releaseGroup
public let id: String
public let title: String
public let primaryType: String?
public let artistCredit: [ArtistCredit]?
public let disambiguation: String?
public let relations: [Relation]?
public let score: Int?
enum CodingKeys: String, CodingKey {
case id, title, disambiguation, score, relations
case primaryType = "primary-type"
case artistCredit = "artist-credit"
}
}

View File

@@ -0,0 +1,16 @@
import Foundation
public struct Series: MusicBrainzSearchable {
public static let entityType: MusicBrainzEntity = .series
public let id: String
public let name: String
public let type: String?
public let disambiguation: String?
public let relations: [Relation]?
public let score: Int?
enum CodingKeys: String, CodingKey {
case id, name, type, disambiguation, score, relations
}
}

View File

@@ -0,0 +1,7 @@
import Foundation
public struct ArtistCredit: Codable, Sendable {
public let name: String
public let artist: Artist?
public let joinphrase: String?
}

View File

@@ -0,0 +1,21 @@
import Foundation
public struct CoverArtImage: Codable, Sendable {
public let image: String
public let thumbnails: [String: String]
public let types: [String]
public let front: Bool
public let back: Bool
public let edit: Int
public let comment: String
public let id: String
}
public struct CoverArtResponse: Codable, Sendable {
public let images: [CoverArtImage]
public let release: String
public var frontImage: CoverArtImage? {
images.first { $0.front }
}
}

View File

@@ -0,0 +1,7 @@
import Foundation
public struct LifeSpan: Codable, Sendable {
public let begin: String?
public let end: String?
public let ended: Bool?
}

View File

@@ -0,0 +1,14 @@
import Foundation
public struct Relation: Codable, Sendable {
public let type: String
public let direction: String
public let url: URLResource?
public let artist: Artist?
public let release: Release?
// Add other entities as needed
enum CodingKeys: String, CodingKey {
case type, direction, url, artist, release
}
}

View File

@@ -0,0 +1,6 @@
import Foundation
public struct URLResource: Codable, Sendable {
public let id: String
public let resource: String
}

View File

@@ -0,0 +1,9 @@
import Foundation
public struct URLReference: MusicBrainzSearchable {
public static let entityType: MusicBrainzEntity = .url
public let id: String
public let resource: String
public let score: Int?
}

View File

@@ -0,0 +1,17 @@
import Foundation
public struct Work: MusicBrainzSearchable {
public static let entityType: MusicBrainzEntity = .work
public let id: String
public let title: String
public let type: String?
public let language: String?
public let disambiguation: String?
public let relations: [Relation]?
public let score: Int?
enum CodingKeys: String, CodingKey {
case id, title, type, language, disambiguation, score, relations
}
}