【Xcode5.1.1 + iOS 7.1 + MacOX10.9.5】
前回書いたように、AVPlayer(AVQeuePlayer)でiPodライブラリの音楽を再生する場合、DRM付きの曲が再生できない。表示されているのに再生できないのはアプリとしてマズいので、再生リストから外す方法を考えてみました。
#import "SelectViewController.h"
@interface SelectViewController ()
@end
const int CATEGORY_ALBUM = 0;
const int CATEGORY_PLAYLIST = 1;
const int CATEGORY_ARTIST = 2;
@implementation SelectViewController
{
NSDictionary *dataSource;
NSMutableArray *key;
int current_category;
}
//(中略)
-(void)setMusicCategory
{
MPMediaQuery *query;
switch (current_category) {
case CATEGORY_ALBUM:
query = [MPMediaQuery albumsQuery];
break;
case CATEGORY_PLAYLIST:
query = [MPMediaQuery playlistsQuery];
break;
case CATEGORY_ARTIST:
query = [MPMediaQuery artistsQuery];
break;
default:
break;
}
//iCloudデータをフィルタリングで除外
[query addFilterPredicate:[MPMediaPropertyPredicate predicateWithValue:[NSNumber numberWithBool:NO] forProperty:MPMediaItemPropertyIsCloudItem]];
NSArray *collectionList = query.collections;
key = [[NSMutableArray alloc] init];
NSMutableArray *albumList = [[NSMutableArray alloc] init];
for (MPMediaItemCollection *collection in collectionList) {
MPMediaItem *representativeItem = [collection representativeItem];
NSString *albumtTitle = [representativeItem valueForProperty:MPMediaItemPropertyAlbumTitle];
//DRMチェック(AVPlayerで再生できないため/DRM対象曲のみを弾く)
int drm_count = 0;
NSMutableArray *itemList = [[NSMutableArray alloc] init];
for (MPMediaItem *item in collection.items) {
NSURL *url_item = [item valueForProperty:MPMediaItemPropertyAssetURL];
if (url_item == NULL) {
drm_count++;
} else {
[itemList addObject:item];
}
}
if (itemList.count > 0) {
MPMediaItemCollection *collection_new = [MPMediaItemCollection collectionWithItems:itemList];
[albumList addObject:collection_new];
NSString *keyword;
switch (current_category) {
case CATEGORY_ALBUM:
keyword = albumtTitle;
break;
case CATEGORY_PLAYLIST:
keyword = [collection valueForProperty:MPMediaPlaylistPropertyName];
break;
case CATEGORY_ARTIST:
keyword = [representativeItem valueForProperty:MPMediaItemPropertyArtist];
break;
default:
break;
}
[key addObject:[NSString stringWithFormat:@"%@",keyword]];
}
}
dataSource = [NSDictionary dictionaryWithObjects:albumList forKeys:key];
}
※ SelectViewControllerは、UITableViewControllerを継承したカスタムクラスです。
上に書いた関数「setMusicCategory」は、UITableViewに選択させる再生リストを表示するためのdataSourceを作成するための関数で、ボタンなどによって再生リストの種類(プレイリスト/アルバム/アーティスト)を切り換えたときに・・・
current_category = CATEGORY_ALBUM;
[self setMusicCategory];
[self.myTableView reloadData];
※self.myTableViewは、UITableViewControllerに含まれるUITableView。
みたいな感じで使います。
・iCloudのデータを除外する
これはフィルタ使って弾けるので、上のソースのこの部分。
//iCloudデータをフィルタリングで除外
[query addFilterPredicate:[MPMediaPropertyPredicate predicateWithValue:[NSNumber numberWithBool:NO] forProperty:MPMediaItemPropertyIsCloudItem]];
・DRM付きの曲を除外する
1つのアルバムで、DRMつきとDRMなしが混在することはないと思われるけど、プレイリストは任意に作れるので、引っ張ってきたMPMediaItemCollectionから、MPMediaItemのMPMediaItemPropertyAssetURLをひとつずつチェックしていくしかなさそうです。
for (MPMediaItem *item in collection.items) {
NSURL *url_item = [item valueForProperty:MPMediaItemPropertyAssetURL];
if (url_item == NULL) {
drm_count++;
} else {
[itemList addObject:item];
}
}
一応、コレで問題なさそうです。もっと効率的な方法があったら教えてください。