NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name Video Streaming Enhanced
// @namespace http://codingtoby.com
// @version 0.5.2.2
// @description Improves streaming video by replacing other players with Flowplayer, and adding a variety of configuration options.
// @author Toby
// @include http://kissanime.ru/Anime/*/*
// @include https://kimcartoon.me/Cartoon/*/*
// @include http://www.pornhub.com/*
// @include http://www.xvideos.com/video*
// @include http://gorillavid.in/*
// @include https://flowplayer.com/standalone/commercial.html
// @include http://vse.codingtoby.com/
// @include https://xmovies8.org/watch*
// @require https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js
// @require https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js
// @require http://js.codingtoby.com/tusl.js?updated=00006
// @require https://cdnjs.cloudflare.com/ajax/libs/bean/1.0.15/bean.min.js
// @grant unsafeWindow
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_deleteValue
// @grant GM_setClipboard
// @grant GM_xmlhttpRequest
// @run-at document-start
// ==/UserScript==
/****************************************************************************************************
* @require explanations
* tusl.js - Toby's UserScript Library. Contains my most commonly used utility functions.
*
* @grant explanations
* unsafeWindow - Required to use Flowplayer commercial.
* GM_getValue, GM_setValue, GM_deleteValue - Required for saving preferences and when working with frames.
* GM_xmlhttpRequest - Required for determining mime types of files for Flowplayer.
*****************************************************************************************************/
"use strict";
(function (w, $, jQuery)
{
var vse =
{
name : GM_info[ "script" ][ "name" ],
version : GM_info[ "script" ][ "version" ],
user : {},
status : {},
video : {},
player : {}
};
function getParameterByName(name, url) {
if (!url) url = window.location.href;
name = name.replace(/[\[\]]/g, "\\$&");
var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
results = regex.exec(url);
if (!results) return null;
if (!results[2]) return '';
return decodeURIComponent(results[2].replace(/\+/g, " "));
}
// Supported domains that VSE will run on.
vse.domains =
{
kissAnime : "kissanime.ru",
kimCartoon : "kimcartoon.me",
pornhub : "pornhub.com",
xvideos : "xvideos.com",
gorillavid : "gorillavid.in",
vseCustom : "codingtoby.com",
xMovies : "xmovies8.org"
};
// Location of the new player.
vse.flowplayer = "https://flowplayer.com/standalone/commercial.html";
var jqui = '<link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/smoothness/jquery-ui.css">';
var fbgrid = '<link rel="stylesheet" href="//cdn.jsdelivr.net/flexboxgrid/6.3.0/flexboxgrid.min.css" type="text/css" >';
var vseStyles = `
/* VSE FCW Messages */
.vse_video_loading_new
{
z-index: 99999; position:fixed; left: 0; top:25%; display: block; opacity: 0.8; width: 100%; text-align: center; box-sizing: border-box;
}
.vse_video_loading_new span
{
box-sizing: border-box; position: relative;
background-color: #000000; padding: 1.25vw 5vw; border-radius: 30px; border: 1px solid #000000; font-size: 1.25vw; color: #FFFFFF;
}
`;
if ( !GM_getValue( "vse_settings" ) )
{
vse.user.config = {};
vse.user.config.autoplay = false;
vse.user.config.launch = false;
vse.user.config.launchLite = true;
vse.user.config.fullCurrentWindow = false;
vse.user.config.jumpForwardLength = 90;
vse.user.config.jumpBackwardLength = 90;
vse.user.config.skipForwardLength = 15;
vse.user.config.skipBackwardLength = 15;
vse.user.config.hopForwardLength = 5;
vse.user.config.hopBackwardLength = 5;
GM_setValue( "vse_settings", JSON.stringify( vse.user.config ) );
}
$.merge( vse.user, JSON.parse( GM_getValue( "vse_settings" ) ) );
console.log( vse.user );
vse.fn =
{
getElementProperties : function (selector)
{
var element =
{
height : $( selector ).height(),
width : $( selector ).width()
};
return element;
},
injectPlayer : function (container)
{
var style = "height: " + vse.flowplayerProperties.height + "px; ";
style = style + "width: " + vse.flowplayerProperties.width + "px; ";
style = style + "box-sizing: border-box; margin:0; padding:0; ";
$( container ).append( "<div id='vse_iframe_container' style='" + style + "'></div>" );
$( "#vse_iframe_container" ).append( '<iframe id="vse_fp_iframe" name="vse_fp_iframe_' + Math.random()
+ '" src="https://flowplayer.com/standalone/commercial.html" frameborder="0" allowfullscreen="true" scrolling="no" height="100%" width="100%"></iframe>' );
$( "#vse_fp_iframe" ).prop( "style", "max-width:100%; max-height:100%; width:100%; height:100%; padding:0px; margin:0px; background-color:#000000;" );
},
injectFullCurrentWindowPlayer : function ()
{
if(vse.video.srcLoc == "kissAnime")
{
var prevLink = $( "#btnPrevious" ).parent().attr( "href" );
var nextLink = $( "#btnNext" ).parent().attr( "href" );
}
else if(vse.video.srcLoc == "kimCartoon")
{
var prevLink = $( "#Img1" ).parent().attr( "href" );
var nextLink = $( "#Img2" ).parent().attr( "href" );
}
$( "head" ).append( `<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<style>
.noscroll { overflow: hidden; }
#vse_fullCurrentWindowModal { z-index:2; position: absolute; left:0; top:0; background-color: #000000; height: 100% !important; width:100%; min-height:100% !important; }
#fcwContainer { z-index:3; position: absolute; right:5px; top:45px; height: auto; opacity: .25; display: inline-block; }
#fcwContainer a { color: #FFFFFF; text-decoration: none; font-weight: bold; font-size:18px; cursor:pointer; }
#fcwContainer a:hover { color: #ACFFBD; }
` + vseStyles + `
</style>` );
$( "body" ).append( `<div id="vse_fullCurrentWindowModal"></div>` );
$( "#vse_fullCurrentWindowModal" ).append( `
<div id="fcwContainer">
<a id="vse_fcwPrev"><i class="material-icons">skip_previous</i></a>
<a id="vse_fcwNext"><i class="material-icons">skip_next</i></a>
<a id="vse_fcwX"><i class="material-icons">close</i></a>
</div>
` );
vse.video.prevLink = prevLink;
vse.video.nextLink = nextLink;
if ( !vse.video.prevLink )
{
$( "#vse_fcwPrev" ).css( "opacity", "0" );
}
else
{
$( "#vse_fcwPrev" ).click( function ()
{
$( "body" ).append( `
<div class="vse_video_loading_new">
<span>Loading Previous Video...</span>
</div>
` );
setTimeout( function ()
{
window.top.location = vse.video.prevLink;
}, 1 );
} );
}
if ( !vse.video.nextLink )
{
$( "#vse_fcwNext" ).css( "opacity", "0" );
}
else
{
$( "#vse_fcwNext" ).click( function ()
{
$( "body" ).append( `
<div class="vse_video_loading_new">
<span>Loading Next Video...</span>
</div>
` );
setTimeout( function ()
{
window.top.location = vse.video.nextLink;
}, 1 );
} );
}
GM_setValue( "vse_videoInfo", JSON.stringify( vse.video ) );
$( "body" ).addClass( "noscroll" );
$( 'html, body' ).animate( {scrollTop : 0}, 1 );
$( "#fcwContainer" ).mouseenter( function ()
{
$( this ).animate( {opacity : 1.0}, 250, function () {} );
console.log( $( this ).attr( "id" ) + " over." );
} );
$( "#fcwContainer" ).mouseleave( function ()
{
$( this ).animate( {opacity : 0.25}, 250, function () {} );
console.log( $( this ).attr( "id" ) + " out." );
} );
$( "#vse_fcwX" ).click( function ()
{
$( "body" ).removeClass( "noscroll" );
$( "#vse_fullCurrentWindowModal" ).remove();
} );
vse.flowplayerProperties = {height : $( "body" ).height(), width : "100vw"};
console.log( vse.flowplayerProperties );
vse.fn.injectPlayer( "#vse_fullCurrentWindowModal" );
$( window ).resize( function ()
{
$( "#vse_iframe_container" ).width( $( "body" ).width() );
} );
},
launchPlayer : function ()
{
var html = $( "#vse_iframe_container" ).html();
var h = vse.flowplayerProperties.height;
var w = vse.flowplayerProperties.width;
var llString = "";
if ( vse.user.config.launchLite == true )
{
var llString = "menubar=false, toolbar=false, height=" + h + ", width=" + w + "";
}
var vsePlayerWindow = window.open( "", "vse_fp_playerWindow_" + Math.random(), llString );
var favicon = 'data:image/png;base64,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';
vsePlayerWindow.document.write( html );
$( vsePlayerWindow.document ).find( "head" )
.append( "<style></style><title></title>" )
.append( '<link rel="icon" type="image/png" href="' + favicon + '">' );
$( vsePlayerWindow.document ).find( "style" ).append( " body { max-width:100%; max-height:100%; width:100%; height:100%; padding:0px; margin:0px; background-color:#000000; } " );
$( vsePlayerWindow.document ).find( "style" ).append( " #fpFrame { max-width:100%; max-height:100%; width:100%; height:100%; padding:0px; margin:0px; position:absolute; bottom:0px; right:0px; } " );
$( vsePlayerWindow.document ).find( "title" ).text( vse.video.title );
$( "#vse_iframe_container" ).html( "" );
},
getSite : function ()
{
var userCL = tusl.location.tld();
for (var key in vse.domains)
{
if ( vse.domains.hasOwnProperty( key ) )
{
var obj = vse.domains[ key ];
if ( userCL.indexOf( obj ) != -1 )
{
vse.on = key;
}
}
}
},
updateConfig : function ()
{
GM_setValue( "vse_settings", JSON.stringify( vse.user.config ) );
},
getMimeType : function (url)
{
var dfd = jQuery.Deferred();
console.log( "Retrieving mime-type for: " );
console.log( url );
GM_xmlhttpRequest(
{
url : url,
method : "HEAD",
timeout : 5000,
onload : function (response)
{
var headers = response.responseHeaders;
headers = headers.split( "\r\n" );
console.log( headers );
for (var i = 0 ; i < headers.length ; i++)
{
if ( (headers[ i ].search( /((?!x-)(content\-type)(?!-options))/i ) != -1) )
{
var vidTitle = headers[ i ].split( ": " )[ 1 ];
if ( vidTitle.includes( "application/octet-stream, " ) )
{
vidTitle = vidTitle.replace( "application/octet-stream, ", "" );
}
vse.video.type = vidTitle;
console.log( vse.video.type );
dfd.resolve();
}
}
},
ontimeout : function ()
{
console.log( "Unable to determine MimeType. Attempting to proceed..." );
vse.video.type = "";
dfd.resolve();
}
} );
return dfd.promise();
},
launchConfig : function ()
{
var isOpen = $( "#vse_config_modal" ).dialog( "isOpen" );
if ( isOpen )
{
$( "#vse_config_modal" ).dialog( "close" );
}
else
{
$( "#vse_config_modal" ).dialog( "open" );
if ( vse.user.config.autoplay )
{
$( "#vse_config_autoplay" ).prop( "checked", true );
}
else
{
$( "#vse_config_autoplay" ).prop( "checked", false );
}
if ( vse.user.config.launch )
{
$( "#vse_config_launch" ).prop( "checked", true );
}
else
{
$( "#vse_config_launch" ).prop( "checked", false );
}
if ( vse.user.config.launchLite )
{
$( "#vse_config_launchLite" ).prop( "checked", true );
}
else
{
$( "#vse_config_launchLite" ).prop( "checked", false );
}
if ( vse.user.config.fullCurrentWindow )
{
$( "#vse_config_fullCurrentWindow" ).prop( "checked", true );
}
else
{
$( "#vse_config_fullCurrentWindow" ).prop( "checked", false );
}
$( "#vse_config_hopForwardLength" ).val( vse.user.config.hopForwardLength );
$( "#vse_config_hopBackwardLength" ).val( vse.user.config.hopBackwardLength );
$( "#vse_config_skipForwardLength" ).val( vse.user.config.skipForwardLength );
$( "#vse_config_skipBackwardLength" ).val( vse.user.config.skipBackwardLength );
$( "#vse_config_jumpForwardLength" ).val( vse.user.config.jumpForwardLength );
$( "#vse_config_jumpBackwardLength" ).val( vse.user.config.jumpBackwardLength );
}
},
prepConfig : function ()
{
// Add jQueryUI stylesheet to the document head.
$( "head" ).append( jqui );
// Add Flexbox Grid stylesheet to the document head.
$( "head" ).append( fbgrid );
// Create basic VSE config window structure.
$( "body" ).append( '<div id="vse_config_modal" title="Video Streaming Enhanced"></div>' );
$( "#vse_config_modal" ).append( '<div id="vse_config_tabs"></div>' );
$( "#vse_config_tabs" ).append( '<ul id="vse_config_tabsUL"></ul>' );
$( "#vse_config_tabsUL" ).append( '<li><a href="#vse_config_playerSettings">Player Settings</a></li>' );
$( "#vse_config_tabsUL" ).append( '<li><a href="#vse_config_supportedSites">Supported Sites</a></li>' );
$( "#vse_config_tabsUL" ).append( '<li><a href="#vse_config_about">About</a></li>' );
$( "#vse_config_tabs" ).append( '<div id="vse_config_playerSettings"></div>' );
$( "#vse_config_tabs" ).append( '<div id="vse_config_supportedSites"></div>' );
$( "#vse_config_tabs" ).append( '<div id="vse_config_about"></div>' );
// Player Settings
$( "#vse_config_playerSettings" ).append( '<div class="row"><div class="col-xs-5">Autoplay: </div><div class="col-xs-7"><input name="vse_config_autoplay" id="vse_config_autoplay" type="checkbox"></div></div>' );
$( "#vse_config_playerSettings" ).append( '<div class="row"><div class="col-xs-5">Launch player in new window: </div><div class="col-xs-7"><input name="vse_config_launch" id="vse_config_launch" type="checkbox"></div></div>' );
$( "#vse_config_playerSettings" ).append( '<div class="row"><div class="col-xs-5">Lightweight Launch Window: </div><div class="col-xs-7"><input name="vse_config_launchLite" id="vse_config_launchLite" type="checkbox"></div></div>' );
$( "#vse_config_playerSettings" ).append( `<div class="row"><div class="col-xs-5">Fullscreen Current Window: </div><div class="col-xs-7">
<input name="vse_config_fullCurrentWindow" id="vse_config_fullCurrentWindow" type="checkbox"></div></div>` );
$( "#vse_config_playerSettings" ).append( '<div class="row"><div class="col-xs-5">Hop Forward Length: </div><div class="col-xs-7"><input name="vse_config_hopForwardLength" value="" id="vse_config_hopForwardLength" type="text"> seconds</div></div>' );
$( "#vse_config_playerSettings" ).append( '<div class="row"><div class="col-xs-5">Hop Backward Length: </div><div class="col-xs-7"><input name="vse_config_hopBackwardLength" value="" id="vse_config_hopBackwardLength" type="text"> seconds</div></div>' );
$( "#vse_config_playerSettings" ).append( '<div class="row"><div class="col-xs-5">Skip Forward Length: </div><div class="col-xs-7"><input name="vse_config_skipForwardLength" value="" id="vse_config_skipForwardLength" type="text"> seconds</div></div>' );
$( "#vse_config_playerSettings" ).append( '<div class="row"><div class="col-xs-5">Skip Backward Length: </div><div class="col-xs-7"><input name="vse_config_skipBackwardLength" value="" id="vse_config_skipBackwardLength" type="text"> seconds</div></div>' );
$( "#vse_config_playerSettings" ).append( '<div class="row"><div class="col-xs-5">Jump Forward Length: </div><div class="col-xs-7"><input name="vse_config_jumpForwardLength" value="" id="vse_config_jumpForwardLength" type="text"> seconds</div></div>' );
$( "#vse_config_playerSettings" ).append( '<div class="row"><div class="col-xs-5">Jump Backward Length: </div><div class="col-xs-7"><input name="vse_config_jumpBackwardLength" value="" id="vse_config_jumpBackwardLength" type="text"> seconds</div></div>' );
$( "#vse_config_playerSettings" ).append( '<br /><br />' );
$( "#vse_config_playerSettings" ).append( '<input id="vse_config_save" type="button" value="Save"> ' );
$( "#vse_config_playerSettings" ).append( '<input id="vse_config_cancel" type="button" value="Cancel"> ' );
// Supported Sites
$( "#vse_config_supportedSites" ).append( "kissanime.ru<br />" );
$( "#vse_config_supportedSites" ).append( "kimcartoon.me<br />" );
$( "#vse_config_supportedSites" ).append( "PornHub.com<br />" );
$( "#vse_config_supportedSites" ).append( "GorillaVid.in<br />" );
$( "#vse_config_supportedSites" ).append( "XVideos.com (Launched Player Only)<br />" );
$( "#vse_config_supportedSites" ).append( "XMovies8.org<br />" );
$( "#vse_config_supportedSites" ).append( "vse.codingtoby.com (Choose the URL of a video file to stream.)<br />" );
$( "#vse_config_supportedSites" ).append( "<br /><br />" );
$( "#vse_config_supportedSites" ).append( "Support for new sites can be added on demand." );
// About
$( "#vse_config_about" ).append( '<span style="font-size: 2em;">Video Streaming Enhanced</span><br /><br />' );
$( "#vse_config_about" ).append( '<strong>Version:</strong> ' + vse.version + "<br />" );
$( "#vse_config_about" ).append( '<strong>Author:</strong> <a href="http://codingtoby.com" target="_blank" style="color:#6666FF">Toby</a><br />' );
$( "#vse_config_about" ).append( '<strong>Updates:</strong> <a href="https://openuserjs.org/scripts/Tobias.Kelmandia/Video_Streaming_Enhanced" target="_blank" style="color:#6666FF">OpenUserJS</a><br />' );
$( "#vse_config_about" ).append( '<strong>Other Links:</strong>' );
$( "#vse_config_about" ).append( '<ul>' );
$( "#vse_config_about" ).append( '<li><a href="http://codingtoby.com/category/userscripts/video-streaming-enhanced/vse-updates/" target="_blank" style="color:#6666FF">Changelog</a></li>' );
$( "#vse_config_about" ).append( '<li><a href="https://github.com/tobiaskelmandia/videoStreamingEnhanced" target="_blank" style="color:#6666FF">Github</a></li>' );
$( "#vse_config_about" ).append( '</ul>' );
// Make sure the seek lengths are numerical.
function validateNumber(id)
{
var str = $( "#" + id ).val();
if ( /^\s*\d+\s*$/.test( str ) )
{
// Everything's fine.
}
else if ( str == "" )
{
$( "#" + id ).val( "0" );
}
else
{
var trueName = id.replace( "vse_config_", "" );
$( "#" + id ).val( vse.user.config[ trueName ] );
}
}
$( '#vse_config_hopForwardLength' ).keyup( function ()
{
validateNumber( "vse_config_hopForwardLength" )
} );
$( '#vse_config_hopBackwardLength' ).keyup( function ()
{
validateNumber( "vse_config_hopBackwardLength" )
} );
$( '#vse_config_skipForwardLength' ).keyup( function ()
{
validateNumber( "vse_config_skipForwardLength" )
} );
$( '#vse_config_skipBackwardLength' ).keyup( function ()
{
validateNumber( "vse_config_skipBackwardLength" )
} );
$( '#vse_config_jumpForwardLength' ).keyup( function ()
{
validateNumber( "vse_config_jumpForwardLength" )
} );
$( '#vse_config_jumpBackwardLength' ).keyup( function ()
{
validateNumber( "vse_config_jumpBackwardLength" )
} );
vse.status.winWidth = parseInt( $( w ).width() );
vse.status.winHeight = parseInt( $( w ).height() );
// Initialize modal.
$( "#vse_config_modal" ).dialog( {
autoOpen : false,
modal : true,
width : vse.status.winWidth - 20,
height : vse.status.winHeight - 20,
resizable : false,
draggable : false
} );
// Initialize tabs.
$( function ()
{
$( "#vse_config_tabs" ).tabs();
} );
// Resize the modal when the window is resized.
$( window ).resize( function ()
{
vse.status.winWidth = parseInt( $( w ).width() );
vse.status.winHeight = parseInt( $( w ).height() );
$( ".ui-dialog" ).css( "width", vse.status.winWidth - 20 );
$( ".ui-dialog" ).css( "height", vse.status.winHeight - 20 );
} );
// Buttons
$( "#vse_config_save" ).click( function ()
{
if ( $( "#vse_config_autoplay" ).prop( "checked" ) )
{
vse.user.config.autoplay = true;
}
else
{
vse.user.config.autoplay = false;
}
if ( $( "#vse_config_launch" ).prop( "checked" ) )
{
vse.user.config.launch = true;
}
else
{
vse.user.config.launch = false;
}
if ( $( "#vse_config_launchLite" ).prop( "checked" ) )
{
vse.user.config.launchLite = true;
}
else
{
vse.user.config.launchLite = false;
}
if ( $( "#vse_config_fullCurrentWindow" ).prop( "checked" ) )
{
vse.user.config.fullCurrentWindow = true;
}
else
{
vse.user.config.fullCurrentWindow = false;
}
vse.user.config.hopForwardLength = parseInt( $( "#vse_config_hopForwardLength" ).val() );
vse.user.config.hopBackwardLength = parseInt( $( "#vse_config_hopBackwardLength" ).val() );
vse.user.config.skipForwardLength = parseInt( $( "#vse_config_skipForwardLength" ).val() );
vse.user.config.skipBackwardLength = parseInt( $( "#vse_config_skipBackwardLength" ).val() );
vse.user.config.jumpForwardLength = parseInt( $( "#vse_config_jumpForwardLength" ).val() );
vse.user.config.jumpBackwardLength = parseInt( $( "#vse_config_jumpBackwardLength" ).val() );
vse.fn.updateConfig();
$( "#vse_config_modal" ).dialog( "close" );
} );
$( "#vse_config_cancel" ).click( function ()
{
$( "#vse_config_modal" ).dialog( "close" );
} );
}
};
vse.fn.siteSpecific =
{
kissAnime : {
cleanupLayout : function ()
{
var iframeIDList = [],
vse_hiddenCSS = "height:1px; width:1px; bottom:0; right:0; background-color:black;",
vse_hidden_containerCSS = "bottom:0px; right:0px; height:2px; width:100%;";
$( document ).ready( function ()
{
$( "body" ).css( "overflow-x", "hidden" );
$( "head" ).append( "<style id='vse_style'></style>" );
$( "#vse_style" ).append( ".vse_hidden { " + vse_hiddenCSS + " }" );
$( "#vse_style" ).append( ".vse_hidden_container { " + vse_hidden_containerCSS + " }" );
$( "label.lbl" ).each( function ()
{
var lbltxt = $( this ).text();
lbltxt = lbltxt.trim();
$( this ).text( lbltxt );
} );
// Allow AdBlock to run on KissAnime. (Fools detection.)
$( "iframe" ).each( function ()
{
var tempID = $( this ).prop( "id" );
iframeIDList.push( tempID );
} );
$( "body" ).append( "<div id='vse_hidden_container'></div>" );
iframeIDList.forEach( function (currentValue, index, array)
{
$( "#" + currentValue ).remove();
$( "#vse_hidden_container" ).append( "<div id='" + currentValue + "' class='vse_hidden'> . </div>" );
} );
if ( !$( '#adsIfrme10' ).is( ":visible" ) )
{
console.log( "Problem!" );
}
else
{
console.log( "No problem!" );
}
// Remove extraneous elements that crowd the page.
$( "#container" ).find( ".clear" ).each( function ()
{
$( this ).remove();
} );
$( "#container" ).find( ".clear2" ).each( function ()
{
$( this ).remove();
} );
$( ".divCloseBut" ).each( function ()
{
$( this ).remove();
} );
setTimeout( function ()
{
unsafeWindow.isBlockAds2 = false;
console.log( "Setting isBlockAds2 = false" );
}, 45000 );
if ( !vse.user.config.fullCurrentWindow && !vse.user.config.debugFCW )
{
// Scroll to the player area.
var scrollTo = $( "#selectEpisode" ).offset().top;
$( 'html, body' ).animate( {scrollTop : scrollTo}, 300 );
}
} );
$( w ).load( function ()
{
$( "iframe" ).each( function ()
{
if ( $( this ).attr( "id" ) != "vse_fp_iframe" )
{
$( this ).remove();
}
} );
} );
},
getVideoURL : function ()
{
//var video_URL = $( "#my_video_1_html5_api" ).prop( "src" );
/*
var qualArr = [];
$( '#slcQualix' ).children().each( function ()
{
qualArr.push( $( this ).val() );
} );
var srcArr = [];
qualArr.forEach( function (currentValue, index, array)
{
srcArr.push( unsafeWindow.ovelWrap( currentValue ) );
} );
console.log("SrcArr = ");
console.log( srcArr );
var video_URL = srcArr[0];
*/
var dfd = jQuery.Deferred();
var video_URL = "";
var vidSvr = $("#selectServer").find(":selected").text();
if(vidSvr == "KissAnime")
{
var video_URL = $( "#my_video_1_html5_api" ).prop( "src" );
vse.video.url = video_URL;
dfd.resolve();
}
else if(vidSvr == "RapidVideo")
{
var rv = $( "iframe[src*='rapidvideo']" );
var rvurl = $(rv).attr("src");
var rvsrc = "";
var rvtemp = "";
var rvobj = "";
console.log(rvurl);
GM_xmlhttpRequest({
method: "GET",
url: rvurl,
onload: function(response) {
rvsrc = response.responseText;
rvtemp = rvsrc.split("sources")[1];
rvtemp = rvtemp.split("]")[0];
rvtemp += "]";
rvtemp = rvtemp.split("[")[1];
rvtemp = "[" + rvtemp;
rvobj = JSON.parse(rvtemp);
var rvl = rvobj.length - 1;
console.log(rvobj[rvl].file);
video_URL = rvobj[rvl].file;
vse.video.url = video_URL;
dfd.resolve();
}
});
}
return dfd.promise();
},
init : function ()
{
console.log( "Running on KissAnime." );
vse.video.sourceLocation = "kissAnime";
vse.user.config.debugFCW = true;
console.log( "Debug: Using Full Screen Current Window." );
$( document ).ready( $.proxy( function ()
{
this.cleanupLayout();
var videoTitle = $( "title" ).text();
videoTitle = tusl.replaceAll( videoTitle, "\n", "" );
videoTitle = videoTitle.split( " - Watch " )[ 0 ];
videoTitle = videoTitle.replace( /\s\s+/g, ' ' );
videoTitle = videoTitle.trim();
vse.video.title = videoTitle;
$("title").text(vse.video.title);
vse.video.srcLoc = "kissAnime";
$.when( this.getVideoURL() ).then( function ()
{
vse.flowplayerProperties = vse.fn.getElementProperties( "#my_video_1_html5_api" );
var oldContainer = $( "#divContentVideo" ).children()[ 0 ];
$( oldContainer ).remove();
$.when( vse.fn.getMimeType( vse.video.url ) ).then( function ()
{
GM_setValue( "vse_videoInfo", JSON.stringify( vse.video ) );
console.log( GM_getValue( "vse_videoInfo" ) );
// Always use FCW on KissAnime for now...
console.log( "Debug: Using Full Current Window." );
// if ( vse.user.config.fullCurrentWindow )
if ( vse.user.config.fullCurrentWindow || vse.user.config.debugFCW )
{
vse.fn.injectFullCurrentWindowPlayer();
}
else
{
vse.fn.injectPlayer( "#divContentVideo" );
$( "#centerDivVideo" ).css( "margin-top", "10px" );
$( "#centerDivVideo" ).css( "margin-bottom", "10px" );
if ( vse.user.config.launch )
{
vse.fn.launchPlayer();
}
}
} );
} );
}, this ) );
}
},
kimCartoon : {
cleanupLayout : function ()
{
var iframeIDList = [],
vse_hiddenCSS = "height:1px; width:1px; bottom:0; right:0; background-color:black;",
vse_hidden_containerCSS = "bottom:0px; right:0px; height:2px; width:100%;";
$( document ).ready( function ()
{
$( "body" ).css( "overflow-x", "hidden" );
$( "head" ).append( "<style id='vse_style'></style>" );
$( "#vse_style" ).append( ".vse_hidden { " + vse_hiddenCSS + " }" );
$( "#vse_style" ).append( ".vse_hidden_container { " + vse_hidden_containerCSS + " }" );
$( "label.lbl" ).each( function ()
{
var lbltxt = $( this ).text();
lbltxt = lbltxt.trim();
$( this ).text( lbltxt );
} );
if ( !vse.user.config.fullCurrentWindow && !vse.user.config.debugFCW )
{
// Scroll to the player area.
var scrollTo = $( "#selectEpisode" ).offset().top;
$( 'html, body' ).animate( {scrollTop : scrollTo}, 300 );
}
} );
$( w ).load( function ()
{
$( "iframe" ).each( function ()
{
if ( $( this ).attr( "id" ) != "vse_fp_iframe" )
{
$( this ).remove();
}
} );
} );
},
getVideoURL : function ()
{
var video_URL = $( "#my_video_1_html5_api" ).prop( "src" );
var qualArr = [];
$( '#selectQuality' ).children().each( function ()
{
qualArr.push( $( this ).val() );
} );
var srcArr = [];
qualArr.forEach( function (currentValue, index, array)
{
srcArr.push( unsafeWindow.$kissenc.decrypt( currentValue ) );
} );
console.log( srcArr );
//var testvar = unsafeWindow.asp.wrap();
return video_URL;
},
init : function ()
{
console.log( "Running on kimCartoon." );
vse.video.sourceLocation = "kimCartoon";
vse.user.config.debugFCW = true;
console.log( "Debug: Using Full Screen Current Window." );
$( document ).ready( $.proxy( function ()
{
this.cleanupLayout();
vse.video.url = this.getVideoURL();
var videoTitle = $( "title" ).text();
videoTitle = videoTitle.split( "- Watch" )[ 0 ];
videoTitle = videoTitle.trim();
videoTitle = tusl.replaceAll( videoTitle, "\n", " - " );
videoTitle = videoTitle.replace( /\s\s+/g, ' ' );
videoTitle = videoTitle.trim();
vse.video.title = videoTitle;
$("title").text(vse.video.title);
vse.video.srcLoc = "kimCartoon";
vse.flowplayerProperties = vse.fn.getElementProperties( "#my_video_1_html5_api" );
var oldContainer = $( "#divContentVideo" ).children()[ 0 ];
$( oldContainer ).remove();
$.when( vse.fn.getMimeType( vse.video.url ) ).then( function ()
{
GM_setValue( "vse_videoInfo", JSON.stringify( vse.video ) );
console.log( GM_getValue( "vse_videoInfo" ) );
// Always use FCW on KissAnime for now...
console.log( "Debug: Using Full Current Window." );
// if ( vse.user.config.fullCurrentWindow )
if ( vse.user.config.fullCurrentWindow || vse.user.config.debugFCW )
{
vse.fn.injectFullCurrentWindowPlayer();
}
else
{
vse.fn.injectPlayer( "#divContentVideo" );
$( "#centerDivVideo" ).css( "margin-top", "10px" );
$( "#centerDivVideo" ).css( "margin-bottom", "10px" );
if ( vse.user.config.launch )
{
vse.fn.launchPlayer();
}
}
} );
}, this ) );
}
},
pornhub : {
cleanupLayout : function ()
{
var here = w.location.href;
$( document ).ready( function ()
{
$( "#PornhubNetworkBar" ).hide();
$( "#welcome" ).remove();
$( "p.footer" ).remove();
$( ".footer-title" ).remove();
$( "section#footer" ).remove();
$( ".logoFooterWrapper" ).remove();
$( "#header" ).css( "padding-bottom", "5px" );
if ( (here.indexOf( "video/" ) != -1) || (here == "http://www.pornhub.com/video") )
{
var hardcoreVidsFromFriends = $( "h2:contains('Hardcore Videos from Our Friends')" ).parent().parent()[ 0 ];
$( hardcoreVidsFromFriends ).remove();
var popPhotoResults = $( "h2:contains('Popular Photos Results')" ).parent().parent()[ 0 ];
$( popPhotoResults ).remove();
var relatedSearch = $( "h2:contains('Searches Related to')" ).parent().parent()[ 0 ];
$( relatedSearch ).remove();
var ps = $( ".section_title:contains('Pornstars')" ).parent();
$( ps ).next().hide();
$( ps ).hide();
var pagination = $( ".pagination3" )[ 0 ];
$( pagination ).find( "a" ).each( function ()
{
var thisLink = $( this ).prop( "href" );
thisLink = tusl.replaceAll( thisLink, "++", "+%2b" );
thisLink = tusl.replaceAll( thisLink, "=+", "=%2b" );
$( this ).prop( "href", thisLink );
} );
$( pagination ).css( {position : "relative", float : "right"} );
var pagi = $( ".pagination3" ).prop( "outerHTML" );
$( pagination ).remove();
$( ".nf-videos" ).find( ".sectionWrapper" ).after().append( pagi );
$( "head" ).append( "<style>.nf-videos { width: calc(100% - 250px) !important; } </style>" );
}
else if ( here.indexOf( "view_video.php?viewkey=" ) != -1 )
{
$( "#hd-rightColVideoPage" ).children().each( function ()
{
if ( !($( this ).hasClass( "section-relateds" )) && !($( this ).hasClass( "reset" )) )
{
$( this ).remove();
}
} );
$( ".abovePlayer" ).remove();
}
} );
$( w ).load( function ()
{
console.log( "late cleanup" );
$( "#abAlertClose" ).click();
var abwl = $( ".adblockWhitelisted" ).parentsUntil( "div" ).each( function ()
{
$( this ).remove();
} );
$( ".adblockWhitelisted" ).parent().remove();
$( "figure" ).remove();
$( "aside" ).remove();
$( ".noAdsWhiteListed" ).remove();
$( ".ad-link" ).remove();
$( ".removeAdLink" ).remove();
$( 'span[class=""]' ).each( function ()
{
if ( $( this ).text().trim() == "" )
{
$( this ).remove();
}
} );
$( "div" ).each( function ()
{
if ( ($( this ).text().trim() == "") && ( ($( this ).css( "backgroundImage" ) != "") || ($( this ).css( "backgroundColor" ) != "") ) )
{
$( this ).hide();
}
} );
} );
},
getVideoURL : function ()
{
var dfd = jQuery.Deferred();
$( document ).ready( function ()
{
var fv = $( document ).find( "script:contains('flashvars')" )[ 0 ];
fv = $( fv ).prop( "innerHTML" );
//console.log(fv);
var pqarr = fv.split( "var player_quality_" );
var pql = pqarr.length;
var lastSource = pqarr[ pql - 1 ];
pqarr[ pql - 1 ] = lastSource.split( "flashvars_" )[ 0 ];
var sources = {};
for (i = 1 ; i < pqarr.length ; i++)
{
var srcStr = pqarr[ i ];
var src = srcStr.split( " = " );
var quality = src[ 0 ];
var url = src[ 1 ];
url = tusl.replaceAll( url, "'", "" );
url = tusl.replaceAll( url, ";", "" );
sources[ "q_" + quality ] = url;
}
if ( sources.q_720p )
{
console.log( "720p: " + sources.q_720p );
vse.video.url = sources.q_720p;
dfd.resolve();
}
else if ( sources.q_480p )
{
console.log( "480p: " + sources.q_480p );
vse.video.url = sources.q_480p;
dfd.resolve();
}
else if ( sources.q_360p )
{
console.log( "360p: " + sources.q_360p );
vse.video.url = sources.q_360p;
dfd.resolve();
}
else if ( sources.q_240p )
{
console.log( "240p: " + sources.q_240p );
vse.video.url = sources.q_240p;
dfd.resolve();
}
} );
return dfd.promise();
},
init : function ()
{
console.log( "Running on PornHub." );
vse.video.sourceLocation = "pornhub";
$( document ).ready( $.proxy( function ()
{
this.cleanupLayout();
var here = w.location.href;
if ( here.indexOf( "view_video.php?viewkey=" ) != -1 )
{
var videoTitle = $( "title" ).text();
videoTitle = tusl.replaceAll( videoTitle, "\n", "" );
videoTitle = videoTitle.split( " - Pornhub.com" )[ 0 ];
vse.video.title = videoTitle;
vse.flowplayerProperties = vse.fn.getElementProperties( "#player" );
var oldContainer = $( ".playerFlvContainer" );
$( oldContainer ).remove();
$.when( this.getVideoURL() ).then( function ()
{
$.when( vse.fn.getMimeType( vse.video.url ) ).then( function ()
{
GM_setValue( "vse_videoInfo", JSON.stringify( vse.video ) );
console.log( GM_getValue( "vse_videoInfo" ) );
vse.fn.injectPlayer( "#player" );
if ( vse.user.config.launch )
{
vse.fn.launchPlayer();
}
} );
} );
}
}, this ) );
}
},
xvideos : {
getVideoURL : function ()
{
var videoEmbed = $( "#player" );
var vserc = $( videoEmbed ).html();
var fs = vserc.split( "flashvars=\"" )[ 1 ];
fs = fs.split( "\"" )[ 0 ];
var videoURL = fs.split( "flv_url=" )[ 1 ];
videoURL = videoURL.split( "&" )[ 0 ];
vse.video.url = decodeURIComponent( videoURL );
},
init : function ()
{
vse.video.sourceLocation = "xvideos";
console.log( "Running on XVideos." );
$( document ).ready( $.proxy( function ()
{
this.getVideoURL();
var videoTitle = $( "title" ).text();
videoTitle = tusl.replaceAll( videoTitle, "\n", "" );
videoTitle = videoTitle.split( " - XVIDEOS.COM" )[ 0 ];
vse.video.title = videoTitle;
vse.flowplayerProperties = vse.fn.getElementProperties( "#player" );
var oldContainer = $( "#player" );
$( oldContainer ).remove();
$( "#content" ).prepend( "<div id='newPlayer'></div>" );
$.when( vse.fn.getMimeType( vse.video.url ) ).then( function ()
{
GM_setValue( "vse_videoInfo", JSON.stringify( vse.video ) );
console.log( GM_getValue( "vse_videoInfo" ) );
vse.fn.injectPlayer( "#newPlayer" );
// CSP prevents inline video, so always launch in a new window.
vse.fn.launchPlayer();
} );
}, this ) );
}
},
gorillavid : {
getVideoURL : function ()
{
// handled by prepwork
},
prepwork : function ()
{
var dfd = jQuery.Deferred();
$( document ).ready( function ()
{
if ( $( '#btn_download' ).length > 0 )
{
for (i = 0 ; i < 100 ; i++)
{
window.clearTimeout( i );
}
console.log( "Timeouts cleared." );
var realForm = $( "form" )[ 1 ];
$( realForm ).attr( "id", "realForm" );
//console.log($('#btn_download'));
$( '#btn_download' ).prop( "disabled", false );
$( '#btn_download' ).val( 'Continue' );
$( "#realForm" ).submit();
//$('#btn_download').click();
}
else
{
let jwpWait = setInterval(function()
{
if($("video".length == 1))
{
vse.video.url = $("video" ).attr("src");
vse.flowplayerProperties = vse.fn.getElementProperties( ".pic-big" );
vse.video.title = "";
console.log( "Loading video:" );
console.log( vse.video.url );
clearInterval(jwpWait);
dfd.resolve();
}
},500);
}
} );
return dfd.promise();
},
init : function ()
{
vse.video.sourceLocation = "gorillaVid";
console.log( "Running on GorillaVid." );
$( document ).ready( $.proxy( function ()
{
$.when( this.prepwork() ).then( $.proxy( function ()
{
var oldContainer = $( ".pic-big" );
$( oldContainer ).remove();
$( ".c1-box" ).prepend( "<div id='newPlayer'></div>" );
$.when( vse.fn.getMimeType( vse.video.url ) ).then( function ()
{
// Parse the video title.
var temp = $( ".tabbertab.tabbertabhide" ).find( "textarea" );
temp = $( temp[ 1 ] ).prop( 'outerHTML' );
if ( temp.startsWith( "[" ) )
{
temp = temp.split( "]" )[ 1 ];
temp = temp.split( "[" )[ 0 ];
temp = temp.replace( /(( \- )+([0-9]?\.[0-9]+|[0-9]+)+( MB))/gi, "" );
temp = temp.trim();
console.log( temp );
vse.video.title = temp;
}
else if ( temp.startsWith( "<" ) )
{
temp = temp.split( ">" )[ 1 ];
temp = temp.split( "<" )[ 0 ];
temp = temp.replace( /(( \- )+([0-9]?\.[0-9]+|[0-9]+)+( MB))/gi, "" );
temp = temp.trim();
console.log( temp );
vse.video.title = temp;
}
else
{
vse.video.title = "Video Streaming Enhanced";
}
GM_setValue( "vse_videoInfo", JSON.stringify( vse.video ) );
console.log( GM_getValue( "vse_videoInfo" ) );
vse.fn.injectPlayer( "#newPlayer" );
if ( vse.user.config.launch )
{
vse.fn.launchPlayer();
setTimeout(function()
{
window.close();
},2000);
}
} );
}, this ) );
}, this ) );
}
},
vseCustom : {
init : function ()
{
vse.video.sourceLocation = "vseCustom";
console.log( "Running on: VSE Custom" );
vse.video.title = "";
vse.flowplayerProperties = vse.fn.getElementProperties( "#playerContainer" );
$( "#loadButton" ).click( function ()
{
vse.video.url = $( "#videoURL" ).val();
vse.video.title = $( "#videoTitle" ).val();
$( "title" ).text( "VSE - " + vse.video.title );
console.log( "Loading: " + vse.video.url );
$.when( vse.fn.getMimeType( vse.video.url ) ).then( function ()
{
GM_setValue( "vse_videoInfo", JSON.stringify( vse.video ) );
console.log( GM_getValue( "vse_videoInfo" ) );
vse.fn.injectPlayer( "#playerContainer" );
if ( vse.user.config.launch )
{
vse.fn.launchPlayer();
}
} );
} );
}
},
xMovies : {
init : function ()
{
vse.video.sourceLocation = "xMovies";
console.log( "Running on xMovies." );
$( document ).ready( function ()
{
var video_id = w.location.href.split( "v=" )[ 1 ];
video_id = video_id.split( "#" )[ 0 ];
//console.log(video_id);
$.post( '/video_info/iframe', {
v : video_id
}, function (data)
{
//console.log(data);
var videoStreams = [];
var vj = JSON.parse( data );
$.each( vj, function (k, v)
{
videoStreams.push( v );
} );
var numOpts = videoStreams.length - 1;
var defaultQuality = "https:" + videoStreams[ numOpts ];
var dq = defaultQuality.split( "https://html5player.org/embed?url=" )[ 1 ];
dq = decodeURIComponent( dq );
//console.log(dq);
vse.video.url = dq;
vse.video.title = $( "div.title" ).find( "h1" ).text().trim();
vse.flowplayerProperties = vse.fn.getElementProperties( "div.player_container" );
//console.log(vse.flowplayerProperties);
$( "div.player_container" ).before( "<div id='vse_newPlayerContainer'></div>" );
$( "div.player_container" ).remove();
$.when( vse.fn.getMimeType( vse.video.url ) ).then( function ()
{
GM_setValue( "vse_videoInfo", JSON.stringify( vse.video ) );
console.log( GM_getValue( "vse_videoInfo" ) );
vse.fn.injectPlayer( "#vse_newPlayerContainer" );
if ( vse.user.config.launch )
{
vse.fn.launchPlayer();
}
} );
} );
} );
}
}
};
vse.init = function ()
{
if ( GM_getValue( "vse_settings" ) )
{
var vse_settings = GM_getValue( "vse_settings" );
vse.user.config = JSON.parse( vse_settings );
}
$( document ).ready( function ()
{
vse.fn.getSite();
if ( (window.top == window.self) && (w.location.href != vse.flowplayer) )
{
vse.fn.siteSpecific[ vse.on ].init();
vse.fn.prepConfig();
$( document ).keydown( function (e)
{
var metaKeyPressed = e.ctrlKey || e.metaKey || e.altKey,
key = e.which;
if ( !e.shiftKey && !metaKeyPressed )
{
switch (key)
{
case 192: // Grave accent key will now open the Video Streaming Enhanced config modal.
vse.fn.launchConfig();
break;
}
}
} );
}
else if ( (window.top == window.self) && (w.location.href == vse.flowplayer) )
{
// do nothing
}
else
{
if ( w.location.href == vse.flowplayer )
{
/**************************************************
** Flowplayer Specific
**************************************************/
console.log( "Running on Flowplayer." );
$( document ).ready( function ()
{
if ( GM_getValue( "vse_videoInfo" ) )
{
vse.video = JSON.parse( GM_getValue( "vse_videoInfo" ) );
GM_deleteValue( "vse_videoInfo" );
console.log( vse.video );
}
var dlName = encodeURIComponent( vse.video.title ),
fileFormat = "",
ap = "";
if ( vse.user.config.autoplay )
{
ap = " autoplay ";
}
if ( vse.video.type == "video/mp4" )
{
fileFormat = ".mp4";
}
else if ( vse.video.type = "video/flash" )
{
unsafeWindow.flowplayer.conf.bgcolor = "#000000";
fileFormat = ".flv";
}
// Replace existing body html with injected player.
var bodyElement = $( "body" );
$( bodyElement ).html( '<div id="vsePlayer" class="flowplayer" data-embed="false" data-key="$130763224349944" tabindex="-1"></div>' );
var playerElement = $( "#vsePlayer" );
var styleElement = $( "style" );
$( playerElement ).append( '<video data-title="' + vse.video.title + '"' + ap + '><source type="' + vse.video.type + '" src="'
+ vse.video.url + '"></video>' );
/**************************************************
** Reskin the stock commercial player.
**************************************************/
// Add google Material Icons webfont. (To fix broken myriad pro icons)
$( "head" ).append( '<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">' );
$( styleElement ).append( `
/* Adjust material icons class to match the help screen. */
.material-icons { font-size: 100% !important; line-height: 1.5 !important; }
/* Basic Styles */
body { background-color:#000000; margin:0px; padding:0px; height:100%; width:100%; max-height:100%; max-width:100%; }
.flowplayer { width:100%; height:100%; max-height:100%; max-width:100%; margin: auto; position: absolute; top: 0; left: 0; bottom: 0; right: 0; }
.flowplayer .fp-timeline { background-color: rgba(46, 46, 46, 1) }
.flowplayer .fp-progress { background-color: rgba(219, 0, 0, 1) }
.flowplayer .fp-buffer { background-color: rgba(249, 249, 249, 1) }
.flowplayer.is-mouseout .fp-ui { cursor: none !important; }
.flowplayer .fp-help .fp-help-basics { margin-top:3%; }
.fp-speed { display: none !important; }
/* Always use a black background for unused screen space. */
.flowplayer.is-ready .fp-player { background-color: #000; }
/* Enable timeline tooltip */
.flowplayer .fp-timeline:hover+.fp-timeline-tooltip { display:block; }
.is-touch.flowplayer .fp-timeline:hover+.fp-timeline-tooltip { display:block; }
/* Video Streaming Enhanced player config. */
.vse_config { height:100%; width:100%; background-color: rgba(51,51,51,0.9); left:0px; top:0px; margin:0px; color:#FFFFFF; position:absolute; }
.vse_config_main { margin-top:6%; padding-left:5%; position:relative; text-align:center; }
#vsePlayer:focus { outline:none; }
` + vseStyles + `
` );
/**************************************************
** Add the context menu.
**************************************************/
/*
$("#vsePlayer").append('<div class="fp-context-menu"><ul id="fpContextMenuList"></ul></div>');
$("#fpContextMenuList").append('<li><a id="fpCopyVideoURL" href="javascript:;">Copy Video URL to Clipboard</a></li>');
$("#fpCopyVideoURL").click(function ()
{
GM_setClipboard(vse.video.url);
$(".fp-context-menu").css("display", "none");
});
*/
/**************************************************
** Adjust flowplayer basic config.
**************************************************/
// Remove unnecessary rtmp object.
delete unsafeWindow.flowplayer.conf.rtmp;
// Enable fullscreen.
unsafeWindow.flowplayer.conf.fullscreen = true;
// Enable adaptive ratio.
unsafeWindow.flowplayer.conf.adaptiveRatio = true;
// Test keyboard disable
unsafeWindow.flowplayer.conf.keyboard = false;
// Initialize injected Flowplayer instance
var player = unsafeWindow.$( playerElement ).flowplayer();
// Flowplayer API shortcut variable
var FP = unsafeWindow.$( playerElement ).data( "flowplayer" );
// Wait until the player is ready.
FP.on( "ready", function ()
{
console.log( FP );
// Enable adaptive ratio.
unsafeWindow.flowplayer.conf.adaptiveRatio = true;
// Add double click to fullscreen support.
$( playerElement ).dblclick( function ()
{
FP.fullscreen();
} );
vse.fn.prepConfig();
$( document ).keydown( function (e)
{
var metaKeyPressed = e.ctrlKey || e.metaKey || e.altKey,
key = e.which;
if ( (!e.shiftKey && !metaKeyPressed) && key == 192 )
{
vse.fn.launchConfig();
}
} );
// Create Help Section
$( playerElement ).append( `
<div class="fp-help">
<div class="fp-help-section fp-help-basics">
<p>
<em>space</em>Play / Pause
</p>
<p>
<em>q</em>Unload | Stop
</p>
<p>
<em>f</em>Fullscreen
</p>
</div>
<div class="fp-help-section">
<p>
<em><i class="material-icons">arrow_upward</i></em><em><i class="material-icons">arrow_downward</i></em>Volume
</p>
<p>
<em>m</em>Mute
</p>
</div>
<div class="fp-help-section">
<p>
<em>shift</em> + <em><i class="material-icons">arrow_back</i></em>Hop Backwards ` + vse.user.config.hopBackwardLength + `s
</p>
<p>
<em>shift</em> + <em><i class="material-icons">arrow_forward</i></em>Hop Backwards ` + vse.user.config.hopForwardLength + `s
</p>
</div>
<div class="fp-help-section">
<p>
<em><i class="material-icons">arrow_back</i></em>Skip Backwards ` + vse.user.config.skipBackwardLength + `s
</p>
<p>
<em><i class="material-icons">arrow_forward</i></em>Skip Forwards ` + vse.user.config.skipForwardLength + `s
</p>
</div>
<div class="fp-help-section">
<p>
<em>ctrl</em> + <em><i class="material-icons">arrow_back</i></em>Jump Backwards ` + vse.user.config.jumpBackwardLength + `s
</p>
<p>
<em>ctrl</em> + <em><i class="material-icons">arrow_forward</i></em>Jump Forwards ` + vse.user.config.jumpForwardLength + `s
</p>
</div>
<div class="fp-help-section">
<p>
<em> . </em>Seek to Previous
</p>
<p>
<em>1</em><em>2</em> ... <em>6</em> seek to 10%, 20% ... 60%
</p>
</div>
<div class="fp-help-section vseKissAnimeOnly">
<p>
<em>alt</em> + <em><i class="material-icons">arrow_back</i></em>Previous Episode
</p>
<p>
<em>alt</em> + <em><i class="material-icons">arrow_forward</i></em>Next Episode
</p>
</div>
<div class="fp-help-section">
<p>
<em>/</em> Toggle Help
</p>
</div>
<div class="fp-help-section">
<p>
<em>`</em> Open Video Streaming Enhanced Config
</p>
</div>
</div>
` );
if ( vse.video.sourceLocation != "kissAnime" )
{
$( ".vseKissAnimeOnly" ).remove();
}
// Reconfigure Hotkeys
unsafeWindow.$( playerElement ).keydown( function (e)
{
var metaKeyPressed = e.ctrlKey || e.metaKey || e.altKey,
key = e.which;
if ( !e.shiftKey && !metaKeyPressed )
{
// Number Key Seeking
if ( key < 58 && key > 47 )
{
return FP.seekTo( key - 48 );
}
// Escape closes help menu
if ( key == 27 && $( playerElement ).hasClass( "is-help" ) )
{
$( playerElement ).toggleClass( "is-help" );
return false;
}
switch (key)
{
case 39: // Right arrow key will now skip forward by configured length.
FP.seek( FP.video.time + vse.user.config.hopForwardLength );
break;
case 37: // Left arrow key will now skip backwards by configured length.
FP.seek( FP.video.time - vse.user.config.hopBackwardLength );
break;
// Enable original controls to function without hover.
case 38: // Up Arrow will raise volume.
FP.volume( FP.volumeLevel + .1 );
break;
case 40: // Down Arrow will lower volume.
FP.volume( FP.volumeLevel - .1 );
break;
case 77: // 'm' key will toggle mute.
FP.mute();
break;
case 70: // 'f' key will toggle fullscreen.
FP.fullscreen();
break;
case 32: // Spacebar will toggle play/pause.
if ( FP.playing )
{
FP.pause();
break;
}
else
{
FP.play();
break;
}
case 81: // 'q' key will unload / stop.
FP.unload();
break;
case 191:
$( playerElement ).toggleClass( "is-help" );
default:
return;
}
}
if (e.shiftKey)
{
switch (key)
{
case 39: // Right arrow key will now skip forward by configured length.
FP.seek( FP.video.time + vse.user.config.skipForwardLength );
break;
case 37: // Left arrow key will now skip backwards by configured length.
FP.seek( FP.video.time - vse.user.config.skipBackwardLength );
break;
case 191:
$( playerElement ).toggleClass( "is-help" );
default:
return;
}
}
if ( e.ctrlKey )
{
switch (key)
{
case 39: // CTRL + Right arrow key will now jump forward by configured length.
FP.seek( FP.video.time + vse.user.config.jumpForwardLength );
break;
case 37: // CTRL + Left arrow key will now jump backwards by configured length.
FP.seek( FP.video.time - vse.user.config.jumpBackwardLength );
break;
default:
return;
}
}
if ( e.altKey )
{
if ( vse.video.prevLink && e.which == 37 )
{
FP.pause();
$( "body" ).append( `
<div class="vse_video_loading_new">
<span>Loading Previous Video...</span>
</div>
` );
setTimeout( function ()
{
window.top.location = vse.video.prevLink;
}, 1000 );
}
if ( vse.video.nextLink && e.which == 39 )
{
FP.pause();
$( "body" ).append( `
<div class="vse_video_loading_new">
<span>Loading Next Video...</span>
</div>
` );
setTimeout( function ()
{
window.top.location = vse.video.nextLink;
}, 1000 );
}
e.preventDefault();
}
// Slow Motion / Fast Forward
/*
if ( e.shiftKey )
{
if ( key == 39 ) FP.speed( true );
else if ( key == 37 )
{
FP.speed( false );
}
return;
}
*/
e.preventDefault();
} );
var rawPlayerElement = unsafeWindow.document.querySelector( "#vsePlayer" );
console.log( rawPlayerElement );
// IE9, Chrome, Safari, Opera
rawPlayerElement.addEventListener( "mousewheel", MouseWheelHandler, false );
// Firefox
rawPlayerElement.addEventListener( "DOMMouseScroll", MouseWheelHandler, false );
var wheelDirection = function (evt)
{
return (evt.detail < 0) ? 1 : (evt.wheelDelta > 0) ? 1 : -1;
};
function MouseWheelHandler(e)
{
var direction = wheelDirection( e );
if ( FP.muted )
{
FP.mute( false );
}
if ( direction == 1 )
{
FP.volume( FP.volumeLevel + 0.01 );
}
if ( direction == -1 )
{
FP.volume( FP.volumeLevel - 0.01 );
}
return false;
}
var fpscript = $( "head" ).find( "script" );
var fpsl = fpscript.length;
$( fpscript[ fpsl - 1 ] ).remove();
//console.log( fpscript );
// remove flowerplayer logo
var fplogolink = $("a[href*='//flowplayer.org/hello/']");
$(fplogolink).remove();
// Focus the player automatically.
$( playerElement ).focus();
console.log( "Current Focus: " );
console.log( document.activeElement );
// Make sure the player is properly positioned.
if ( vse.user.config.fullCurrentWindow || vse.user.config.debugFCW )
{
setTimeout( function ()
{
$( 'html, body' ).animate( {scrollTop : 0}, 1000 );
}, 1 );
}
} );
} );
}
}
} );
};
w.vse = vse;
})( window, this.jQuery, this.jQuery );
vse.init();