2015-07-01 16:38:01 +00:00
( function ( ) {
2015-09-16 06:32:01 +00:00
var CUSTOM _EMBED _WARNING , CustomEmbedPlayer , DEFAULT _ERROR , DailymotionPlayer , EmbedPlayer , FilePlayer , GoogleDriveYouTubePlayer , HITBOX _ERROR , HitboxPlayer , ImgurPlayer , LivestreamPlayer , Player , RTMPPlayer , SoundCloudPlayer , TYPE _MAP , TwitchPlayer , USTREAM _ERROR , UstreamPlayer , VideoJSPlayer , VimeoPlayer , YouTubePlayer , codecToMimeType , genParam , sortSources ,
2015-07-01 16:38:01 +00:00
extend = function ( child , parent ) { for ( var key in parent ) { if ( hasProp . call ( parent , key ) ) child [ key ] = parent [ key ] ; } function ctor ( ) { this . constructor = child ; } ctor . prototype = parent . prototype ; child . prototype = new ctor ( ) ; child . _ _super _ _ = parent . prototype ; return child ; } ,
hasProp = { } . hasOwnProperty ;
window . Player = Player = ( function ( ) {
function Player ( data ) {
if ( ! ( this instanceof Player ) ) {
return new Player ( data ) ;
}
this . setMediaProperties ( data ) ;
this . paused = false ;
}
2013-08-06 15:42:20 +00:00
2015-07-01 16:38:01 +00:00
Player . prototype . load = function ( data ) {
return this . setMediaProperties ( data ) ;
2013-08-06 15:42:20 +00:00
} ;
2015-07-01 16:38:01 +00:00
Player . prototype . setMediaProperties = function ( data ) {
this . mediaId = data . id ;
this . mediaType = data . type ;
return this . mediaLength = data . seconds ;
2013-08-06 15:42:20 +00:00
} ;
2015-07-01 16:38:01 +00:00
Player . prototype . play = function ( ) {
return this . paused = false ;
2013-08-06 15:42:20 +00:00
} ;
2015-07-01 16:38:01 +00:00
Player . prototype . pause = function ( ) {
return this . paused = true ;
2013-08-06 15:42:20 +00:00
} ;
2015-07-01 16:38:01 +00:00
Player . prototype . seekTo = function ( time ) { } ;
2014-02-03 02:04:50 +00:00
2015-07-01 16:38:01 +00:00
Player . prototype . setVolume = function ( volume ) { } ;
2014-02-03 02:04:50 +00:00
2015-07-01 16:38:01 +00:00
Player . prototype . getTime = function ( cb ) {
return cb ( 0 ) ;
2014-02-03 02:04:50 +00:00
} ;
2015-07-01 16:38:01 +00:00
Player . prototype . isPaused = function ( cb ) {
return cb ( this . paused ) ;
2014-02-03 02:04:50 +00:00
} ;
2013-08-04 16:16:19 +00:00
2015-07-01 16:38:01 +00:00
Player . prototype . getVolume = function ( cb ) {
return cb ( VOLUME ) ;
} ;
2013-08-04 16:16:19 +00:00
2015-07-01 16:38:01 +00:00
return Player ;
2013-08-04 16:16:19 +00:00
2015-07-01 16:38:01 +00:00
} ) ( ) ;
2013-08-04 16:16:19 +00:00
2015-07-01 16:38:01 +00:00
window . VimeoPlayer = VimeoPlayer = ( function ( superClass ) {
extend ( VimeoPlayer , superClass ) ;
2013-08-04 16:16:19 +00:00
2015-07-01 16:38:01 +00:00
function VimeoPlayer ( data ) {
if ( ! ( this instanceof VimeoPlayer ) ) {
return new VimeoPlayer ( data ) ;
}
this . load ( data ) ;
}
2014-02-03 02:04:50 +00:00
2015-07-01 16:38:01 +00:00
VimeoPlayer . prototype . load = function ( data ) {
this . setMediaProperties ( data ) ;
return waitUntilDefined ( window , '$f' , ( function ( _this ) {
return function ( ) {
var video ;
video = $ ( '<iframe/>' ) ;
removeOld ( video ) ;
video . attr ( {
src : "https://player.vimeo.com/video/" + data . id + "?api=1&player_id=ytapiplayer" ,
webkitallowfullscreen : true ,
mozallowfullscreen : true ,
allowfullscreen : true
} ) ;
if ( USEROPTS . wmode _transparent ) {
video . attr ( 'wmode' , 'transparent' ) ;
}
return $f ( video [ 0 ] ) . addEvent ( 'ready' , function ( ) {
_this . vimeo = $f ( video [ 0 ] ) ;
_this . play ( ) ;
_this . vimeo . addEvent ( 'finish' , function ( ) {
if ( CLIENT . leader ) {
return socket . emit ( 'playNext' ) ;
}
2013-08-05 04:19:10 +00:00
} ) ;
2015-07-01 16:38:01 +00:00
_this . vimeo . addEvent ( 'pause' , function ( ) {
_this . paused = true ;
if ( CLIENT . leader ) {
return sendVideoUpdate ( ) ;
}
} ) ;
_this . vimeo . addEvent ( 'play' , function ( ) {
_this . paused = false ;
if ( CLIENT . leader ) {
return sendVideoUpdate ( ) ;
}
} ) ;
return _this . setVolume ( VOLUME ) ;
} ) ;
} ;
} ) ( this ) ) ;
2013-08-05 04:19:10 +00:00
} ;
2013-06-11 15:29:21 +00:00
2015-07-01 16:38:01 +00:00
VimeoPlayer . prototype . play = function ( ) {
this . paused = false ;
if ( this . vimeo ) {
return this . vimeo . api ( 'play' ) ;
}
2013-08-05 04:19:10 +00:00
} ;
2013-06-11 15:29:21 +00:00
2015-07-01 16:38:01 +00:00
VimeoPlayer . prototype . pause = function ( ) {
this . paused = true ;
if ( this . vimeo ) {
return this . vimeo . api ( 'pause' ) ;
}
2013-08-05 04:19:10 +00:00
} ;
2013-06-11 15:29:21 +00:00
2015-07-01 16:38:01 +00:00
VimeoPlayer . prototype . seekTo = function ( time ) {
if ( this . vimeo ) {
return this . vimeo . api ( 'seekTo' , time ) ;
}
2013-08-05 04:19:10 +00:00
} ;
2013-07-12 20:34:55 +00:00
2015-07-01 16:38:01 +00:00
VimeoPlayer . prototype . setVolume = function ( volume ) {
if ( this . vimeo ) {
return this . vimeo . api ( 'setVolume' , volume ) ;
}
2013-08-05 04:19:10 +00:00
} ;
2014-02-03 02:04:50 +00:00
2015-07-01 16:38:01 +00:00
VimeoPlayer . prototype . getTime = function ( cb ) {
if ( this . vimeo ) {
return this . vimeo . api ( 'getCurrentTime' , function ( time ) {
return cb ( parseFloat ( time ) ) ;
} ) ;
} else {
return cb ( 0 ) ;
}
2014-02-03 02:04:50 +00:00
} ;
2015-07-01 16:38:01 +00:00
VimeoPlayer . prototype . getVolume = function ( cb ) {
if ( this . vimeo ) {
return this . vimeo . api ( 'getVolume' , cb ) ;
} else {
return cb ( VOLUME ) ;
}
2014-02-03 02:04:50 +00:00
} ;
2015-07-01 16:38:01 +00:00
return VimeoPlayer ;
2013-06-11 15:29:21 +00:00
2015-07-01 16:38:01 +00:00
} ) ( Player ) ;
2014-05-16 05:36:33 +00:00
2015-07-01 16:38:01 +00:00
window . YouTubePlayer = YouTubePlayer = ( function ( superClass ) {
extend ( YouTubePlayer , superClass ) ;
2014-05-16 05:36:33 +00:00
2015-07-01 16:38:01 +00:00
function YouTubePlayer ( data ) {
if ( ! ( this instanceof YouTubePlayer ) ) {
return new YouTubePlayer ( data ) ;
}
this . setMediaProperties ( data ) ;
this . qualityRaceCondition = true ;
this . pauseSeekRaceCondition = false ;
waitUntilDefined ( window , 'YT' , ( function ( _this ) {
return function ( ) {
return waitUntilDefined ( YT , 'Player' , function ( ) {
var wmode ;
removeOld ( ) ;
wmode = USEROPTS . wmode _transparent ? 'transparent' : 'opaque' ;
return _this . yt = new YT . Player ( 'ytapiplayer' , {
videoId : data . id ,
playerVars : {
autohide : 1 ,
autoplay : 1 ,
controls : 1 ,
iv _load _policy : 3 ,
rel : 0 ,
wmode : wmode
} ,
events : {
onReady : _this . onReady . bind ( _this ) ,
onStateChange : _this . onStateChange . bind ( _this )
}
2013-07-28 14:49:12 +00:00
} ) ;
2015-07-01 16:38:01 +00:00
} ) ;
} ;
} ) ( this ) ) ;
}
2013-07-28 14:49:12 +00:00
2015-07-01 16:38:01 +00:00
YouTubePlayer . prototype . load = function ( data ) {
this . setMediaProperties ( data ) ;
if ( this . yt && this . yt . ready ) {
this . yt . loadVideoById ( data . id , data . currentTime ) ;
this . qualityRaceCondition = true ;
if ( USEROPTS . default _quality ) {
return this . setQuality ( USEROPTS . default _quality ) ;
}
} else {
return console . error ( 'WTF? YouTubePlayer::load() called but yt is not ready' ) ;
}
} ;
2013-07-28 14:49:12 +00:00
2015-07-01 16:38:01 +00:00
YouTubePlayer . prototype . onReady = function ( ) {
this . yt . ready = true ;
return this . setVolume ( VOLUME ) ;
} ;
2013-06-11 15:29:21 +00:00
2015-07-01 16:38:01 +00:00
YouTubePlayer . prototype . onStateChange = function ( ev ) {
if ( this . qualityRaceCondition ) {
this . qualityRaceCondition = false ;
if ( USEROPTS . default _quality ) {
this . setQuality ( USEROPTS . default _quality ) ;
}
}
if ( ev . data === YT . PlayerState . PLAYING && this . pauseSeekRaceCondition ) {
this . pause ( ) ;
this . pauseSeekRaceCondition = false ;
}
if ( ( ev . data === YT . PlayerState . PAUSED && ! this . paused ) || ( ev . data === YT . PlayerState . PLAYING && this . paused ) ) {
this . paused = ev . data === YT . PlayerState . PAUSED ;
if ( CLIENT . leader ) {
sendVideoUpdate ( ) ;
2014-02-03 02:04:50 +00:00
}
2015-07-01 16:38:01 +00:00
}
if ( ev . data === YT . PlayerState . ENDED && CLIENT . leader ) {
return socket . emit ( 'playNext' ) ;
}
2013-08-05 04:19:10 +00:00
} ;
2013-06-11 15:29:21 +00:00
2015-07-01 16:38:01 +00:00
YouTubePlayer . prototype . play = function ( ) {
this . paused = false ;
if ( this . yt && this . yt . ready ) {
return this . yt . playVideo ( ) ;
}
2013-08-05 04:19:10 +00:00
} ;
2013-06-11 15:29:21 +00:00
2015-07-01 16:38:01 +00:00
YouTubePlayer . prototype . pause = function ( ) {
this . paused = true ;
if ( this . yt && this . yt . ready ) {
return this . yt . pauseVideo ( ) ;
}
2013-08-05 04:19:10 +00:00
} ;
2013-06-11 15:29:21 +00:00
2015-07-01 16:38:01 +00:00
YouTubePlayer . prototype . seekTo = function ( time ) {
if ( this . yt && this . yt . ready ) {
return this . yt . seekTo ( time , true ) ;
}
2013-08-05 04:19:10 +00:00
} ;
2013-06-11 15:29:21 +00:00
2015-07-01 16:38:01 +00:00
YouTubePlayer . prototype . setVolume = function ( volume ) {
if ( this . yt && this . yt . ready ) {
if ( volume > 0 ) {
this . yt . unMute ( ) ;
}
return this . yt . setVolume ( volume * 100 ) ;
}
2013-08-05 04:19:10 +00:00
} ;
2014-02-03 02:04:50 +00:00
2015-07-01 16:38:01 +00:00
YouTubePlayer . prototype . setQuality = function ( quality ) {
var ytQuality ;
if ( ! this . yt || ! this . yt . ready ) {
return ;
}
ytQuality = ( function ( ) {
switch ( String ( quality ) ) {
case '240' :
return 'small' ;
case '360' :
return 'medium' ;
case '480' :
return 'large' ;
case '720' :
return 'hd720' ;
case '1080' :
return 'hd1080' ;
case 'best' :
return 'highres' ;
default :
return 'auto' ;
2014-02-03 02:04:50 +00:00
}
2015-07-01 16:38:01 +00:00
} ) ( ) ;
if ( ytQuality !== 'auto' ) {
return this . yt . setPlaybackQuality ( ytQuality ) ;
}
2014-02-03 02:04:50 +00:00
} ;
2015-07-01 16:38:01 +00:00
YouTubePlayer . prototype . getTime = function ( cb ) {
if ( this . yt && this . yt . ready ) {
return cb ( this . yt . getCurrentTime ( ) ) ;
} else {
return cb ( 0 ) ;
}
} ;
YouTubePlayer . prototype . getVolume = function ( cb ) {
if ( this . yt && this . yt . ready ) {
if ( this . yt . isMuted ( ) ) {
return cb ( 0 ) ;
} else {
return cb ( this . yt . getVolume ( ) / 100 ) ;
2014-02-03 02:04:50 +00:00
}
2015-07-01 16:38:01 +00:00
} else {
return cb ( VOLUME ) ;
}
2014-02-03 02:04:50 +00:00
} ;
2013-08-07 18:25:08 +00:00
2015-07-01 16:38:01 +00:00
return YouTubePlayer ;
2013-06-11 15:29:21 +00:00
2015-07-01 16:38:01 +00:00
} ) ( Player ) ;
2013-06-11 15:29:21 +00:00
2015-07-01 16:38:01 +00:00
window . DailymotionPlayer = DailymotionPlayer = ( function ( superClass ) {
extend ( DailymotionPlayer , superClass ) ;
2013-06-11 15:29:21 +00:00
2015-07-01 16:38:01 +00:00
function DailymotionPlayer ( data ) {
if ( ! ( this instanceof DailymotionPlayer ) ) {
return new DailymotionPlayer ( data ) ;
}
this . setMediaProperties ( data ) ;
this . initialVolumeSet = false ;
waitUntilDefined ( window , 'DM' , ( function ( _this ) {
return function ( ) {
var params , quality ;
removeOld ( ) ;
params = {
autoplay : 1 ,
wmode : USEROPTS . wmode _transparent ? 'transparent' : 'opaque' ,
logo : 0
} ;
quality = _this . mapQuality ( USEROPTS . default _quality ) ;
if ( quality !== 'auto' ) {
params . quality = quality ;
}
_this . dm = DM . player ( 'ytapiplayer' , {
video : data . id ,
width : parseInt ( VWIDTH , 10 ) ,
height : parseInt ( VHEIGHT , 10 ) ,
params : params
} ) ;
return _this . dm . addEventListener ( 'apiready' , function ( ) {
_this . dm . ready = true ;
_this . dm . addEventListener ( 'ended' , function ( ) {
if ( CLIENT . leader ) {
return socket . emit ( 'playNext' ) ;
}
2014-02-03 02:04:50 +00:00
} ) ;
2015-07-01 16:38:01 +00:00
_this . dm . addEventListener ( 'pause' , function ( ) {
_this . paused = true ;
if ( CLIENT . leader ) {
return sendVideoUpdate ( ) ;
}
2013-08-05 04:19:10 +00:00
} ) ;
2015-07-01 16:38:01 +00:00
return _this . dm . addEventListener ( 'playing' , function ( ) {
_this . paused = false ;
if ( CLIENT . leader ) {
sendVideoUpdate ( ) ;
}
if ( ! _this . initialVolumeSet ) {
_this . setVolume ( VOLUME ) ;
return _this . initialVolumeSet = true ;
}
} ) ;
} ) ;
} ;
} ) ( this ) ) ;
}
2013-06-11 15:29:21 +00:00
2015-07-01 16:38:01 +00:00
DailymotionPlayer . prototype . load = function ( data ) {
this . setMediaProperties ( data ) ;
if ( this . dm && this . dm . ready ) {
this . dm . load ( data . id ) ;
return this . dm . seek ( data . currentTime ) ;
} else {
return console . error ( 'WTF? DailymotionPlayer::load() called but dm is not ready' ) ;
}
2013-08-05 04:19:10 +00:00
} ;
2013-06-11 15:29:21 +00:00
2015-07-01 16:38:01 +00:00
DailymotionPlayer . prototype . pause = function ( ) {
if ( this . dm && this . dm . ready ) {
this . paused = true ;
return this . dm . pause ( ) ;
}
2013-08-05 04:19:10 +00:00
} ;
2013-06-11 15:29:21 +00:00
2015-07-01 16:38:01 +00:00
DailymotionPlayer . prototype . play = function ( ) {
if ( this . dm && this . dm . ready ) {
this . paused = false ;
return this . dm . play ( ) ;
}
2013-08-05 04:19:10 +00:00
} ;
2013-06-11 15:29:21 +00:00
2015-07-01 16:38:01 +00:00
DailymotionPlayer . prototype . seekTo = function ( time ) {
if ( this . dm && this . dm . ready ) {
return this . dm . seek ( time ) ;
}
2013-08-05 04:19:10 +00:00
} ;
2013-06-11 15:29:21 +00:00
2015-07-01 16:38:01 +00:00
DailymotionPlayer . prototype . setVolume = function ( volume ) {
if ( this . dm && this . dm . ready ) {
return this . dm . setVolume ( volume ) ;
}
2013-08-05 04:19:10 +00:00
} ;
2014-02-03 02:04:50 +00:00
2015-07-01 16:38:01 +00:00
DailymotionPlayer . prototype . getTime = function ( cb ) {
if ( this . dm && this . dm . ready ) {
return cb ( this . dm . currentTime ) ;
} else {
return cb ( 0 ) ;
}
2014-02-03 02:04:50 +00:00
} ;
2015-07-01 16:38:01 +00:00
DailymotionPlayer . prototype . getVolume = function ( cb ) {
var volume ;
if ( this . dm && this . dm . ready ) {
if ( this . dm . muted ) {
return cb ( 0 ) ;
} else {
volume = this . dm . volume ;
if ( volume > 1 ) {
volume /= 100 ;
}
return cb ( volume ) ;
}
} else {
return cb ( VOLUME ) ;
}
2013-08-06 02:46:56 +00:00
} ;
2013-06-11 15:29:21 +00:00
2015-07-01 16:38:01 +00:00
DailymotionPlayer . prototype . mapQuality = function ( quality ) {
switch ( String ( quality ) ) {
case '240' :
case '480' :
case '720' :
case '1080' :
return String ( quality ) ;
case '360' :
return '380' ;
case 'best' :
return '1080' ;
default :
return 'auto' ;
}
2013-08-06 02:46:56 +00:00
} ;
2013-06-11 15:29:21 +00:00
2015-07-01 16:38:01 +00:00
return DailymotionPlayer ;
2013-06-11 15:29:21 +00:00
2015-07-01 16:38:01 +00:00
} ) ( Player ) ;
2013-06-11 15:29:21 +00:00
2015-07-01 16:38:01 +00:00
sortSources = function ( sources ) {
2015-07-26 19:28:43 +00:00
var flv , flvOrder , idx , j , len , nonflv , pref , qualities , quality , qualityOrder , sourceOrder ;
2015-07-01 16:38:01 +00:00
if ( ! sources ) {
console . error ( 'sortSources() called with null source list' ) ;
return [ ] ;
}
qualities = [ '1080' , '720' , '480' , '360' , '240' ] ;
pref = String ( USEROPTS . default _quality ) ;
2015-10-01 01:26:23 +00:00
if ( USEROPTS . default _quality === 'best' ) {
pref = '1080' ;
}
2015-07-01 16:38:01 +00:00
idx = qualities . indexOf ( pref ) ;
if ( idx < 0 ) {
2015-08-04 02:02:56 +00:00
idx = 2 ;
2015-07-01 16:38:01 +00:00
}
2015-08-04 02:02:56 +00:00
qualityOrder = qualities . slice ( idx ) . concat ( qualities . slice ( 0 , idx ) . reverse ( ) ) ;
2015-07-01 16:38:01 +00:00
sourceOrder = [ ] ;
flvOrder = [ ] ;
2015-07-26 19:28:43 +00:00
for ( j = 0 , len = qualityOrder . length ; j < len ; j ++ ) {
quality = qualityOrder [ j ] ;
2015-07-01 16:38:01 +00:00
if ( quality in sources ) {
flv = [ ] ;
nonflv = [ ] ;
sources [ quality ] . forEach ( function ( source ) {
source . quality = quality ;
2015-07-03 18:24:21 +00:00
if ( source . contentType === 'video/flv' ) {
2015-07-01 16:38:01 +00:00
return flv . push ( source ) ;
} else {
return nonflv . push ( source ) ;
}
} ) ;
sourceOrder = sourceOrder . concat ( nonflv ) ;
flvOrder = flvOrder . concat ( flv ) ;
}
}
return sourceOrder . concat ( flvOrder ) . map ( function ( source ) {
return {
2015-07-03 18:24:21 +00:00
type : source . contentType ,
2015-07-01 16:38:01 +00:00
src : source . link ,
quality : source . quality
} ;
2014-02-24 05:27:07 +00:00
} ) ;
2015-07-01 16:38:01 +00:00
} ;
2013-08-06 02:46:56 +00:00
2015-07-01 16:38:01 +00:00
waitUntilDefined ( window , 'videojs' , ( function ( _this ) {
return function ( ) {
return videojs . options . flash . swf = '/video-js.swf' ;
2013-08-06 02:46:56 +00:00
} ;
2015-07-01 16:38:01 +00:00
} ) ( this ) ) ;
window . VideoJSPlayer = VideoJSPlayer = ( function ( superClass ) {
extend ( VideoJSPlayer , superClass ) ;
function VideoJSPlayer ( data ) {
if ( ! ( this instanceof VideoJSPlayer ) ) {
return new VideoJSPlayer ( data ) ;
}
this . setMediaProperties ( data ) ;
2015-07-03 18:24:21 +00:00
this . loadPlayer ( data ) ;
}
VideoJSPlayer . prototype . loadPlayer = function ( data ) {
return waitUntilDefined ( window , 'videojs' , ( function ( _this ) {
2015-07-01 16:38:01 +00:00
return function ( ) {
var sources , video ;
video = $ ( '<video/>' ) . addClass ( 'video-js vjs-default-skin embed-responsive-item' ) . attr ( {
width : '100%' ,
height : '100%'
} ) ;
removeOld ( video ) ;
sources = sortSources ( data . meta . direct ) ;
if ( sources . length === 0 ) {
console . error ( 'VideoJSPlayer::constructor(): data.meta.direct has no sources!' ) ;
_this . mediaType = null ;
return ;
}
sources . forEach ( function ( source ) {
return $ ( '<source/>' ) . attr ( {
src : source . src ,
type : source . type ,
'data-quality' : source . quality
} ) . appendTo ( video ) ;
} ) ;
2015-07-25 08:19:32 +00:00
if ( data . meta . gdrive _subtitles ) {
data . meta . gdrive _subtitles . available . forEach ( function ( subt ) {
2015-07-26 19:28:43 +00:00
var label ;
label = subt . lang _original ;
if ( subt . name ) {
label += " (" + subt . name + ")" ;
}
2015-07-25 08:19:32 +00:00
return $ ( '<track/>' ) . attr ( {
src : "/gdvtt/" + data . id + "/" + subt . lang + "/" + subt . name + ".vtt?vid=" + data . meta . gdrive _subtitles . vid ,
kind : 'subtitles' ,
srclang : subt . lang ,
2015-07-26 19:28:43 +00:00
label : label
2015-07-25 08:19:32 +00:00
} ) . appendTo ( video ) ;
} ) ;
}
2015-07-01 16:38:01 +00:00
_this . player = videojs ( video [ 0 ] , {
autoplay : true ,
controls : true
} ) ;
return _this . player . ready ( function ( ) {
2015-07-05 20:50:34 +00:00
_this . setVolume ( VOLUME ) ;
2015-07-01 16:38:01 +00:00
_this . player . on ( 'ended' , function ( ) {
if ( CLIENT . leader ) {
return socket . emit ( 'playNext' ) ;
}
} ) ;
_this . player . on ( 'pause' , function ( ) {
_this . paused = true ;
if ( CLIENT . leader ) {
return sendVideoUpdate ( ) ;
}
} ) ;
2015-07-02 06:59:21 +00:00
_this . player . on ( 'play' , function ( ) {
2015-07-01 16:38:01 +00:00
_this . paused = false ;
if ( CLIENT . leader ) {
return sendVideoUpdate ( ) ;
}
} ) ;
2015-07-26 19:28:43 +00:00
_this . player . on ( 'seeked' , function ( ) {
2015-07-02 06:59:21 +00:00
return $ ( '.vjs-waiting' ) . removeClass ( 'vjs-waiting' ) ;
} ) ;
2015-07-26 20:29:06 +00:00
return setTimeout ( function ( ) {
return $ ( '#ytapiplayer .vjs-subtitles-button .vjs-menu-item' ) . each ( function ( i , elem ) {
if ( elem . textContent === localStorage . lastSubtitle ) {
elem . click ( ) ;
2015-07-26 19:28:43 +00:00
}
2015-07-26 20:29:06 +00:00
return elem . onclick = function ( ) {
if ( elem . attributes [ 'aria-selected' ] . value === 'true' ) {
return localStorage . lastSubtitle = elem . textContent ;
}
} ;
} ) ;
} , 1 ) ;
2015-07-01 16:38:01 +00:00
} ) ;
2013-06-11 15:29:21 +00:00
} ;
2015-07-01 16:38:01 +00:00
} ) ( this ) ) ;
2015-07-03 18:24:21 +00:00
} ;
2015-07-01 16:38:01 +00:00
VideoJSPlayer . prototype . load = function ( data ) {
this . setMediaProperties ( data ) ;
2015-07-03 18:24:21 +00:00
return this . loadPlayer ( data ) ;
2013-08-06 02:46:56 +00:00
} ;
2013-06-11 15:29:21 +00:00
2015-07-01 16:38:01 +00:00
VideoJSPlayer . prototype . play = function ( ) {
this . paused = false ;
if ( this . player && this . player . readyState ( ) > 0 ) {
return this . player . play ( ) ;
}
2013-08-06 02:46:56 +00:00
} ;
2013-06-11 15:29:21 +00:00
2015-07-01 16:38:01 +00:00
VideoJSPlayer . prototype . pause = function ( ) {
this . paused = true ;
if ( this . player && this . player . readyState ( ) > 0 ) {
return this . player . pause ( ) ;
}
} ;
2013-06-11 15:29:21 +00:00
2015-07-01 16:38:01 +00:00
VideoJSPlayer . prototype . seekTo = function ( time ) {
if ( this . player && this . player . readyState ( ) > 0 ) {
return this . player . currentTime ( time ) ;
}
} ;
2013-07-12 20:34:55 +00:00
2015-07-01 16:38:01 +00:00
VideoJSPlayer . prototype . setVolume = function ( volume ) {
2015-07-05 20:50:34 +00:00
if ( this . player ) {
2015-07-01 16:38:01 +00:00
return this . player . volume ( volume ) ;
}
} ;
2013-06-11 15:29:21 +00:00
2015-07-01 16:38:01 +00:00
VideoJSPlayer . prototype . getTime = function ( cb ) {
if ( this . player && this . player . readyState ( ) > 0 ) {
return cb ( this . player . currentTime ( ) ) ;
} else {
return cb ( 0 ) ;
}
} ;
2014-02-03 02:04:50 +00:00
2015-07-01 16:38:01 +00:00
VideoJSPlayer . prototype . getVolume = function ( cb ) {
if ( this . player && this . player . readyState ( ) > 0 ) {
if ( this . player . muted ( ) ) {
return cb ( 0 ) ;
} else {
return cb ( this . player . volume ( ) ) ;
}
} else {
return cb ( VOLUME ) ;
}
2014-02-03 02:04:50 +00:00
} ;
2015-07-01 16:38:01 +00:00
return VideoJSPlayer ;
2014-02-03 02:04:50 +00:00
2015-07-01 16:38:01 +00:00
} ) ( Player ) ;
2013-06-11 15:29:21 +00:00
2015-07-03 18:24:21 +00:00
codecToMimeType = function ( codec ) {
switch ( codec ) {
case 'mov/h264' :
return 'video/mp4' ;
case 'flv/h264' :
return 'video/flv' ;
case 'matroska/vp8' :
case 'matroska/vp9' :
return 'video/webm' ;
case 'ogg/theora' :
return 'video/ogg' ;
case 'mp3' :
return 'audio/mp3' ;
case 'vorbis' :
return 'audio/vorbis' ;
default :
return 'video/flv' ;
2015-07-01 16:38:01 +00:00
}
} ;
window . FilePlayer = FilePlayer = ( function ( superClass ) {
extend ( FilePlayer , superClass ) ;
function FilePlayer ( data ) {
if ( ! ( this instanceof FilePlayer ) ) {
return new FilePlayer ( data ) ;
}
data . meta . direct = {
480 : [
{
2015-07-03 18:24:21 +00:00
contentType : codecToMimeType ( data . meta . codec ) ,
2015-07-01 16:38:01 +00:00
link : data . id
}
]
} ;
FilePlayer . _ _super _ _ . constructor . call ( this , data ) ;
2014-02-03 02:04:50 +00:00
}
2014-11-14 02:24:05 +00:00
2015-07-01 16:38:01 +00:00
FilePlayer . prototype . load = function ( data ) {
data . meta . direct = {
480 : [
{
2015-07-03 18:24:21 +00:00
contentType : codecToMimeType ( data . meta . codec ) ,
2015-07-01 16:38:01 +00:00
link : data . id
}
]
} ;
return FilePlayer . _ _super _ _ . load . call ( this , data ) ;
2013-08-06 02:55:11 +00:00
} ;
2013-06-11 15:29:21 +00:00
2015-07-01 16:38:01 +00:00
return FilePlayer ;
} ) ( VideoJSPlayer ) ;
window . SoundCloudPlayer = SoundCloudPlayer = ( function ( superClass ) {
extend ( SoundCloudPlayer , superClass ) ;
function SoundCloudPlayer ( data ) {
if ( ! ( this instanceof SoundCloudPlayer ) ) {
return new SoundCloudPlayer ( data ) ;
}
this . setMediaProperties ( data ) ;
waitUntilDefined ( window , 'SC' , ( function ( _this ) {
return function ( ) {
var soundUrl , volumeSlider , widget ;
removeOld ( ) ;
if ( data . meta . scuri ) {
soundUrl = data . meta . scuri ;
} else {
soundUrl = data . id ;
}
widget = $ ( '<iframe/>' ) . appendTo ( $ ( '#ytapiplayer' ) ) ;
widget . attr ( {
id : 'scplayer' ,
src : "https://w.soundcloud.com/player/?url=" + soundUrl
} ) ;
volumeSlider = $ ( '<div/>' ) . attr ( 'id' , 'widget-volume' ) . css ( 'top' , '170px' ) . insertAfter ( widget ) . slider ( {
range : 'min' ,
value : VOLUME * 100 ,
stop : function ( event , ui ) {
return _this . setVolume ( ui . value / 100 ) ;
}
} ) ;
_this . soundcloud = SC . Widget ( widget [ 0 ] ) ;
return _this . soundcloud . bind ( SC . Widget . Events . READY , function ( ) {
_this . soundcloud . ready = true ;
_this . setVolume ( VOLUME ) ;
_this . play ( ) ;
_this . soundcloud . bind ( SC . Widget . Events . PAUSE , function ( ) {
_this . paused = true ;
if ( CLIENT . leader ) {
return sendVideoUpdate ( ) ;
}
} ) ;
_this . soundcloud . bind ( SC . Widget . Events . PLAY , function ( ) {
_this . paused = false ;
if ( CLIENT . leader ) {
return sendVideoUpdate ( ) ;
}
} ) ;
return _this . soundcloud . bind ( SC . Widget . Events . FINISH , function ( ) {
if ( CLIENT . leader ) {
return socket . emit ( 'playNext' ) ;
}
} ) ;
} ) ;
} ;
} ) ( this ) ) ;
}
SoundCloudPlayer . prototype . load = function ( data ) {
var soundUrl ;
this . setMediaProperties ( data ) ;
if ( this . soundcloud && this . soundcloud . ready ) {
if ( data . meta . scuri ) {
soundUrl = data . meta . scuri ;
2014-11-14 02:24:05 +00:00
} else {
2015-07-01 16:38:01 +00:00
soundUrl = data . id ;
2014-11-14 02:24:05 +00:00
}
2015-07-01 16:38:01 +00:00
return this . soundcloud . load ( soundUrl , {
auto _play : true
} ) ;
} else {
return console . error ( 'SoundCloudPlayer::load() called but soundcloud is not ready' ) ;
}
2013-08-06 02:46:56 +00:00
} ;
2013-06-11 15:29:21 +00:00
2015-07-01 16:38:01 +00:00
SoundCloudPlayer . prototype . play = function ( ) {
this . paused = false ;
if ( this . soundcloud && this . soundcloud . ready ) {
return this . soundcloud . play ( ) ;
}
2013-08-06 02:46:56 +00:00
} ;
2015-07-01 16:38:01 +00:00
SoundCloudPlayer . prototype . pause = function ( ) {
this . paused = true ;
if ( this . soundcloud && this . soundcloud . ready ) {
return this . soundcloud . pause ( ) ;
}
2013-08-06 02:46:56 +00:00
} ;
2013-07-12 20:34:55 +00:00
2015-07-01 16:38:01 +00:00
SoundCloudPlayer . prototype . seekTo = function ( time ) {
if ( this . soundcloud && this . soundcloud . ready ) {
return this . soundcloud . seekTo ( time * 1000 ) ;
}
2013-08-06 02:46:56 +00:00
} ;
2013-06-11 15:29:21 +00:00
2015-07-01 16:38:01 +00:00
SoundCloudPlayer . prototype . setVolume = function ( volume ) {
if ( this . soundcloud && this . soundcloud . ready ) {
return this . soundcloud . setVolume ( volume ) ;
}
2013-08-06 02:46:56 +00:00
} ;
2014-02-03 02:04:50 +00:00
2015-07-01 16:38:01 +00:00
SoundCloudPlayer . prototype . getTime = function ( cb ) {
if ( this . soundcloud && this . soundcloud . ready ) {
return this . soundcloud . getPosition ( function ( time ) {
return cb ( time / 1000 ) ;
} ) ;
} else {
return cb ( 0 ) ;
}
2014-02-03 02:04:50 +00:00
} ;
2015-07-01 16:38:01 +00:00
SoundCloudPlayer . prototype . getVolume = function ( cb ) {
if ( this . soundcloud && this . soundcloud . ready ) {
return this . soundcloud . getVolume ( cb ) ;
} else {
return cb ( VOLUME ) ;
}
2014-02-03 02:04:50 +00:00
} ;
2015-07-01 16:38:01 +00:00
return SoundCloudPlayer ;
2013-06-11 15:29:21 +00:00
2015-07-01 16:38:01 +00:00
} ) ( Player ) ;
2013-06-11 15:29:21 +00:00
2015-07-01 16:38:01 +00:00
DEFAULT _ERROR = 'You are currently connected via HTTPS but the embedded content uses non-secure plain HTTP. Your browser therefore blocks it from loading due to mixed content policy. To fix this, embed the video using a secure link if available (https://...), or load this page over plain HTTP by replacing "https://" with "http://" in the address bar (your websocket will still be secured using HTTPS, but this will permit non-secure content to load).' ;
2013-06-11 15:29:21 +00:00
2015-07-01 16:38:01 +00:00
genParam = function ( name , value ) {
return $ ( '<param/>' ) . attr ( {
name : name ,
value : value
} ) ;
} ;
2014-02-03 02:04:50 +00:00
2015-07-01 16:38:01 +00:00
window . EmbedPlayer = EmbedPlayer = ( function ( superClass ) {
extend ( EmbedPlayer , superClass ) ;
2013-06-11 15:29:21 +00:00
2015-07-01 16:38:01 +00:00
function EmbedPlayer ( data ) {
if ( ! ( this instanceof EmbedPlayer ) ) {
return new EmbedPlayer ( data ) ;
}
this . load ( data ) ;
}
2014-12-11 05:56:17 +00:00
2015-07-01 16:38:01 +00:00
EmbedPlayer . prototype . load = function ( data ) {
var embed ;
this . setMediaProperties ( data ) ;
embed = data . meta . embed ;
if ( embed == null ) {
console . error ( 'EmbedPlayer::load(): missing meta.embed' ) ;
return ;
}
if ( embed . tag === 'object' ) {
this . player = this . loadObject ( embed ) ;
} else {
this . player = this . loadIframe ( embed ) ;
}
return removeOld ( this . player ) ;
} ;
2014-12-11 05:56:17 +00:00
2015-07-01 16:38:01 +00:00
EmbedPlayer . prototype . loadObject = function ( embed ) {
var key , object , ref , value ;
object = $ ( '<object/>' ) . attr ( {
type : 'application/x-shockwave-flash' ,
2015-09-17 03:20:51 +00:00
data : embed . src ,
wmode : 'opaque'
2015-07-01 16:38:01 +00:00
} ) ;
genParam ( 'allowfullscreen' , 'true' ) . appendTo ( object ) ;
genParam ( 'allowscriptaccess' , 'always' ) . appendTo ( object ) ;
ref = embed . params ;
for ( key in ref ) {
value = ref [ key ] ;
genParam ( key , value ) . appendTo ( object ) ;
}
return object ;
} ;
2014-12-11 05:56:17 +00:00
2015-07-01 16:38:01 +00:00
EmbedPlayer . prototype . loadIframe = function ( embed ) {
var alert , error , iframe ;
if ( embed . src . indexOf ( 'http:' ) === 0 && location . protocol === 'https:' ) {
if ( this . _ _proto _ _ . mixedContentError != null ) {
error = this . _ _proto _ _ . mixedContentError ;
} else {
error = DEFAULT _ERROR ;
2014-12-11 05:56:17 +00:00
}
2015-07-01 16:38:01 +00:00
alert = makeAlert ( 'Mixed Content Error' , error , 'alert-danger' ) . removeClass ( 'col-md-12' ) ;
alert . find ( '.close' ) . remove ( ) ;
return alert ;
} else {
iframe = $ ( '<iframe/>' ) . attr ( {
src : embed . src ,
frameborder : '0'
} ) ;
return iframe ;
}
2013-08-06 02:46:56 +00:00
} ;
2013-08-03 15:12:53 +00:00
2015-07-01 16:38:01 +00:00
return EmbedPlayer ;
2013-08-03 15:12:53 +00:00
2015-07-01 16:38:01 +00:00
} ) ( Player ) ;
2013-08-03 15:12:53 +00:00
2015-07-05 21:04:21 +00:00
window . twitchEventCallback = function ( events ) {
if ( ! ( PLAYER instanceof TwitchPlayer ) ) {
return false ;
}
return events . forEach ( function ( event ) {
if ( event . event === 'playerInit' ) {
PLAYER . twitch . unmute ( ) ;
return PLAYER . twitch . ready = true ;
}
} ) ;
} ;
window . TwitchPlayer = TwitchPlayer = ( function ( superClass ) {
extend ( TwitchPlayer , superClass ) ;
function TwitchPlayer ( data ) {
if ( ! ( this instanceof TwitchPlayer ) ) {
return new TwitchPlayer ( data ) ;
}
this . load ( data ) ;
}
TwitchPlayer . prototype . load = function ( data ) {
data . meta . embed = {
src : '//www-cdn.jtvnw.net/swflibs/TwitchPlayer.swf' ,
tag : 'object' ,
params : {
flashvars : "embed=1&hostname=localhost&channel=" + data . id + "& eventsCallback=twitchEventCallback&auto_play=true&start_volume=" + ( Math . floor ( VOLUME * 100 ) )
}
} ;
return TwitchPlayer . _ _super _ _ . load . call ( this , data ) ;
} ;
return TwitchPlayer ;
} ) ( EmbedPlayer ) ;
2015-07-05 21:00:59 +00:00
window . LivestreamPlayer = LivestreamPlayer = ( function ( superClass ) {
extend ( LivestreamPlayer , superClass ) ;
function LivestreamPlayer ( data ) {
if ( ! ( this instanceof LivestreamPlayer ) ) {
return new LivestreamPlayer ( data ) ;
}
this . load ( data ) ;
}
LivestreamPlayer . prototype . load = function ( data ) {
if ( LIVESTREAM _CHROMELESS ) {
data . meta . embed = {
src : 'https://cdn.livestream.com/chromelessPlayer/v20/playerapi.swf' ,
tag : 'object' ,
params : {
flashvars : "channel=" + data . id
}
} ;
} else {
data . meta . embed = {
src : "https://cdn.livestream.com/embed/" + data . id + "?layout=4&color=0x000000&iconColorOver=0xe7e7e7&iconColor=0xcccccc" ,
tag : 'iframe'
} ;
}
return LivestreamPlayer . _ _super _ _ . load . call ( this , data ) ;
} ;
return LivestreamPlayer ;
} ) ( EmbedPlayer ) ;
2015-07-01 16:38:01 +00:00
CUSTOM _EMBED _WARNING = 'This channel is embedding custom content from %link%. Since this content is not trusted, you must click "Embed" below to allow the content to be embedded.<hr>' ;
2013-08-03 15:12:53 +00:00
2015-07-01 16:38:01 +00:00
window . CustomEmbedPlayer = CustomEmbedPlayer = ( function ( superClass ) {
extend ( CustomEmbedPlayer , superClass ) ;
2013-08-06 02:46:56 +00:00
2015-07-01 16:38:01 +00:00
function CustomEmbedPlayer ( data ) {
if ( ! ( this instanceof CustomEmbedPlayer ) ) {
return new CustomEmbedPlayer ( data ) ;
}
this . load ( data ) ;
}
2014-02-03 02:04:50 +00:00
2015-07-01 16:38:01 +00:00
CustomEmbedPlayer . prototype . load = function ( data ) {
var alert , embedSrc , link ;
if ( data . meta . embed == null ) {
console . error ( 'CustomEmbedPlayer::load(): missing meta.embed' ) ;
return ;
}
embedSrc = data . meta . embed . src ;
link = "<a href=\"" + embedSrc + "\" target=\"_blank\"><strong>" + embedSrc + "</strong></a>" ;
alert = makeAlert ( 'Untrusted Content' , CUSTOM _EMBED _WARNING . replace ( '%link%' , link ) , 'alert-warning' ) . removeClass ( 'col-md-12' ) ;
$ ( '<button/>' ) . addClass ( 'btn btn-default' ) . text ( 'Embed' ) . click ( ( function ( _this ) {
return function ( ) {
return CustomEmbedPlayer . _ _super _ _ . load . call ( _this , data ) ;
} ;
} ) ( this ) ) . appendTo ( alert . find ( '.alert' ) ) ;
return removeOld ( alert ) ;
} ;
2014-02-03 02:04:50 +00:00
2015-07-01 16:38:01 +00:00
return CustomEmbedPlayer ;
2014-02-03 02:04:50 +00:00
2015-07-01 16:38:01 +00:00
} ) ( EmbedPlayer ) ;
2013-08-03 15:12:53 +00:00
2015-07-01 16:38:01 +00:00
window . rtmpEventHandler = function ( id , event , data ) {
if ( event === 'volumechange' ) {
return PLAYER . volume = data . muted ? 0 : data . volume ;
}
} ;
2014-06-01 17:54:53 +00:00
2015-07-01 16:38:01 +00:00
window . RTMPPlayer = RTMPPlayer = ( function ( superClass ) {
extend ( RTMPPlayer , superClass ) ;
2014-02-03 02:04:50 +00:00
2015-07-01 16:38:01 +00:00
function RTMPPlayer ( data ) {
if ( ! ( this instanceof RTMPPlayer ) ) {
return new RTMPPlayer ( data ) ;
}
2015-11-09 03:51:17 +00:00
data . meta . direct = {
480 : [
{
link : data . id
}
]
2015-07-01 16:38:01 +00:00
} ;
2015-11-09 03:51:17 +00:00
RTMPPlayer . _ _super _ _ . constructor . call ( this , data ) ;
}
2014-02-03 02:04:50 +00:00
2015-07-01 16:38:01 +00:00
return RTMPPlayer ;
2014-02-03 02:04:50 +00:00
2015-11-09 03:51:17 +00:00
} ) ( VideoJSPlayer ) ;
2014-02-03 02:04:50 +00:00
2015-07-01 16:38:01 +00:00
HITBOX _ERROR = 'Hitbox.tv only serves its content over plain HTTP, but you are viewing this page over secure HTTPS. Your browser therefore blocks the hitbox embed due to mixed content policy. In order to view hitbox, you must view this page over plain HTTP (change "https://" to "http://" in the address bar)-- your websocket will still be connected using secure HTTPS. This is something I have asked Hitbox to fix but they have not done so yet.' ;
2014-02-03 02:04:50 +00:00
2015-07-01 16:38:01 +00:00
window . HitboxPlayer = HitboxPlayer = ( function ( superClass ) {
extend ( HitboxPlayer , superClass ) ;
2014-02-03 02:04:50 +00:00
2015-07-01 16:38:01 +00:00
function HitboxPlayer ( data ) {
if ( ! ( this instanceof HitboxPlayer ) ) {
return new HitboxPlayer ( data ) ;
}
this . load ( data ) ;
2014-06-01 17:54:53 +00:00
}
2015-01-23 05:21:31 +00:00
2015-07-01 16:38:01 +00:00
HitboxPlayer . prototype . load = function ( data ) {
data . meta . embed = {
src : "http://hitbox.tv/embed/" + data . id ,
tag : 'iframe'
} ;
return HitboxPlayer . _ _super _ _ . load . call ( this , data ) ;
2015-01-23 05:21:31 +00:00
} ;
2015-07-01 16:38:01 +00:00
HitboxPlayer . prototype . mixedContentError = HITBOX _ERROR ;
2015-01-23 05:21:31 +00:00
2015-07-01 16:38:01 +00:00
return HitboxPlayer ;
2015-01-23 05:21:31 +00:00
2015-07-01 16:38:01 +00:00
} ) ( EmbedPlayer ) ;
2015-01-23 05:21:31 +00:00
2015-07-08 02:30:39 +00:00
USTREAM _ERROR = 'Ustream.tv\'s embed player only works over plain HTTP, but you are viewing this page over secure HTTPS. Your browser therefore blocks the ustream embed due to mixed content policy. In order to view ustream, you must view this page over plain HTTP (change "https://" to "http://" in the address bar)-- your websocket will still be connecting using secure HTTPS. This is something that ustream needs to fix.' ;
2015-07-01 16:38:01 +00:00
window . UstreamPlayer = UstreamPlayer = ( function ( superClass ) {
extend ( UstreamPlayer , superClass ) ;
2015-01-23 05:21:31 +00:00
2015-07-01 16:38:01 +00:00
function UstreamPlayer ( data ) {
if ( ! ( this instanceof UstreamPlayer ) ) {
return new UstreamPlayer ( data ) ;
}
this . load ( data ) ;
}
2015-01-23 05:21:31 +00:00
2015-07-01 16:38:01 +00:00
UstreamPlayer . prototype . load = function ( data ) {
data . meta . embed = {
tag : 'iframe' ,
2015-07-08 02:30:39 +00:00
src : "http://www.ustream.tv/embed/" + data . id + "?v=3&wmode=direct&autoplay=1"
2015-07-01 16:38:01 +00:00
} ;
return UstreamPlayer . _ _super _ _ . load . call ( this , data ) ;
} ;
2015-01-23 05:21:31 +00:00
2015-07-08 02:30:39 +00:00
UstreamPlayer . prototype . mixedContentError = USTREAM _ERROR ;
2015-07-01 16:38:01 +00:00
return UstreamPlayer ;
2015-01-23 05:21:31 +00:00
2015-07-01 16:38:01 +00:00
} ) ( EmbedPlayer ) ;
2015-01-23 05:21:31 +00:00
2015-07-01 16:38:01 +00:00
window . ImgurPlayer = ImgurPlayer = ( function ( superClass ) {
extend ( ImgurPlayer , superClass ) ;
2013-09-22 04:54:29 +00:00
2015-07-01 16:38:01 +00:00
function ImgurPlayer ( data ) {
if ( ! ( this instanceof ImgurPlayer ) ) {
return new ImgurPlayer ( data ) ;
}
this . load ( data ) ;
2013-09-22 04:54:29 +00:00
}
2014-02-03 02:04:50 +00:00
2015-07-01 16:38:01 +00:00
ImgurPlayer . prototype . load = function ( data ) {
data . meta . embed = {
tag : 'iframe' ,
src : "https://imgur.com/a/" + data . id + "/embed"
} ;
return ImgurPlayer . _ _super _ _ . load . call ( this , data ) ;
} ;
2013-08-06 02:46:56 +00:00
2015-07-01 16:38:01 +00:00
return ImgurPlayer ;
} ) ( EmbedPlayer ) ;
2015-09-16 06:32:01 +00:00
window . GoogleDriveYouTubePlayer = GoogleDriveYouTubePlayer = ( function ( superClass ) {
extend ( GoogleDriveYouTubePlayer , superClass ) ;
function GoogleDriveYouTubePlayer ( data ) {
if ( ! ( this instanceof GoogleDriveYouTubePlayer ) ) {
return new GoogleDriveYouTubePlayer ( data ) ;
}
this . setMediaProperties ( data ) ;
this . init ( data ) ;
}
GoogleDriveYouTubePlayer . prototype . init = function ( data ) {
var embed ;
embed = $ ( '<embed />' ) . attr ( {
type : 'application/x-shockwave-flash' ,
2015-09-16 07:04:34 +00:00
src : "https://www.youtube.com/get_player?docid=" + data . id + "&ps=docs&partnerid=30&enablejsapi=1&cc_load_policy=1&auth_timeout=86400000000" ,
2015-09-16 06:32:01 +00:00
flashvars : 'autoplay=1&playerapiid=uniquePlayerId' ,
wmode : 'opaque' ,
allowscriptaccess : 'always'
} ) ;
removeOld ( embed ) ;
return window . onYouTubePlayerReady = ( function ( _this ) {
return function ( ) {
if ( PLAYER !== _this ) {
return ;
}
_this . yt = embed [ 0 ] ;
window . gdriveStateChange = _this . onStateChange . bind ( _this ) ;
_this . yt . addEventListener ( 'onStateChange' , 'gdriveStateChange' ) ;
return _this . onReady ( ) ;
} ;
} ) ( this ) ;
} ;
GoogleDriveYouTubePlayer . prototype . load = function ( data ) {
this . setMediaProperties ( data ) ;
return this . init ( data ) ;
} ;
GoogleDriveYouTubePlayer . prototype . onReady = function ( ) {
this . yt . ready = true ;
this . setVolume ( VOLUME ) ;
return this . setQuality ( USEROPTS . default _quality ) ;
} ;
GoogleDriveYouTubePlayer . prototype . onStateChange = function ( ev ) {
if ( PLAYER !== this ) {
return ;
}
if ( ( ev === YT . PlayerState . PAUSED && ! this . paused ) || ( ev === YT . PlayerState . PLAYING && this . paused ) ) {
this . paused = ev === YT . PlayerState . PAUSED ;
if ( CLIENT . leader ) {
sendVideoUpdate ( ) ;
}
}
if ( ev === YT . PlayerState . ENDED && CLIENT . leader ) {
return socket . emit ( 'playNext' ) ;
}
} ;
GoogleDriveYouTubePlayer . prototype . play = function ( ) {
this . paused = false ;
if ( this . yt && this . yt . ready ) {
return this . yt . playVideo ( ) ;
}
} ;
GoogleDriveYouTubePlayer . prototype . pause = function ( ) {
this . paused = true ;
if ( this . yt && this . yt . ready ) {
return this . yt . pauseVideo ( ) ;
}
} ;
GoogleDriveYouTubePlayer . prototype . seekTo = function ( time ) {
if ( this . yt && this . yt . ready ) {
return this . yt . seekTo ( time , true ) ;
}
} ;
GoogleDriveYouTubePlayer . prototype . setVolume = function ( volume ) {
if ( this . yt && this . yt . ready ) {
if ( volume > 0 ) {
this . yt . unMute ( ) ;
}
return this . yt . setVolume ( volume * 100 ) ;
}
} ;
GoogleDriveYouTubePlayer . prototype . setQuality = function ( quality ) {
var ytQuality ;
if ( ! this . yt || ! this . yt . ready ) {
return ;
}
ytQuality = ( function ( ) {
switch ( String ( quality ) ) {
case '240' :
return 'small' ;
case '360' :
return 'medium' ;
case '480' :
return 'large' ;
case '720' :
return 'hd720' ;
case '1080' :
return 'hd1080' ;
case 'best' :
return 'highres' ;
default :
return 'auto' ;
}
} ) ( ) ;
if ( ytQuality !== 'auto' ) {
return this . yt . setPlaybackQuality ( ytQuality ) ;
}
} ;
GoogleDriveYouTubePlayer . prototype . getTime = function ( cb ) {
if ( this . yt && this . yt . ready ) {
return cb ( this . yt . getCurrentTime ( ) ) ;
} else {
return cb ( 0 ) ;
}
} ;
GoogleDriveYouTubePlayer . prototype . getVolume = function ( cb ) {
if ( this . yt && this . yt . ready ) {
if ( this . yt . isMuted ( ) ) {
return cb ( 0 ) ;
} else {
return cb ( this . yt . getVolume ( ) / 100 ) ;
}
} else {
return cb ( VOLUME ) ;
}
} ;
return GoogleDriveYouTubePlayer ;
} ) ( Player ) ;
2015-07-01 16:38:01 +00:00
TYPE _MAP = {
yt : YouTubePlayer ,
vi : VimeoPlayer ,
dm : DailymotionPlayer ,
2015-09-16 06:32:01 +00:00
gd : GoogleDriveYouTubePlayer ,
2015-07-01 16:38:01 +00:00
gp : VideoJSPlayer ,
fi : FilePlayer ,
jw : FilePlayer ,
sc : SoundCloudPlayer ,
li : LivestreamPlayer ,
tw : TwitchPlayer ,
cu : CustomEmbedPlayer ,
rt : RTMPPlayer ,
hb : HitboxPlayer ,
us : UstreamPlayer ,
im : ImgurPlayer
} ;
window . loadMediaPlayer = function ( data ) {
2015-09-27 03:00:07 +00:00
var e , error1 , error2 ;
2015-09-16 06:32:01 +00:00
if ( data . meta . direct && data . type !== 'gd' ) {
2015-07-05 20:50:34 +00:00
try {
return window . PLAYER = new VideoJSPlayer ( data ) ;
2015-09-27 03:00:07 +00:00
} catch ( error1 ) {
e = error1 ;
2015-07-05 20:50:34 +00:00
return console . error ( e ) ;
}
2015-07-01 16:38:01 +00:00
} else if ( data . type in TYPE _MAP ) {
try {
return window . PLAYER = TYPE _MAP [ data . type ] ( data ) ;
2015-09-27 03:00:07 +00:00
} catch ( error2 ) {
e = error2 ;
2015-07-01 16:38:01 +00:00
return console . error ( e ) ;
}
2013-06-11 15:29:21 +00:00
}
2015-07-01 16:38:01 +00:00
} ;
2013-08-06 02:46:56 +00:00
2015-07-01 16:38:01 +00:00
window . handleMediaUpdate = function ( data ) {
var PLAYER , waiting ;
PLAYER = window . PLAYER ;
if ( typeof PLAYER . mediaLength === 'number' && PLAYER . mediaLength > 0 && data . currentTime > PLAYER . mediaLength ) {
return ;
}
waiting = data . currentTime < 0 ;
if ( data . id && data . id !== PLAYER . mediaId ) {
if ( data . currentTime < 0 ) {
data . currentTime = 0 ;
}
PLAYER . load ( data ) ;
PLAYER . play ( ) ;
}
if ( waiting ) {
PLAYER . seekTo ( 0 ) ;
if ( PLAYER instanceof YouTubePlayer ) {
PLAYER . pauseSeekRaceCondition = true ;
} else {
PLAYER . pause ( ) ;
}
return ;
} else if ( PLAYER instanceof YouTubePlayer ) {
PLAYER . pauseSeekRaceCondition = false ;
}
if ( CLIENT . leader || ! USEROPTS . synch ) {
return ;
}
if ( data . paused && ! PLAYER . paused ) {
PLAYER . seekTo ( data . currentTime ) ;
PLAYER . pause ( ) ;
2015-07-05 20:29:06 +00:00
} else if ( PLAYER . paused && ! data . paused ) {
2015-07-01 16:38:01 +00:00
PLAYER . play ( ) ;
}
return PLAYER . getTime ( function ( seconds ) {
var accuracy , diff , time ;
time = data . currentTime ;
diff = ( time - seconds ) || time ;
accuracy = USEROPTS . sync _accuracy ;
if ( PLAYER instanceof DailymotionPlayer ) {
accuracy = Math . max ( accuracy , 5 ) ;
}
if ( diff > accuracy ) {
return PLAYER . seekTo ( time ) ;
} else if ( diff < - accuracy ) {
if ( ! ( PLAYER instanceof DailymotionPlayer ) ) {
time += 1 ;
2013-06-11 15:29:21 +00:00
}
2015-07-01 16:38:01 +00:00
return PLAYER . seekTo ( time ) ;
}
2013-08-06 02:46:56 +00:00
} ) ;
2015-07-01 16:38:01 +00:00
} ;
window . removeOld = function ( replace ) {
var old ;
$ ( '#sc_volume' ) . remove ( ) ;
if ( replace == null ) {
replace = $ ( '<div/>' ) . addClass ( 'embed-responsive-item' ) ;
2013-08-06 03:25:16 +00:00
}
2015-07-01 16:38:01 +00:00
old = $ ( '#ytapiplayer' ) ;
replace . insertBefore ( old ) ;
old . remove ( ) ;
replace . attr ( 'id' , 'ytapiplayer' ) ;
return replace ;
} ;
} ) . call ( this ) ;