【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]; } }
一応、コレで問題なさそうです。もっと効率的な方法があったら教えてください。
「【Objective-C】再生リストからiCloudとDRM付きの曲を外す」への1件のフィードバック
コメントは停止中です。