1
0
Fork 0
mirror of https://github.com/jellyfin/jellyfin-web synced 2025-03-30 19:56:21 +00:00

refactor mediaSession to support NativeShell API

This commit is contained in:
vitorsemeano 2019-03-17 00:31:56 +00:00
parent 7fc4165b53
commit e4c7282b92

View file

@ -1,6 +1,11 @@
define(['playbackManager', 'nowPlayingHelper', 'events', 'connectionManager'], function (playbackManager, nowPlayingHelper, events, connectionManager) { define(['playbackManager', 'nowPlayingHelper', 'events', 'connectionManager'], function (playbackManager, nowPlayingHelper, events, connectionManager) {
"use strict"; "use strict";
// no support for mediaSession
if (!navigator.mediaSession && !window.NativeShell) {
return;
}
// Reports media playback to the device for lock screen control // Reports media playback to the device for lock screen control
var currentPlayer; var currentPlayer;
@ -64,15 +69,16 @@ define(['playbackManager', 'nowPlayingHelper', 'events', 'connectionManager'], f
return null; return null;
} }
function pushImageUrl(item, height, list) { function pushImageUrl(item, imageOptions, list) {
var imageOptions = {
height: height
};
var url = seriesImageUrl(item, imageOptions) || imageUrl(item, imageOptions); var url = seriesImageUrl(item, imageOptions) || imageUrl(item, imageOptions);
if (url) { if (url) {
list.push({ src: url, sizes: height + 'x' + height }); var height = imageOptions.height || imageOptions.maxHeight;
list.push({
src: url,
sizes: height + 'x' + height
});
} }
} }
@ -80,12 +86,12 @@ define(['playbackManager', 'nowPlayingHelper', 'events', 'connectionManager'], f
var list = []; var list = [];
pushImageUrl(item, 96, list); pushImageUrl(item, {height: 96}, list);
pushImageUrl(item, 128, list); pushImageUrl(item, {height: 128}, list);
pushImageUrl(item, 192, list); pushImageUrl(item, {height: 192}, list);
pushImageUrl(item, 256, list); pushImageUrl(item, {height: 256}, list);
pushImageUrl(item, 384, list); pushImageUrl(item, {height: 384}, list);
pushImageUrl(item, 512, list); pushImageUrl(item, {height: 512}, list);
return list; return list;
} }
@ -99,6 +105,19 @@ define(['playbackManager', 'nowPlayingHelper', 'events', 'connectionManager'], f
return; return;
} }
// dummy this up
if (eventName == 'init') {
eventName = 'timeupdate';
}
var isVideo = item.MediaType === 'Video';
var isLocalPlayer = player.isLocalPlayer || false;
// Local players do their own notifications
if (isLocalPlayer && isVideo) {
return;
}
var playState = state.PlayState || {}; var playState = state.PlayState || {};
var parts = nowPlayingHelper.getNowPlayingNames(item); var parts = nowPlayingHelper.getNowPlayingNames(item);
@ -106,8 +125,6 @@ define(['playbackManager', 'nowPlayingHelper', 'events', 'connectionManager'], f
var artist = parts.length === 1 ? '' : parts[0].text; var artist = parts.length === 1 ? '' : parts[0].text;
var title = parts[parts.length - 1].text; var title = parts[parts.length - 1].text;
var isVideo = item.MediaType === 'Video';
// Switch these two around for video // Switch these two around for video
if (isVideo && parts.length > 1) { if (isVideo && parts.length > 1) {
var temp = artist; var temp = artist;
@ -131,6 +148,18 @@ define(['playbackManager', 'nowPlayingHelper', 'events', 'connectionManager'], f
var isPaused = playState.IsPaused || false; var isPaused = playState.IsPaused || false;
var canSeek = playState.CanSeek || false; var canSeek = playState.CanSeek || false;
var now = new Date().getTime();
// Don't go crazy reporting position changes
if (eventName == 'timeupdate' && (now - lastUpdateTime) < 5000) {
// Only report if this item hasn't been reported yet, or if there's an actual playback change.
// Don't report on simple time updates
return;
}
lastUpdateTime = now;
if (navigator.mediaSession){
navigator.mediaSession.metadata = new MediaMetadata({ navigator.mediaSession.metadata = new MediaMetadata({
title: title, title: title,
artist: artist, artist: artist,
@ -143,6 +172,30 @@ define(['playbackManager', 'nowPlayingHelper', 'events', 'connectionManager'], f
itemId: itemId, itemId: itemId,
mediaType: item.MediaType mediaType: item.MediaType
}); });
} else {
var imageUrl = [];
pushImageUrl(item, {maxHeight: 400}, imageUrl);
if (imageUrl.length) {
imageUrl = imageUrl[0].src;
} else {
imageUrl = null;
}
window.NativeShell.updateMediaSession({
action: eventName,
isLocalPlayer: isLocalPlayer,
itemId: itemId,
title: title,
artist: artist,
album: album,
duration: duration,
position: currentTime,
imageUrl: imageUrl,
canSeek: canSeek,
isPaused: isPaused
});
}
} }
function onGeneralEvent(e) { function onGeneralEvent(e) {
@ -191,7 +244,13 @@ define(['playbackManager', 'nowPlayingHelper', 'events', 'connectionManager'], f
} }
function hideMediaControls() { function hideMediaControls() {
lastUpdateTime = 0;
if (navigator.mediaSession) {
navigator.mediaSession.metadata = null; navigator.mediaSession.metadata = null;
} else {
window.NativeShell.hideMediaSession();
}
} }
function bindToPlayer(player) { function bindToPlayer(player) {
@ -215,6 +274,8 @@ define(['playbackManager', 'nowPlayingHelper', 'events', 'connectionManager'], f
events.on(currentPlayer, 'timeupdate', onGeneralEvent); events.on(currentPlayer, 'timeupdate', onGeneralEvent);
} }
if (navigator.mediaSession) {
function execute(name) { function execute(name) {
playbackManager[name](currentPlayer); playbackManager[name](currentPlayer);
} }
@ -242,6 +303,7 @@ define(['playbackManager', 'nowPlayingHelper', 'events', 'connectionManager'], f
navigator.mediaSession.setActionHandler('seekforward', function () { navigator.mediaSession.setActionHandler('seekforward', function () {
execute('fastForward'); execute('fastForward');
}); });
}
events.on(playbackManager, 'playerchange', function () { events.on(playbackManager, 'playerchange', function () {