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

update event binding

This commit is contained in:
Luke Pulverenti 2015-12-17 10:54:47 -05:00
parent bcfbb01b4b
commit a08715f2f2
10 changed files with 164 additions and 126 deletions

View file

@ -16,12 +16,12 @@
}, },
"devDependencies": {}, "devDependencies": {},
"ignore": [], "ignore": [],
"version": "1.0.13", "version": "1.0.15",
"_release": "1.0.13", "_release": "1.0.15",
"_resolution": { "_resolution": {
"type": "version", "type": "version",
"tag": "1.0.13", "tag": "1.0.15",
"commit": "50abac508289fd4db77f6d52ba1ee351b57baec2" "commit": "2b89c4815135e6acef56ec14d56ad0a1d7551e00"
}, },
"_source": "git://github.com/MediaBrowser/Emby.ApiClient.Javascript.git", "_source": "git://github.com/MediaBrowser/Emby.ApiClient.Javascript.git",
"_target": "~1.0.3", "_target": "~1.0.3",

View file

@ -2,22 +2,20 @@
function getCallbacks(obj, name) { function getCallbacks(obj, name) {
ensureCallbacks(obj, name);
return obj._callbacks[name];
}
function ensureCallbacks(obj, name) {
if (!obj) { if (!obj) {
throw new Error("obj cannot be null!"); throw new Error("obj cannot be null!");
} }
obj._callbacks = obj._callbacks || {}; obj._callbacks = obj._callbacks || {};
if (!obj._callbacks[name]) { var list = obj._callbacks[name];
if (!list) {
obj._callbacks[name] = []; obj._callbacks[name] = [];
list = obj._callbacks[name];
} }
return list;
} }
return { return {
@ -26,17 +24,17 @@
var list = getCallbacks(obj, eventName); var list = getCallbacks(obj, eventName);
if (list.indexOf(fn) == -1) {
list.push(fn); list.push(fn);
}
}, },
off: function (obj, eventName, fn) { off: function (obj, eventName, fn) {
var list = getCallbacks(obj, eventName); var list = getCallbacks(obj, eventName);
obj._callbacks[name] = list.filter(function (i) {
return i != fn; var i = list.indexOf(fn);
}); if (i != -1) {
list.splice(i, 1);
}
}, },
trigger: function (obj, eventName) { trigger: function (obj, eventName) {
@ -53,7 +51,9 @@
eventArgs.push(additionalArgs[i]); eventArgs.push(additionalArgs[i]);
} }
getCallbacks(obj, eventName).forEach(function (c) { var callbacks = getCallbacks(obj, eventName).slice(0);
callbacks.forEach(function (c) {
c.apply(obj, eventArgs); c.apply(obj, eventArgs);
}); });
} }

View file

@ -24,14 +24,14 @@
"web-component-tester": "*" "web-component-tester": "*"
}, },
"private": true, "private": true,
"homepage": "https://github.com/Polymer/polymer", "homepage": "https://github.com/polymer/polymer",
"_release": "1.2.3", "_release": "1.2.3",
"_resolution": { "_resolution": {
"type": "version", "type": "version",
"tag": "v1.2.3", "tag": "v1.2.3",
"commit": "aa535d1675342007cbf64dc9c66497cf74cbc616" "commit": "aa535d1675342007cbf64dc9c66497cf74cbc616"
}, },
"_source": "git://github.com/Polymer/polymer.git", "_source": "git://github.com/polymer/polymer.git",
"_target": "^1.0.0", "_target": "^1.0.0",
"_originalSource": "Polymer/polymer" "_originalSource": "polymer/polymer"
} }

View file

@ -162,7 +162,7 @@
if (options.showConfirmation !== false) { if (options.showConfirmation !== false) {
Dashboard.processServerConfigurationUpdateResult(); Dashboard.processServerConfigurationUpdateResult();
} }
$(self).trigger('submitted'); Events.trigger(self, 'submitted');
}, function () { }, function () {
Dashboard.hideLoadingMsg(); Dashboard.hideLoadingMsg();

View file

@ -483,7 +483,7 @@
} }
}; };
$(castPlayer).on("connect", function (e) { Events.on(castPlayer, "connect", function (e) {
MediaController.setActivePlayer(PlayerName, self.getCurrentTargetInfo()); MediaController.setActivePlayer(PlayerName, self.getCurrentTargetInfo());
@ -492,7 +492,7 @@
self.lastPlayerData = {}; self.lastPlayerData = {};
}); });
$(castPlayer).on("playbackstart", function (e, data) { Events.on(castPlayer, "playbackstart", function (e, data) {
Logger.log('cc: playbackstart'); Logger.log('cc: playbackstart');
@ -502,7 +502,7 @@
Events.trigger(self, "playbackstart", [state]); Events.trigger(self, "playbackstart", [state]);
}); });
$(castPlayer).on("playbackstop", function (e, data) { Events.on(castPlayer, "playbackstop", function (e, data) {
Logger.log('cc: playbackstop'); Logger.log('cc: playbackstop');
var state = self.getPlayerStateInternal(data); var state = self.getPlayerStateInternal(data);
@ -513,7 +513,7 @@
self.lastPlayerData = {}; self.lastPlayerData = {};
}); });
$(castPlayer).on("playbackprogress", function (e, data) { Events.on(castPlayer, "playbackprogress", function (e, data) {
Logger.log('cc: positionchange'); Logger.log('cc: positionchange');
var state = self.getPlayerStateInternal(data); var state = self.getPlayerStateInternal(data);

View file

@ -26,7 +26,7 @@
function onEnded() { function onEnded() {
showStatusBar(); showStatusBar();
$(self).trigger('ended'); Events.trigger(self, 'ended');
} }
function onTimeUpdate() { function onTimeUpdate() {
@ -46,50 +46,58 @@
// } // }
//} //}
$(self).trigger('timeupdate'); Events.trigger(self, 'timeupdate');
} }
function onVolumeChange() { function onVolumeChange() {
$(self).trigger('volumechange'); Events.trigger(self, 'volumechange');
} }
function onOneAudioPlaying() { function onOneAudioPlaying(e) {
var elem = e.target;
elem.removeEventListener('playing', onOneAudioPlaying);
$('.mediaPlayerAudioContainer').hide(); $('.mediaPlayerAudioContainer').hide();
} }
function onPlaying() { function onPlaying() {
$(self).trigger('playing'); Events.trigger(self, 'playing');
} }
function onPlay() { function onPlay() {
$(self).trigger('play'); Events.trigger(self, 'play');
} }
function onPause() { function onPause() {
$(self).trigger('pause'); Events.trigger(self, 'pause');
} }
function onClick() { function onClick() {
$(self).trigger('click'); Events.trigger(self, 'click');
} }
function onDblClick() { function onDblClick() {
$(self).trigger('dblclick'); Events.trigger(self, 'dblclick');
} }
function onError() { function onError(e) {
var errorCode = this.error ? this.error.code : ''; var elem = e.target;
var errorCode = elem.error ? elem.error.code : '';
Logger.log('Media element error code: ' + errorCode); Logger.log('Media element error code: ' + errorCode);
showStatusBar(); showStatusBar();
$(self).trigger('error'); Events.trigger(self, 'error');
} }
function onLoadedMetadata() { function onLoadedMetadata(e) {
var elem = e.target;
elem.removeEventListener('loadedmetadata', onLoadedMetadata);
if (!hlsPlayer) { if (!hlsPlayer) {
this.play(); elem.play();
} }
} }
@ -119,14 +127,17 @@
return 0; return 0;
} }
function onOneVideoPlaying() { function onOneVideoPlaying(e) {
hideStatusBar(); hideStatusBar();
var element = e.target;
element.removeEventListener('playing', onOneVideoPlaying);
var requiresNativeControls = !self.enableCustomVideoControls(); var requiresNativeControls = !self.enableCustomVideoControls();
if (requiresNativeControls) { if (requiresNativeControls) {
$(this).attr('controls', 'controls'); $(element).attr('controls', 'controls');
} }
if (requiresSettingStartTimeOnStart) { if (requiresSettingStartTimeOnStart) {
@ -138,7 +149,6 @@
if (startPositionInSeekParam && src.indexOf('.m3u8') != -1) { if (startPositionInSeekParam && src.indexOf('.m3u8') != -1) {
var delay = browserInfo.safari ? 2500 : 0; var delay = browserInfo.safari ? 2500 : 0;
var element = this;
if (delay) { if (delay) {
setTimeout(function () { setTimeout(function () {
element.currentTime = startPositionInSeekParam; element.currentTime = startPositionInSeekParam;
@ -173,15 +183,18 @@
elem = $('.mediaPlayerAudio'); elem = $('.mediaPlayerAudio');
} }
return $(elem) elem = elem[0];
.on('timeupdate', onTimeUpdate)
.on('ended', onEnded) elem.addEventListener('playing', onOneAudioPlaying);
.on('volumechange', onVolumeChange) elem.addEventListener('timeupdate', onTimeUpdate);
.one('playing', onOneAudioPlaying) elem.addEventListener('ended', onEnded);
.on('play', onPlay) elem.addEventListener('volumechange', onVolumeChange);
.on('pause', onPause) elem.addEventListener('error', onError);
.on('playing', onPlaying) elem.addEventListener('pause', onPause);
.on('error', onError)[0]; elem.addEventListener('play', onPlay);
elem.addEventListener('playing', onPlaying);
return elem;
} }
function enableHlsPlayer(src) { function enableHlsPlayer(src) {
@ -221,18 +234,24 @@
var elem = $('#videoElement', '#videoPlayer').prepend(html); var elem = $('#videoElement', '#videoPlayer').prepend(html);
return $('.itemVideo', elem) var itemVideo = $('.itemVideo', elem)[0];
.one('.loadedmetadata', onLoadedMetadata)
.one('playing', onOneVideoPlaying) itemVideo.addEventListener('loadedmetadata', onLoadedMetadata);
.on('timeupdate', onTimeUpdate) itemVideo.addEventListener('playing', onOneVideoPlaying);
.on('ended', onEnded)
.on('volumechange', onVolumeChange) itemVideo.addEventListener('timeupdate', onTimeUpdate);
.on('play', onPlay) itemVideo.addEventListener('ended', onEnded);
.on('pause', onPause) itemVideo.addEventListener('volumechange', onVolumeChange);
.on('playing', onPlaying)
.on('click', onClick) itemVideo.addEventListener('voluplaymechange', onPlay);
.on('dblclick', onDblClick) itemVideo.addEventListener('pause', onPause);
.on('error', onError)[0]; itemVideo.addEventListener('playing', onPlaying);
itemVideo.addEventListener('click', onClick);
itemVideo.addEventListener('dblclick', onDblClick);
itemVideo.addEventListener('error', onError);
return itemVideo;
} }
// Save this for when playback stops, because querying the time at that point might return 0 // Save this for when playback stops, because querying the time at that point might return 0
@ -384,7 +403,7 @@
setTracks(elem, tracks); setTracks(elem, tracks);
$(elem).one("loadedmetadata", onLoadedMetadata); elem.addEventListener("loadedmetadata", onLoadedMetadata);
playNow = true; playNow = true;
} }

View file

@ -543,6 +543,10 @@
self.playNextAfterEnded = function () { self.playNextAfterEnded = function () {
console.log('playNextAfterEnded');
Events.off(this, 'ended', self.playNextAfterEnded);
self.nextTrack(); self.nextTrack();
}; };
@ -661,16 +665,18 @@
Events.off(mediaRenderer, 'ended', self.onPlaybackStopped); Events.off(mediaRenderer, 'ended', self.onPlaybackStopped);
Events.off(mediaRenderer, 'ended', self.playNextAfterEnded); Events.off(mediaRenderer, 'ended', self.playNextAfterEnded);
$(mediaRenderer).one("play", function () { function onPlayingOnce() {
Events.off(this, "play", onPlayingOnce);
Events.on(this, 'ended', self.onPlaybackStopped); Events.on(this, 'ended', self.onPlaybackStopped);
$(this).one('ended', self.playNextAfterEnded); Events.on(this, 'ended', self.playNextAfterEnded);
self.startProgressInterval(); self.startProgressInterval();
sendProgressUpdate(); sendProgressUpdate();
}
}); Events.on(mediaRenderer, "play", onPlayingOnce);
if (self.currentItem.MediaType == "Video") { if (self.currentItem.MediaType == "Video") {
ApiClient.stopActiveEncodings(playSessionId).then(function () { ApiClient.stopActiveEncodings(playSessionId).then(function () {
@ -1550,15 +1556,17 @@
if (mediaRenderer) { if (mediaRenderer) {
mediaRenderer.stop();
Events.off(mediaRenderer, 'ended', self.playNextAfterEnded); Events.off(mediaRenderer, 'ended', self.playNextAfterEnded);
$(mediaRenderer).one("ended", function () { mediaRenderer.stop();
$(this).off('.mediaplayerevent'); Events.trigger(mediaRenderer, "ended");
//self.onPlaybackStopped.call(mediaRenderer);
this.cleanup(destroyRenderer); // TODO: Unbind video events
unBindAudioEvents(mediaRenderer);
mediaRenderer.cleanup(destroyRenderer);
self.currentMediaRenderer = null; self.currentMediaRenderer = null;
self.currentItem = null; self.currentItem = null;
@ -1566,10 +1574,6 @@
self.currentSubtitleStreamIndex = null; self.currentSubtitleStreamIndex = null;
self.streamInfo = {}; self.streamInfo = {};
});
Events.trigger(mediaRenderer, "ended");
} else { } else {
self.currentMediaRenderer = null; self.currentMediaRenderer = null;
self.currentItem = null; self.currentItem = null;
@ -1583,6 +1587,14 @@
} }
}; };
function unBindAudioEvents(mediaRenderer) {
Events.off(mediaRenderer, "volumechange", onVolumeChange);
Events.off(mediaRenderer, "pause", onPause);
Events.off(mediaRenderer, "playing", onPlaying);
Events.off(mediaRenderer, "timeupdate", onTimeUpdate);
}
self.isPlaying = function () { self.isPlaying = function () {
return self.playlist.length > 0; return self.playlist.length > 0;
}; };
@ -1767,8 +1779,8 @@
var mediaRenderer = this; var mediaRenderer = this;
Events.off(mediaRenderer, '.mediaplayerevent'); // TODO: Unbind other events
unBindAudioEvents(mediaRenderer);
Events.off(mediaRenderer, 'ended', self.onPlaybackStopped); Events.off(mediaRenderer, 'ended', self.onPlaybackStopped);
var item = self.currentItem; var item = self.currentItem;
@ -1790,6 +1802,8 @@
self.onPlaystateChange = function (mediaRenderer) { self.onPlaystateChange = function (mediaRenderer) {
console.log('mediaplayer onPlaystateChange');
var state = self.getPlayerStateInternal(mediaRenderer, self.currentItem, self.currentMediaSource); var state = self.getPlayerStateInternal(mediaRenderer, self.currentItem, self.currentMediaSource);
Events.trigger(self, 'playstatechange', [state]); Events.trigger(self, 'playstatechange', [state]);
@ -1939,44 +1953,24 @@
poster: self.getPosterUrl(item) poster: self.getPosterUrl(item)
}); });
Events.on(mediaRenderer, "volumechange.mediaplayerevent", function () { function onPlayingOnce() {
Logger.log('audio element event: volumechange'); Events.off(mediaRenderer, "playing", onPlayingOnce);
self.onVolumeChanged(this);
});
$(mediaRenderer).one("playing.mediaplayerevent", function () {
Logger.log('audio element event: playing'); Logger.log('audio element event: playing');
// For some reason this is firing at the start, so don't bind until playback has begun // For some reason this is firing at the start, so don't bind until playback has begun
Events.on(this, 'ended', self.onPlaybackStopped); Events.on(mediaRenderer, 'ended', self.onPlaybackStopped);
Events.on(mediaRenderer, 'ended', self.playNextAfterEnded);
$(this).one('ended', self.playNextAfterEnded); self.onPlaybackStart(mediaRenderer, item, mediaSource);
}
self.onPlaybackStart(this, item, mediaSource); Events.on(mediaRenderer, "volumechange", onVolumeChange);
Events.on(mediaRenderer, "playing", onPlayingOnce);
}).on("pause.mediaplayerevent", function () { Events.on(mediaRenderer, "pause", onPause);
Events.on(mediaRenderer, "playing", onPlaying);
Logger.log('audio element event: pause'); Events.on(mediaRenderer, "timeupdate", onTimeUpdate);
self.onPlaystateChange(this);
// In the event timeupdate isn't firing, at least we can update when this happens
self.setCurrentTime(self.getCurrentTicks());
}).on("playing.mediaplayerevent", function () {
Logger.log('audio element event: playing');
self.onPlaystateChange(this);
// In the event timeupdate isn't firing, at least we can update when this happens
self.setCurrentTime(self.getCurrentTicks());
}).on("timeupdate.mediaplayerevent", onTimeUpdate);
self.currentMediaRenderer = mediaRenderer; self.currentMediaRenderer = mediaRenderer;
self.currentDurationTicks = self.currentMediaSource.RunTimeTicks; self.currentDurationTicks = self.currentMediaSource.RunTimeTicks;
@ -1994,6 +1988,34 @@
}); });
} }
function onVolumeChange() {
Logger.log('audio element event: pause');
self.onPlaystateChange(this);
// In the event timeupdate isn't firing, at least we can update when this happens
self.setCurrentTime(self.getCurrentTicks());
}
function onPause() {
Logger.log('audio element event: pause');
self.onPlaystateChange(this);
// In the event timeupdate isn't firing, at least we can update when this happens
self.setCurrentTime(self.getCurrentTicks());
}
function onPlaying() {
Logger.log('audio element event: playing');
self.onPlaystateChange(this);
// In the event timeupdate isn't firing, at least we can update when this happens
self.setCurrentTime(self.getCurrentTicks());
}
var getItemFields = "MediaSources,Chapters"; var getItemFields = "MediaSources,Chapters";
self.tryPair = function (target) { self.tryPair = function (target) {

View file

@ -591,8 +591,8 @@
Events.off(currentPlayer, 'playbackstart', onPlaybackStart); Events.off(currentPlayer, 'playbackstart', onPlaybackStart);
Events.off(currentPlayer, 'playbackstop', onPlaybackStopped); Events.off(currentPlayer, 'playbackstop', onPlaybackStopped);
Events.off(currentPlayer, 'volumechange', onStateChanged); Events.off(currentPlayer, 'volumechange', onVolumeChanged);
Events.off(currentPlayer, 'playstatechange', onVolumeChanged); Events.off(currentPlayer, 'playstatechange', onStateChanged);
Events.off(currentPlayer, 'positionchange', onStateChanged); Events.off(currentPlayer, 'positionchange', onStateChanged);
currentPlayer.endPlayerUpdates(); currentPlayer.endPlayerUpdates();
@ -635,8 +635,8 @@
Events.on(player, 'playbackstart', onPlaybackStart); Events.on(player, 'playbackstart', onPlaybackStart);
Events.on(player, 'playbackstop', onPlaybackStopped); Events.on(player, 'playbackstop', onPlaybackStopped);
Events.on(player, 'volumechange', onStateChanged); Events.on(player, 'volumechange', onVolumeChanged);
Events.on(player, 'playstatechange', onVolumeChanged); Events.on(player, 'playstatechange', onStateChanged);
Events.on(player, 'positionchange', onStateChanged); Events.on(player, 'positionchange', onStateChanged);
} }

View file

@ -2047,10 +2047,6 @@ var AppInfo = {};
deps.push('connectionmanagerfactory'); deps.push('connectionmanagerfactory');
deps.push('credentialprovider'); deps.push('credentialprovider');
if (AppInfo.isNativeApp && browserInfo.android) {
require(['cordova/android/logging']);
}
deps.push('appstorage'); deps.push('appstorage');
deps.push('scripts/mediaplayer'); deps.push('scripts/mediaplayer');
deps.push('scripts/appsettings'); deps.push('scripts/appsettings');

View file

@ -947,5 +947,6 @@
"FreeAppsFeatureDescription": "Enjoy free access to select Emby apps for your devices.", "FreeAppsFeatureDescription": "Enjoy free access to select Emby apps for your devices.",
"HeaderCinemaMode": "Cinema Mode", "HeaderCinemaMode": "Cinema Mode",
"CinemaModeFeatureDescription": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the feature.", "CinemaModeFeatureDescription": "Cinema Mode gives you the true cinema experience with trailers and custom intros before the feature.",
"CoverArt": "Cover Art" "CoverArt": "Cover Art",
"ButtonOff": "Off"
} }