Genres fix

This commit is contained in:
2026-04-20 13:02:51 +02:00
parent 7e25a4f978
commit dae9da7084
4 changed files with 265 additions and 37 deletions
+16 -30
View File
@@ -360,39 +360,25 @@ final class MAService {
)
}
/// Browse items under a genre URI.
/// MA returns provider sub-folders at the first level, so we auto-expand
/// them with a second browse pass to surface actual artists/albums.
func browseGenre(genreUri: String) async throws -> [MAMediaItem] {
logger.debug("Browsing genre \(genreUri)")
let firstLevel = try await webSocketClient.sendCommand(
"music/browse",
args: ["uri": genreUri],
/// Get artists belonging to one or more genre IDs.
/// Uses the native `genre` parameter of music/artists/library_items (int | list[int]).
func getArtistsByGenre(genreIds: [Int], limit: Int = 500) async throws -> [MAMediaItem] {
logger.debug("Fetching artists for genre ids \(genreIds)")
return try await webSocketClient.sendCommand(
"music/artists/library_items",
args: ["limit": limit, "genre": genreIds as [Any]],
resultType: [MAMediaItem].self
)
}
// If first level already contains real media items, return them.
let realItems = firstLevel.filter {
guard let t = $0.mediaType else { return false }
return t != .unknown
}
if !realItems.isEmpty { return realItems }
// Otherwise these are sub-folders (providers) browse each one.
var allItems: [MAMediaItem] = []
var seen = Set<String>()
for folder in firstLevel {
let items = (try? await webSocketClient.sendCommand(
"music/browse",
args: ["uri": folder.uri],
resultType: [MAMediaItem].self
)) ?? []
for item in items where seen.insert(item.uri).inserted {
allItems.append(item)
}
}
logger.debug("Genre browse returned \(allItems.count) items after expanding \(firstLevel.count) folders")
return allItems
/// Get albums belonging to one or more genre IDs.
func getAlbumsByGenre(genreIds: [Int], limit: Int = 500) async throws -> [MAMediaItem] {
logger.debug("Fetching albums for genre ids \(genreIds)")
return try await webSocketClient.sendCommand(
"music/albums/library_items",
args: ["limit": limit, "genre": genreIds as [Any]],
resultType: [MAMediaItem].self
)
}
/// Get radio stations