Use GraceNote SDK in iOS(二)擷取音樂的完整資訊

來源:互聯網
上載者:User

標籤:gracenote   ios sdk   音樂類服務   

在需求徹底明朗化,外加從MusicFans轉到GraceNote,再從GraceNote的GNSDK轉到iOS SDK後,終於完成了在iOS上通過音樂的部分資訊擷取完整資訊的功能了。(好吧,我承認是相對完整。。。)


首先介紹下在項目中配置GraceNote的iOS SDK。

SDK的:Mobile Client

注意要先登入才能見到檔案的下載連結。另外官網還給出來一個SDK的配置文檔,完全跟著走在Xcode 5是走不通的,不過也具有一定的指導作用,建議看一看。

下載解壓後,建立一個工程,添加GracenoteMusicID.framework到工程中:


建立一個標頭檔GraceNote.h,匯入該架構中的標頭檔(在本工程中已經匯入全部需要使用到的標頭檔了):

#ifndef MFDemo_iOS_GraceNote_h#define MFDemo_iOS_GraceNote_h#import <GracenoteMusicID/GNConfig.h>#import <GracenoteMusicID/GNOperations.h>#import <GracenoteMusicID/GNSearchResultReady.h>#import <GracenoteMusicID/GNSearchResponse.h>#import <GracenoteMusicID/GNSearchResult.h>#import <GracenoteMusicID/GNImage.h>#import <GracenoteMusicID/GNCoverArt.h>#import <GracenoteMusicID/GNDescriptor.h>#endif

然後配置工程環境,依次在Build Phases中加入下列系統庫檔案:



配置完成。


其實這個SDK的使用非常的簡單。

第一步,通過你的GraceNote帳號配置GNConfig類(我直接放在了AppDelegate中,這樣可以配置可以全域使用):

#import <UIKit/UIKit.h>#import <GracenoteMusicID/GNConfig.h>@interface AppDelegate : UIResponder <UIApplicationDelegate>@property (strong, nonatomic) UIWindow *window;@property (retain, nonatomic) GNConfig *app_gnConfig;@end
#import "AppDelegate.h"static NSString * kClientID = @"4541440-79EFBF4E21724D084BA87FF9B242F0C9";static NSString * kCoverArtProperty = @"content.coverArt";static NSString * kCoverArtSizeProperty = @"content.coverArt.sizePreference";static NSString * kYESBooleanString = @"1";static NSString * kCoverArtSizeLarge = @"LARGE";static NSString * kCoverArtSizeThumbnail = @"THUMBNAIL";static NSString * kCoverArtSizeSmall = @"SMALL";@implementation AppDelegate@synthesize app_gnConfig = _app_gnConfig;- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{    self.app_gnConfig = [GNConfig init:kClientID]; // <Client ID>-<Client ID Tag>    [_app_gnConfig setProperty:kCoverArtProperty value:kYESBooleanString];    [_app_gnConfig setProperty:kCoverArtSizeProperty value:kCoverArtSizeThumbnail];        return YES;}

client id就是申請應用時的ID,不清楚的可以參考Use GraceNote SDK in iOS(一)通過序列化的GDO查詢專輯封面。然後設定content.coverArt屬性開啟,否則返回的資料中將不會有專輯封面。

第二步,通過下面的方法發起查詢請求:

+ (void) searchByText:(id<GNSearchResultReady>)resultReady               config:(GNConfig*)config               artist:(NSString*)artist           albumTitle:(NSString*)albumTitle           trackTitle:(NSString*)trackTitle;

在Demo中,就是一個Button中的方法:

- (IBAction)check:(id)sender {    [_checking_activityIndicator startAnimating];    self.view.alpha = 0.75;    self.view.userInteractionEnabled = NO;    [GNOperations searchByText:self                        config:((AppDelegate *)[[UIApplication sharedApplication] delegate]).app_gnConfig                        artist:_artist_textField.text                    albumTitle:_album_textField.text                    trackTitle:_trackTitle_textField.text];}

注意resultReady參數設定為一個遵守GNSearchResultReady協議的對象,也就是self。

config參數設定為全域的配置。

artist,albumTitle,trackTitle分別為藝術家,專輯名稱,音樂名等,這些是搜尋的Key,三個參數最多可以預設兩個。

第三步,在查詢成功後,我們可以從GNResultReady:方法中擷取伺服器返回的資料,從中剝離出我們需要的資訊。但是,非常奇怪的是,對於返回結果中的每一個GNSearchResponse對象,其AlbumCoverArt均為nil。如所示,注意是10個對象中的每一個對象的m_coverArt的值都是nil。


替代的方法是,記錄下GNSearchResponse對象的Id資訊,然後通過AlbumId發起二次請求,從伺服器中擷取完整的專輯資訊(這樣做確實不好,但是目前我只找到這個解決方案)

#pragma mark - GNSearchResultReady Protocol- (void)GNResultReady:(GNSearchResult *)result{    NSArray *responses = [result responses];    if (!responses || !responses.count) {        [[[UIAlertView alloc] initWithTitle:@"對不起" message:@"沒有找到任何匹配結果" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil] show];        [_checking_activityIndicator stopAnimating];        self.view.userInteractionEnabled = YES;        self.view.alpha = 1.0;        _check_button.hidden = NO;        return;    }        [_albumIDArray removeAllObjects];        int i = 0;    for (GNSearchResponse *resp in responses) {        if (i == 10) {            break;        }                NSString *albumID = resp.albumId;        if (albumID) {            [_albumIDArray addObject:albumID];            i++;        }    }        if (!_albumIDArray.count) {        [[[UIAlertView alloc] initWithTitle:@"對不起" message:@"沒有找到任何匹配結果" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil] show];        return;    }    else {        [self performSegueWithIdentifier:@"check_segue" sender:self];        [_checking_activityIndicator stopAnimating];        self.view.userInteractionEnabled = YES;        self.view.alpha = 1.0;        _check_button.hidden = NO;    }}

在下一個視圖中通過AlbumID發起二次請求:

- (void)getAlbumLists {    [_albumInfo removeAllObjects];        for (NSString *album_id in _albumIDs) {        [GNOperations fetchByAlbumId:self                              config:((AppDelegate *)[[UIApplication sharedApplication] delegate]).app_gnConfig                             albumId:album_id];    }}


上幾張運行結果圖:



這個Demo通過音樂名/專輯名/藝術家擷取到專輯封面,歌曲風格,完整的歌曲名,完整的藝術家列表,歌曲風格,發行資訊等相對較為完整的資訊,重點是拿到了專輯的封面。真機調試過,沒什麼問題,看來我可以交差了。


完整的代碼我就不貼出來了,有興趣的下載Demo看看。

說明:由於GraceNote的SDK有71M,在Demo中我將其移除,因此Demo是無法啟動並執行。請自行到GraceNote網站中下載GraceNoteMusicID.framework並添加到工程中。




相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.