版权声明:本文为博主原创文章。未经博主同意不得转载。

https://blog.csdn.net/u010962810/article/details/24066737

本文讨论下通过专辑名获取专辑的完整信息。包括歌曲列表,艺术家列表。发行时间和地区等。

由于是通过专辑名搜索专辑信息,所以搜索出来的结果可能较多,比如一个“Violin Concertos”就可能包括多个搜索结果,而本文仅仅是显示专辑的完整信息,并不进行进一步的匹配工作,因此以第一个搜索结果为例。

代码例如以下:

#import "AlbumViewController.h"
#import "MB.h"
#import "ResultViewController.h" #define UnknownString @"未知"
#define UnknownInteger 0 @interface AlbumViewController () @property (strong, nonatomic) ResultViewController *resultController; @property (copy, nonatomic) RequestFailureBlock failureBlock; @end @implementation AlbumViewController
@synthesize resultController = _resultController; - (void)viewDidLoad
{
[super viewDidLoad]; self.resultController = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"ResultViewController"]; self.failureBlock = ^(MBRequest *request, NSError *error, NSData *data) {
NSString *message = [NSString stringWithFormat:@"错误:%@", [error localizedDescription]];
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"警告"
message:message
delegate:nil
cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];
[alertView show];
};
} - (void)alertWithMessage:(NSString *)message {
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"警告" message:message delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];
[alertView show];
} - (IBAction)search:(id)sender {
MBConnection *conn = [MBConnection connection]; RequestSuccessBlock successBlock = ^(MBRequest *request, MBMetadata *metadata) {
MBList *list = metadata.ReleaseList;
MBRelease *release = [list elementAtIndex:0]; // 专辑的mbid
_resultController.mbid = (release.Id) ? release.Id : UnknownString;
if (!release.Id) {
[self alertWithMessage:@"搜索失败"];
return;
} // 专辑名
_resultController.title = (release.Title) ? release.Title : UnknownString; // 专辑状态
_resultController.status = (release.Status) ? release.Status : UnknownString; // 专辑音质
_resultController.quality = (release.Quality) ? release.Quality : UnknownString; MBTextRepresentation *textRepresentation = release.TextRepresentation; // 专辑语言
_resultController.language = (textRepresentation.Language) ? textRepresentation.Language : UnknownString; // 专辑剧本语言
_resultController.script = (textRepresentation.Script) ? textRepresentation.Script : UnknownString; MBArtistCredit *artistCredit = release.ArtistCredit;
NSUInteger nameCount = (artistCredit.elementCount) ? artistCredit.elementCount : UnknownInteger; // 专辑艺术家列表
_resultController.artists = [NSMutableArray array];
for (int i = 0; i < nameCount; i++) {
MBNameCredit *nameCredit = [artistCredit elementAtIndex:i];
[_resultController.artists addObject:nameCredit.Artist.Name];
} MBReleaseGroup *group = release.ReleaseGroup;
NSLog(@"发行组织类型 = %@", group.Type);
NSLog(@"发行组织名称 = %@", group.Title); // 专辑发行日期
_resultController.date = (release.Date) ? release.Date : UnknownString; // 专辑发行国家
_resultController.country = (release.Country) ? release.Country : UnknownString; NSLog(@"专辑条形码 = %@", release.Barcode);
NSLog(@"Asin 标准识别码,来自卓越亚马逊 = %@", release.Asin); MBList *mediumList = release.MediumList;
MBMedium *medium = [mediumList elementAtIndex:1]; // 专辑发行形式
_resultController.format = medium.Format; NSLog(@"专辑中的音乐个数 = %d", medium.TrackList.Count.integerValue); // 用一个列表显示出专辑的具体信息
[self showAllData:release.Id];
}; MBRequest *req = [MBRequest searchForEntity:MBEntityRelease
query:@"Violin Concertos"
// query:@"不想放手"
limit:[NSNumber numberWithInteger:10]
offset:[NSNumber numberWithInteger:0]]; [conn enqueueRequest:req onSuccess:successBlock onFailure:self.failureBlock];
} - (void)showAllData:(NSString *)mbid {
MBConnection *conn = [MBConnection connection]; MBRequest *req = [MBRequest lookupWithEntity:MBEntityRelease
mbid:mbid
incParameters:(MBIncParameterRecordings | MBIncParameterRecordingRels)]; void (^successBlock)(MBRequest *, MBMetadata *) = ^(MBRequest *request, MBMetadata *metadata) {
MBRelease *release = metadata.Release;
if (release) {
_resultController.tracks = [NSMutableArray array];
MBList *mediumList = release.MediumList;
MBMedium *medium = [mediumList elementAtIndex:0];
MBList *trackList = medium.TrackList;
for (MBTrack *track in trackList) {
[_resultController.tracks addObject:track.Recording.Title];
}
[self.navigationController pushViewController:_resultController animated:YES];
NSLog(@"Success");
}
else {
[self alertWithMessage:@"搜索失败"];
}
}; [conn enqueueRequest:req onSuccess:successBlock onFailure:self.failureBlock];
} @end

其实,这和Use MusicBrainz in iOS(二)中的搜索方法是一样的,仅仅是搜索的类型是MBEntityRelease。在搜索并获取到列表中的第一个结果后,我们选取其mbid进行进一步的查询,由于仅仅有通过mbid的查询才干查找到该专辑中包括什么歌曲等信息。

在查询成功后。用一个表格来载入这些数据。ResultViewController类代码例如以下:

#import <UIKit/UIKit.h>

@interface ResultViewController : UITableViewController

@property (strong, nonatomic) NSMutableArray *tracks;

@property (strong, nonatomic) NSMutableArray *artists;

@property (copy, nonatomic) NSString *title;

@property (copy, nonatomic) NSString *mbid;

@property (copy, nonatomic) NSString *date;

@property (copy, nonatomic) NSString *country;

@property (copy, nonatomic) NSString *format;

@property (copy, nonatomic) NSString *language;

@property (copy, nonatomic) NSString *script;

@property (copy, nonatomic) NSString *quality;

@property (copy, nonatomic) NSString *status;

@end

#import "ResultViewController.h"

@interface ResultViewController ()

@end

@implementation ResultViewController

- (void)viewDidLoad {
[super viewDidLoad];
} - (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated]; self.navigationItem.title = self.title;
} #pragma mark - Table view data source - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 4;
} - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
switch (section) {
case 0:
return [self.tracks count];
case 1:
return [self.artists count];
case 2:
return 5;
case 3:
return 2;
default:
return 0;
}
} - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
switch (section) {
case 0:
return @"音乐列表";
case 1:
return @"艺术家";
case 2:
return @"基本信息";
case 3:
return @"附加信息";
default:
return @"";
}
} - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CellIdentifier" forIndexPath:indexPath]; if (indexPath.section == 0) {
cell.textLabel.text = self.tracks[indexPath.row];
}
else if (indexPath.section == 1) {
cell.textLabel.text = self.artists[indexPath.row];
}
else if (indexPath.section == 2) {
NSString *text;
switch (indexPath.row) {
case 0:
text = [NSString stringWithFormat:@"发行日期:%@", self.date];
break;
case 1:
text = [NSString stringWithFormat:@"发行地区:%@", self.country];
break;
case 2:
text = [NSString stringWithFormat:@"发行形式:%@", self.format];
break;
case 3:
text = [NSString stringWithFormat:@"语言:%@", self.language];
break;
case 4:
text = [NSString stringWithFormat:@"Script:%@", self.script];
break;
default:
break;
}
cell.textLabel.text = text;
}
else if (indexPath.section == 3) {
NSString *text;
switch (indexPath.row) {
case 0:
text = [NSString stringWithFormat:@"品质:%@", self.quality];
break;
case 1:
text = [NSString stringWithFormat:@"状态:%@", self.status];
break;
default:
break;
}
cell.textLabel.text = text;
} return cell;
} @end

执行结果例如以下:

程序可能会继续改动,看看明天有什么进一步的需求提出来吧。

Use MusicBrainz in iOS(三)查询专辑的完整信息的更多相关文章

  1. Use GraceNote SDK in iOS(一)通过序列化GDO查询专辑封面

    于Use MusicBrainz in iOS之后,因为MusicBrainz找出专辑封面,它只能转移到其他网站提供的音乐信息搜索服务,领导给出GraceNote.(有压力.. .) 需求类似:通过一 ...

  2. 自学 iOS – 三十天三十个 Swift 项目

    自学 iOS – 三十天三十个 Swift 项目 github源码地址:https://github.com/allenwong/30DaysofSwift

  3. IOS三种归档(NSKeyArchieve)的总结

    IOS三种归档(NSKeyArchieve)的总结 归档是一种IOS中常用来存储文件的一种方法,在面向对象的语言中,归档也就实际上可以将一切对象存储在文件中,以下是IOS开发中常见的三种文件归档方式, ...

  4. 自学 iOS - 三十天三十个 Swift 项目 第一天

    最近公司项目不是很忙,偶然间看到编程语言排行榜,看到swift 已经排到前10了,然OC排名也越来越后了,感觉要上车了,虽然现在项目都是用OC写的,但是swift是一种趋势.在网上看到"自学 ...

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

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

  6. 如何用ajax写分页查询(以留言信息为例)-----2017-05-17

    要写分页,首先你得清楚,一页你想显示多少条信息?如何计算总共显示的页数? 先说一下思路: (1)从数据库读取数据,以chenai表为例,读取所有留言信息.并能够实现输入发送者,可以查询该发送者的留言总 ...

  7. CentOS7查询系统版本内核信息

    1. 查看版本号 查看CentOS的版本号命令: [root@localhost ~]# cat /etc/centos-releaseCentOS Linux release 7.4.1708 (C ...

  8. MySQL中 如何查询表名中包含某字段的表 ,查询MySql数据库架构信息:数据库,表,表字段

    --查询tablename 数据库中 以"_copy" 结尾的表 select table_name from information_schema.tables where ta ...

  9. Java的三种代理模式&完整源码分析

    Java的三种代理模式&完整源码分析 参考资料: 博客园-Java的三种代理模式 简书-JDK动态代理-超详细源码分析 [博客园-WeakCache缓存的实现机制](https://www.c ...

随机推荐

  1. C#winform使用进度条

    在用c#做WinFrom开发的过程中.我们经常需要用到进度条(ProgressBar)用于显示进度信息.这时候我们可能就需要用到多线程,如果不采用多线程控制进度条,窗口很容易假死(无法适时看到进度信息 ...

  2. Java多线程--线程及相关的Java API

    Java多线程--线程及相关的Java API 线程与进程 进程是线程的容器,程序是指令.数据的组织形式,进程是程序的实体. 一个进程中可以容纳若干个线程,线程是轻量级的进程,是程序执行的最小单位.我 ...

  3. java通过url在线预览Word、excel、ppt、pdf、txt文档

    java通过url在线预览Word.excel.ppt.pdf.txt文档中的内容[只获得其中的文字] 在页面上显示各种文档中的内容.在servlet中的逻辑 word: BufferedInputS ...

  4. Java三大特性:封装,继承,多态

    java提高篇(一)-----理解java的三大特性之封装 概念: 封装从字面上来理解就是包装的意思,专业点就是信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独 ...

  5. java设计模式-----24、访问者模式

    概念: Visitor模式也叫访问者模式,是行为模式之一,它分离对象的数据和行为,使用Visitor模式,可以不修改已有类的情况下,增加新的操作. 访问者模式的应用示例 比如有一个公园,有一到多个不同 ...

  6. python学习之老男孩python全栈第九期_day003知识点总结

    1. int: i.bit_length(): 把i这个数转换成二进制所需最少的位数 2. bool: (1) 1比True的效率更高 (2) 空字符串(什么都没有)为False:非空字符串为True ...

  7. apicloud 第一篇

    最近公司需要开发一款app,说实话,之前也只是对Android有过一部分的了解,ios基本上都毛都不知道,所以作为小公司的我们经过商议决定使用apicloud,虽然用户体验不如原生的好,但谁叫我们穷, ...

  8. equals 与 == 的区别

    equals 是 用来比较二个对象内容是否相等. == 是用来比较二个对象的内存是否相等. public void testString(){ String s1="123"; S ...

  9. es6 类 和构造函数

  10. AutoCAD.net支持后台线程-Socket通讯

    最近因为公司项目的需求,CAD作为服务端在服务器中常驻运行,等待客户端远程发送执行任务的指令,最终确认用Socket-tcp通讯,CAD需要实时监听客户端发送的消息,这时就需要开启线程执行Socket ...