ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
MusicKitでコンテンツをさらに見つける
MusicKitでAppを強化したりカスタマイズしたりする方法をご覧ください。MusicKitフレームワークの追加機能に関する最新情報を紹介し、リクエストやメタデータなどで音楽コンテンツをご利用のAppに取り込む方法について解説します。
リソース
関連ビデオ
WWDC22
WWDC21
-
ダウンロード
♪ ♪
こんにちは WWDCへようこそ Davidです MusicKitで より多くのコンテンツを 見つける方法について お話したいと思います 2021年に発表された MusicKitフレームワークは Swiftで音楽にアクセスし 再生するAPI群を提供します このフレームワークで AppはApple Musicと統合し Apple Musicの全カタログに アクセス可能になります 本日は MusicKitの 主な機能強化について お話したいと思います まず Apple Musicの カタログをさらに活用するため 新しい音楽アイテムタイプ リクエストやメタデータ追加を紹介します
その後 パーソナライズされた コンテンツを取得し ユーザーに合わせた体験を 提供する方法を説明します 次は Apple Musicの カタログのその先について説明します 今年は ユーザライブラリの 音楽を取り込むことで Appをさらにレベルアップ させることができます ライブラリやプレイリストへの アイテムの追加 プレイリストの作成 編集など ライブラリとアクティブに やり取りする方法を 説明します まずは カタログのコンテンツ追加 について説明します MusicKitの初期リリースでは 歌 アルバム プレイリスト などのコアタイプを含む 音楽の新モデル層が導入されました 今年は 2つの新しい タイプを追加して MusicKitで新しい音楽を 発見できるようにします: キュレーターと ラジオ番組です
それ以外にも MusicKitでは カタログを検索するための 優れたUIを構築したり トップチャートにアクセスして 人気の歌 アルバムを入手したり Dolby AtmosのSpatial Audio などのより高品質な オーディオメタデータなど 新属性を取得できます キュレーターや ラジオ番組から始めましょう 音楽を発見できる 素晴らしいリソースです ここでは キュレーターの 一例として ナイキを見ます 他の例としては Shazamや Beats by Dr. Dreがあります ここでは 彼らが作った全プレイリストを 簡単に見つけられます ユーザーはこの機能で 自分の好きな プレイリストにすばやくアクセスし 新曲を見つけ 昔好きだった曲を もう一度聴いたりできます さて ここからは より技術的な話になります キュレーターは さまざまな 属性を受け入れます この新しいキュレータータイプの 主な属性は 名前 URL アートワーク 種類です kindプロパティはenumで 「editorial」か「external」を指定し キュレーターがAppleキュレーターか 第三者キュレーターかを示します また キュレーターは そのキュレーターが作った プレイリストを表示する プレイリストリレーションを持ち まさに先ほどの音楽発見の 概念をサービスしています
次に ラジオ番組タイプです 「New Music Daily by Zane Lowe」や 「Pop Hits Radio by Brooke Reese」 などラジオ番組も 経験豊富な プロを通して 新しい音楽を発見する 方法のひとつです キュレータータイプと同様に ラジオ番組も ラジオ番組が取り上げる 音楽を探すための プレイリスト関係があります この2つの新しいタイプは プレイリストとの関係を保ち プレイリストタイプにも 「キュレーター」と「ラジオ番組」 という2つの新関係を公開し プレイリストが与えられた時 何が生成したか 構造を簡単に 得る逆ロジックを実現します
MusicKitでは 大量の中から カタログを検索できますが キュレーターやラジオ番組など 新アイテムタイプに対応しました その結果 リストは膨れ上がり 良いUIを作ることは ますます 難しくなっています そのため今年は 「上位の結果」と「おすすめ」によって より簡単に 利用できるようにしています これら機能拡張がUIに与える 効用について見ていきます タイプをして コンテンツを検索する際 音楽関連の自動コンプリート機能を 強力にサポートしたい場合 人々が探そうとしている 言葉を提供する 「おすすめ」が活躍するのです さらに 「上位の検索結果」を 表示することで ユーザーは探しているものに すばやくアクセスも可能です 最良の結果を得るためには アイテムの種類は気にせず 関連性を重視するのも よいでしょう これが「上位の検索結果」の 力です では これを実装すると どのようになるのか 「上位の検索結果」から 見ていきましょう ここでは カタログ検索の リクエストを作成するために 検索語と 表現したいアイテムの 種類を指定する 方法を説明します レスポンスには 要求されたタイプ別に 分類されたコレクションが含まれ これは素晴らしいことですが 私たちは型にとらわれない 最も関連性の高い 結果の単一リストを 公開したいのです この情報をリクエストするのは 一行を加えるだけなのです リクエストのincludeTopResults プロパティをtrueに設定し 返答に新しいプロパティが 記入されるようにしています この新しいプロパティは topResultsと名付けられ リクエストされたタイプの いずれかアイテムを含みます print文の出力は こんな感じです 上位結果は 1つのコレクション に含まれる曲 アーティスト アルバムが混在し 関連性の高い順に並んでいます では おすすめを使って より早く検索先に たどり着く 方法を紹介します 文字列の用語でおすすめ リクエストを作成します レスポンスを呼び出すと おすすめの返答が返ってきます 返答にはおすすめ の配列が含まれます 各おすすめには 検索キーワード だけでなく UIに適したキーワードも 含まれます ユーザーがおすすめを選択すると 検索ワードで検索リクエストを行い 対応する結果を 取得することができます
カタログチャートは 人気曲の 最新情報を得るのに最適です MusicKitには トレンドを確認できる さまざまな種類のチャートがあります 提供するチャートの種類は トップソングやアルバムなど 再生数の多い曲に対応した トップチャート シティチャート デイリートップ100 などです リクエストチャートを特定ジャンルで フィルタリング指定もできます これらのチャートをコードで 取得するのは非常に簡単です カタログチャートリクエストは カタログ検索リクエストで 使用された確立済の パターンに従っています まず チャートリクエストを 初期化します そして 好きなチャートの種類を 指定をできます デフォルトでは 最も再生された コンテンツを取得しますが デイリーグローバルトップチャートや シティトップチャートも含められます 最後に チャートに含ませたい 種類を指定するだけです 以上です 返答の最初のプレイリスト チャートにアクセスすると デイリーグローバルトップチャートを 表すMusicCatalogChartを得ます 「Top 100: Global」や 「Top 100: USA」プレイリストです MusicDataRequestを使い カタログチャートを取得していた場合 アイテムの収集に組込まれた ページネーションサポートで MusicKitが作業を行うので もうその必要はありません 2021に 真の多次元サウンドと クリアな音質で 画期的なオーディオ体験を 提供しました: Dolby Atmos対応の Spatial Audioです この没入型体験は何千もの 楽曲で提供され 今回 このデータにアクセスが 可能になりました MusicKitは Audio Variantsを通じ どの曲やアルバムでどの 音響資源が利用できるか公開し 他でもリレーが可能です オーディオの バリエーションの例としては Dolby AtmosのSpatial Audio Lossless Audioなどです
オーディオバリアントと並んで 新たにApple Digital Masterという 最高品質のマスターを支援する ブール値のプロパティを公開します このメタデータは アイテムレベルで公開され オーディオバリアントは 詳細表示に最適で このようなUIを 実現することができます ここでは アルバムの 詳細表示をしています ここには 先ほどの オーディオバリアントの プロパティに基づいた 適切なバッジが表示され ユーザーにどんな音質が 期待できるかを知らせます この場合 このアルバムでは 空間オーディオと ロスレス・オーディオ が利用可能です これを実現するコードを どう書くか見てみましょう オーディオバリアントのロードは 他の拡張属性と同じです 既存のアルバムや曲 この場合はアルバムを取得し withメソッドでaudioVariants 拡張属性を読み込みます detailedAlbumにはaudioVariants プロパティが設定されました このAudioVariantを 要素とする配列である オーディオバリアントプロパティ を見ることができます これらの値で 先ほど見たように 特定の要素で利用可能な オーディオリソースを UIに表示ができます 素晴らしいですが これらのオーディオバッジを トップレベルや詳細ビュー以外にも 表示したい場合があります そのため もう一歩踏み込んで 音楽プレーヤー用の アクティブオーディオの バリアントも公開しています アクティブオーディオバリアント にアクセスすると 現在再生中のアイテムの オーディオの品質を 視覚的に表示ができます Dolby Atmosなどです MusicKitのプレーヤーAPIは ユーザー設定やネットワーク状況 に応じて 適切な音質を 自動的に選択します プレイヤーからアクティブな 特性にアクセスするために ApplicationMusicPlayer の再生状態をobserved オブジェクトで アクセスします 再生状態からアクティブな audioVariantに直接アクセスでき audioVariantプロパティで dolbyAtmosかどうかを確認し dolbyAtmosであれば UIを追加します 再生状態は観測された オブジェクトであるため 再生中のアイテムが 変更されるたびに このビューは 自動的に更新され ビューが常に最新 であることを確認します さて カタログの追加について 説明しましたが パーソナライズコンテンツの 取得について説明します パーソナライズコンテンツは 登録者固有のデータであり App内の全ユーザーにユニークで ユーザーに合わせた体験を提供します 通常パーソナライズコンテンツは 認証やユーザートークンが必要ですが MusicKitフレームワークでは これをすべて自動化し 煩わしさを感じさせません 私たちが開発者に提供する パーソナライズドコンテンツは 最近再生したアイテムへの アクセスや パーソナライズされたおすすめです 最近再生したコンテンツは その人の 音楽消費体験の 貴重なデータです ユーザーが楽しんでいる音楽アイテムに すばやく簡単にアクセスができます 新しい音楽を聴いた場合 後から履歴をさかのぼって 参照することも可能です アルバム プレイリスト ステーションなどの最近再生した コンテナの取得には リクエストを 作成することができます プレイリストやアルバムから 曲を再生した場合は コンテナタイプが 取得されます レスポンスには 最近再生した音楽の項目があり タイトル サブタイトル アートワーク の便利なアクセサを提供します 曲やステーションなど より具体的な 種類の最近再生した項目を 取得することも可能です ここでは 最近再生した 曲のリクエストを作成し 角括弧で示した汎用パラメータで 曲の種類を指定します 現在返答には 再生した曲 だけが含まれています さて パーソナライズされた おすすめについてです パーソナライズされたおすすめは ユーザライブラリや再生履歴に 基づいて作られ Appの体験をより 親密で魅力的なものにします ジャンル別 アーティスト別 「あなたにおすすめ」コレクション別など テーマ別におすすめが きれいに整理されます パーソナライズされたおすすめを 取得するには パーソナライズされたおすすめ リクエストを作成します その返答は おすすめのが収集されています 最初のおすすめを記録すると この特定の要素が 「あなたにおすすめ」のレコメンドを 表すことがわかります おすすめには ID タイトル nextRefreshDateがあります nextRefreshDateは このおすすめが 最新のおすすめに 更新されるべき日付を表します playlistsプロパティには 自分用の全プレイリストが含まれます もう一つのおすすめの 例を見てみましょう おすすめレスポンスの 2番目の要素をprintします 私はオルタナティブ音楽を 沢山聴きますが このおすすめでは アルバムとプレイリストという 異なるタイプをミックスしています それらは カタログ検索の 上位結果のように 関連性によって並べられ 1つのコレクションにまとめられます さらに ユーザーのライブラリの コンテンツをAppに取り込み 音楽体験をさらに 充実させる方法 について説明します 今年MusicKitは ライブラリから アイテム取得リクエストと ユーザライブラリ内の コンテンツを検索し特別に 拡張属性と関係を読み込む ライブラリセクション化 リクエストの 2種類のリクエストを Appで可能にします 技術的な詳細を見る前に ライブラリコンテンツを使用し App強化の方法を紹介します Music Marathonという フィットネスAppを開発しています 屋外のランニングを 記録することができます MusicKitをプロジェクトに 組み込むことで Apple MusicのAppとを コンテキストで切り替えず Appから直接音楽を 再生できるようにします 新しいワークアウトを始め 音楽コンテンツを探しましょう
ここでは パーソナライズされたおすすめ リクエストから取得した おすすめのプレイリストを 紹介します ユーザーが好むと思われるプレイリストに すぐにアクセスを可能にします ライブラリタブに移動すると 空のビューなのがわかります パーソナライズされたプレイリストをすべて 見れたら最高なので その機能を書きましょう すでにこのビューの 基本処理UIをいくつか設定し 私のライブラリから プレイリストをロードします まず ライブラリの リクエストを...
genericパラメータに playlistを指定することで ユーザライブラリからの プレイリスト取得を示します
"request "と名付けた ローカル変数に格納します
次に リクエストを受け取り レスポンス関数を呼出します
このメソッドは非同期で 投げるメソッドなので tryとawaitキーワードを 追加しましょう もう一度レスポンス変数に 格納します
そして この応答を受け取るため stateオブジェクトを更新します
あとはリストを更新して UIでプレイリストを 見れるようにします ForEachを使い レスポンス 項目を繰り返し処理します
MusicItemCollectionにある 各プレイリストを取得します
プレイリストができたので すでに作った PlaylistCellに渡します
再実行すると...
そして Appに戻ると ライブラリの個人プレイリストを すべて見ることができます パーソナライズされたおすすめ Apple Musicのカタログからの選択 自分の個人的ライブラリを 聴けるようになりました ライブラリコンテンツへの アクセスが簡単なのを説明しました では ライブラリリクエストで 他に何ができるかを見ましょう ミュージックライブラリの リクエストは ユーザライブラリからの アイテム取得への強力なAPIです iOSでは ミュージックカタログからの コンテンツ取得のリクエストとは異なり MusicLibraryRequestは ネットワークからデータをロードしません その代わり 端末に保存された ユーザライブラリの コピーからアイテムを 読み込みます このリクエストの基本は どの音楽アイテムの種類を 希望するかを 指定することだけです この項目タイプは MusicLibraryRequestの generic パラメータに 渡されます リクエストに対してさまざまな フィルターやソートを適用し 要件にマッチした呼び出しを 細かく調整できます このリクエストは ダウンロード済みの コンテンツの取得も可能で 完全なオフライン体験を サポートします シンプルで基本的なリクエストから 始めます Music MarathonAppで 書いたのと同じですが 今回は ライブラリ内アルバムを要求します アルバムタイプは genericパラメータで指定します リクエストを実行するには レスポンス関数を呼び出します 出力結果を見ると MusicLibraryResponseがあり そこには ユーザーの 音楽ライブラリで見つかった 全アルバムの MusicItemCollectionがあります これらアルバムは さまざまな カタログリクエストから得られるのと 同じアルバム構造で 同じ機能を持ちます この例では ライブラリ内の 全アルバムを取得していますが 特定アルバムのサブセットのみ が必要なシナリオもあるでしょう その為 MusicLibraryRequestでは ライブラリから取得したい項目を より具体的に 指定することも可能です 先程のリクエストと同じものに フィルタを追加しましょう isCompilationプロパティが trueに等しいすべての アルバムを ロードしたいと思います filterメソッドを呼び出すと Xcodeの自動コンプリートは リクエストするアイテムタイプに 対応の特定キーパスのみ提供します レスポンスに含まれるのは コンピレーションアルバムだけです しかし MusicLibraryRequestが 持つ力はまだあります 複数のフィルタを 連結することができ 追加する度 より洗練された リクエストが可能になります あるジャンルのコンピレーションを すべて揃えたい場合は? リクエストに別の フィルタを追加できます 例えば 「ダンス」という ジャンルの例があります ジャンル関係でフィルタリングし この特定のジャンルを含む コンピレーションだけを結果に含めるよう 制限することができます 今は ダンスコンピレーションしか 入っていません ダウンロード済みのダンスコンピレーション だけを収録するのはどうでしょう それには リクエスト時に includeOnlyDownloadedContentを trueに設定すれば いいのです 以上です レスポンスは同じ MusicLibraryResponseですが アイテムはダウンロード済の 要素のみを含みます ミュージックライブラリの リクエストは非常に強力で カスタムMusicDataRequestでは 不可能な新しい機能を解放ます MusicKitにはユーザライブラリから さらに充実した形でデータを取得できます ライブラリセクションリクエスト を紹介します セクション指定りクエストは グループ化されたアイテムを取得できます セクションリクエスト は異なるパラメータを取り込みます 1つ目はセクションタイプ 2つ目はアイテムタイプです ライブラリセクションリクエストは 通常のと同じ機能をサポートしており セクションまたは アイテムに適用できます さまざまなフィルタや ソートメソッドを使用できます ライブラリセクションリクエストを使用し ジャンル別に分類された 全アルバムを取得する 方法を説明します セクション化された応答は各要素が リクエストの最初の汎用パラメータ に対応する「セクション」の プロパティを保持します 各ジャンルは 独自の属性を 公開するだけでなく アルバムの コレクションを含み items プロパティでアクセスできます これらの項目は 一般的な 第2引数に相当します ここでは ジャンルがAlternativeの アルバムをハイライト表示しています 前述したように フィルタリングやソート機能も このセクションリクエストで 利用可能です 例えば 同じアルバムを ジャンル別に分類し アーティスト名で 並べたいとします ソートフィルタを追加します アルバムにartistNameの keyPathを指定し これらを昇順に指定する事で 応答をソートしています メソッドがsortItemsであることに 注意してください セクションではなくアイテムへ 適用ソートを指定しているためです セクションを指定する場合は filterSectionsとsortSection メソッドが用意されています 新しい応答を 見てみましょう
アルバムはタイトル順でなく アーティスト名のアルファベット 順に並んでいることが わかります ライブラリリクエストとセクション リクエストはどちらも強力ですが ユーザライブラリからの 検索結果を追加することで 音楽検索のUIを 補完することもできます カタログ検索とほぼ同じく動作 する新しいリクエストを追加しました カタログから 結果を読み込むのではなく ユーザライブラリから 関連する項目を検索します ライブラリの検索リクエストは カタログと同じように 必要なのは 検索語とタイプの 配列だけです ユーザライブラリからアイテムを 取得する方法を見てきましたが 拡張属性やリレーションシップの 読み込みについてはどうでしょう MusicKitの初期リリースでは withメソッドが導入され Apple Music APIからプロパティの 読み込みが可能になりました 今年は現在のwithメソッドを 拡張して 優先ソースパラメータ も取得できるようになりました この優先ソースは Apple Music カタログとユーザライブラリ両方で 利用可能な拡張属性と リレーションシップのデータを どこからロードするかを 示します カタログとライブラリの 一方しか存在しないプロパティは 無視されることがないように 優先ソースに関係なく 取得されます また カタログリクエストや ライブラリリクエストなど 最初の項目が どこから来たものであっても この機能を 利用することができます すべてうまくいきます
ここでは 音楽アイテムの 関係を受け取る方法をお見せします アルバムのトラックをロードし 出力を表示すると そのアルバムの 全トラックを 見ることができます しかし 新たにpreferredSource プロパティが追加されたことで ライブラリからリレーションシップ を取得するように 指定することが できるようになりました 出力にはライブラリにある アルバムトラックのみが含まれます ユーザライブラリからさまざまな 方法でアイテムを取得できる今 ユーザーがMusicKitを通じて直接 ライブラリを操作できる事は 理にかなっていると言えます サンプルApp 「Music Marathon」に戻って このライブラリの機能を いくつか見てみましょう 体を動かしているうちに 個人的なおすすめを 閲覧したくなります
曲目を見ているうちに この中の1曲がワークアウトの プレイリストに ぴったりだと気付きました このセルを長押しすると コンテクストメニューが表示され この曲をプレイリストに 追加することができます それを押すと 再び自分の プレイリストがポップアップ表示されます 選択トラックを指定のプレイリストに 追加する コードを書いてみましょう 選択アイテムはAddToPlaylistCell セルにパイプされており あとは共有インスタンスを通して MusicLibraryにアクセスするだけです
選択したトラックと どのプレイリストに 追加するかを指定して 「add」メソッドを 呼び出すことにします
このメソッドも 非同期投げ関数なので もう一度tryとawait キーワードを追加します
最後に バインディング変数 isShowingPlaylistPicker をfalseに設定し ピッカー解除します
ここで再実行して プレイリストにトラックを追加し プレイリストの1つを選択すると このアイテムが 追加されるはずです App内のライブラリタブに戻ると ワークアウトのプレイリストに 曲が追加されています プレイリストへのアイテム追加は これくらい簡単です ライブラリが提供する その他の機能を見てみましょう その他 ライブラリコンテンツの追加 プレイリストの作成 プレイリストのメタデータや トラックリストの編集など さまざまな方法でライブラリを 操作することができます ユーザライブラリにコンテンツを 追加するとApple Music Appの ライブラリタブで特定の曲や アルバムを探すことができ 設定で「Sync Library」 をオンにすると すべてのデバイスで 同期されるようになります この機能をあなたのAppに 直接提供することで Apple Music Appとあなたの Appを切り替える手間が省け ユーザーはあなたが提供するコンテンツに 集中することができます 新しく導入された ライブラリリクエストと一緒に ライブラリへの 追加を統合することで Appはすぐにこれらの 結果の恩恵を受けることができ ユーザーは好きなコンテンツに 簡単にアクセスができます このような 強力なサービスでも まだ音楽体験を 特別なものにしたいかもしれません そこで今年 プレイリストの作成と編集を MusicKitに搭載しました ユーザーの代わりにプレイリストの 作成ができるようになりました また ユーザライブラリ にある対象プレイリストに 曲やアルバム全体を 追加することも可能です プレイリストの作成は 好まれるコンテンツをグループ化し Appの設定したいムードに 合わせるのに適しています 既存のプレイリストに コンテンツを追加することで MusicKitが提供する さまざまな音楽発見ツールが人々に 直接影響を 与えることを可能にします また 作成したプレイリストの 編集も可能になり トラックリストやメタデータを編集し 思い通りのプレイリストに 仕上げることが できるようになりました そしてこれらは Appの中から ユーザライブラリと 対話できる方法です まとめます MusicKitには今年 いくつか大きなアップグレードがありました 新しいタイプやプロパティ 検索機能などカタログの機能拡張を 既存のAppに簡単に取り入れ より良い体験を実現します
ライブラリのコンテンツと 機能を統合し まったく新しい機能を解放し ユーザーが自分の体験を コントロールできるようにします
MusicKitを使うことで 複数の 異なるタイプのAppを強化できます フィットネスApp ゲームApp ソーシャルApp 地図Appなど 音楽を再生 共有することで 全Appが恩恵を受けられます さらに上を目指すなら 関連セッションも要確認です Swiftをより深く理解しMusicKitや 他のAppleフレームワークを 最大限に活用する 新しい言語追加を学びます 2021年のMusicKitセッションで フレームワークを使用するAppの設定方法 再生開始方法 サブスクリプション オファーの提示方法を学びましょう AndroidやWebでApple Musicとの 連携に興味がある方は Apple Music APIを直接利用する方法を 解説するセッションもあります
私たちのセッションを 楽しんでいただけたら幸いです デベロッパフォーラムを通じて 常に最新情報を確認してください ありがとうございました WWDC2022をお楽しみください
-
-
4:20 - Existing catalog search request
// Loading catalog search top results var searchRequest = MusicCatalogSearchRequest( term: "Hello", types: [ Artist.self, Album.self, Song.self ] ) let searchResponse = try await searchRequest.response() print("\(searchResponse)")
-
4:44 - Loading catalog search top results
// Loading catalog search top results var searchRequest = MusicCatalogSearchRequest( term: "Hello", types: [ Artist.self, Album.self, Song.self ] ) searchRequest.includeTopResults = true let searchResponse = try await searchRequest.response() print("\(searchResponse.topResults)")
-
5:09 - Loading search suggestions
// Loading suggestions let request = MusicCatalogSearchSuggestionsRequest(term: "shaz") let response = try await request.response() print("\(response)")
-
6:30 - Loading catalog top charts
// Loading catalog top charts. let request = MusicCatalogChartsRequest( kinds: [.dailyGlobalTop, .mostPlayed, .cityTop], types: [Song.self, Playlist.self] ) let response = try await request.response() print("\(response.playlistCharts.first)")
-
8:10 - Loading audio variants
// Loading audio variants let album = … let detailedAlbum = try await album.with(.audioVariants) print("\(detailedAlbum.debugDescription)")
-
9:09 - Showing currently playing audio variants
// Showing currently playing audio variants @ObservedObject var musicPlayerQueue = ApplicationMusicPlayer.shared.queue @ObservedObject var musicPlayerState = ApplicationMusicPlayer.shared.state var body: some View { if let currentEntry = musicPlayerQueue.currentEntry { VStack { MyPlayerEntryView(currentEntry) if musicPlayerState.audioVariant == .dolbyAtmos { Image("dolby-atmos-badge") } } } }
-
10:28 - Loading recently played containers
// Loading recently played containers let request = MusicRecentlyPlayedContainerRequest() let response = try await request.response() print("\(response)")
-
10:41 - Loading recently played songs
// Loading recently played songs let request = MusicRecentlyPlayedRequest<Song>() let response = try await request.response() print("\(response)")
-
11:21 - Loading personal recommendations and printing first recommendation
// Loading personal recommendations let request = MusicPersonalRecommendationsRequest() let response = try await request.response() print("\(response.recommendations.first)")
-
11:51 - Loading personal recommendations and printing second recommendation
// Loading personal recommendations let request = MusicPersonalRecommendationsRequest() let response = try await request.response() print("\(response.recommendations[1])")
-
13:36 - Loading library playlists
@MainActor private func loadLibraryPlaylists() async throws { let request = MusicLibraryRequest<Playlist>() let response = try await request.response() self.response = response }
-
14:23 - Displaying library playlists
List { Section(header: Text("Library Playlists").fontWeight(.semibold)) { ForEach(response.items) { playlist in PlaylistCell(playlist) } } }
-
15:47 - Fetching all albums in the library
// Fetching all albums in the library let request = MusicLibraryRequest<Album>() let response = try await request.response() print("\(response)")
-
16:38 - Fetching all compilations in the library
// Fetching all compilations in the library var request = MusicLibraryRequest<Album>() request.filter(matching: \.isCompilation, equalTo: true) let response = try await request.response() print("\(response)")
-
17:08 - Fetching all dance compilations in the library
// Fetching all dance compilations in the library var request = MusicLibraryRequest<Album>() request.filter(matching: \.isCompilation, equalTo: true) request.filter(matching: \.genres, contains: danceGenre) let response = try await request.response() print("\(response)")
-
17:29 - Fetching all downloaded dance compilations in the library
// Fetching all downloaded dance compilations in the library var request = MusicLibraryRequest<Album>() request.filter(matching: \.isCompilation, equalTo: true) request.filter(matching: \.genres, contains: danceGenre) request.includeDownloadedContentOnly = true let response = try await request.response() print("\(response)")
-
18:29 - Fetching all albums sectioned by genre
// Fetching all albums sectioned by genre var request = MusicLibrarySectionedRequest<Genre, Album>() let response = try await request.response() print("\(response)")
-
19:04 - Fetching all albums sectioned by genre sorted by artist name
// Fetching all albums sectioned by genre sorted by artist name var request = MusicLibrarySectionedRequest<Genre, Album>() request.sortItems(by: \.artistName, ascending: true) let response = try await request.response() print("\(response)")
-
20:58 - Fetching relationships using the with method without a preferred source
// Fetching relationships using the with method let album = … let detailedAlbum = try await album.with(.tracks) print("\(album.tracks)")
-
21:11 - Fetching relationships using the with method and a preferred source
// Fetching relationships using the with method let album = … let detailedAlbum = try await album.with(.tracks, preferredSource: .library) print("\(album.tracks)")
-
22:09 - Adding a track to a playlist
Task { try await MusicLibrary.shared(add: selectedTrack, to: playlist) isShowingPlaylistPicker = false }
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。