WWDC Quick Look 💓 By SwiftGGTeam
Meet Apple Music API and MusicKit

Meet Apple Music API and MusicKit

元の動画を見る

ハイライト

Apple Music API と MusicKit を使用すると、開発者は、カタログ検索、コンテンツ検出、再生制御、購読者向けのパーソナライズされた推奨事項など、Apple Music の機能を iOS、Web、Android プラットフォーム全体で統合できます。

主要内容

1 つの API、3 つのプラットフォーム

以前は、音楽ストリーミングをアプリに統合したい場合は、独自の音楽ライブラリを構築し、著作権を処理し、CDN を設定する必要がありました。これは中小規模の開発者にとってはほぼ不可能です。

Apple Music API は、Apple Music の完全なカタログへの直接アクセスを提供する RESTful JSON インターフェイスを提供します。 MusicKit クライアント フレームワークを使用すると、開発者は iOS、Web、Android 全体で一貫した音楽エクスペリエンスを実現できます。

00:51

各プラットフォームにおける MusicKit の役割分担:

  • Apple プラットフォーム: MusicKit は認証、再生制御、API 呼び出しを処理するため、開発者が基盤となるネットワーク リクエストを直接操作する必要はほとんどありません。
  • Web: JavaScript SDK および組み込みコンポーネント (フル機能のメディア プレーヤーを含む) を提供します。
  • Android: 加入者認証、再生制御、完全な API アクセスをサポートする SDK を提供します。

アクセスを取得する

Apple Music API を呼び出すには開発者トークンが必要です。プラットフォームが異なれば、アクセス方法も異なります。

03:42

Apple プラットフォーム: Apple Developer Portal の App ID で MusicKit サービスを有効にすると、システムが自動的にトークンを管理します。

その他のプラットフォーム: Apple Developer Portal で MusicKit 開発者として登録し、秘密キーをダウンロードして、JWT (JSON Web Token) を生成します。

JWT には次のフィールドが必要です。

  • Header:algES256でなければなりません、kidは秘密鍵の識別子です
  • Claims:iss(Team ID)、iat(発行時間)、exp(有効期限は最長6ヶ月)
  • Webアプリケーションの提案プラスoriginトークンが指定されたドメイン名でのみ使用されるように制限するクレーム

リソースをリクエストする

Apple Music API の URL は RESTful 構造を使用します。

https://api.music.apple.com/v1/catalog/{storefront}/{resource-type}/{id}

05:36

  • v1下位互換性を維持する API バージョンです
  • {storefront}は、次のような 2 文字の国コードです。uscn
  • {resource-type}のようにplaylistsalbumssongs
  • {id}リソースの一意の識別子です

オプションのパラメータ:

  • l:言語タグなどen-USes-MX
  • extend: 拡張属性を要求します
  • include: 関連するリソースの完全なメタデータが含まれます

詳細

プレイリストを取得する

curl "https://api.music.apple.com/v1/catalog/us/playlists/pl.u-55D6ZEMId7y" \
  -H "Authorization: Bearer YOUR_DEVELOPER_TOKEN"

応答構造:

{
  "data": [
    {
      "id": "pl.u-55D6ZEMId7y",
      "type": "playlists",
      "href": "/v1/catalog/us/playlists/pl.u-55D6ZEMId7y",
      "attributes": {
        "name": "Today's Hits",
        "curatorName": "Apple Music",
        "description": {
          "standard": "The biggest songs right now."
        },
        "artwork": {
          "width": 1200,
          "height": 1200,
          "url": "https://example.mzstatic.com/image/{w}x{h}bb.jpg"
        },
        "playParams": {
          "id": "pl.u-55D6ZEMId7y",
          "kind": "playlist"
        }
      },
      "relationships": {
        "curator": {
          "href": "/v1/catalog/us/playlists/pl.u-55D6ZEMId7y/curator",
          "data": [{ "id": "123456789", "type": "apple-curators" }]
        },
        "tracks": {
          "href": "/v1/catalog/us/playlists/pl.u-55D6ZEMId7y/tracks",
          "data": [
            {
              "id": "1234567890",
              "type": "songs",
              "attributes": {
                "name": "Song Title",
                "artistName": "Artist Name",
                "durationInMillis": 234000
              }
            }
          ]
        }
      }
    }
  ]
}

キーポイント:

  • data要求されたリソースを含む配列
  • attributesメタデータの保存 (名前、説明、アートワーク)
  • playParams購読者がコンテンツを再生できるかどうかを示します
  • relationships関連リソース(キュレーター、トラック)が含まれています
  • artwork.url{w}そして{h}実際の解像度に置き換える必要があります

アートワークをロードする

// 替换 artwork URL 中的尺寸占位符
let width = 400
let height = 400
let artworkURL = artwork.url
    .replacingOccurrences(of: "{w}", with: "\(width)")
    .replacingOccurrences(of: "{h}", with: "\(height)")

キーポイント:

  • アートワークの URL に含まれるもの{w}そして{h}プレースホルダー
  • 必要な解像度に置き換えて、対応するサイズの画像を取得します
  • 小さいサイズの画像はファイル サイズが小さくなり、読み込みが速くなります

ページネーション処理

プレイリストのトラック関係は、デフォルトでは上位 100 トラックのみを返します。 100 曲を超える場合、応答には次のものが含まれます。nextフィールド:

{
  "relationships": {
    "tracks": {
      "href": "/v1/catalog/us/playlists/pl.xxx/tracks",
      "data": [...],
      "next": "/v1/catalog/us/playlists/pl.xxx/tracks?offset=100"
    }
  }
}

キーポイント:

  • 合格nextURL 次のページを取得
  • 追加可能limit各ページのサイズをカスタマイズするパラメータ
  • 常に使用してくださいnextURL、オフセットを自分で計算しないでください
  • データがなくなったら、nextフィールドが存在しません

ディレクトリの検索

curl "https://api.music.apple.com/v1/catalog/us/search?term=pop&types=albums,songs&limit=10" \
  -H "Authorization: Bearer YOUR_DEVELOPER_TOKEN"

応答には以下が含まれますresultsオブジェクト、各リクエスト タイプは結果グループに対応します。

{
  "results": {
    "albums": {
      "href": "/v1/catalog/us/search?term=pop&types=albums",
      "data": [...],
      "next": "/v1/catalog/us/search?term=pop&types=albums&offset=10"
    },
    "songs": {
      "href": "/v1/catalog/us/search?term=pop&types=songs",
      "data": [...]
    }
  },
  "meta": {
    "results": {
      "order": ["albums", "songs"]
    }
  }
}

キーポイント:

  • typesパラメータにより検索されるコンテンツ タイプが制限されます
  • limitタイプごとの返品数を制御する
  • meta.results.order関連性に基づいた推奨ランキングを提供します
  • 各結果グループには独自の結果グループがありますnextページネーションリンク

パーソナライゼーション機能にアクセスする

加入者は、音楽ユーザー トークンを介してパーソナライズされたデータにアクセスできます。

curl "https://api.music.apple.com/v1/me/library/albums" \
  -H "Authorization: Bearer YOUR_DEVELOPER_TOKEN" \
  -H "Music-User-Token: USER_TOKEN"

キーポイント:

  • Music User TokenはMusicKitの認証プロセスを通じて取得されます
  • 音楽データにアクセスするには明示的なユーザー認証が必要です
  • トークンはデバイスとアプリにバインドされており、デバイス間で共有することはできません
  • サブスクリプションの変更、パスワードの変更、または権限の取り消しにより、トークンが無効になる可能性があります

重要ポイント

クロスプラットフォームの音楽発見アプリを作成する

  • 内容: Apple Music カタログとソーシャル レコメンデーションを組み合わせて、ユーザーが新しい音楽を発見できるようにする Web アプリ
  • 実行する価値がある理由: Apple Music API は完全なカタログ データと検索機能を提供するため、開発者は検出アルゴリズムと UI だけに集中する必要があります。
  • 開始方法: JavaScript MusicKit SDKで初期化して呼び出します/v1/catalog/{storefront}/searchで検索playParamsコンテンツが再生可能かどうかを判断する

音楽トリビア ゲームを作成します

  • 内容: ユーザーが曲のスニペットを再生して曲のタイトル、アーティスト、またはアルバムを推測できるトリビア ゲーム
  • 実行する価値がある理由: Apple Music API はアートワーク、曲のメタデータ、プレビュー クリップを提供し、ゲーム コンテンツは自然に充実しています
  • 開始方法: 検索 API を使用して曲を取得し、アートワークとアーティスト名をタイトル素材として抽出し、MusicKit プレーヤーを統合してプレビューを再生します

スマート プレイリスト ジェネレーターを作成する

  • 内容: ユーザーの気分、アクティビティ、または天気に基づいて Apple Music プレイリストを自動的に生成します
  • 実行する価値がある理由: Apple Music のカタログ データとユーザーのライブラリ データを組み合わせて、高度にパーソナライズされたリストを生成できます
  • 開始方法: 電話/v1/me/recommendations推奨事項を取得して組み合わせる/v1/catalog/{storefront}/searchキーワードで曲を追加するには、次を使用します。/v1/me/library/playlistsプレイリストの作成

音楽学習補助具を作成

  • 機能: 歌詞、コード、曲の構造を表示し、音楽学生のレパートリー学習を支援します。
  • 実行する価値がある理由: Apple Music API は、学習コンテンツと正確に一致する正確な曲の長さとアーティスト情報を提供します。
  • 開始方法: 検索 API を使用して曲を見つけて取得します。durationInMillis段落の位置を計算し、プレーヤーを統合して同期スクロールを実現します

関連セッション

コメント

GitHub Issues · utterances