Greasy Fork is available in English.

vk.com

Layout Design - bigger video and thumbs and Info on precent video and some navigation

このスクリプトの質問や評価の投稿はこちら通報はこちらへお寄せください。
/// ==UserScript==
// @name			vk.com
// @namespace		http://use.i.E.your.homepage/
// @version			0.25
// @description     Layout Design - bigger video and thumbs and Info on precent video and some navigation  

// @match			*vk.com/*
// @require			http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js
// @require 		https://greasyfork.org/scripts/386-waituntilexists/code/waitUntilExists.js?version=5026
// @require			http://cdnjs.cloudflare.com/ajax/libs/moment.js/2.9.0/moment.min.js

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

// @created			2014-09-27
// @released		2014-00-00
// @updated			2014-00-00
// @history         @version 0.25 - first version: @released - 2015-02-11

// @compatible		Greasemonkey, Tampermonkey
// @license         GNU GPL v3 (http://www.gnu.org/copyleft/gpl.html) 
// @copyright		2014+, Magnus Fohlström
// ==/UserScript==

/*global $, jQuery*/
/*jshint -W014, -W030*/
// -W014, laxbreak, Bad line breaking before '+'
// -W030, Expected assignment or funtion call insted saw an expression

//-----------------------------------------------------------------------------------------------------------------------------------------

(function ($) {
    
    var timeThis = performance.now(),
        mainWidth = 1357,
        lstate = 0;
    
    function l( name, fn, showthis ){  if( showthis == 1 || lstate == showthis ) console.log( name, fn !== undefined ? fn : '' );  }
    
    String.prototype.formatString = function(){
        return this.toString()    
                    .split(/\s+/g).join(' ')
                    .split('¤').join('')
                    .split('{').join('{\n\t\t')
                    .split('; ').join(';')
                    .split(';').join(';\n\t\t')
                    .split('*/').join('*/\n')
                    .split('\t\t').join('\t')
                    .split('}').join('}\n');
    };
    
    $( '<style id="InsertCssZoom"></style>' +
       '<style id="InsertCssBasic"></style>' +
       '<style id="inputPopupCss" ></style>' ).appendTo('head');
        
    function refreshElement( elem , speed ) //refreshElement('.videoPlayer','slow');
    {
        var data = $( elem ).html();
        $( elem ).hide().html( data ).fadeIn( speed );
    }
    
    function playerSize()
    {
        var sideWidth = 120,
            ContWidth = 1500,
            
            bodyWidth0 = window.innerWidth - sideWidth,
            bodyWidth1 = bodyWidth0 > ContWidth ? ContWidth : bodyWidth0,
            zoomWidth0 = bodyWidth1 / $('#video_player').width(),
            
            zoomWidth = zoomWidth0 < 1 ? 1 : zoomWidth0;
        
        $( '#InsertCssZoom' ).text( '#video_player { zoom:' + zoomWidth + '; }' );
    }
    
    function init(input)
    {
        var InsertCssBasic, insertReload, newWidth, divider, insertThis;
        
        insertReload = 
    //        '<div class="divider fl_r">|</div>' +
            '<div id="NormalizeThis" onmouseover="Videoview.activate(this, 2);" onmouseout="Videoview.deactivate(this, 2);" class="mv_top_button fl_r">Normalize</div>' +
            '<div id="MaximizeThis" onmouseover="Videoview.activate(this, 2);" onmouseout="Videoview.deactivate(this, 2);" class="mv_top_button fl_r">Maximize</div>' +
            '<div class="divider fl_r">|</div>' +
            '<div id="reloadThis" onmouseover="Videoview.activate(this, 2);" onmouseout="Videoview.deactivate(this, 2);" class="mv_top_button fl_r">Reload</div>' +
            '<div class="divider fl_r">|</div>' +
            '<div id="ChangeThis" onmouseover="Videoview.activate(this, 2);" onmouseout="Videoview.deactivate(this, 2);" class="mv_top_button fl_r">Change Title</div>';
        
    //    $( insertReload ).appendTo('#mv_top_controls');
    //    $( insertReload ).insertAfter('.mv_share_actions.fl_l .fl_r .mv_views_count.fl_r');
    
        insertThis = setInterval(function(){ $('.mv_info_block.fl_l').size() !== 0 && $('#NormalizeThis').size() === 0 && ( $( insertReload ).appendTo('.mv_info_block.fl_l'), clearInterval(insertThis) ); },8);
        
        divider = 4;
        newWidth = input !== undefined ? input : mainWidth;
        InsertCssBasic = 
            '.mv_cont {'
        +	'	top: 30px !important;'
        +	'	}'
        +	'#mv_box {'
        +	'	background: #232430;'
        +	'	}'
        +	'.mv_top_button {'
        +	'	background: transparent;'
        +	'	color: rgb(119, 119, 119);'
        +	'	margin-top: -4px;'
        +	'	}'
        +	'.video_box_wrap {'
        +	'	width: initial !important;'
        +	'	height: initial !important;'
        +	'	}'
        +	'#mv_min_layer {'
        +	'	width: calc(100% - 250px);'
        +	'	}'
        +	'#mv_min_title {'
        +	'	max-width: 100% !important;'
        +	'	}'
        +	'#mv_title {'
        +	'	width: 100%;'
        +	'	max-width: 100%;'
        +	'	}'
        +	'#mv_min_title:hover, .mv_top_button:hover {'
        +	'	cursor: pointer;'
        +	'	color: rgb(7, 7, 207) !important;'
        +	'	}'
        +	'.fl_r.mv_title_panel {'
        +	'	width: calc(100% - 65px);'
        +	'	}'
        +	'.mv_info_block.fl_l {'
        +	'	width: 100%;'
        +	'	}'
        
        +	'#page_layout {'
        +	'	width: '+newWidth+'px !important;'
        +	'	}'
        
        +	'#page_body {'
        +	'	width: calc(100% - 165px) !important;'
        +	'	}'
        +	'.video_compact_view #choose_video_rows .video_row, .video_compact_view #video_rows .video_row, '
        +	'.video_compact_view #video_search_rows .video_row, .video_compact_view .search_media_rows.video_type .video_row {'
        +	'	height: initial;'
        +	'	margin-bottom: 20px;'
        +	'	width: calc(('+newWidth+'px - 165px) / '+divider+' - 23px);'
        +	'	}'
        +	'.video_compact_view #choose_video_rows .video_row_thumb, .video_compact_view #video_rows .video_row_thumb, '
        +	'.video_compact_view #video_search_rows .video_row_thumb, .video_compact_view .search_media_rows.video_type .video_row_thumb, '
        +	'.video_compact_view #choose_video_rows .video_image_div, .video_compact_view .search_media_rows.video_type .video_image_div, '
        +	'.video_compact_view #video_rows .video_image_div, .video_compact_view #video_search_rows .video_image_div {'
        +	'	width: inherit;'
        +	'	}'
        +	'.video_compact_view #choose_video_rows .video_image_div, .video_compact_view #video_rows .video_image_div, '
        +	'.video_compact_view #video_search_rows .video_image_div, .video_compact_view .search_media_rows.video_type .video_image_div, '
        +	'.video_compact_view #choose_video_rows .video_row_thumb, .video_compact_view #video_rows .video_row_thumb, '
        +	'.video_compact_view #video_search_rows .video_row_thumb, .video_compact_view .search_media_rows.video_type .video_row_thumb {'
        +	'	height: calc((('+newWidth+'px - 165px) / '+divider+' - 23px) * (106/191));'
        +	'	}'
        +	'#search_content .video_row .video_row_info_name a, #video_content .video_row .video_row_info_name a, '
        +	'#choose_video_content .video_row .video_row_info_name a, #pva_video_tags .video_row .video_row_info_name a {'
        +	'	white-space: normal;'
        +	'	overflow: hidden;'
        +	'	text-overflow: ellipsis;'
        +	'	width: calc(('+newWidth+'px - 165px) / '+divider+' - 23px) !important;'
        +	'	display: -webkit-box;'
        +	'	height: calc( 11px * 1.4 * 3 );'
        +	'	font-size: 11px;'
        +	'	line-height: 1.4;'
        +	'	-webkit-line-clamp: 3;'
        +	'	-webkit-box-orient: vertical;'
        +	'	}';
     
        $( '#InsertCssBasic' ).html( InsertCssBasic.formatString() );
        
        $( '#InsertCssBasic' ).append( '#stl_side { left: '+( $( '#page_layout' ).offset().left )+'px !important; }'.formatString() );
    }
    
    init();
    
    $( window ).resize(function(){ init(); });
    
    $( '#NormalizeThis' ).waitUntilExists(function(){ 
                
        function Maximize()
        {
            GM_setValue('VK_playerState', 'Maximize' );
            
            playerSize();
            
            $(".mv_top_button:contains('Maximize')").hide();
            $(".mv_top_button:contains('Normalize')").show();
        }
        function Normalize()
        {
            GM_setValue('VK_playerState', 'Normalize' );
            
            $( '#InsertCssZoom' ).empty();
            
            $(".mv_top_button:contains('Normalize')").hide();
            $(".mv_top_button:contains('Maximize')").show();    
        }
        
        GM_getValue('VK_playerState') == 'Maximize' ? Maximize() : Normalize();
        
        $("#NormalizeThis").on('click', Normalize );
        
        $("#MaximizeThis").on('click', Maximize );
        
        $('#reloadThis').on('click', function() { 
            refreshElement('#mv_content .video_box_wrap', 2500 );
        });
        
        $('#ChangeThis, #ChangeThis font').on('mouseup', function(e){ 
            this == e.target && e.which == 1 && rewriteTitle(); 
        });    
    });
    
    function runflashvars()
    {
        var flashvars,Seconds_1,Seconds,xformat,time;
        
        flashvars = $('embed').attr('flashvars');
        flashvars = flashvars !== undefined ? flashvars : '';
        Seconds_1 = flashvars.split('&duration=');
        Seconds = Seconds_1[1] === undefined ? '' : Seconds_1[1].split('&eid1=');
        Seconds = Seconds[0] === undefined ? 0 : Seconds[0];
        xformat = ( Seconds < 3600 ) ? 'mm:ss' : 'H:mm:ss';
        time = moment().startOf('day').seconds(Seconds).format(xformat);
        
        console.log('sec',Seconds);
        // Display how long the video clip are      
        if( $('#VideoLength').size() === 0 ) 
        {
            $('<div id="VideoLength" class="mv_info mv_duration" style="margin-left: 20px;">Video Length:<span style="padding-left:22px;">' + time + '</span></div><br class="my"><div class="clear"></div>').insertAfter('.mv_info_panel.clear_fix');
        }
        
        // Show a list of Qualities that are playable for this clip 
        window.qualities = '';     
        function stp( qual,input ){ window.qualities += '<span class="mv_info mv_quality" style="float: none !important; margin-bottom: 10px;"><span>' + qual + '</span> - ' + input + '</span><br>'; }
        
        if ( flashvars.search('&url720=' ) > 0 ) { stp('720p','HD'); }
        if ( flashvars.search('&url480=' ) > 0 ) { stp('480p','SD'); }
        if ( flashvars.search('&url360=' ) > 0 ) { stp('360p','Normal'); }
        if ( flashvars.search('&url240=' ) > 0 ) { stp('240p','Almost'); }
        if ( flashvars.search('&url180=' ) > 0 ) { stp('180p','Lowest'); }
        
        $( '<div class="mv_info mv_quality_lable" style="margin-left: 20px; float:left;">Video Qualities:</div> <div class="mv_info mv_qualities" style="float:left; margin-left:15px;">' + window.qualities + '</div>' ).insertAfter('br.my');
    
    }
    
    $( '#video_player' ).waitUntilExists(function() { $( '#VideoLength' ).size() === 0 && runflashvars(); });
    
    // Re-sizing inputField
    function sizingInput( str )
    {
        str = str === undefined ? ' ' : str;
        
        var texLen = str.length,
            parLen = $('#toInputingThis').width() - 6,
            inputWidth = ( texLen * 5.2 ) + 21;
        
        // this makes sure that inputfield dont get bigger than avaible space
        inputWidth = inputWidth > parLen ? parLen : inputWidth;
        
        // check if string is longer than, then the field gets bigger, otherwise it vill stay the same as default.
        inputWidth = texLen > 34 ? inputWidth : 200;
        
        // makes the change as defined 
        $( '#txtInputThis' ).width( inputWidth );  
    }
    
    $( window ).resize(function() {
        playerSize();
        sizingInput( $( '#txtInputThis' ).val() );
    });
    
    // this is usefull when same page reloads, with new uniqe URL && only applicable within 10s from clicking reload.
    var mainTitleHead = '#mv_title',
        docLoc = window.location.href,
        lastUrl = GM_getValue('VK_lastUrl') === docLoc,
        ifReloaded = GM_getValue('VK_title_old') !== undefined && lastUrl;
    
    if( lastUrl && $.now() - GM_getValue('VK_date') < 10000  )
    {
        $( '#mv_title' ).waitUntilExists(function(){ 
            var changeTo = GM_getValue('VK_title');
            $( '#txtInputThis' ).val( changeTo );            
            $( mainTitleHead + ', title').text( changeTo ); 
        });
    }
    
    function rewriteTitle()
    {        
        function thePopup()
        {
            var inputPopup, inputPopupCss, thisTitle, author;
            
            inputPopup =
                '<div id="space"class="ymvy"></div>'
            +	'<div class="divider fl_r">|</div>'
            +	'<div id="CancelsNowThis" onmouseover="Videoview.activate(this, 2);" onmouseout="Videoview.deactivate(this, 2);" class="ymvy">Cancel</div>'
            +	'<div class="divider fl_r">|</div>'
            +	'<div id="SaveReloadThis" onmouseover="Videoview.activate(this, 2);" onmouseout="Videoview.deactivate(this, 2);" class="ymvy">Reload</div>'
            +	'<div class="divider fl_r">|</div>'
            +	'<div id="justupdateThis" onmouseover="Videoview.activate(this, 2);" onmouseout="Videoview.deactivate(this, 2);" class="ymvy">Update</div>'
            +	'<div class="divider fl_r">|</div>'
            +	'<div id="toInputingThis" onmouseover="Videoview.activate(this, 2);" onmouseout="Videoview.deactivate(this, 2);" class="ymvy">'
            +		'<input id="txtInputThis" type="text" class="" value=""/>'
            +	'</div>'
            +	'<div class="divider fl_r">|</div>'
            +	'<div id="LatestTextThis" onmouseover="Videoview.activate(this, 2);" onmouseout="Videoview.deactivate(this, 2);" class="ymvy">Latest</div>'
            +	'<div class="divider fl_r">|</div>'
            +	'<div id="MostUseTxtThis" onmouseover="Videoview.activate(this, 2);" onmouseout="Videoview.deactivate(this, 2);" class="ymvy">Most</div>'
            +	'<div class="divider fl_r">|</div>'
            +	'<div id="FavoritTxtThis" onmouseover="Videoview.activate(this, 2);" onmouseout="Videoview.deactivate(this, 2);" class="ymvy">Favorits</div>'
            +	'<div class="divider fl_r">|</div>'
            +	'<div id="restsTextsThis" onmouseover="Videoview.activate(this, 2);" onmouseout="Videoview.deactivate(this, 2);" class="ymvy">Resets</div>'
            +	'<div class="divider fl_r">|</div>'
            +	' ';
            
            inputPopupCss = 
                '#inputPopup {'
            +	'	width: calc(100% - 14px);'
            +	'	background-color:#232430;'
            +	'	position: fixed;'
            +	'	z-index: 1000;'
            +	'	height: 40px;'
            +	'	margin:auto;'
            +	'	top:0px;'
            +	'	}'
            +	'#space {'
            +	'	width: 40px;'
            +	'	}' 
            +	'.ymvy {'
            +	'	float: right;'
            +	'	color: #777777;'
            +	'	cursor: pointer;'
            +	'	padding: 12px 5px 12px;'
            +	'	}'
            +	'#toInputingThis {'
            +	'	margin-top: -4px;'
            +	'	width: calc(100% - (87px * 6) );'
            +	'	}'
            +	'input#txtInputThis {'
            +	'	width: 200px;'
            +	'	padding-left: 3px;'
            +	'	line-height: 15px;'
            +	'	background-color: darkgray;'
            +	'	}'
            +	'#inputPopup .divider.fl_r {'
            +	'	padding: 12px 5px;'
            +	'	opacity: .5;'
            +	'	}';
            
            $( '#inputPopupCss' ).html( inputPopupCss.formatString() );
            
            $('<div id="inputPopup" style="display:none;">' + inputPopup + '</div>').insertBefore('#mv_layer_wrap');
            
            author = $('.mv_author_name a').text();
            thisTitle = $( mainTitleHead ).text() + ( ifReloaded || ( mainTitleHead.search( author ) > -1 ) ? '' : ' - ' + author );
            
            if( ifReloaded )
            {
                $('#restsTextsThis').attr('data-thisTitle', GM_getValue('VK_title_old') );
                GM_deleteValue('VK_title_old');
            }
            else
            {
                $('#restsTextsThis').attr('data-thisTitle', thisTitle);
            }
            
           
            $('#txtInputThis').val( thisTitle );       
        }
        
        function doThis()
        {
            $('#inputPopup').slideToggle( 1000 );
        }   
        
        if( $('#inputPopup').size() < 1 )
        {
            thePopup();
            doThis();
            sizingInput( $( '#txtInputThis' ).val() );
        }
        else
        {
            doThis();
        }
        
        function handlestr( str )
        {
            var strArray = str.split(' ');
        }
        
        $('#CancelsNowThis').off().on('mousedown',function() {
            $('#inputPopup').slideUp( 1000 );
        });
        
        $('#SaveReloadThis').off().on('mousedown',function() {
            
            var NewurlThis,
                nowTime = $.now(),
                titleThis = $('#txtInputThis').val(),
                oldtitleThis = $('#restsTextsThis').attr('data-thisTitle'),
                urlThis = docLoc;
            
            // Stored so it can be checked and used later after page are reloaded.
            GM_setValue('VK_date', nowTime );
            GM_setValue('VK_title', titleThis );
            GM_setValue('VK_title_old', oldtitleThis );
            
            // Clean up earlier uniqe generated url
            if( urlThis.search('=ffff') > 0 ) 
            {
                NewurlThis = urlThis.split('=ffff');
                urlThis = NewurlThis[0].slice(0, -1 );
            }
            
            // Creat new uniqe generated url and store as value, so it can be check when page loads. 
            // This needs to be done so that download button gets the new title
            urlThis = urlThis + '?=ffff' + nowTime;
            GM_setValue('VK_lastUrl', urlThis );
            
            // Reload with that newley created url.
            window.location.href = urlThis;            
        });
        
        $('#justupdateThis').off().on('mousedown',function() {
            var changeTo = $('#txtInputThis').val();
            $( mainTitleHead + ', title').text( changeTo );
        });
        
        $('#restsTextsThis').off().on('mousedown',function() { 
            var changeTo = $('#restsTextsThis').attr('data-thisTitle');
            sizingInput( changeTo );
            $('#txtInputThis').val( changeTo );
            $( mainTitleHead + ', title').text( changeTo );        
        });
        
        $( '#txtInputThis' ).bind("input change paste keyup", function( target ) {
            sizingInput( target.currentTarget.value );    
        });
    }       
    
    $(document).on('click','*',function(e){ this == e.target && l('target',e.target,1); });
    console.log('timeThis', performance.now() - timeThis );

}(jQuery));