[iOS][Swift]ミュージックライブラリにアクセスして音楽を再生する(MPMusicPlayerController使用) | nackpan Blog
では、MPMusicPlayerControllerを用いて、ミュージックライブラリにアクセスしました。
そのときは、メディアピッカーを使いました。
今回は、メディアクエリを使用して、アイテムを取得する方法を紹介します。
iPodライブラリアクセス プログラミングガイド(PDF)での「iPodライブラリの使用」部分の話になります
MPMediaQueryクラス
MPMediaQuery Class Reference
MPMediaQueryクラスを使うと、
「アルバムごとにまとめて」取得
「アーティスト名を指定して」取得
などグループ化したり、対象を絞り込んだりして、アイテムを取得することができます
グルーピング
グルーピングクエリには、
albumsQuery
artistsQuery
songsQuery
playlistsQuery
podcastsQuery
audiobooksQuery
compilationsQuery
composersQuery
があります
グルーピングクエリは、MPMediaQuery!クラスを返します
MPMediaQueryのプロパティ
• collections
• items
に取得した内容が入っています。
collectionsは、MPMediaItemCollectionのarrayです
(MPMediaItemCollectionはMPMediaItem(ミュージックライブラリアイテムを表すクラス)を集めて管理するクラスです)
(albumsQueryの場合だと、アルバム一つ分が一つのMPMediaItemCollectionになっています)
itemsは、MPMediaItem(ミュージックライブラリアイテムを表すクラス)のarrayです。
MPMediaItem Class Reference
MPMediaItemCollection Class Reference
アルバムごとにグルーピングして取得したのち、アルバムのタイトルを表示する例を示します
// 「アルバム」単位で取得 let query = MPMediaQuery.albumsQuery() // 取得したアルバム情報を表示 if let collections = query.collections { for collection in collections { if let representativeTitle = collection.representativeItem!.albumTitle { print("アルバム名: \(representativeTitle) 曲数: \(collection.items.count)") } } }
フィルター
MPMediaQueryは、対象を絞るフィルターを加えることができます。
それには
addFilterPredicate(_ predicate: MPMediaPredicate!)
を用います
アルバムごとにグルーピングして取得する例を先ほど示しましたが、そのさい、cloudItem(端末にないアイテム)を取り除く例を示します。
let query = MPMediaQuery.albumsQuery() query.addFilterPredicate(MPMediaPropertyPredicate(value: false, forProperty: MPMediaItemPropertyIsCloudItem)) // 取得したアルバム情報を表示 if let collections = query.collections { for collection in collections { if let representativeTitle = collection.representativeItem!.albumTitle { print("アルバム名: \(representativeTitle) 曲数: \(collection.items.count)") } } }
MPMusicPlayerControllerでのクエリの利用
MPMusicPlayerControllerは、クエリを元に曲目キューをセットする
setQueueWithQuery(_ query: MPMediaQuery)
メソッドがあるので、クエリをそのまま渡してプレイヤーを作成することができます
let query = MPMediaQuery.albumsQuery() // プレイヤーにqueryから作成したキューをセット // (playerはMPMusicPlayerControllerのインスタンスを示す) player.setQueueWithQuery(query)
アーティスト名で絞り込むサンプル
サンプルプロジェクトを作成しました
テキストフィールドにアーティスト名を入力して「実行」ボタンを押すと、入力したテキストを含むアーティストの曲を表示し、再生を開始します
// アーティスト名で絞り込む // (ここのMPMediaPropertyPredicateで使われている変数artistは、String型でユーザーが入力したテキストから作成したもの) let predicate = MPMediaPropertyPredicate(value: artist, forProperty: MPMediaItemPropertyArtist, comparisonType: MPMediaPredicateComparison.Contains) query.addFilterPredicate(predicate)
フィルターで、「指定したテキストを含むアーティスト」を選出しています。
プロジェクトはGitHubにあります
nackpan/MediaQueryExample
ためしてみてくださいね
関連
[iOS][Swift]ミュージックライブラリにアクセスして音楽を再生する(MPMusicPlayerController使用) | nackpan Blog
[iOS][Swift]ミュージックライブラリにアクセスして音楽を再生する(AVAudioPlayer使用) | nackpan Blog
[iOS][Swift]AVAudioPlayerを使う(再生速度の変更、複数のプレイヤー) | nackpan Blog
[iOS][Swift]AVAudioPlayerを使う(リソースファイルを使う) | nackpan Blog
[iOS][Swift]AVAudioPlayerを使う(複数の曲をあつかう) | nackpan Blog