X-Hamster

Keyboard driven changing layout, full browser player with ability to re-size, remove auto-play, auto-scroll to video, bigger thumbs

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey, Greasemonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Userscripts.

Voor het installeren van scripts heb je een extensie nodig, zoals {tampermonkey_link:Tampermonkey}.

Voor het installeren van scripts heb je een gebruikersscriptbeheerder nodig.

(Ik heb al een user script manager, laat me het downloaden!)

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

(Ik heb al een beheerder - laat me doorgaan met de installatie!)

// ==UserScript==
// @name       X-Hamster
// @namespace  http://use.i.E.your.homepage/
// @version    0.4001
// @description  Keyboard driven changing layout, full browser player with ability to re-size, remove auto-play, auto-scroll to video, bigger thumbs
// @match      *://xhamster.com/*
// @require    http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js

// @require    https://greasyfork.org/scripts/6882-riklomas-jquery-quicksearch/code/riklomasjqueryquicksearch.js?version=27465
// @require    https://greasyfork.org/scripts/6881-wait-until-exists-version-v0-2/code/Wait%20Until%20Exists%20Version%20v02.js?version=27464
// @require    https://greasyfork.org/scripts/6883-tinysort-tsort/code/TinySorttsort.js?version=27466

// @grant      GM_getValue
// @grant      GM_setValue
// @grant      GM_deleteValue
// @grant      GM_log

// @run-at     document-start

// @copyright  2014+, You
// ==/UserScript==

/*global $, jQuery*/

/*jshint -W014, -W082*/
// -W014, laxbreak, Bad line breaking before '+'
// -W082,a function declaration inside a block statement

function l(name,func)
{ 
    console.log( name, func !== undefined ? func : '' ); 
}

(function ($) {
    
    $.fn.waitUntilExists = function (handler, shouldRunHandlerOnce, isChild) 
    {
        var found  = 'found',
        $this	   = $(this.selector),
        $elements  = $this.not(function () { return $(this).data(found); }).each(handler).data(found, true);

        if( !isChild ) 
        {
            (window.waitUntilExists_Intervals = window.waitUntilExists_Intervals || {})[this.selector] =
                window.setInterval(function () { 
                    $this.waitUntilExists(
                        handler, shouldRunHandlerOnce, true); 
                }, 500);
        } 
        else if (shouldRunHandlerOnce && $elements.length) 
        {
            window.clearInterval(window.waitUntilExists_Intervals[this.selector]);
        }
		return $this;
	};
        
}(jQuery));

//ScrollZoomTune("div.thumb .title a",1,-25,1,'slow');
function ScrollZoomTune(selection, zomms, tune, ani, speed)
{
    $('body').css('zoom',zomms);
    
    var position = $( selection ).position();
    position = position.top + tune;
    
    if( ani == 1 ){
        $('body').animate({ scrollTop: position * zomms }, speed); }
    else {
        $('body').scrollTop( position * zomms );
    }
}

String.prototype.formatString = function(){ 
    return this.toString()
                .split(/\s+/g).join(' ')
                .split('{').join('{\n\t')
                .split('; ').join(';')
                .split(';').join(';\n\t')
                .split('*/').join('*/\n')
                .split('}').join('}\n'); 
};

function refreshElement( elem , speed ) //refreshElement('.videoPlayer','slow');
{
    var data = $( elem ).html();
    $( elem ).empty().html( data ).fadeIn( speed );
}   
 
$( '#player object' ).waitUntilExists(function(){
    
    if( $( this ).hasClass('donne') ) return false;
    $( this ).addClass('donne');
    
    var flashvar = $( '#player object param[name=flashvars]' ).attr('value');     
    $( '#player object param[name=flashvars]' ).attr('value',flashvar.replace("&autostart=true&","&autostart=false&autoload=true&"));
    
    setTimeout(function(){
    	refreshElement( '#player', 128 );
        ScrollZoomTune("#content",1,5,1,'slow');
        $( '#player' ).on('mousedown', function(){
            $( '#player' ).addClass('clicked');
        });
    },128);    
});

function RefreshButton()
{
    var newRefreshButtonCss, newRefreshButton = ' '
	+	'<div class="RefreshButton">'
	+		'<div class="wrap"></div>'
        +	'</div>';
    
    newRefreshButtonCss = ' '
	+	' .RefreshButton {'
	+		' position: relative;'
	+		' height: 27px;'
	+		' margin-top: -28px;'
        +		' }'
	+	' .RefreshButton .wrap {'
	+		' position: absolute;'
	+		' height: inherit;'
	+		' width: 17px;'
	+		' right: 0px;'
	+		' zoom: 1.8;'
	+		' top: 0px;'
	+		' background-image: url(http://eu-st.xhamster.com/images/tpl2/icons.png?5);'
	+		' background-position: 1px -51px;'
        +		' cursor: pointer;'
	+		' }'
        +	' .RefreshButton .wrap:hover {'
	+		' background-position: -15px -51px;'
	+		' }';
    
    $("style#tamper").append( newRefreshButtonCss.formatString() );    
   
    setTimeout(function(){
        $( "#playerBox .head.gr" ).append( newRefreshButton ); 
        $( '.RefreshButton .wrap' ).on('click',function(){
            refreshElement( '#player', 250 );    
        });
    },250);    
}

function searchMenue()
{
    $( "#searchFrom > div:nth-child(6)" ).insertAfter( "#searchFrom .menu2" );
    
    var newSearchMenue = ' '
	+	'<div class="box">'
	+		'<div class="head gr">Filter Search</div>'
	+		'<div class="boxC radio" style="height: 105px">'
	+			'<label class="sel"><input type="radio" name="unFiltered" value="" checked=""> Unfiltered</label>'
	+			'<label class=""><input type="radio" name="exactMatch" value=""> Exact Match</label>'
	+			'<label><input type="radio" name="filterMore" value=""> Filter More<div id="searhthis" style="margin-top:10px;">'
        +                              '<input id="sub_search"></div></label>'
	+		'</div>'
	+	'</div>';
    $( "#searchFrom .menu2" ).after( newSearchMenue ); 
    
    $("#sub_search, #searchRes2 > div.box > div.boxC > table > tbody > tr > td > div:nth-child(2) > u").on("change keyup paste", function(){
        
        $('input#sub_search').quicksearch('.video');        
        var newinputtext = $( '#sub_search' ).val();
        $.cookie( "inputtext", newinputtext );
	});     
}

function resize( newWidth )
{
     var newResize =
         '.main, table#content, #playerBox, #commentBox, #related, #playerBox, #commentBox, #related {'
    +		' width: '+newWidth+'px !important;'
    +		' }'
    +	'#player, #player object, #player .noFlash, #playerSwf, .noFlash, video, .mp4Thumb, .mp4Thumb img {'
    +		' width: 100%;'
    +		' height: calc( ('+newWidth+'px - 20px) * (10/16)) !important;'
    +		' }';   
    
    $('#cssResize').empty().append( newResize.formatString() );  
}

function fullPlayer(){
      
    var cssfullPlayer =
        '#header, #content tr:nth-child(2), #commentBox, .tools, #videoInfoBox, .head.gr, #footer {'
    +		' display: none !important;'
    +		' }'
    +	' #content {'
    +		' margin-top: 0px;'
    +		' }'
    +	' body {'
    +		' overflow: hidden;'
    +		' }';
    
    $('#cssfullPlayer').empty().append( cssfullPlayer.formatString() );
     
    resize( $( window ).width() );
    
    if( $('#player').hasClass('clicked') === false )
    {
        refreshElement('#player','fast');
    }   
    
    ScrollZoomTune("#content",1,-10,1,'slow');
}

$( window ).resize(function()
{
    if( $('html').hasClass('fullplayer') )
    {
        resize( $( this ).width() );
    }
    
    if( $('#player').hasClass('clicked') === false )
    {
        refreshElement('#player','fast');
    }
    
});

function movies( newWidth ){
    
    var newRulesSortMenue =
    	'#idxFeach {'
    +		' display: none !important;'
    +		' }'
    +	'.adVideo2 {'
    +		' display: none;'
    +		' }'
    +	' table#header {'
    +		' width: 1000px;'
    +		' margin: auto;'
    +		' }';
    
    resize(newWidth);
    
    newRulesSortMenue +=
		'#playerBox .boxC {'
	+		' box-sizing: border-box;'
	+		' padding-right: 18px;'
	+		' }'
	+	'.tools {'
	+		' width: 100%;'
	+		' }'
	+	'#videoInfoBox {'
	+		' width: calc(100% - 12px);'
	+		' }'
	+	'.box .line, .box .lineS {'
	+		' width: calc(100% + 18px);'
	+		' }'
	+	'.tabs {'
	+		' width: inherit;'
	+		' }'
	+	'.tabs .content {'
	+		' max-width: none;'
	+		' width: 100%;'
	+		' }'
        +	'#related .tab {'
	+		' width: 100%;'
	+		' }'
	+	'#relatedVid, #relatedVid table {'
	+		' width: inherit;'
	+		' }'
	+	'#relatedVidList {'
	+		' width: inherit;'
	+		' height: initial;'
	+		' }'
	+	'.video {'
        +		' width: calc(100% / 5 - 18px);'
	+		' height: 100%;'
	+		' display: inline-table; }'
	+	'.video a {'
	+		' width: 100%;'
	+		' }'
	+	'.video .thumb {'
	+		' width: inherit;' 
	+		' height: initial;'
	+		' }'
	+	'.video b, .video .hPaid {'
	+		' top: calc(100% - 72px);'
	+		' left: calc( 100% - 38px);'
	+		' }'
	+	'.video u {'
	+		' height: 30px;'
	+		' }'
	+	'#relatedVid .arrowL, #relatedVid .arrowR {'
	+		' vertical-align: initial;'
	+		' }'
        +	'#relatedVid .arrowR a, #relatedVid .arrowL a {'
	+		' margin-top: 0px;'
	+		' }';
    $("style#tamper").append( newRulesSortMenue.formatString() );  
    
    $(' #relatedVid').hide();
    setTimeout(function(){    
        var hh = $('#relatedVidList .video').width() - 1; l( 'hh', hh );
        hh = hh / 160; l( 'hh', hh );
        
        newRulesSortMenue = ' '
        +	'.video .hSprite {'
        +		' transform: scale('+ hh +');'
        +		' transform-origin: 1px 1px;'
        +		' }';
        $("style#tamper").append( newRulesSortMenue.formatString() );
    },10);    
    setTimeout(function(){
        newRulesSortMenue = ' '
        +	' #relatedVid .arrowL, #relatedVid .arrowR {'
        +		' padding-top: calc('+ $('#relatedVid table').height() +'px / 2 - 49px);'
        +		' }';
        $("style#tamper").append( newRulesSortMenue.formatString() );  
        
        
    },500);
    
    refreshElement( '#relatedVid', 1);
    $(' #relatedVid').show();
}

function basic(){
    
    var newRulesSortMenue = ' '
	+	'.clear {'
	+		' display: none;'
	+		' }'
	+	'.video {'
	+		' height: 240px;'
	+		' max-height: none;'
	+		' width: 245px;'
	+		' }'
	+	'#searchResR, .video .xhSprite {'
	+		' display: none;'
	+		' }'
	+	'.video .thumb, .video .hSprite {'
	+		' zoom: 1.53 !important;'
	+		' }'
	+	'.video b, .video .hPaid {'
	+		' top: 166px;'
	+		' color: antiquewhite;'
	+		' background: rgba(139, 0, 0, 0.45);'
	+		' }';           
    $("style#tamper").append( newRulesSortMenue.formatString() );   
}

function search(){

        $('.main').css('cssText','width: 1507px;'); 
        $('#searchFrom, #searchMenu').css('cssText','width: 222px;');
    
        searchMenue(); 
    
        console.log('searchMenuNew');

}

function channel(){

    $('.main').css('cssText','width: 1422px;'); 
    $(".pager").before('<div class="clear" style="display: block;"></div>');
    
}

function preSorter(){
    
    if( !$('.boxTL .boxC>div').hasClass('sortedBYme') )
    {        
        var counter = 1;
        $('.boxTL .boxC>div').each(function(counter)
        {            
            $( this ).addClass('sortedBYme');
            $( this ).attr( 'data-SortCounts', counter );
            $( this ).attr( 'data-SortLength', $( this ).find('b').text() );
            counter++;              
        });    
    }
}

function pager(){
    
    $(".boxTL .boxC>div.pager").attr('id','pager-bottom');
    $(".box.boxTL .boxC").attr('id','target-GPM');

    $( "#pager-bottom" ).insertAfter( $( "#target-GPM" ) );
    
    var field1 = $('#pager-bottom').clone();
    field1.attr('id','pager-top');
    field1.insertBefore( $( "#target-GPM" ) );
    
    $( "#pager-top, #pager-bottom" ).css('cssText','width: 1277px; margin-left: 0px; padding-bottom: 10px; ');
    
}

function SizeDate(){
      
    var newButtonsMenue = '', sortOrder = '', buttonToSelect = GM_getValue( "newSizeDate" );
    
    newButtonsMenue = 
        '<a id="sortbydate" class="sel">Date</a>' +
	'<a id="sortbylength" class="">Length</a>';        
    $( "div.btnsRight" ).append( newButtonsMenue ); 
    $( ".box .head .btnsBetween" ).append( newButtonsMenue ); 

        
    function selButton(){
        
        console.log('buttonToSelect',buttonToSelect);
        
        if ( buttonToSelect == 'date' ){
            sortOrder = 'asc';
            $('#sortbylength').removeClass('sel');
            $('#sortbydate').addClass('sel');
            $('.vDate, .fl').css('cssText','display: block;');
            pager();
            preSorter();
            $('.boxTL .boxC>div').tsort({attr:'data-SortCounts', order: sortOrder });
        } else if ( buttonToSelect == 'lenght' ){
            sortOrder = 'decs';
            $('#sortbydate').removeClass('sel');
            $('#sortbylength').addClass('sel');
            $('.vDate, .fl').css('cssText','display: none;');
            pager();
            preSorter();
            $('.boxTL .boxC>div').tsort({attr:'data-SortLength', order: sortOrder });
        } else {
            buttonToSelect = 'lenght';
            selButton();
        }
    }
    
    selButton();
    
    $('#sortbydate').on('click', function(){
        var newSizeDate = 'date',sortOrder = 'asc';
        $('#sortbylength').removeClass('sel');
        $('#sortbydate').addClass('sel');
        $('.vDate, .fl').css('cssText','display: block;');
        GM_setValue( "newSizeDate", newSizeDate );
        //$.cookie( "newSizeDate", newSizeDate );
        $('.boxTL .boxC>div').tsort({attr:'data-SortCounts', order: sortOrder });
    });

    $('#sortbylength').on('click', function(){
        var newSizeDate = 'lenght',sortOrder = 'decs';
        $('#sortbydate').removeClass('sel');
        $('#sortbylength').addClass('sel');
        $('.vDate, .fl').css('cssText','display: none;');
        GM_setValue( "newSizeDate", newSizeDate );
        //$.cookie( "newSizeDate", newSizeDate );
        $('.boxTL .boxC>div').tsort({attr:'data-SortLength', order: sortOrder });
    });

}
document.addEventListener('keydown', function(e) {
           
    if (e.keyCode == 27) { //esc
        if( $('html').hasClass('fullplayer') === false ) return false;
        
        $('html').removeClass('fullplayer');
        $("style#cssfullPlayer").empty();
        
        resize(1450);
        
        if( $('#player').hasClass('clicked') === false )
        {
            refreshElement('#player','fast');
        }  
        
        ScrollZoomTune("#content",1,5,1,'slow');
    }
    else if (e.keyCode == 66) { //b
        if( $('html').hasClass('fullplayer') ) return false;
        $('html').addClass('fullplayer');
        fullPlayer();
    }
        
/*    else if (e.keyCode == 76) { //L
        
    }
    else if (e.keyCode == 78) { //n
        t_PW = t_normal;
        fn_init();
	fn_playerWidth( t_PW );
        GM_setValue('likuoo_PW', t_PW);
        ScrollZoomTune("#container",1,-25,1,'slow');
    }
    else if (e.keyCode == 87) { //w
        t_PW = t_wide;
        fn_init();
	fn_playerWidth( t_PW );
        GM_setValue('likuoo_PW', t_PW);
        ScrollZoomTune("#container",1,-25,1,'slow');
    }
    else if (e.keyCode == 79) { //O
        GM_setValue('likuoo_PW', 655);
        $("style#fullplayer, style#playerWidth, style#CssBasic").empty();
    }*/
}, false);

waitUntilExists(document,function(){

    var astr = window.location.href,
        ares = astr.split("/"),
        Wait_search,
        ch;
    
    console.log('astr',astr);console.log('ares',ares);

	$('<style id="tamper"></style><style id="cssfullPlayer"></style><style id="cssResize"></style>').appendTo('head');

    if ( astr == 'http://xhamster.com/' ||  astr == 'https://xhamster.com/' )
    {        
        $('div#vPromo, div#idxFeach').css('margin-top','40px');
        console.log('root');
    }
    else if ( ares[3] == 'movies' )
    {   
        movies(1450);
        RefreshButton();
        console.log('movies');
        //wideVideo();
    }
    else if ( ares[3] == 'user' )
    {    
        if ( ares[4] !== 'video' )
        { 
            userProfile(); 
        }  
        else if ( ares[4] == 'video' )
        { 
            channel(); 
        } 
    } 
    else if ( ares[3].substring(0,6) == 'search' )
    {           
        function Wait_search(){
            
            if( $('#searchFrom').size() >  0 ){
                basic();
                search();                
            } else {
                console.log('Wait_search');
                setTimeout(function(){
                    Wait_search();
                },25);
            }
        } 
        Wait_search();
        
        var arrayQuery = astr.split("?"); 
        arrayQuery = arrayQuery[1].split("&");												
        
        $.each(arrayQuery, function(Index, value)
        {        
            if( value.substring(0,1) === 'q' && value.substring(0,4) != 'qcat') 
            {                
                var searchQuery = value.split("=");
                if ( searchQuery[1] == GM_getValue("searchQuery") ) 
                {
                       var inputtext = GM_getValue("inputtext");									
                       $('input#sub_search').val( inputtext ).focus();
                } 
                else if ( searchQuery[1] != GM_getValue("searchQuery") ) 
                {																			
		        GM_setValue( "searchQuery", searchQuery[1] );
			$('input#sub_search').focus();                
                }
            }
        });
    }
    else if ( ares[3] == 'photos' && ares[4] == 'view')
    {        
        document.addEventListener('keydown', function(e) {
            GM_log(e.keyCode);
            if (e.keyCode == 37) {
                slide.showPrev(true);
                $("a.prev").click();
            }
            if (e.keyCode == 39) {
                slide.showNext(true);
                $("a.next").click();
            }
        }, false);
            
        console.log('ViewPhotos');        
     } 
     else if ( ares[3] == 'photos' || ares[3] == 'channels' || ares[3] == 'new')
     {
         function ch(){
             console.log('#main',$('#main').size());
             if( $('#main').size() >  0 ){
                 basic();        
                 channel();
                 SizeDate();
             } else {
                 setTimeout(function(){
                     ch();
                 },10);
             }
         }
         
         ch();
         
         if ( ares[3] == 'photos'){
             photo();
         }    
         console.log('pcn');  
     } 
     else 
     {        
         channel();        
     }    

        
});