[iOS][Swift]MPMediaQueryを使って曲を絞り込む

[iOS][Swift]ミュージックライブラリにアクセスして音楽を再生する(MPMusicPlayerController使用) | nackpan Blog
では、MPMusicPlayerControllerを用いて、ミュージックライブラリにアクセスしました。

そのときは、メディアピッカーを使いました。
ss 2015-09-13 11 41 39

今回は、メディアクエリを使用して、アイテムを取得する方法を紹介します。
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)

アーティスト名で絞り込むサンプル

サンプルプロジェクトを作成しました
ファイル 2015-09-16 22 10 16
テキストフィールドにアーティスト名を入力して「実行」ボタンを押すと、入力したテキストを含むアーティストの曲を表示し、再生を開始します

        // アーティスト名で絞り込む
        // (ここの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

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください