Compare commits
No commits in common. "f82d6b027a6e2160a6d26d25f5cd1f8c734f74e3" and "5b325d7dbcae37b1053b172eedbdfc159793377d" have entirely different histories.
f82d6b027a
...
5b325d7dbc
@ -27,7 +27,7 @@ class AlbumDataSource: NSObject, NSCollectionViewDataSource {
|
|||||||
self.albums[indexPath.item].coverArt = image
|
self.albums[indexPath.item].coverArt = image
|
||||||
|
|
||||||
DispatchQueue.main.async {
|
DispatchQueue.main.async {
|
||||||
collectionView.reloadItems(at: [indexPath])
|
albumViewItem.setAlbum(self.albums[indexPath.item])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -14,11 +14,10 @@ import PMKFoundation
|
|||||||
class AlbumArtService: NSObject {
|
class AlbumArtService: NSObject {
|
||||||
static var shared = AlbumArtService()
|
static var shared = AlbumArtService()
|
||||||
var session = URLSession(configuration: .default)
|
var session = URLSession(configuration: .default)
|
||||||
let albumArtQueue = DispatchQueue(label: "albumArtCacheQueue", attributes: .concurrent)
|
let cacheQueue = DispatchQueue(label: "albumArtCacheQueue", attributes: .concurrent)
|
||||||
|
|
||||||
func fetchAlbumArt(for album: AlbumItem, callback: @escaping (_ image: NSImage) -> Void) {
|
func fetchAlbumArt(for album: AlbumItem, callback: @escaping (_ image: NSImage) -> Void) {
|
||||||
albumArtQueue.async {
|
cacheQueue.async {
|
||||||
print(album)
|
|
||||||
if !self.getCachedArtwork(for: album, callback: callback) {
|
if !self.getCachedArtwork(for: album, callback: callback) {
|
||||||
self.getRemoteArtwork(for: album, callback: callback)
|
self.getRemoteArtwork(for: album, callback: callback)
|
||||||
}
|
}
|
||||||
@ -36,7 +35,7 @@ class AlbumArtService: NSObject {
|
|||||||
if FileManager.default.fileExists(atPath: cacheFilePath) {
|
if FileManager.default.fileExists(atPath: cacheFilePath) {
|
||||||
guard let data = FileManager.default.contents(atPath: cacheFilePath),
|
guard let data = FileManager.default.contents(atPath: cacheFilePath),
|
||||||
let image = NSImage(data: data)
|
let image = NSImage(data: data)
|
||||||
else { return true }
|
else { return false }
|
||||||
|
|
||||||
callback(image)
|
callback(image)
|
||||||
|
|
||||||
@ -66,32 +65,50 @@ class AlbumArtService: NSObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func getArtworkFromMusicBrainz(for album: AlbumItem, callback: @escaping (_ image: NSImage) -> Void) {
|
func getArtworkFromMusicBrainz(for album: AlbumItem, callback: @escaping (_ image: NSImage) -> Void) {
|
||||||
guard var urlComponents = URLComponents(string: "https://musicbrainz.org/ws/2/release/")
|
if var urlComponents = URLComponents(string: "https://musicbrainz.org/ws/2/release/") {
|
||||||
else { return }
|
|
||||||
|
|
||||||
urlComponents.query = "query=artist:\(album.artist) AND release:\(album.title) AND country:US&limit=1&fmt=json"
|
urlComponents.query = "query=artist:\(album.artist) AND release:\(album.title) AND country:US&limit=1&fmt=json"
|
||||||
|
|
||||||
guard let searchURL = urlComponents.url
|
guard let searchURL = urlComponents.url
|
||||||
else { return }
|
else { return }
|
||||||
|
|
||||||
firstly {
|
let releaseTask = session.dataTask(with: searchURL) { data, response, error in
|
||||||
URLSession.shared.dataTask(.promise, with: searchURL).validate()
|
if let _ = error {
|
||||||
}.compactMap {
|
return
|
||||||
JSON($0.data)
|
}
|
||||||
}.compactMap {
|
|
||||||
$0["releases"][0]["id"].string
|
guard let httpResponse = response as? HTTPURLResponse,
|
||||||
}.compactMap {
|
(200...299).contains(httpResponse.statusCode) else {
|
||||||
URLComponents(string: "https://coverartarchive.org/release/\($0)/front-500")
|
return
|
||||||
}.then { (urlComponents: URLComponents?) -> Promise<(data: Data, response: URLResponse)> in
|
}
|
||||||
let url = urlComponents!.url
|
|
||||||
return URLSession.shared.dataTask(.promise, with: url!).validate()
|
if let mimeType = httpResponse.mimeType, mimeType == "application/json",
|
||||||
}.compactMap {
|
let data = data,
|
||||||
self.cacheArtwork(for: album, data: $0.data)
|
let json = try? JSON(data: data) {
|
||||||
return NSImage(data: $0.data)
|
|
||||||
}.done {
|
let releaseId = json["releases"][0]["id"]
|
||||||
callback($0)
|
|
||||||
}.catch { (error: Error) in
|
let coverURL = URLComponents(string: "https://coverartarchive.org/release/\(releaseId)/front-500")
|
||||||
self.cacheArtwork(for: album, data: Data())
|
|
||||||
|
let coverArtTask = self.session.dataTask(with: coverURL!.url!) { data, response, error in
|
||||||
|
|
||||||
|
guard let httpResponse = response as? HTTPURLResponse,
|
||||||
|
(200...299).contains(httpResponse.statusCode) else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if let mimeType = httpResponse.mimeType, mimeType == "image/jpeg",
|
||||||
|
let data = data,
|
||||||
|
let coverImage = NSImage(data: data) {
|
||||||
|
|
||||||
|
self.cacheArtwork(for: album, data: data)
|
||||||
|
callback(coverImage)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
coverArtTask.resume()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
releaseTask.resume()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 982 B |
|
Before Width: | Height: | Size: 7.1 KiB After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 976 B |
|
Before Width: | Height: | Size: 7.4 KiB After Width: | Height: | Size: 2.4 KiB |