mirror of
https://github.com/jellyfin/jellyfin-web
synced 2025-03-30 19:56:21 +00:00
fixes #898 - Google Cast Ready
This commit is contained in:
parent
9af2992260
commit
2a800129cb
4 changed files with 106 additions and 18 deletions
51
dashboard-ui/components/remotecontrolautoplay.js
Normal file
51
dashboard-ui/components/remotecontrolautoplay.js
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
(function () {
|
||||||
|
|
||||||
|
function transferPlayback(oldPlayer) {
|
||||||
|
|
||||||
|
oldPlayer.getPlayerState().then(function (state) {
|
||||||
|
|
||||||
|
var item = state.NowPlayingItem;
|
||||||
|
|
||||||
|
if (!item) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var playState = state.PlayState || {};
|
||||||
|
|
||||||
|
oldPlayer.stop();
|
||||||
|
|
||||||
|
var itemId = item.Id;
|
||||||
|
var resumePositionTicks = playState.PositionTicks || 0;
|
||||||
|
|
||||||
|
MediaController.play({
|
||||||
|
ids: [itemId],
|
||||||
|
startPositionTicks: resumePositionTicks
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
Events.on(MediaController, 'playerchange', function (e, newPlayer, newTarget, oldPlayer) {
|
||||||
|
|
||||||
|
if (!oldPlayer) {
|
||||||
|
console.log('Skipping remote control autoplay because oldPlayer is null');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!oldPlayer.isLocalPlayer) {
|
||||||
|
console.log('Skipping remote control autoplay because oldPlayer is not a local player');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (newPlayer.isLocalPlayer) {
|
||||||
|
console.log('Skipping remote control autoplay because newPlayer is a local player');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If playback is playing locally and a new player is activated, transfer the media to that player
|
||||||
|
if (oldPlayer.isPlaying()) {
|
||||||
|
transferPlayback(oldPlayer);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
})();
|
|
@ -1,6 +1,31 @@
|
||||||
(function (window, chrome, console) {
|
(function (window, chrome, console) {
|
||||||
|
|
||||||
// Based on https://github.com/googlecast/CastVideos-chrome/blob/master/CastVideos.js
|
// Based on https://github.com/googlecast/CastVideos-chrome/blob/master/CastVideos.js
|
||||||
|
var currentResolve;
|
||||||
|
var currentReject;
|
||||||
|
|
||||||
|
var PlayerName = 'Chromecast';
|
||||||
|
|
||||||
|
function sendConnectionResult(isOk) {
|
||||||
|
|
||||||
|
var resolve = currentResolve;
|
||||||
|
var reject = currentReject;
|
||||||
|
|
||||||
|
currentResolve = null;
|
||||||
|
currentReject = null;
|
||||||
|
|
||||||
|
if (isOk) {
|
||||||
|
if (resolve) {
|
||||||
|
resolve();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (reject) {
|
||||||
|
reject();
|
||||||
|
} else {
|
||||||
|
MediaController.removeActivePlayer(PlayerName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constants of states for Chromecast device
|
* Constants of states for Chromecast device
|
||||||
|
@ -26,8 +51,6 @@
|
||||||
'ERROR': 'ERROR'
|
'ERROR': 'ERROR'
|
||||||
};
|
};
|
||||||
|
|
||||||
var PlayerName = 'Chromecast';
|
|
||||||
|
|
||||||
var applicationID = "2D4B1DA3";
|
var applicationID = "2D4B1DA3";
|
||||||
var messageNamespace = 'urn:x-cast:com.connectsdk';
|
var messageNamespace = 'urn:x-cast:com.connectsdk';
|
||||||
|
|
||||||
|
@ -191,7 +214,7 @@
|
||||||
console.log('sessionUpdateListener: setting currentMediaSession to null');
|
console.log('sessionUpdateListener: setting currentMediaSession to null');
|
||||||
this.currentMediaSession = null;
|
this.currentMediaSession = null;
|
||||||
|
|
||||||
MediaController.removeActivePlayer(PlayerName);
|
sendConnectionResult(false);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -257,7 +280,7 @@
|
||||||
|
|
||||||
//});
|
//});
|
||||||
|
|
||||||
MediaController.removeActivePlayer(PlayerName);
|
sendConnectionResult(false);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -485,7 +508,11 @@
|
||||||
|
|
||||||
Events.on(castPlayer, "connect", function (e) {
|
Events.on(castPlayer, "connect", function (e) {
|
||||||
|
|
||||||
|
if (currentResolve) {
|
||||||
|
sendConnectionResult(true);
|
||||||
|
} else {
|
||||||
MediaController.setActivePlayer(PlayerName, self.getCurrentTargetInfo());
|
MediaController.setActivePlayer(PlayerName, self.getCurrentTargetInfo());
|
||||||
|
}
|
||||||
|
|
||||||
console.log('cc: connect');
|
console.log('cc: connect');
|
||||||
// Reset this so the next query doesn't make it appear like content is playing.
|
// Reset this so the next query doesn't make it appear like content is playing.
|
||||||
|
@ -832,7 +859,19 @@
|
||||||
self.tryPair = function (target) {
|
self.tryPair = function (target) {
|
||||||
|
|
||||||
return new Promise(function (resolve, reject) {
|
return new Promise(function (resolve, reject) {
|
||||||
resolve();
|
if (castPlayer.deviceState != DEVICE_STATE.ACTIVE && castPlayer.isInitialized) {
|
||||||
|
|
||||||
|
currentResolve = resolve;
|
||||||
|
currentReject = reject;
|
||||||
|
|
||||||
|
castPlayer.launchApp();
|
||||||
|
} else {
|
||||||
|
|
||||||
|
currentResolve = null;
|
||||||
|
currentReject = null;
|
||||||
|
|
||||||
|
reject();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -842,14 +881,6 @@
|
||||||
castPlayer = new CastPlayer();
|
castPlayer = new CastPlayer();
|
||||||
|
|
||||||
MediaController.registerPlayer(new chromecastPlayer());
|
MediaController.registerPlayer(new chromecastPlayer());
|
||||||
|
|
||||||
Events.on(MediaController, 'playerchange', function (e, newPlayer, newTarget) {
|
|
||||||
if (newPlayer.name == PlayerName) {
|
|
||||||
if (castPlayer.deviceState != DEVICE_STATE.ACTIVE && castPlayer.isInitialized) {
|
|
||||||
castPlayer.launchApp();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
requirejs(["https://www.gstatic.com/cv/js/sender/v1/cast_sender.js"], initializeChromecast);
|
requirejs(["https://www.gstatic.com/cv/js/sender/v1/cast_sender.js"], initializeChromecast);
|
||||||
|
|
|
@ -286,9 +286,9 @@
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
function triggerPlayerChange(newPlayer, newTarget) {
|
function triggerPlayerChange(newPlayer, newTarget, previousPlayer) {
|
||||||
|
|
||||||
Events.trigger(self, 'playerchange', [newPlayer, newTarget]);
|
Events.trigger(self, 'playerchange', [newPlayer, newTarget, previousPlayer]);
|
||||||
}
|
}
|
||||||
|
|
||||||
self.setActivePlayer = function (player, targetInfo) {
|
self.setActivePlayer = function (player, targetInfo) {
|
||||||
|
@ -303,13 +303,15 @@
|
||||||
throw new Error('null player');
|
throw new Error('null player');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var previousPlayer = currentPlayer;
|
||||||
|
|
||||||
currentPairingId = null;
|
currentPairingId = null;
|
||||||
currentPlayer = player;
|
currentPlayer = player;
|
||||||
currentTargetInfo = targetInfo;
|
currentTargetInfo = targetInfo;
|
||||||
|
|
||||||
console.log('Active player: ' + JSON.stringify(currentTargetInfo));
|
console.log('Active player: ' + JSON.stringify(currentTargetInfo));
|
||||||
|
|
||||||
triggerPlayerChange(player, targetInfo);
|
triggerPlayerChange(player, targetInfo, previousPlayer);
|
||||||
};
|
};
|
||||||
|
|
||||||
var currentPairingId = null;
|
var currentPairingId = null;
|
||||||
|
@ -333,12 +335,14 @@
|
||||||
|
|
||||||
player.tryPair(targetInfo).then(function () {
|
player.tryPair(targetInfo).then(function () {
|
||||||
|
|
||||||
|
var previousPlayer = currentPlayer;
|
||||||
|
|
||||||
currentPlayer = player;
|
currentPlayer = player;
|
||||||
currentTargetInfo = targetInfo;
|
currentTargetInfo = targetInfo;
|
||||||
|
|
||||||
console.log('Active player: ' + JSON.stringify(currentTargetInfo));
|
console.log('Active player: ' + JSON.stringify(currentTargetInfo));
|
||||||
|
|
||||||
triggerPlayerChange(player, targetInfo);
|
triggerPlayerChange(player, targetInfo, previousPlayer);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -2267,6 +2267,8 @@ var AppInfo = {};
|
||||||
postInitDependencies.push('cordova/ios/tabbar');
|
postInitDependencies.push('cordova/ios/tabbar');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
postInitDependencies.push('components/remotecontrolautoplay');
|
||||||
|
|
||||||
require(postInitDependencies);
|
require(postInitDependencies);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue