Angular と MusicKit を使用して、ユーザーが同じ音楽を同時に聴けるようにするアプリケーションを作成しています。デフォルトのローカルホスト (ng serve を使用) 以外に対して (ng serve --host xxxx を使用して) アプリケーションを実行しようとすると、次のエラーが発生します。
core.js:14597 ERROR TypeError: Cannot read property 'container' of null
at Player. (musickit.js:formatted:6614)
at musickit.js:formatted:726
at Object.next (musickit.js:formatted:739)
at fulfilled (musickit.js:formatted:627)
at ZoneDelegate.push../node_modules/zone.js/dist/zone.js.ZoneDelegate.invoke (zone.js:388)
at Object.onInvoke (core.js:16156)
at ZoneDelegate.push../node_modules/zone.js/dist/zone.js.ZoneDelegate.invoke (zone.js:387)
at Zone.push../node_modules/zone.js/dist/zone.js.Zone.run (zone.js:138)
at zone.js:872
at ZoneDelegate.push../node_modules/zone.js/dist/zone.js.ZoneDelegate.invokeTask (zone.js:421)
21:08:38.100 core.js:14597 ERROR Error: Uncaught (in promise):
TypeError: Cannot read property 'isFairplay' of undefined
TypeError: Cannot read property 'isFairplay' of undefined
at MediaExtension.get [as isFairplay] (musickit.js:formatted:5020)
at musickit.js:formatted:6728
at Array.filter ()
at Player._playbackDataForItem (musickit.js:formatted:6726)
at Player. (musickit.js:formatted:6504)
at musickit.js:formatted:726
「isFairplay」エラーは、最初のエラーの原因の結果だと思いますが、安全のために含めました。digitalocean で nginx サーバーを使用しています (ng ビルド、dist フォルダーを /var/www/html に移動します) が、ローカルでは "ng serve --host xxxx を使用してローカル IP に対して実行していました。プレーン ng サーブ, すべて正常に動作します. Apple が実際に要求を行っているアプリケーションについて混乱した場合に備えて、他の Apple Music アカウントで試しました. Chrome のさまざまなブラウザー/シークレット ウィンドウで試しました.
私は次のことをしようとしています: 1. ライブラリから曲のリストをユーザーに表示します 2. ユーザーが曲を選択できるようにします 3. オブザーバブルで次の手順にサブスクライブします: 4. 曲が選択されたら、キューに入れます5. 曲がキューに入れられたら、musicKit.player.play() を使用して、現在キューに入れられている曲を再生します。
手順 5 の後に次のエラーが発生します。すでに container.id を曲に追加しているため、何らかの理由で Apple が実際に曲をキューに入れていないと思います。後で何が起こったのかわかりません。queueSong が正常に返されるので、container.id が null または未定義の唯一のものではなく、最初に不平を言うだけだと思います。
上記の手順で何が起こるかを説明するコード。"playSong(..)" は別のクラスでサブスクライブされています:
playSong(songs: any[], index: number): Observable {
if(songs) {
//songs play without the forEach, but musicKit still complains
//about not finding container.id in the song object
songs.forEach(song => song['container'] = { 'id' : song.id });
return from(this.musicKitService.setQueue({ 'items': songs, startPosition: index}))
.pipe(mergeMap(x => this.play()));
}
}
modifyPlayback(arg: Observable): Observable {
return arg.pipe(map(x => this.setTitle()));
}
play(): Observable {
return this.modifyPlayback(from(this.player.play()));
}
この後、ブラウザーで曲の再生が開始されることを期待しています。基本的に、1 つの曲をキューに入れ、musicKit.js にキューに入れられた曲を再生するように指示します。ただし、msuicKit.js がキューに入れられた曲を再生しようとすると、再生する曲はありません。ローカルホストの外で実行しているときに、キューに正常に入れられた後、曲に実際に何が起こっているのかわかりません。
これを Apple 開発者フォーラムにも投稿し、昨年の問題を抱えている人を含めましたが、解決されることはありませんでした。 https://forums.developer.apple.com/message/350355#350355
また、元の投稿で言及するのを忘れていました。これはクロムでのみ発生します。コードは Firefox とモバイル サファリで正常に動作します。