Twitter video links

Показывает прямые ссылки на видео в твиттере. Direct twitter video links showing in the bottom of the player.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey, Greasemonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да инсталирате разширение, като например Tampermonkey .

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Userscripts.

За да инсталирате скрипта, трябва да инсталирате разширение като Tampermonkey.

За да инсталирате този скрипт, трябва да имате инсталиран скриптов мениджър.

(Вече имам скриптов мениджър, искам да го инсталирам!)

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

(Вече имам инсталиран мениджър на стиловете, искам да го инсталирам!)

// ==UserScript==
// @name        Twitter video links
// @namespace   twitter
// @description Показывает прямые ссылки на видео в твиттере. Direct twitter video links showing in the bottom of the player.
// @include     https://twitter.com/i/videos/*
// @version     2.2
// @grant       none
// ==/UserScript==
$(document).on("dataPlayerReadyEvent", function(){
	Number.prototype.dd = function(){ return (this<10)? '0'+this : this.toString(); }
	var vmap_url = ($pt=$("#playerContainer")).length == 1? ( $pt.data("config").vmap_url || '' ) : '',
		a_attrs = 'target="_blank" style="text-decoration: underline; color: #37f;"',
		$vspan = $('<span>').css({ 'position': "fixed", 'bottom': "0px", 'right': "0px", 
				'background-color': "#fff", 'padding': "0px 5px 2px", 'margin': "2px", }),
		st = $pt.data("config").source_type, ct = $pt.data("config").content_type, fl = Math.floor,
		sd = (dr=$pt.data("config").duration)?
				' ('+[(h=fl((d=fl(dr/1000))/3600)), (m=fl((d-h*3600)/60)).dd(), (d-h*3600-m*60).dd()].join(':')+')'
				: '';
	if(vmap_url !== '' || $.inArray(st, ['consumer', 'snap-reel', 'gif']) > -1 ){
		if( $.inArray(ct, ['video/mp4', 'application/x-mpegURL'] ) > -1 
				&& typeof (vu = $pt.data("config").video_url) !== 'undefined' ){
			$vspan.append('<a '+a_attrs+' href="'+vu+'" title="'+ct+sd+'">Main video</a>&nbsp;');
		}
		if( vmap_url !== '' ){
			var dlm = ($vspan.text() == '')? '' : '|&nbsp;';
			$vspan.append(dlm+'<a '+a_attrs+' href="'+vmap_url+'">vmap.xml</a>&nbsp;')
				.append('<span id="progress">&#9200;</span>');
			$.get( vmap_url, function( vdata ) {
				$("#progress").remove();
				var mv_url = ($mf=$(vdata).find("MediaFile")).length == 1? $mf.text().replace(/[\s\n\r\t]/gm, '') : '';
				if( mv_url !== '' ){
					ct = $mf.attr("type");
					$vspan.append('|&nbsp;<a '+a_attrs+' href="'+mv_url+'" title="'+ct+sd+'">Main video</a>&nbsp;');
				}
				var yt_url = ($wn=$(vdata).find("tw\\:cta_watch_now, cta_watch_now")).length == 1? $wn.attr("url") : '';
				if( yt_url !== '' ){
					$vspan.append('|&nbsp;<a '+a_attrs+' href="'+yt_url+'">YouTube</a>&nbsp;');
				}
				$(vdata).find("tw\\:videoVariant, videoVariant").each(function(vidx, vidvar){
					if( (ct=$(vidvar).attr("content_type")) == 'video/mp4' ){
						var vcap = (mtch = $(vidvar).attr("url").match(/vid\/(\d+x\d+)\//)).length > 1 ? 
								mtch[1] : $(vidvar).attr("bit_rate")+'&nbsp;bps';
						$vspan.append('|&nbsp;<a '+a_attrs+' href="'+$(vidvar).attr("url")+'" title="'+ct+'">'+vcap+'</a>&nbsp;');
					}
				});
			});
		}
		if($vspan.text() == ''){
			$vspan.append('<a '+a_attrs+' href="'+document.location.href+'">Can`t parse this frame</a>');
		}
		$(".error-msg-container").css('opacity', "0");
		$(document.body).append($vspan);
	}
});