• Use GraceNote SDK in iOS(二)获取音乐的完整信息


    在需求彻底明朗化,外加从MusicFans转到GraceNote,再从GraceNote的GNSDK转到iOS SDK后,最终完毕了在iOS上通过音乐的部分信息获取完整信息的功能了。(好吧,我承认是相对完整。。。)


    首先介绍下在项目中配置GraceNote的iOS SDK。

    SDK的下载地址:Mobile Client

    注意要先登录才干见到文件的下载链接。另外官网还给出来一个SDK的配置文档,全然跟着走在Xcode 5是走不通的,只是也具有一定的指导作用,建议看一看。

    下载解压后,新建一个project,加入GracenoteMusicID.framework到project中:


    新建一个头文件GraceNote.h,导入该框架中的头文件(在本project中已经导入所有须要使用到的头文件了):

    #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

    然后配置project环境,依次在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:方法中获取server返回的数据,从中剥离出我们须要的信息。可是,很奇怪的是,对于返回结果中的每个GNSearchResponse对象,其AlbumCoverArt均为nil。例如以下图所看到的,注意是10个对象中的每个对象的m_coverArt的值都是nil。


    替代的方法是,记录下GNSearchResponse对象的Id信息,然后通过AlbumId发起二次请求,从server中获取完整的专辑信息(这样做确实不好,可是眼下我仅仅找到这个解决方法)

    #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并加入到project中。




  • 相关阅读:
    [SCOI2015]国旗计划
    [SCOI2015]小凸玩矩阵
    点分治复习笔记
    [HNOI2014]米特运输
    [HNOI2015]接水果
    [HEOI2016/TJOI2016]游戏
    为什么验证集的loss会小于训练集的loss?
    转载GPU并行计算
    深度学习图像标注工具汇总(转载)
    你理解了吗?
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/3877607.html
Copyright © 2020-2023  润新知