From f938f281f1f2937ad0d6768173c092970cd14248 Mon Sep 17 00:00:00 2001 From: j <0x006A@0x2620.org> Date: Tue, 9 Jul 2013 22:48:22 +0000 Subject: [PATCH] rewrite Ox.VideoElement --- source/Ox.UI/js/Video/VideoElement.js | 503 +++++++++++--------------- source/Ox.UI/js/Video/VideoPlayer.js | 20 +- 2 files changed, 227 insertions(+), 296 deletions(-) diff --git a/source/Ox.UI/js/Video/VideoElement.js b/source/Ox.UI/js/Video/VideoElement.js index e18ef301..e33217b7 100644 --- a/source/Ox.UI/js/Video/VideoElement.js +++ b/source/Ox.UI/js/Video/VideoElement.js @@ -3,10 +3,13 @@ /*@ Ox.VideoElement VideoElement Object options Options object + autoplay autoplay + items array of objects with src,in,out,duration,offset + look loop playback self Shared private variable ([options[, self]]) -> VideoElement Object loadedmetadata loadedmetadata - pointschange pointschange + itemchange itemchange seeked seeked seeking seeking sizechange sizechange @@ -19,50 +22,58 @@ Ox.VideoElement = function(options, self) { var that = Ox.Element({}, self) .defaults({ autoplay: false, - preload: 'none', - src: [] + loop: false, + items: [] }) .options(options || {}) + .update({ + items: function() { + self.loadedMetadata = false; + loadItems(function() { + if (self.items.length != self.numberOfItems) { + self.numberOfItems = self.items.lenth; + if (self.currentItem > self.numberOfItems) { + self.currentItem = 0; + } + } + var item = self.items[self.currentItem]; + if (self.$video.attr('src') != item.src) { + setCurrentVideo(); + } + }); + } + }) .css({width: '100%', height: '100%'}); Ox.Log('Video', 'VIDEO ELEMENT OPTIONS', self.options); - self.currentPart = 0; - self.items = []; + self.currentItem = 0; + self.currentTime = 0; + self.currentVideo = 0; self.loadedMetadata = false; self.paused = true; - self.$video = $('
'); + self.seeking = false; + self.$videos = [getVideo(), getVideo()]; + self.$video = self.$videos[self.currentVideo]; + self.video = self.$video[0]; + self.$brightness = $('
').css({ + width: '100%', + height: '100%', + background: 'rgb(0, 0, 0)', + opacity: 0 + }) + .appendTo(that); - if (Ox.isFunction(self.options.src)) { - self.isPlaylist = true; - self.currentItem = 0; - self.currentPage = 0; - self.loadedMetadata = false; - self.pageLength = 2; - self.options.src(function(items) { - self.numberOfItems = items; - self.numberOfPages = Math.ceil(self.numberOfItems / self.pageLength); - loadPages(function() { - Ox.Log('Video', 'VIDEO PAGES LOADED'); - setCurrentItem(0); - if (!self.loadedMedatata) { - self.loadedMetadata = true; - that.triggerEvent('loadedmetadata'); - that.triggerEvent('pointschange'); // fixme: needs to be triggered again, loadedmetadata messes with duration - } - }); - }); - } else { - self.numberOfItems = 1; - self.items.push(loadItem(self.options.src)); - } - - function getCurrentPage() { - return Math.floor(self.currentItem / self.pageLength); - } + loadItems(function() { + setCurrentItem(0); + self.options.autoplay && play(); + }); function getCurrentTime() { - return self.items[self.currentItem].offsets[self.currentPart] + self.video.currentTime; + var item = self.items[self.currentItem]; + return self.seeking + ? self.currentTime + : item.offset + self.video.currentTime - item['in']; } function getset(key, value) { @@ -76,232 +87,216 @@ Ox.VideoElement = function(options, self) { return ret; } - function loadItem(src, points, callback) { - src = Ox.isArray(src) ? src : [src]; - var item = { - currentPart: 0, - duration: 0, - durations: src.map(function() { - return 0; - }), - offsets: [], - parts: src.length - }; - if (points) { - item.points = points; - } - item.$videos = src.map(function(src, i) { - //fixme: get rid of this to make use of browser caching - // but in all browsers except firefox, - // loadedmetadata fires only once per src - if (src.length > 0 && Ox.startsWith(Ox.parseURL(src).protocol, 'http')) { - src += '?' + Ox.uid(); - } - return $('