从 Spotify 下载封面艺术 URL 和键值观察

Posted

技术标签:

【中文标题】从 Spotify 下载封面艺术 URL 和键值观察【英文标题】:Downloading cover art URL from Spotify and key-value observing 【发布时间】:2012-12-26 13:53:15 【问题描述】:

我在我的应用程序的表格视图中显示 Spotify 曲目列表,我想下载这些曲目所属专辑的封面。

我已登录 CocoaLibSpotify,我可以播放所有曲目,所以这部分没问题。我似乎无法开始工作的是封面艺术的下载。我遵循 SimplePlayer 项目的代码,但我将 SPTrack 实例存储在可变字典 (tracksDownladingForCoverArt) 中,因为可能有很多轨道下载封面。

所以,我就是这样做的:

[[SPSession sharedSession] trackForURL:nativeSpotifyURL callback:^(SPTrack *track) 
    if (track != nil) 

        [track addObserver:self forKeyPath:@"album.cover.spotifyURL" options:0 context:NULL];
        self.tracksDownloadingForCoverArt[nativeSpotifyURL] = track;

        [SPAsyncLoading waitUntilLoaded:track timeout:kSPAsyncLoadingDefaultTimeout then:^(NSArray *tracks, NSArray *notLoadedTracks) 
            if ([tracks count] > 0) 
                // I don't believe I need to do anything here
            
        ];
    
];

observeValueForKeyPath:ofObject:change:context: 被调用一次,新旧值都为 nil,但在那之后,什么都没有。但是,如果我遵循 SimplePlayer 的字母(即使用 self.currentTrack 而不是字典)并注册键路径 @"self.currentTrack.album.cover.spotifyURL",observerValue... 方法被调用两次,一次有 nil 和一次有实际值。

我错过了什么?哦,我注册的是 spotifyURL 而不是图像,所以我可以缓存图像。这样,当用户退出应用并稍后返回时,不必重新加载所有图像。

【问题讨论】:

【参考方案1】:

这是预期的行为——除非您明确要求降低数据使用量,否则不会加载封面。要加载所有封面,您可以这样做……

NSArray *tracksToGetArtFor = …; // Get some tracks;
[SPAsyncLoading waitUntilLoaded:tracks timeout:kSPAsyncLoadingDefaultTimeout then:^(NSArray *loadedTracks, NSArray *notLoadedTracks) 

    NSArray *coverArts = [tracks valueForKey:@"album.cover"]; // Get an array of the track's covers

    [SPAsyncLoading waitUntilLoaded:coverArts timeout:kSPAsyncLoadingDefaultTimeout then:^(NSArray *loadedCovers, NSArray *notLoadedCovers) 
        NSLog(@"Number of covers that're loaded: %@:", @(loadedCovers.count));
    ];
];

您可能需要更长的超时时间来加载大量封面,因为它们可能相当大。

如果您不想为封面使用SPAsyncLoading,另一种方法是使用SPAsyncLoading 加载轨道,然后在每个轨道的album.cover 属性上使用KVO。要强制所有封面开始加载,您需要调用每个封面的-startLoading 方法。例如:

NSArray *tracksToGetArtFor = …; // Get some tracks;
[SPAsyncLoading waitUntilLoaded:tracks timeout:kSPAsyncLoadingDefaultTimeout then:^(NSArray *loadedTracks, NSArray *notLoadedTracks) 

    NSArray *coverArts = [tracks valueForKey:@"album.cover"]; // Get an array of the track's covers

    // Trigger the -startLoading method of each cover.
    [coverArts makeObjectsPerformSelector:@selector(startLoading)];

];

【讨论】:

valueForKey 应该是valueForKeyPath album.cover 的数据类型是什么? 检索没有专辑封面的曲目时出现错误。我怎么能抓住这个?错误是 [NSNull isLoaded]。 在将它们发送到 SPAsynLoading 之前,您需要从您的 coverArts 数组中删除所有 NSNull 实例。 或者是否可以使用 cocoalibspotify 获取专辑封面的 url?

以上是关于从 Spotify 下载封面艺术 URL 和键值观察的主要内容,如果未能解决你的问题,请参考以下文章

Spotify API,预加载封面艺术

显示 Spotify 专辑封面网页

libspotify API:如何使用 libspotify API 检索封面艺术?

Spotify API 组艺术家/专辑

如何从 Spotify 获取艺术家的 URI,而无需从 Spotify 手动复制艺术家的 URI

如何使用 Spotify API 将艺术家的姓名添加到端点?