使用GraceNote Web API开发Mac查询音乐信息应用
2020-12-13 02:45
标签:mac gracenote web api 好久没写博客了,最近各种忙,大忙特忙,今晚难得有空,写个博客总结下最近完成的一个任务:使用GraceNote的Web API来开发一个查询音乐信息的应用,其实功能和前面的那些GraceNote SDK的博文是一样的,只是这一次不使用任何SDK,单纯的使用Web API,然后开发的平台从iOS转移到了Mac上,于是,我人生中第一个Mac App Demo就出来了。 GraceNote Web API的官方资料:点击打开链接 首先看下基本的查询和响应的数据格式: 可以看到交互的形式是XML。 事实上,任何调用GraceNote的Web API的消息,都是向一个指定的URL POST XML消息,然后对返回的XML消息进行解析并从中提取出我们想要的信息。下面是程序的一些常数:
其中kWebAPIURL就是这个固定的发起请求的URL,注意将c后面的数字替换成你的App的Client ID。 kClient ID和kClient Tag可以从在网站中注册的App中找到。 在使用GraceNote的Web API进行查询之前,首先要通过App的Client ID和Client Tag来注册一个User ID,然后在所有后续查询中都要使用这个User ID和之前的Client ID来进行认证,格式如下: 首先看看注册的代码,在注册成功后我们将其保存到本地的NSUserDefaults中:
所有的任务都可以通过NSURLSessionDataTask来完成。 然后根据艺术家名,专辑名,歌曲标题,搜索结果的返回范围来发起查询请求(album search):
将搜索到的gnID(在数据库中标识这个专辑的一个ID)保存进一个数组gn_IDs中,然后根据数组中的每个gn_id发起进一步的抓取专辑完整数据的操作(album fetch):
最后在NSTableView中将数据load出来:
另外我将专辑元数据抽象成了一个MFAlbum类,可以通过返回的XML响应数据初始化(在这里使用了GDataXML类库进行XML解析),代码如下: 主界面部分(MainMenu.xib): 最后上运行结果: 实在好久没写博客,写作水平下降得厉害,加上自己又变懒惰了很多,这篇文章实在写得太烂,只能当做做个记号,证明我有完成了GraceNote的音乐信息查询服务了吧。 使用GraceNote Web API开发Mac查询音乐信息应用,搜素材,soscw.com 使用GraceNote Web API开发Mac查询音乐信息应用 标签:mac gracenote web api 原文地址:http://blog.csdn.net/jymn_chen/article/details/29673981NSString * const kWebAPIURL = @"https://c10239232.web.cddbp.net/webapi/xml/1.0/"; // 调用网络接口的URL
NSString * const kClientID = @"10239232"; // 你申请的应用的Client ID
NSString * const kClientTag = @"46B9ABAD30F0F5EB409C7BFAA13EB2EF"; // 你申请的应用的Client Tag
// 向GraceNote网站注册User ID
- (void)gn_registerUserID {
NSString *registerString = [NSString stringWithFormat:@"
// 以Artist,Album Title,Track Title为搜索关键字,发起搜索请求
- (void)gn_albumSearchWithArtist:(NSString *)anArtist
albumTitle:(NSString *)anAlbumTitle
trackTitle:(NSString *)aTrackTitle
start:(NSUInteger)startIndex
end:(NSUInteger)endIndex
{
// 首先移除上次残留的查询结果
[_gn_IDs removeAllObjects];
if (startIndex endIndex) {
return;
}
// 设置查询字符串,本次请求属于ALBUM_SEARCH操作
NSString *searchString = [NSString stringWithFormat:@"
// 逐个抓取专辑的具体信息
- (void)albumFetch {
// 首先移除上次搜索的残留数据
[_searchAlbums removeAllObjects];
// 以gn_IDs中的每一个gnID为搜索关键字,执行album fetch请求,抓取专辑的完整信息
for (NSString *gnID in _gn_IDs) {
[self gn_albumFetchWithGNID:gnID];
}
}
// 以GN_ID为搜索关键字,执行album fetch请求,抓取专辑的完整信息
- (void)gn_albumFetchWithGNID:(NSString *)aID {
// 设置要查询的字符串,本次操作为ALBUM_FETCH操作
NSString *searchString = [NSString stringWithFormat:@"
#pragma mark - NSTableViewDataSource
- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView {
return [_searchAlbums count];
}
- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
NSString *unknown = @"未知";
MFAlbum *album = _searchAlbums[row];
NSString *identifier = tableColumn.identifier;
if ([identifier isEqualToString:@"coverArt"]) {
NSURL *coverArtURL = [NSURL URLWithString:album.coverArtURLString];
NSImage *image;
if (coverArtURL) {
image = [[NSImage alloc] initWithContentsOfURL:coverArtURL];
}
else {
image = [NSImage imageNamed:@"NotFound"];
}
return image;
}
else if ([identifier isEqualToString:@"artistImage"]) {
NSURL *artistImageURL = [NSURL URLWithString:album.artistImageURLString];
NSImage *image;
if (artistImageURL) {
image = [[NSImage alloc] initWithContentsOfURL:artistImageURL];
}
else {
image = [NSImage imageNamed:@"NotFound"];
}
return image;
}
else if ([identifier isEqualToString:@"trackCount"]) {
return [NSString stringWithFormat:@"%ld", album.trackCount] ? [NSString stringWithFormat:@"%ld", album.trackCount] : unknown;
}
else {
NSString *info = [album valueForKey:identifier];
return info ? info : unknown;
}
}
- (instancetype)initWithXMLData:(NSData *)xmlData {
self = [super init];
if (self) {
NSError *parseError = nil;
GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:xmlData encoding:NSUTF8StringEncoding error:&parseError];
if (parseError) {
NSLog(@"Parse Error:%@", [parseError localizedDescription]);
return nil; // 转换出错,直接返回nil
}
// 逐个解析xml结点,获取专辑对象所需要的所有信息
GDataXMLElement *rootElement = [doc rootElement];
GDataXMLElement *response = [rootElement elementsForName:kGNResponse][0];
if (![self gn_requestSucceed:response]) {
return nil;
}
GDataXMLElement *album = [response elementsForName:kGNAlbum][0];
_gn_id = [[album elementsForName:kGNID][0] stringValue];
_artistName = [[album elementsForName:kGNArtist][0] stringValue];
_albumTitle = [[album elementsForName:kGNTitle][0] stringValue];
_language = [[album elementsForName:kGNLanguage][0] stringValue];
_releaseDate = [[album elementsForName:kGNDate][0] stringValue];
_genre = [[album elementsForName:kGNGenre][0] stringValue];
_trackCount = (NSUInteger)[[[album elementsForName:kGNTrackCount][0] stringValue] integerValue];
_allTracks = [NSMutableArray array];
NSArray *tracks = [album elementsForName:kGNTrack];
for (GDataXMLElement *trackElement in tracks) {
NSString *title = [[trackElement elementsForName:kGNTitle][0] stringValue];
[_allTracks addObject:title];
}
NSArray *urlElements = [album elementsForName:kGNURL];
if (!urlElements) {
return self;
}
for (GDataXMLElement *element in urlElements) {
GDataXMLNode *node = [element attributeForName:kGNType];
NSString *type = [node stringValue];
if ([type isEqualToString:kGNCoverArt]) {
_coverArtURLString = [element stringValue];
}
else if ([type isEqualToString:kGNArtistImage]) {
_artistImageURLString = [element stringValue];
}
}
}
return self;
}
文章标题:使用GraceNote Web API开发Mac查询音乐信息应用
文章链接:http://soscw.com/essay/26221.html