Warning
This repository is archived and is no longer maintained or supported. Apple introduced native MusicKit support a couple of years ago, and it is now mature enough that this package is no longer needed for most projects. For new Apple platform projects, prefer Apple's native MusicKit APIs or an open source alternative built on top of them such as MusadoraKit.
A swift package to facilitate Apple Music Api integration for iOS, MacOS, tvOS & watchOS projects.
import AmuseKitYou can initialize AmuseKit using a StorageConfiguration that specifies service name and keys that will be used to save developer token & user token on keychain.
let configuration = AmuseKit.StorageConfiguration(serviceName: "KEYCHAIN_SERVICE_NAME",
developerTokenKey: "DEV_TOKEN_KEYCHAIN_KEY",
userTokenKey: "USER_TOKEN_KEYCHAIN_KEY")
let amuseProvider = AmuseKit.DataProvider(configuration)
amuseProvider.setDeveloperToken("YOUR_DEV_TOKEN")amuseProvider.setUserToken("USER_TOKEN")amuseProvider.setUserCountryCode("USER_COUNTRY_CODE")Supported values are: albums, artists, musicVideos, playlists, songs.
let response = try await amuseProvider.catalog(.albums, ids: ["123", "456", "789"])
print(response.data)amuseProvider.catalog(.albums, ids: ["123", "456", "789"])
.sink { _ in
} receiveValue: { response in
print(response.data)
}let response = try await amuseProvider.catalogSearch(searchTerm: "YOUR_QUERY_TEXT")
print(response.results?.albums)
print(response.results?.artists)
print(response.results?.musicVideos)
print(response.results?.playlists)
print(response.results?.songs)
print(response.results?.stations)amuseProvider.catalogSearch(searchTerm: "YOUR_QUERY_TEXT")
.sink { _ in
} receiveValue: { response in
// content will be found under results properties.
print(response.results?.albums)
print(response.results?.artists)
print(response.results?.musicVideos)
print(response.results?.playlists)
print(response.results?.songs)
print(response.results?.stations)
}let response = try await amuseProvider.catalogSearch([.playlists, .songs], searchTerm: "YOUR_QUERY_TEXT")
print(response.results?.playlists)
print(response.results?.songs)amuseProvider.catalogSearch([.playlists, .songs], searchTerm: "YOUR_QUERY_TEXT")
.sink { _ in
} receiveValue: { response in
print(response.results?.playlists)
print(response.results?.songs)
}Supported values are: albums, artists, musicVideos, playlists, songs.
let response = try await dataProvider.library(.albums)
print(response.data)amuseProvider.library(.albums)
.sink { _ in
} receiveValue: { response in
print(response.data)
}let response = try await amuseProvider.librarySearch(searchTerm: "YOUR_QUERY_TEXT")
print(response.results?.albums)
print(response.results?.artists)
print(response.results?.musicVideos)
print(response.results?.playlists)
print(response.results?.songs)amuseProvider.librarySearch(searchTerm: "YOUR_QUERY_TEXT")
.sink { _ in
} receiveValue: { response in
// content will be found under results properties.
print(response.results?.albums)
print(response.results?.artists)
print(response.results?.musicVideos)
print(response.results?.playlists)
print(response.results?.songs)
}let response = try await amuseProvider.librarySearch([.playlists, .songs], searchTerm: "YOUR_QUERY_TEXT")
print(response.results?.playlists)
print(response.results?.songs)amuseProvider.librarySearch([.playlists, .songs], searchTerm: "YOUR_QUERY_TEXT")
.sink { _ in
} receiveValue: { response in
print(response.results?.playlists)
print(response.results?.songs)
}