diff --git a/CHANGELOG.md b/CHANGELOG.md index a9dacd9..0c57212 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +__v2.1.0 - Dec 2, 2016__ + +* Exposed default settings `$.tubeplayer.defaults.settings` +* New player event: "onPlayerLoaded", _complementing_ $.tubeplayer.defaults.afterReady + __v2.0.0 - Dec 2, 2016__ * Removed code to handle flash player (due to deprecation); instead - uses iframe player exclusively diff --git a/README.md b/README.md index 9f354b8..feafada 100644 --- a/README.md +++ b/README.md @@ -15,20 +15,15 @@ In your web page: ```html - +
@@ -39,7 +34,7 @@ jQuery(document).ready(function(){ ### TubePlayer Plugin Defaults ```javascript -{ +$.tubeplayer.defaults.settings = { // Plugin init params width: 480, // the width of the player @@ -74,6 +69,7 @@ jQuery(document).ready(function(){ onPlayerPaused: function(){}, // player returns a state of paused onPlayerBuffering: function(){}, // player returns a state of buffering onPlayerCued: function(){}, // player returns a state of cued + onPlayerLoaded: function(){}, // player is initially loaded and attached to the DOM onQualityChange: function(quality){}, // player quality changes onRateChange: function(rate){}, // player rate changes @@ -107,6 +103,7 @@ onPlayerPlaying onPlayerPaused onPlayerBuffering onPlayerCued +onPlayerLoaded onQualityChange onRateChange diff --git a/bower.json b/bower.json index 20bdd20..022e21a 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "jquery-tubeplayer-plugin", - "version": "2.0.0", + "version": "2.1.0", "homepage": "https://github.com/nirvanatikku/jQuery-TubePlayer-Plugin", "authors": [ "Nirvana Tikku " diff --git a/dist/jquery.tubeplayer.js b/dist/jquery.tubeplayer.js index b2a765d..087722c 100644 --- a/dist/jquery.tubeplayer.js +++ b/dist/jquery.tubeplayer.js @@ -1,4 +1,4 @@ -/*! jQuery TubePlayer - Simplified YouTube Player Management - v2.0.0-beta - 2016-12-02 +/*! jQuery TubePlayer - Simplified YouTube Player Management - v2.1.0 - 2016-12-02 * https://github.com/nirvanatikku/jQuery-TubePlayer-Plugin * Copyright (c) 2016 Nirvana Tikku; Licensed MIT */ (function($) { @@ -123,7 +123,8 @@ playing: {}, paused: {}, buffering: {}, - cued: {} + cued: {}, + loaded: {} }, onErr: { defaultError: {}, @@ -138,7 +139,7 @@ * plugin to work without providing any parameters. They * are merged with the users options. */ - var defaults = { + $.tubeplayer.defaults.settings = { // public facing width: 480, @@ -169,6 +170,7 @@ onUnMute: function() {}, // functions called when events are triggered from the youtube player itself + onPlayerLoaded: function(){}, onPlayerUnstarted: function() {}, onPlayerEnded: function() {}, onPlayerPlaying: function() {}, @@ -225,7 +227,7 @@ 'id' : ids ? ids : '' }); $this.replaceWith(newDiv); - var new_input = $.extend({}, defaults, settings, input); + var new_input = $.extend({}, $.tubeplayer.defaults.settings, settings, input); TP.init(newDiv, new_input); } } else { @@ -280,7 +282,7 @@ if ($player.hasClass(TUBEPLAYER_CLASS)) { return $player; } - var o = $.extend({}, defaults, opts); + var o = $.extend({}, $.tubeplayer.defaults.settings, opts); o.playerID += "-" + guid(); $player.addClass(TUBEPLAYER_CLASS).data(OPTS, o); for (var event in PlayerEvents){ @@ -342,6 +344,7 @@ 'onReady': function(evt) { TP.ytplayers[o.playerID] = evt.target; var $player = $(evt.target.getIframe()).parents("." + TUBEPLAYER_CLASS); + $player.tubeplayer('opts').onPlayerLoaded.call($player); $.tubeplayer.defaults.afterReady($player); }, 'onPlaybackQualityChange': $.tubeplayer.defaults.qualityChange(o.playerID), @@ -385,6 +388,7 @@ dp.paused[ID] = o.onPlayerPaused; dp.buffering[ID] = o.onPlayerBuffering; dp.cued[ID] = o.onPlayerCued; + dp.loaded[ID] = o.onPlayerLoaded; // default onQualityChange d.onQualityChange[ID] = o.onQualityChange; @@ -592,7 +596,7 @@ delete TP.ytplayers[p.opts.playerID]; // cleanup callback handler references.. var d = $.tubeplayer.defaults; - var events = ['unstarted', 'ended', 'playing', 'paused', 'buffering', 'cued']; + var events = ['unstarted', 'ended', 'playing', 'paused', 'buffering', 'cued', 'loaded']; $.each(events, function(i, event) { delete d.onPlayer[event][p.opts.playerID]; }); diff --git a/dist/jquery.tubeplayer.min.js b/dist/jquery.tubeplayer.min.js index 891cbee..653c4f7 100644 --- a/dist/jquery.tubeplayer.min.js +++ b/dist/jquery.tubeplayer.min.js @@ -1,4 +1,4 @@ -/*! jQuery TubePlayer - Simplified YouTube Player Management - v2.0.0-beta - 2016-12-02 +/*! jQuery TubePlayer - Simplified YouTube Player Management - v2.1.0 - 2016-12-02 * https://github.com/nirvanatikku/jQuery-TubePlayer-Plugin * Copyright (c) 2016 Nirvana Tikku; Licensed MIT */ -(function(e){"use strict";function t(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(e){var t=0|16*Math.random(),a="x"==e?t:8|3&t;return a.toString(16)})}var a=".tubeplayer",r="jquery-youtube-tubeplayer",n="opts"+a,o={inited:!1,ytplayers:{},inits:[],iframeScriptInited:!1,State:{UNSTARTED:-1,ENDED:0,PLAYING:1,PAUSED:2,BUFFERING:3,CUED:5},Error:{BAD_INIT:0,INVALID_PARAM:2,NOT_FOUND:100,NOT_EMBEDDABLE:101,CANT_PLAY:150}};e.tubeplayer={TubePlayer:o},e.tubeplayer.defaults={afterReady:function(){},stateChange:function(t){var a=this.onPlayer;return function(r){var n=e("#"+t).parent();switch("object"==typeof r&&(r=r.data),r){case o.State.UNSTARTED:return a.unstarted[t].call(n);case o.State.ENDED:return a.ended[t].call(n);case o.State.PLAYING:return a.playing[t].call(n);case o.State.PAUSED:return a.paused[t].call(n);case o.State.BUFFERING:return a.buffering[t].call(n);case o.State.CUED:return a.cued[t].call(n);default:return null}}},onError:function(t){var a=this.onErr;return function(r){var n=e("#"+t).parent();switch("object"==typeof r&&(r=r.data),r){case o.Error.BAD_INIT:case o.Error.INVALID_PARAM:case o.Error.CANT_PLAY:return a.invalidParameter[t].call(n);case o.Error.NOT_FOUND:return a.notFound[t].call(n);case o.Error.NOT_EMBEDDABLE:return a.notEmbeddable[t].call(n);default:return a.defaultError[t].call(n)}}},qualityChange:function(t){var a=this;return function(r){var n=e("#"+t).parent();return"object"==typeof r&&(r=r.data),a.onQualityChange[t].call(n,r)}},rateChange:function(t){var a=this;return function(r){var n=e("#"+t).parent();return"object"==typeof r&&(r=r.data),a.onRateChange[t].call(n,r)}},onQualityChange:{},onRateChange:{},onPlayer:{unstarted:{},ended:{},playing:{},paused:{},buffering:{},cued:{}},onErr:{defaultError:{},notFound:{},notEmbeddable:{},invalidParameter:{}}};var l={width:480,height:270,allowFullScreen:"true",initialVideo:"DkoeNLuMbcI",start:0,preferredQuality:"default",controls:1,showRelated:!1,playsinline:!1,annotations:!0,autoPlay:!1,loop:0,color:"red",showinfo:!1,modestbranding:!0,protocol:"https:"==window.location.protocol?"https":"http",allowScriptAccess:"always",playerID:"tubeplayer-player-container",onPlay:function(){},onPause:function(){},onStop:function(){},onSeek:function(){},onMute:function(){},onUnMute:function(){},onPlayerUnstarted:function(){},onPlayerEnded:function(){},onPlayerPlaying:function(){},onPlayerPaused:function(){},onPlayerBuffering:function(){},onPlayerCued:function(){},onQualityChange:function(){},onRateChange:function(){},onError:function(){},onErrorNotFound:function(){},onErrorNotEmbeddable:function(){},onErrorInvalidParameter:function(){}};e.fn.tubeplayer=function(t,r){var n=e(this),i=typeof t;return 0===arguments.length||"object"===i?n.each(function(){if(n=e(this),"IFRAME"==n.prop("tagName")){var a=/^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#\&\?]*).*/,r=n.attr("src").match(a);if(r&&11==r[7].length){var i={initialVideo:r[7]},u=n.attr("class"),y=n.attr("id");n.attr("width")&&(i.width=n.attr("width")),n.attr("height")&&(i.height=n.attr("height")),i.allowFullScreen=void 0!==n.attr("allowfullscreen")?"true":!1;var d=e("
").attr({"class":u?u:"",id:y?y:""});n.replaceWith(d);var s=e.extend({},l,i,t);o.init(d,s)}}else o.init(e(this),t)}):"string"===i?n.triggerHandler(t+a,r!==void 0?r:null):void 0};var i=function(e){return function(t,a){var r=o.getPkg(t);if(r.ytplayer){var n=e(t,a,r);return n===void 0&&(n=r.$player),n}return r.$player}};e.tubeplayer.getPlayers=function(){return o.ytplayers},o.init=function(i,y){if(i.hasClass(r))return i;var d=e.extend({},l,y);d.playerID+="-"+t(),i.addClass(r).data(n,d);for(var s in u)i.bind(s+a,i,u[s]);return o.initDefaults(e.tubeplayer.defaults,d),e("
").attr("id",d.playerID).appendTo(i),o.initPlayer(i,d),i},o.getPkg=function(e){var t=e.data,a=t.data(n),r=o.ytplayers[a.playerID];return{$player:t,opts:a,ytplayer:r}},o.iframeReady=function(t){return o.inits.push(function(){new YT.Player(t.playerID,{videoId:t.initialVideo,width:t.width,height:t.height,playerVars:{autoplay:t.autoPlay?1:0,controls:t.controls?t.controls:0,loop:t.loop?1:0,playlist:t.playlist?t.playlist:0,rel:t.showRelated?1:0,fs:t.allowFullScreen?1:0,showinfo:t.showinfo?1:0,modestbranding:t.modestbranding?1:0,iv_load_policy:t.annotations?1:3,start:t.start,color:t.color,playsinline:t.playsinline,origin:window.location.origin},events:{onReady:function(a){o.ytplayers[t.playerID]=a.target;var n=e(a.target.getIframe()).parents("."+r);e.tubeplayer.defaults.afterReady(n)},onPlaybackQualityChange:e.tubeplayer.defaults.qualityChange(t.playerID),onPlaybackRateChange:e.tubeplayer.defaults.rateChange(t.playerID),onStateChange:e.tubeplayer.defaults.stateChange(t.playerID),onError:e.tubeplayer.defaults.onError(t.playerID)}})}),o.inits.length>=1&&!o.inited?function(){for(var e=0;o.inits.length>e;e++)o.inits[e]();o.inited=!0}:(o.inited&&o.inits.pop()(),window.onYouTubePlayerAPIReady)},o.initDefaults=function(e,t){var a=t.playerID,r=e.onPlayer;r.unstarted[a]=t.onPlayerUnstarted,r.ended[a]=t.onPlayerEnded,r.playing[a]=t.onPlayerPlaying,r.paused[a]=t.onPlayerPaused,r.buffering[a]=t.onPlayerBuffering,r.cued[a]=t.onPlayerCued,e.onQualityChange[a]=t.onQualityChange,e.onRateChange[a]=t.onRateChange;var n=e.onErr;n.defaultError[a]=t.onError,n.notFound[a]=t.onErrorNotFound,n.notEmbeddable[a]=t.onErrorNotEmbeddable,n.invalidParameter[a]=t.onErrorInvalidParameter},o.initPlayer=function(e,t){if(!o.iframeScriptInited){var a=document.createElement("script");a.src=t.protocol+"://www.youtube.com/iframe_api";var r=document.getElementsByTagName("script")[0];r.parentNode.insertBefore(a,r),o.iframeScriptInited=!0}window.onYouTubePlayerAPIReady=o.iframeReady(t)},o.getVideoIDFromURL=function(e){e=e||"";var t=e.indexOf("?"),a=e.substring(t,e.length),r=a.indexOf("v=");if(r>-1){var n=a.indexOf("&",r);return-1===n&&(n=a.length),a.substring(r+"v=".length,n)}return""};var u={opts:i(function(e,t,a){return a.opts}),cue:i(function(e,t,a){a.ytplayer.cueVideoById(t,0,a.opts.preferredQuality)}),cuePlaylist:i(function(e,t,a){a.ytplayer.cuePlaylist(t.playlist,t.index||0,t.startSeconds||0,a.opts.preferredQuality)}),play:i(function(e,t,a){var r,n;"object"==typeof t?(r=t.id,n=t.time):t!==void 0&&(r=t,n=0),r?a.ytplayer.loadVideoById({videoId:r,startSeconds:n,suggestedQuality:a.opts.preferredQuality}):a.ytplayer.playVideo(),a.opts.onPlay(t)}),playPlaylist:i(function(e,t,a){var r,n,o;if("object"==typeof t){var l=void 0!==t.length;r=l?t:t.playlist,o=l?0:t.time||0,n=l?0:t.index||0}else t!==void 0&&(r=t,o=0,n=0);r&&(a.ytplayer.loadPlaylist(r,n,o,a.opts.preferredQuality),a.opts.onPlay(t))}),next:i(function(e,t,a){a.ytplayer.nextVideo()}),previous:i(function(e,t,a){a.ytplayer.previousVideo()}),playVideoAt:i(function(e,t,a){a.ytplayer.playVideoAt(t)}),pause:i(function(e,t,a){a.ytplayer.pauseVideo(),a.opts.onPause(a)}),stop:i(function(e,t,a){a.ytplayer.stopVideo(),a.opts.onStop(a)}),seek:i(function(e,t,a){if(/:/.test(t)){var r=t.split(":").reverse();t=0;for(var n=0;r.length>n;n++)t+=Math.pow(60,n)*(0|r[n])}a.ytplayer.seekTo(t,!0),a.opts.onSeek(t)}),mute:i(function(e,t,a){a.$player.attr("data-prev-mute-volume",a.ytplayer.getVolume()),a.ytplayer.mute(),a.opts.onMute(a)}),unmute:i(function(e,t,a){a.ytplayer.unMute(),a.ytplayer.setVolume(a.$player.attr("data-prev-mute-volume")||50),a.opts.onUnMute()}),isMuted:i(function(e,t,a){return a.ytplayer.isMuted()}),volume:i(function(e,t,a){return void 0===t?a.ytplayer.getVolume():(a.ytplayer.setVolume(t),a.$player.attr("data-prev-mute-volume",a.ytplayer.getVolume()),void 0)}),quality:i(function(e,t,a){return void 0===t?a.ytplayer.getPlaybackQuality():(a.ytplayer.setPlaybackQuality(t),void 0)}),playbackRate:i(function(e,t,a){return void 0===t?a.ytplayer.getPlaybackRate():(a.ytplayer.setPlaybackRate(t),void 0)}),data:i(function(e,t,a){var r={},n=a.ytplayer;return r.videoLoadedFraction=n.getVideoLoadedFraction(),r.bytesLoaded=n.getVideoBytesLoaded(),r.bytesTotal=n.getVideoBytesTotal(),r.startBytes=n.getVideoStartBytes(),r.state=n.getPlayerState(),r.currentTime=n.getCurrentTime(),r.duration=n.getDuration(),r.videoURL=n.getVideoUrl(),r.playlist={videoIDs:n.getPlaylist(),currentIndex:n.getPlaylistIndex()},r.videoEmbedCode=n.getVideoEmbedCode(),r.videoID=o.getVideoIDFromURL(r.videoURL),r.availableQualityLevels=n.getAvailableQualityLevels(),r.availablePlaybackRates=n.getAvailablePlaybackRates(),r}),videoId:i(function(e,t,a){return o.getVideoIDFromURL(a.ytplayer.getVideoUrl())}),size:i(function(t,a,r){a!==void 0&&a.width&&a.height&&(r.ytplayer.setSize(a.width,a.height),e(r.ytplayer).css(a))}),destroy:i(function(t,l,i){i.$player.removeClass(r).data(n,null).unbind(a).html(""),delete o.ytplayers[i.opts.playerID];var u=e.tubeplayer.defaults,y=["unstarted","ended","playing","paused","buffering","cued"];return e.each(y,function(e,t){delete u.onPlayer[t][i.opts.playerID]}),y=["defaultError","notFound","notEmbeddable","invalidParameter"],e.each(y,function(e,t){delete u.onErr[t][i.opts.playerID]}),delete u.onQualityChange[i.opts.playerID],delete u.onRateChange[i.opts.playerID],"destroy"in i.ytplayer&&i.ytplayer.destroy(),e(i.ytplayer).remove(),null}),player:i(function(e,t,a){return a.ytplayer})}})(jQuery); \ No newline at end of file +(function(e){"use strict";function t(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(e){var t=0|16*Math.random(),a="x"==e?t:8|3&t;return a.toString(16)})}var a=".tubeplayer",r="jquery-youtube-tubeplayer",n="opts"+a,o={inited:!1,ytplayers:{},inits:[],iframeScriptInited:!1,State:{UNSTARTED:-1,ENDED:0,PLAYING:1,PAUSED:2,BUFFERING:3,CUED:5},Error:{BAD_INIT:0,INVALID_PARAM:2,NOT_FOUND:100,NOT_EMBEDDABLE:101,CANT_PLAY:150}};e.tubeplayer={TubePlayer:o},e.tubeplayer.defaults={afterReady:function(){},stateChange:function(t){var a=this.onPlayer;return function(r){var n=e("#"+t).parent();switch("object"==typeof r&&(r=r.data),r){case o.State.UNSTARTED:return a.unstarted[t].call(n);case o.State.ENDED:return a.ended[t].call(n);case o.State.PLAYING:return a.playing[t].call(n);case o.State.PAUSED:return a.paused[t].call(n);case o.State.BUFFERING:return a.buffering[t].call(n);case o.State.CUED:return a.cued[t].call(n);default:return null}}},onError:function(t){var a=this.onErr;return function(r){var n=e("#"+t).parent();switch("object"==typeof r&&(r=r.data),r){case o.Error.BAD_INIT:case o.Error.INVALID_PARAM:case o.Error.CANT_PLAY:return a.invalidParameter[t].call(n);case o.Error.NOT_FOUND:return a.notFound[t].call(n);case o.Error.NOT_EMBEDDABLE:return a.notEmbeddable[t].call(n);default:return a.defaultError[t].call(n)}}},qualityChange:function(t){var a=this;return function(r){var n=e("#"+t).parent();return"object"==typeof r&&(r=r.data),a.onQualityChange[t].call(n,r)}},rateChange:function(t){var a=this;return function(r){var n=e("#"+t).parent();return"object"==typeof r&&(r=r.data),a.onRateChange[t].call(n,r)}},onQualityChange:{},onRateChange:{},onPlayer:{unstarted:{},ended:{},playing:{},paused:{},buffering:{},cued:{},loaded:{}},onErr:{defaultError:{},notFound:{},notEmbeddable:{},invalidParameter:{}}},e.tubeplayer.defaults.settings={width:480,height:270,allowFullScreen:"true",initialVideo:"DkoeNLuMbcI",start:0,preferredQuality:"default",controls:1,showRelated:!1,playsinline:!1,annotations:!0,autoPlay:!1,loop:0,color:"red",showinfo:!1,modestbranding:!0,protocol:"https:"==window.location.protocol?"https":"http",allowScriptAccess:"always",playerID:"tubeplayer-player-container",onPlay:function(){},onPause:function(){},onStop:function(){},onSeek:function(){},onMute:function(){},onUnMute:function(){},onPlayerLoaded:function(){},onPlayerUnstarted:function(){},onPlayerEnded:function(){},onPlayerPlaying:function(){},onPlayerPaused:function(){},onPlayerBuffering:function(){},onPlayerCued:function(){},onQualityChange:function(){},onRateChange:function(){},onError:function(){},onErrorNotFound:function(){},onErrorNotEmbeddable:function(){},onErrorInvalidParameter:function(){}},e.fn.tubeplayer=function(t,r){var n=e(this),l=typeof t;return 0===arguments.length||"object"===l?n.each(function(){if(n=e(this),"IFRAME"==n.prop("tagName")){var a=/^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#\&\?]*).*/,r=n.attr("src").match(a);if(r&&11==r[7].length){var l={initialVideo:r[7]},i=n.attr("class"),u=n.attr("id");n.attr("width")&&(l.width=n.attr("width")),n.attr("height")&&(l.height=n.attr("height")),l.allowFullScreen=void 0!==n.attr("allowfullscreen")?"true":!1;var d=e("
").attr({"class":i?i:"",id:u?u:""});n.replaceWith(d);var y=e.extend({},e.tubeplayer.defaults.settings,l,t);o.init(d,y)}}else o.init(e(this),t)}):"string"===l?n.triggerHandler(t+a,r!==void 0?r:null):void 0};var l=function(e){return function(t,a){var r=o.getPkg(t);if(r.ytplayer){var n=e(t,a,r);return n===void 0&&(n=r.$player),n}return r.$player}};e.tubeplayer.getPlayers=function(){return o.ytplayers},o.init=function(l,u){if(l.hasClass(r))return l;var d=e.extend({},e.tubeplayer.defaults.settings,u);d.playerID+="-"+t(),l.addClass(r).data(n,d);for(var y in i)l.bind(y+a,l,i[y]);return o.initDefaults(e.tubeplayer.defaults,d),e("
").attr("id",d.playerID).appendTo(l),o.initPlayer(l,d),l},o.getPkg=function(e){var t=e.data,a=t.data(n),r=o.ytplayers[a.playerID];return{$player:t,opts:a,ytplayer:r}},o.iframeReady=function(t){return o.inits.push(function(){new YT.Player(t.playerID,{videoId:t.initialVideo,width:t.width,height:t.height,playerVars:{autoplay:t.autoPlay?1:0,controls:t.controls?t.controls:0,loop:t.loop?1:0,playlist:t.playlist?t.playlist:0,rel:t.showRelated?1:0,fs:t.allowFullScreen?1:0,showinfo:t.showinfo?1:0,modestbranding:t.modestbranding?1:0,iv_load_policy:t.annotations?1:3,start:t.start,color:t.color,playsinline:t.playsinline,origin:window.location.origin},events:{onReady:function(a){o.ytplayers[t.playerID]=a.target;var n=e(a.target.getIframe()).parents("."+r);n.tubeplayer("opts").onPlayerLoaded.call(n),e.tubeplayer.defaults.afterReady(n)},onPlaybackQualityChange:e.tubeplayer.defaults.qualityChange(t.playerID),onPlaybackRateChange:e.tubeplayer.defaults.rateChange(t.playerID),onStateChange:e.tubeplayer.defaults.stateChange(t.playerID),onError:e.tubeplayer.defaults.onError(t.playerID)}})}),o.inits.length>=1&&!o.inited?function(){for(var e=0;o.inits.length>e;e++)o.inits[e]();o.inited=!0}:(o.inited&&o.inits.pop()(),window.onYouTubePlayerAPIReady)},o.initDefaults=function(e,t){var a=t.playerID,r=e.onPlayer;r.unstarted[a]=t.onPlayerUnstarted,r.ended[a]=t.onPlayerEnded,r.playing[a]=t.onPlayerPlaying,r.paused[a]=t.onPlayerPaused,r.buffering[a]=t.onPlayerBuffering,r.cued[a]=t.onPlayerCued,r.loaded[a]=t.onPlayerLoaded,e.onQualityChange[a]=t.onQualityChange,e.onRateChange[a]=t.onRateChange;var n=e.onErr;n.defaultError[a]=t.onError,n.notFound[a]=t.onErrorNotFound,n.notEmbeddable[a]=t.onErrorNotEmbeddable,n.invalidParameter[a]=t.onErrorInvalidParameter},o.initPlayer=function(e,t){if(!o.iframeScriptInited){var a=document.createElement("script");a.src=t.protocol+"://www.youtube.com/iframe_api";var r=document.getElementsByTagName("script")[0];r.parentNode.insertBefore(a,r),o.iframeScriptInited=!0}window.onYouTubePlayerAPIReady=o.iframeReady(t)},o.getVideoIDFromURL=function(e){e=e||"";var t=e.indexOf("?"),a=e.substring(t,e.length),r=a.indexOf("v=");if(r>-1){var n=a.indexOf("&",r);return-1===n&&(n=a.length),a.substring(r+"v=".length,n)}return""};var i={opts:l(function(e,t,a){return a.opts}),cue:l(function(e,t,a){a.ytplayer.cueVideoById(t,0,a.opts.preferredQuality)}),cuePlaylist:l(function(e,t,a){a.ytplayer.cuePlaylist(t.playlist,t.index||0,t.startSeconds||0,a.opts.preferredQuality)}),play:l(function(e,t,a){var r,n;"object"==typeof t?(r=t.id,n=t.time):t!==void 0&&(r=t,n=0),r?a.ytplayer.loadVideoById({videoId:r,startSeconds:n,suggestedQuality:a.opts.preferredQuality}):a.ytplayer.playVideo(),a.opts.onPlay(t)}),playPlaylist:l(function(e,t,a){var r,n,o;if("object"==typeof t){var l=void 0!==t.length;r=l?t:t.playlist,o=l?0:t.time||0,n=l?0:t.index||0}else t!==void 0&&(r=t,o=0,n=0);r&&(a.ytplayer.loadPlaylist(r,n,o,a.opts.preferredQuality),a.opts.onPlay(t))}),next:l(function(e,t,a){a.ytplayer.nextVideo()}),previous:l(function(e,t,a){a.ytplayer.previousVideo()}),playVideoAt:l(function(e,t,a){a.ytplayer.playVideoAt(t)}),pause:l(function(e,t,a){a.ytplayer.pauseVideo(),a.opts.onPause(a)}),stop:l(function(e,t,a){a.ytplayer.stopVideo(),a.opts.onStop(a)}),seek:l(function(e,t,a){if(/:/.test(t)){var r=t.split(":").reverse();t=0;for(var n=0;r.length>n;n++)t+=Math.pow(60,n)*(0|r[n])}a.ytplayer.seekTo(t,!0),a.opts.onSeek(t)}),mute:l(function(e,t,a){a.$player.attr("data-prev-mute-volume",a.ytplayer.getVolume()),a.ytplayer.mute(),a.opts.onMute(a)}),unmute:l(function(e,t,a){a.ytplayer.unMute(),a.ytplayer.setVolume(a.$player.attr("data-prev-mute-volume")||50),a.opts.onUnMute()}),isMuted:l(function(e,t,a){return a.ytplayer.isMuted()}),volume:l(function(e,t,a){return void 0===t?a.ytplayer.getVolume():(a.ytplayer.setVolume(t),a.$player.attr("data-prev-mute-volume",a.ytplayer.getVolume()),void 0)}),quality:l(function(e,t,a){return void 0===t?a.ytplayer.getPlaybackQuality():(a.ytplayer.setPlaybackQuality(t),void 0)}),playbackRate:l(function(e,t,a){return void 0===t?a.ytplayer.getPlaybackRate():(a.ytplayer.setPlaybackRate(t),void 0)}),data:l(function(e,t,a){var r={},n=a.ytplayer;return r.videoLoadedFraction=n.getVideoLoadedFraction(),r.bytesLoaded=n.getVideoBytesLoaded(),r.bytesTotal=n.getVideoBytesTotal(),r.startBytes=n.getVideoStartBytes(),r.state=n.getPlayerState(),r.currentTime=n.getCurrentTime(),r.duration=n.getDuration(),r.videoURL=n.getVideoUrl(),r.playlist={videoIDs:n.getPlaylist(),currentIndex:n.getPlaylistIndex()},r.videoEmbedCode=n.getVideoEmbedCode(),r.videoID=o.getVideoIDFromURL(r.videoURL),r.availableQualityLevels=n.getAvailableQualityLevels(),r.availablePlaybackRates=n.getAvailablePlaybackRates(),r}),videoId:l(function(e,t,a){return o.getVideoIDFromURL(a.ytplayer.getVideoUrl())}),size:l(function(t,a,r){a!==void 0&&a.width&&a.height&&(r.ytplayer.setSize(a.width,a.height),e(r.ytplayer).css(a))}),destroy:l(function(t,l,i){i.$player.removeClass(r).data(n,null).unbind(a).html(""),delete o.ytplayers[i.opts.playerID];var u=e.tubeplayer.defaults,d=["unstarted","ended","playing","paused","buffering","cued","loaded"];return e.each(d,function(e,t){delete u.onPlayer[t][i.opts.playerID]}),d=["defaultError","notFound","notEmbeddable","invalidParameter"],e.each(d,function(e,t){delete u.onErr[t][i.opts.playerID]}),delete u.onQualityChange[i.opts.playerID],delete u.onRateChange[i.opts.playerID],"destroy"in i.ytplayer&&i.ytplayer.destroy(),e(i.ytplayer).remove(),null}),player:l(function(e,t,a){return a.ytplayer})}})(jQuery); \ No newline at end of file diff --git a/package.json b/package.json index f4c5e76..84c3cec 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "jquery-tubeplayer-plugin", "title": "jQuery TubePlayer Plugin", "description": "Simplified management of embedded YouTube players", - "version": "2.0.0", + "version": "2.1.0", "homepage": "https://github.com/nirvanatikku/jQuery-TubePlayer-Plugin", "bugs": "https://github.com/nirvanatikku/jQuery-TubePlayer-Plugin/issues", "author": { diff --git a/src/tubeplayer.js b/src/tubeplayer.js index 1fe60eb..3bae754 100644 --- a/src/tubeplayer.js +++ b/src/tubeplayer.js @@ -120,7 +120,8 @@ playing: {}, paused: {}, buffering: {}, - cued: {} + cued: {}, + loaded: {} }, onErr: { defaultError: {}, @@ -135,7 +136,7 @@ * plugin to work without providing any parameters. They * are merged with the users options. */ - var defaults = { + $.tubeplayer.defaults.settings = { // public facing width: 480, @@ -166,6 +167,7 @@ onUnMute: function() {}, // functions called when events are triggered from the youtube player itself + onPlayerLoaded: function(){}, onPlayerUnstarted: function() {}, onPlayerEnded: function() {}, onPlayerPlaying: function() {}, @@ -222,7 +224,7 @@ 'id' : ids ? ids : '' }); $this.replaceWith(newDiv); - var new_input = $.extend({}, defaults, settings, input); + var new_input = $.extend({}, $.tubeplayer.defaults.settings, settings, input); TP.init(newDiv, new_input); } } else { @@ -277,7 +279,7 @@ if ($player.hasClass(TUBEPLAYER_CLASS)) { return $player; } - var o = $.extend({}, defaults, opts); + var o = $.extend({}, $.tubeplayer.defaults.settings, opts); o.playerID += "-" + guid(); $player.addClass(TUBEPLAYER_CLASS).data(OPTS, o); for (var event in PlayerEvents){ @@ -339,6 +341,7 @@ 'onReady': function(evt) { TP.ytplayers[o.playerID] = evt.target; var $player = $(evt.target.getIframe()).parents("." + TUBEPLAYER_CLASS); + $player.tubeplayer('opts').onPlayerLoaded.call($player); $.tubeplayer.defaults.afterReady($player); }, 'onPlaybackQualityChange': $.tubeplayer.defaults.qualityChange(o.playerID), @@ -382,6 +385,7 @@ dp.paused[ID] = o.onPlayerPaused; dp.buffering[ID] = o.onPlayerBuffering; dp.cued[ID] = o.onPlayerCued; + dp.loaded[ID] = o.onPlayerLoaded; // default onQualityChange d.onQualityChange[ID] = o.onQualityChange; @@ -589,7 +593,7 @@ delete TP.ytplayers[p.opts.playerID]; // cleanup callback handler references.. var d = $.tubeplayer.defaults; - var events = ['unstarted', 'ended', 'playing', 'paused', 'buffering', 'cued']; + var events = ['unstarted', 'ended', 'playing', 'paused', 'buffering', 'cued', 'loaded']; $.each(events, function(i, event) { delete d.onPlayer[event][p.opts.playerID]; }); diff --git a/test_console/index.html b/test_console/index.html index 22adb2b..afa49c8 100644 --- a/test_console/index.html +++ b/test_console/index.html @@ -48,7 +48,7 @@