【问题标题】:How to display album artwork of streamed Apple Music?如何显示流式 Apple Music 的专辑封面?
【发布时间】:2016-07-17 00:14:40
【问题描述】:

在我的音乐播放器中使用 iOS 9 中的新 Apple Music API(2016 年 5 月 12 日发布)(swift,虽然我目前也熟悉 Objective-C),我可以显示来自流式歌曲的信息,但不是艺术品。我正在使用 MediaPlayer、UIKit 和 StoreKit 框架。我已成功请求 AddToCloudMusicLibrary 和 MusicCatalogPlayback 的授权。我成功展示了从 Apple Music 应用程序下载的歌曲中的 Apple Music 作品,以及我个人歌曲收藏中的作品。我见过其他人对此有问题,但没有运气......

在我求助于显示默认图像(无论如何这对于错误处理都是必需的)或从替代服务中提取之前,我只是想再询问一次。任何帮助都会很棒!我的代码中并不是真正的错误,所以我不会显示它,除非请求帮助解决这个问题。

我第一次尝试发布代码...这是我在名为 Authorization 的 swift 文件中的内容。我需要在任何地方引用此代码还是应该在 AppDelegate 文件中?这是我项目中唯一我不能 100% 确定的部分。

import StoreKit
import MediaPlayer
import UIKit

class AppleMusicPlayer: NSObject {

    let applePlayer = MPMusicPlayerController.systemMusicPlayer()

    func playID(productID: String) {
        SKCloudServiceController.requestAuthorization { status in
            let controller = SKCloudServiceController()
            controller.requestCapabilitiesWithCompletionHandler { capabilities, error in
                if capabilities != SKCloudServiceCapability.None {
                    MPMediaLibrary.defaultMediaLibrary().addItemWithProductID(productID) { entities, error in
                        self.appPlayer.setQueueWithStoreIDs([productID])
                        self.appPlayer.shuffleMode = .Songs
                        self.appPlayer.play()
                    }
                }
            }
        }
    }
}

【问题讨论】:

    标签: ios objective-c swift media-player apple-music


    【解决方案1】:

    这是当前 Apple Music API 中的一个错误。正如您所提到的,不在用户库中而是从 AM 流式传输的歌曲不会返回专辑插图。

    您应该在 bugreport.apple.com 提交功能增强(您也可以从 6 个月前 25413082 欺骗我的)。

    与此同时,您最好的办法是使用 iTunes api 来检索专辑插图,不幸的是,这并不能 100% 地返回正确的结果...

    【讨论】:

    • 酷,很高兴你找到了这个。这真的让我慢了一段时间!我将在这里提交错误报告...
    • 每次都返回图片吗?只是可能不正确?它多久不正确?
    • @JakeDobson 它每次都会返回一个图像,但是很难确定您是否从 API 中获得了正确的歌曲。例如,如果您搜索艺术家、标题和专辑标题,您可能找不到正确的歌曲(单曲、名称听起来像另一个乐队的歌曲/专辑标题的乐队等)
    【解决方案2】:

    我为此苦苦挣扎了一段时间。如果这曾经是一个实际的错误,我不确定但是您不能像您期望的那样将UIImageView 设置为nowPlayingItem。您必须从 Apple Music 服务 api 中提取图像。请参阅文档here。还可以查看 Apple 提供的示例项目 here,以便全面了解。 here 也是我如何克服这个问题的完整示例。

    func updateUserInterface() {
        if musicPlayerManager.musicPlayerController.playbackState == .playing { //Check if anything is playing
            if let currentItem = musicPlayerManager.musicPlayerController.nowPlayingItem {
                songAlbumLabel.text = currentItem.albumTitle
                songTitleLabel.text = currentItem.title
                songArtistNameLabel.text = currentItem.artist
                let albumTitle = currentItem.albumTitle  //Changes here!
                let artist = currentItem.artist  //Changes here!
                if let artwork = musicPlayerManager.musicPlayerController.nowPlayingItem?.artwork, let image = artwork.image(at: artworkImageView.frame.size) { // Check for local image
                    print("using local image")
                    artworkImageView.image = image 
            } else { 
                guard let developerToken = appleMusicManager.fetchDeveloperToken() else {print("oops");return}
                let searchTypes = "songs"
                var searchURLComponents = URLComponents()
                searchURLComponents.scheme = "https"
                searchURLComponents.host = "api.music.apple.com"
                searchURLComponents.path = "/v1/catalog/"
                searchURLComponents.path += "\(authorizationManager.cloudServiceStoreFrontCountryCode)"
                searchURLComponents.path += "/search"
                let expectedArtist = artist?.replacingOccurrences(of: " ", with: "+")  //Changes here!
                let artistExpected = expectedArtist?.replacingOccurrences(of: "&", with: "")  //Changes here!
                let expectingArtist = artistExpected?.replacingOccurrences(of: "++", with: "+")  //Changes here!
                let expectedAlbum = albumTitle?.replacingOccurrences(of: " ", with: "+")  //Changes here!
                searchURLComponents.queryItems = [
                        URLQueryItem(name: "term", value: (expectingArtist! + "-" + expectedAlbum!)),
                        URLQueryItem(name: "types", value: searchTypes)
                    ]  //Changes here!
                var request = URLRequest(url: searchURLComponents.url!)
                request.httpMethod = "GET"
                request.addValue("Bearer \(developerToken)", forHTTPHeaderField: "Authorization")
                let dataTask = URLSession.shared.dataTask(with: request) {
                    (data, response, error) in
                    print(response!)
                    if let searchData = data {
                        guard let results = try? self.appleMusicManager.processMediaItemSections(searchData) else { return}
                        self.mediaItem = results
                        let album = self.mediaItem[0][0]
                        let albumArtworkURL = album.artwork.imageUrl(self.artworkImageView.frame.size)
                        if let image = self.imageManager.cachedImage(url: albumArtworkURL) {
                            print("using cached image")
                            self.artworkImageView.image = image
                        }
                        else {
                            self.imageManager.fetchImage(url: albumArtworkURL) {(image) in
                                print("fetching image")
                                self.artworkImageView.image = image
                            }
                        }
                    }
                }
                dataTask.resume()
            }
        } else { // Need to set it to some kind of default values
            artworkImageView.image = nil
            songArtistNameLabel.text = " "
            songTitleLabel.text = " "
            songAlbumLabel.text = " "
            }
        }
    }
    

    【讨论】:

    • 我已更新我的答案以反映 Apple Music API 的变化。您确定您的开发人员令牌有效吗?您是否收到状态码 200?如果不是这就是问题所在。请参阅我更新的 Github 示例。
    【解决方案3】:

    在 MediaItem 类中有一个名为 MPMediaItemPropertyArtwork 的属性。您将能够通过以下方式检索专辑的插图:

    MPMediaItemArtwork *artwork = [mediaItem valueForProperty:MPMediaItemPropertyArtwork];
    UIImage *albumImage = [itemArtwork imageWithSize:cgSizeYouWant];
    

    【讨论】:

    • 是的,但它不适用于流媒体内容。如果我将它下载到我的手机(个人收藏或 Apple Music 下载作品),我会得到艺术品并且我正在使用那个确切的代码从上面。所以我的手机上没有 Toby Keith 的歌曲,如果我在 Apple Music 应用程序中播放 Red Solo Cup 并切换到我的应用程序,则不会显示艺术品。但是,我会显示歌名、艺术家和专辑。如果我使用商店 ID(从 Apple Music Toolbox 中找到)设置查询并在应用程序打开后开始播放(在应用程序委托中实现),我已成功显示艺术品。
    • Apple Music Toolbox 不知道链接是如何工作的,但如果您或任何人不熟悉链接的话。
    • 对不起@Sean,刚刚进入堆栈溢出!请看一下我上面的代码和cmets好吗?
    【解决方案4】:

    我发现的最佳方法是使用从 Apple Music API 目录中获取歌曲的请求,documented here

    您只需要传入歌曲标识符(用于播放的标识符)和用于播放歌曲的店面标识符。与使用可能失败的搜索请求的答案相比,这总是会产生准确的结果。

    【讨论】:

      猜你喜欢
      • 2016-09-24
      • 1970-01-01
      • 1970-01-01
      • 2021-08-19
      • 2013-07-08
      • 2016-01-08
      • 2012-10-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多