From 0625cb0444cdf51de5a2a8c26b7abfcfc8de7b31 Mon Sep 17 00:00:00 2001 From: hensm Date: Fri, 21 Dec 2018 23:58:42 +0000 Subject: [PATCH] Add new media options --- ext/src/_locales/en/messages.json | 6 + ext/src/mediaCast.js | 196 ++++++++++++++++++------------ ext/src/options/defaultOptions.js | 2 + ext/src/options/index.jsx | 20 +++ 4 files changed, 143 insertions(+), 81 deletions(-) diff --git a/ext/src/_locales/en/messages.json b/ext/src/_locales/en/messages.json index e25dadf..3a97187 100755 --- a/ext/src/_locales/en/messages.json +++ b/ext/src/_locales/en/messages.json @@ -76,6 +76,12 @@ , "optionsMediaEnabled": { "message": "Media casting enabled" } + , "optionsMediaSyncElement": { + "message": "Sync receiver state with media element" + } + , "optionsMediaStopOnUnload": { + "message": "Stop receiver playback on page unload" + } , "optionsLocalMediaCategoryName": { "message": "Local media casting" diff --git a/ext/src/mediaCast.js b/ext/src/mediaCast.js index 675298b..37dfd53 100644 --- a/ext/src/mediaCast.js +++ b/ext/src/mediaCast.js @@ -9,6 +9,8 @@ let logMessage; let session; let currentMedia; +let ignoreMediaEvents = false; + const isLocalFile = srcUrl.startsWith("file:"); @@ -18,6 +20,13 @@ window.addEventListener("beforeunload", () => { browser.runtime.sendMessage({ subject: "bridge:stopHttpServer" }); + + if (options.mediaStopOnUnload) { + session.stop(); + /*currentMedia.stop(null + , onMediaStopSuccess + , onMediaStopError);*/ + } }); function getLocalAddress () { @@ -38,51 +47,6 @@ function getLocalAddress () { } -mediaElement.addEventListener("play", () => { - currentMedia.play(null - , onMediaPlaySuccess - , onMediaPlayError); -}); - -mediaElement.addEventListener("pause", () => { - currentMedia.pause(null - , onMediaPauseSuccess - , onMediaPauseError); -}); - -mediaElement.addEventListener("suspend", () => { - /*currentMedia.stop(null - , onMediaStopSuccess - , onMediaStopError);*/ -}); - -mediaElement.addEventListener("seeking", () => { - const seekRequest = new chrome.cast.media.SeekRequest(); - seekRequest.currentTime = mediaElement.currentTime; - - currentMedia.seek(seekRequest - , onMediaSeekSuccess - , onMediaSeekError); -}); - -mediaElement.addEventListener("ratechange", () => { - currentMedia._sendMediaMessage({ - type: "SET_PLAYBACK_RATE" - , playbackRate: mediaElement.playbackRate - }); -}); - -mediaElement.addEventListener("volumechange", () => { - const newVolume = new chrome.cast.Volume( - currentMedia.volume - , currentMedia.muted); - const volumeRequest = new chrome.cast.media.VolumeRequest(newVolume); - - logMessage("Volume change"); - currentMedia.setVolume(volumeRequest); -}); - - async function onRequestSessionSuccess (session_) { logMessage("onRequestSessionSuccess"); @@ -219,49 +183,119 @@ function onLoadMediaSuccess (media) { logMessage("onLoadMediaSuccess"); currentMedia = media; - currentMedia.addUpdateListener(() => { - console.log(currentMedia); - // PlayerState - const localPlayerState = mediaElement.paused - ? chrome.cast.media.PlayerState.PAUSED - : chrome.cast.media.PlayerState.PLAYING; - - if (localPlayerState !== currentMedia.playerState) { - switch (currentMedia.playerState) { - case chrome.cast.media.PlayerState.PLAYING: - mediaElement.play(); - break; - - case chrome.cast.media.PlayerState.PAUSED: - mediaElement.pause(); - break; + if (options.mediaSyncElement) { + mediaElement.addEventListener("play", () => { + if (ignoreMediaEvents) { + ignoreMediaEvents = false; + return; } - } - // RepeatMode - const localRepeatMode = mediaElement.loop - ? chrome.cast.media.RepeatMode.SINGLE - : chrome.cast.media.RepeatMode.OFF; + currentMedia.play(null + , onMediaPlaySuccess + , onMediaPlayError); + }); - if (localRepeatMode !== currentMedia.repeatMode) { - switch (currentMedia.repeatMode) { - case chrome.cast.media.RepeatMode.SINGLE: - mediaElement.loop = true; - break; - - case chrome.cast.media.RepeatMode.OFF: - mediaElement.loop = false; - break; + mediaElement.addEventListener("pause", () => { + if (ignoreMediaEvents) { + ignoreMediaEvents = false; + return; } - } + + currentMedia.pause(null + , onMediaPauseSuccess + , onMediaPauseError); + }); + + mediaElement.addEventListener("suspend", () => { + /*currentMedia.stop(null + , onMediaStopSuccess + , onMediaStopError);*/ + }); + + mediaElement.addEventListener("seeking", () => { + if (ignoreMediaEvents) { + ignoreMediaEvents = false; + return; + } + + const seekRequest = new chrome.cast.media.SeekRequest(); + seekRequest.currentTime = mediaElement.currentTime; + + currentMedia.seek(seekRequest + , onMediaSeekSuccess + , onMediaSeekError); + }); + + mediaElement.addEventListener("ratechange", () => { + currentMedia._sendMediaMessage({ + type: "SET_PLAYBACK_RATE" + , playbackRate: mediaElement.playbackRate + }); + }); + + mediaElement.addEventListener("volumechange", () => { + const newVolume = new chrome.cast.Volume( + currentMedia.volume + , currentMedia.muted); + + const volumeRequest = + new chrome.cast.media.VolumeRequest(newVolume); + + logMessage("Volume change"); + currentMedia.setVolume(volumeRequest); + }); - // currentTime - if (currentMedia.currentTime !== mediaElement.currentTime) { - mediaElement.currentTime = currentMedia.currentTime; - } - }); + currentMedia.addUpdateListener(isAlive => { + if (!isAlive) { + return; + } + + // PlayerState + const localPlayerState = mediaElement.paused + ? chrome.cast.media.PlayerState.PAUSED + : chrome.cast.media.PlayerState.PLAYING; + + if (localPlayerState !== currentMedia.playerState) { + ignoreMediaEvents = true; + switch (currentMedia.playerState) { + case chrome.cast.media.PlayerState.PLAYING: + mediaElement.play(); + break; + + case chrome.cast.media.PlayerState.PAUSED: + mediaElement.pause(); + break; + } + } + + // RepeatMode + const localRepeatMode = mediaElement.loop + ? chrome.cast.media.RepeatMode.SINGLE + : chrome.cast.media.RepeatMode.OFF; + + if (localRepeatMode !== currentMedia.repeatMode) { + ignoreMediaEvents = true; + switch (currentMedia.repeatMode) { + case chrome.cast.media.RepeatMode.SINGLE: + mediaElement.loop = true; + break; + + case chrome.cast.media.RepeatMode.OFF: + mediaElement.loop = false; + break; + } + } + + + // currentTime + if (currentMedia.currentTime !== mediaElement.currentTime) { + ignoreMediaEvents = true; + mediaElement.currentTime = currentMedia.currentTime; + } + }); + } } function onLoadMediaError () { logMessage("onLoadMediaError"); diff --git a/ext/src/options/defaultOptions.js b/ext/src/options/defaultOptions.js index 8d1214e..dac682d 100644 --- a/ext/src/options/defaultOptions.js +++ b/ext/src/options/defaultOptions.js @@ -1,5 +1,7 @@ export default { mediaEnabled: true + , mediaSyncElement: false + , mediaStopOnUnload: false , localMediaEnabled: true , localMediaServerPort: 9555 , mirroringEnabled: false diff --git a/ext/src/options/index.jsx b/ext/src/options/index.jsx index 8d2bdd9..eafb571 100644 --- a/ext/src/options/index.jsx +++ b/ext/src/options/index.jsx @@ -192,6 +192,26 @@ class App extends Component { + + + +