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

在需求彻底明朗化,外加从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并添加到工程中。

Use GraceNote SDK in iOS(二)获取音乐的完整信息,布布扣,bubuko.com

时间: 2024-10-01 07:46:54

Use GraceNote SDK in iOS(二)获取音乐的完整信息的相关文章

ArcGIS Runtime SDK for iOS中获取ImageServiceLayer的栅格值

本文原创,转载请注明原创地址 http://blog.csdn.net/dongyu1009/article/details/37697389 用AGSImageServiceIdentifyTask可以获取ArcGISImageServiceLayer图层中的栅格值.这涉及了三个比较重要的类:AGSImageServiceIdentifyParameters.AGSImageServiceIdentifyTask和AGSImageServiceIdentifyResult,还有一个delega

Java并发学习之二——获取和设置线程信息

本文是学习网络上的文章时的总结,感谢大家无私的分享. Thread类的对象中保存了一些属性信息能够帮助我们辨别每一个线程,知道它的一些信息 ID:每个线程的独特标示: Name:线程的名称: Priority:线程对象的优先级.优先级别在1-10之间,1是最低级,10是最高级. Status:线程状态.在java中,线程只有6种状态:new,runnable,blocked,waiting,time waiting 或terminated. 现在写一个程序,将线程的信息保存到文件中方便查看 pa

iOS中获取UIWebView的各种信息

stringByEvaluatingJavaScriptFromString 使用stringByEvaluatingJavaScriptFromString方法,需要等UIWebView中的页面加载完成之后去调用.我们在界面上拖放一个UIWebView控件.在Load中将googlemobile加载到这个控件中,代码如下: // 记得遵守UIWebView的代理 1. - (void)viewDidLoad 2. { 3. [super viewDidLoad]; 4. webview.bac

利用php获取图片完整Exif信息类 获取图片详细完整信息类

这个是最近写的一个php获取图片Exif类,功能比较全面,也把所有的Exif都翻译了,执行效率也还可以. 唉,这次懒地写英文版了,以后有时间把英文版也做下.同样,不设置隐藏,也不需金钱. 因为这里不能贴链接,我博客里有个测试网页,大家如果有兴趣,可以去看看tonylevid.com 分两大模式:一个是已经转换数据的(如width:500px)用于显示:一个是未转换数据的如(width:500)用于用户自己自定义计算. 内置3种获取模式,用户可以自定义数组来获取. 注意:需在php.ini中开启m

php获取图片完整Exif信息类 获取图片详细完整信息类

首先解释一下什么是Exif.Exif是一种图象文件格式,它的数据存储与JPEG格式是完全相同的.实际上,Exif格式就是在JPEG格式头部插入了数码照片的信息,包括拍摄时的光圈.快门.白平衡.ISO.焦距.日期时间等各种和拍摄条件以及相机品牌.型号.色彩编码.拍摄时录制的声音以及全球定位系统(GPS).缩略图等.简单地说,Exif=JPEG+拍摄参数.因此,你可以利用任何可以查看JPEG文件的看图软件浏览Exif格式的照片,但并不是所有的图形程序都能处理Exif信息. 开启PHP模块 默认情况下

Use MusicBrainz in iOS(三)查询专辑的完整信息

本文讨论下通过专辑名获取专辑的完整信息.包含歌曲列表.艺术家列表,发行时间和地区等. 因为是通过专辑名搜索专辑信息.所以搜索出来的结果可能较多,比如一个"Violin Concertos"就可能包括多个搜索结果,而本文仅仅是显示专辑的完整信息,并不进行进一步的匹配工作,因此以第一个搜索结果为例. 代码例如以下: #import "AlbumViewController.h" #import "MB.h" #import "ResultV

iOS上获取iTunes音乐权限

方法一: MPMediaQuery *mysongsQuery = [MPMediaQuery songsQuery]; _songsArray = [mysongsQuery items]; for (MPMediaItem *song in _songsArray) { NSString *songTitle = [song valueForProperty:MPMediaItemPropertyTitle]; NSString *assetUrl = [song valueForPrope

iOS - 音乐播放器之怎么获取音乐列表

方法一: 这个方法是通过获取到沙盒路径,来得到音乐的路径(使用这个方法需要把音乐放进沙盒) NSFileManager *manager = [NSFileManager defaultManager]; NSString *Documents = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]; NSLog(@"%@",Documents); NSString *LocalStr = 

使用GraceNote Web API发展Mac发现音乐信息的应用

好久没有写博客,最近各种忙,特别忙里忙,今晚难得清闲.写最近完成下一个博客任务的摘要:使用GraceNote的Web API开发一个查询的音乐信息的应用,事实上,并在这些功能的前GraceNote SDK鲍文是一样的,次不使用不论什么SDK.单纯的使用Web API,然后开发的平台从iOS转移到了Mac上.于是,我人生中第一个Mac App Demo就出来了. GraceNote Web API的官方资料:点击打开链接 首先看下主要的查询和响应的数据格式: 能够看到交互的形式是XML. 其实.不