Kaynağa Gözat

[front] MediaSession API support

Innocenty Enikeew 7 yıl önce
ebeveyn
işleme
0b4a50aefa

+ 1 - 1
front/public/index.html

@@ -19,7 +19,7 @@
       work correctly both with client-side routing and a non-root public URL.
       Learn how to configure a non-root public URL by running `npm run build`.
     -->
-    <title>React App</title>
+    <title>Chad Music</title>
   </head>
   <body>
     <noscript>

+ 2 - 2
front/public/manifest.json

@@ -1,6 +1,6 @@
 {
-  "short_name": "React App",
-  "name": "Create React App Sample",
+  "short_name": "Chad Music",
+  "name": "Chad Music player",
   "icons": [
     {
       "src": "favicon.ico",

+ 23 - 6
front/src/App.js

@@ -1,5 +1,6 @@
 import React, { Component } from 'react';
 import Sound from 'react-sound';
+import MediaSession from './MediaSession.js';
 import logo from './logo.svg';
 import './App.css';
 
@@ -168,7 +169,8 @@ class Player extends Component {
       sound: {url: '', playStatus: Sound.status.STOPPED},
       tracks: null,
       activeTrack: -1,
-      activeAlbum: null
+      activeAlbum: null,
+      metadata: {artist: '', album: '', title: '', cover: ''}
     };
     for (var {type} of this.categories) {
       this.state[type] = Object.assign({}, this.stateLoading);
@@ -231,11 +233,19 @@ class Player extends Component {
         if (!track) {
           console.log('Bad activeTrack', this.state.tracks, this.state.activeTrack);
         } else {
-          this.setState({sound: {
-            url: track.url,
-            position: 0,
-            playStatus: Sound.status.PLAYING
-          }})
+          this.setState({
+            sound: {
+              url: track.url,
+              position: 0,
+              playStatus: Sound.status.PLAYING
+            },
+            metadata: {
+              title: track.title,
+              artist: track.artist,
+              album: track.album,
+              cover: this.state.activeAlbum.cover
+            }
+          })
         }
       }
     }
@@ -344,6 +354,13 @@ class Player extends Component {
           onLoading={this.handleSoundLoading}
           onPlaying={this.handleSoundPlaying}
           onFinishedPlaying={this.handleSoundFinished} />
+        <MediaSession
+          {...this.state.metadata}
+          onPlay={this.handleControlPlayPause}
+          onPause={this.handleControlPlayPause}
+          onPreviousTrack={this.handleControlPrev}
+          onNextTrack={this.handleControlNext}
+        />
       </div>
     );
   }

+ 50 - 0
front/src/MediaSession.js

@@ -0,0 +1,50 @@
+import React from 'react';
+
+export default class MediaSession extends React.Component {
+  updateMetadata() {
+    if (!('mediaSession' in navigator)) {
+      return;
+    }
+    const {title, artist, album, cover} = this.props;
+    navigator.mediaSession.metadata = new window.MediaMetadata({title, artist, album, artwork: [{src:cover}]});
+  }
+  updateEvents() {
+    if (!('mediaSession' in navigator)) {
+      return;
+    }
+    const {mediaSession} = navigator;
+    const {onPlay, onPause, onSeekBackward, onSeekForward, onPreviousTrack, onNextTrack} = this.props;
+
+    mediaSession.setActionHandler('play', onPlay);
+    mediaSession.setActionHandler('pause', onPause);
+    mediaSession.setActionHandler('seekbackward', onSeekBackward);
+    mediaSession.setActionHandler('seekforward', onSeekForward);
+    mediaSession.setActionHandler('previoustrack', onPreviousTrack);
+    mediaSession.setActionHandler('nexttrack', onNextTrack);
+  }
+  componentDidMount() {
+    this.updateMetadata();
+    this.updateEvents();
+  }
+  componentDidUpdate(prevProps) {
+    this.updateMetadata();
+    this.updateEvents();
+  }
+  componentWillUnmount() {
+    if (!('mediaSession' in navigator)) {
+      return;
+    }
+    const {mediaSession} = navigator;
+    mediaSession.metadata = null;
+    mediaSession.setActionHandler('play', null);
+    mediaSession.setActionHandler('pause', null);
+    mediaSession.setActionHandler('seekbackward', null);
+    mediaSession.setActionHandler('seekforward', null);
+    mediaSession.setActionHandler('previoustrack', null);
+    mediaSession.setActionHandler('nexttrack', null);
+  }
+
+  render() {
+    return null;
+  }
+}