0

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 とモバイル サファリで正常に動作します。

4

1 に答える 1