From 1c57e6c1c034a0ebab7c123b590ee17c50cd5220 Mon Sep 17 00:00:00 2001 From: Sanj Date: Sat, 12 May 2012 12:37:03 +0530 Subject: [PATCH] ups, forgot to add jquery.pandoravideo.js --- jquery.pandoravideo.js | 362 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 362 insertions(+) create mode 100644 jquery.pandoravideo.js diff --git a/jquery.pandoravideo.js b/jquery.pandoravideo.js new file mode 100644 index 0000000..637746b --- /dev/null +++ b/jquery.pandoravideo.js @@ -0,0 +1,362 @@ +'use strict'; + +(function($) { + $.fn.pandoravideo = function(options) { + + //get options, giving preference, in order, to data- attributes defined on the html element, options passed when instantiatiing $(element).pandoravideo(options), defaults. + var options = options || {}, + namespace = options.namespace || "pandora", + $this = this; + + + var optionTypes = { + 'strings': ['api', 'base', 'resolution', 'action', 'id'], + 'integers': ['in', 'out', 'width', 'interval'], + 'arrays': ['layers', 'keys'], + 'booleans': [] + //'functions': ['callback'] FIXME: lets not. + }; + + var dataOptions = $.extend(options, $this.getDataOptions(optionTypes, namespace)); + + var opts = $.extend({ + 'id': 'ABC', //FIXME: throw an error if id is undefined at this point + 'layers': ['transcripts', 'descriptions', 'keywords', 'places'], + 'keys': ['layers'], //data keys to fetch from API call. FIXME: add more apt keys + 'api': "//pad.ma/api/", //pandora instance api end-point - see http://pad.ma/api + 'in': 0, //in point (float, in seconds) of clip + 'out': 0, //out point of clip + 'pandora_base': '//pad.ma/', //pandora instance from where to fetch video and image data + 'resolution': '480p', //resolution of video (96p, 320p, or 480p) + 'width': '640', //display (css) width + 'interval': 300, //interval (in ms) to run updatePlayer polling loop + 'action': 'get', //action POST param to send to url + 'callback': function() { $.noop(); } //function to call after done instantiating pandoraVideo object, called with the object. + }, dataOptions); + + //get the pandora id and instantiate a pandoraVideo object with the current element and render it and execute optional callback + var id = opts.id, + $loading = $('
').addClass("pandoraLoading").text("Loading video...").appendTo($this), + sendData = JSON.stringify({'id': id, 'keys': opts.keys}); + + var deferred = $.post(opts.api, {'action': opts.action, 'data': sendData}, function(response) { + $loading.hide().remove(); + var pandora = new PandoraVideo(id, response.data, $this, opts); + pandora.render(); + opts.callback(pandora); + }, "json"); + + deferred.error(function(data) { + alert("failed to load video data"); + }); + }; + + /* + pandoraVideo class + Parameters: + id: pandora video id + data: data for the video object + $el: + opts: options object + + */ + var PandoraVideo = function(id, data, $el, opts) { + var that = this; + this.id = id; + this.data = data; + this.$el = $el; + this.o = opts; + this.annotPoint = -1; + this.getVideoURL = function() { + return opts.pandora_base + id + "/" + opts.resolution + ".webm"; + }; + + //empties element, appends video widget + this.render = function() { + var that = this; + this.$el.empty(); + this.$el.append(that.getWidget()); + }; + + /* + Get points + */ + var flattenedPoints = []; + $.each(that.o.layers, function(i,layerType) { + $.each(that.data.layers[layerType], function(j,layer) { + flattenedPoints.push(layer['in']); + flattenedPoints.push(layer.out); + }); + }); + this.points = makeArrayUnique(flattenedPoints); + + + this.crossesPoint = function(newPos) { + var that = this; + var positions = [that.annotPoint, newPos].sort(); + return this.points.some(function(point) { + return point >= positions[0] && point <= positions[1]; + }); + }; + + function makeArrayUnique(arr) { + var o = {}, i, l = arr.length, r = []; + for(i=0; i eg. 'width' + */ + this.getOption = function(key) { + return this.o[key] || "invalid option"; + }; + + + //returns widget for this pandoraVideo object + this.getWidget = function() { + var that = this; + var $container = this.$container = $('
').addClass("pandoraContainer"); + var $video = this.$video = $('