Skocz do zawartości

Skrypty userjs dla Youtube (nie tylko Opera)


Rekomendowane odpowiedzi

Uwaga - skrypty podane poniżej są już mocno nieaktualne, od ich opublikowania Youtube wprowadziło wiele zmian, jeżeli ktoś jest zainteresowany działającymi wersjami proszę pytać na priv!!!

 

 

Od dłuższego czasu używałem skryptu YousableTubeFix ale sam skrypt jest dość ciężki na dodatek w przypadku Opery używa emulacji pewnych elementów z Greasemonkey.

Ponieważ tak naprawdę najbardziej interesował mnie w nim przycisk pobierania i funkcja wymuszania rozmiaru oraz jakości domyślnej dla filmików postanowiłem "dłubnąć" coś własnego.

Jakiś czas temu bawiłem się też skryptami podmieniającymi sam odtwarzacz na coś lżejszego i troszkę lepie wyglądającego, co prawda udało mi się wtedy uzyskać działającą wersję ale nie było to nic wartego udostępnienia, teraz postanowiłem wrócić do tego i wykorzystać procedury również dla downloadera.

 

Tak powstały trzy skrypty, oto one:

 

Pierwszy dodający baton z menu pozwalającym na zassanie oglądanego wideo we wszystkich zdefiniowanych w skrypcie formatach (domyślnie nie zawiera definicji dla formatów 3d), tworzy baton z menu "prawie" identycznym jak w wymienionym wcześniej YousableTubeFix choć korzysta do tego z innych procedur:

 

 







// ==UserScript==
// @name Przycisk pobierania YT
// @description Pozwala zapisać na dysku oglądany film
// @include http://www.youtube.com/watch?*
// @include http://*.youtube.com/watch?*
// @include https://www.youtube.com/watch?*
// @include https://*.youtube.com/watch?*
// ==/UserScript==

(function ()
{

if( location.pathname.match(/\.(txt|text|js|css|cpp|src)$/) ) { return; }

if(typeof(unsafeWindow)=='undefined'){unsafeWindow=window;}// Opera

if (typeof(unsafeWindow.yt.playerConfig) === "object"){
var config_attrs = unsafeWindow.yt.playerConfig["attrs"];
var config_args = unsafeWindow.yt.playerConfig["args"];
var config_params = unsafeWindow.yt.playerConfig["params"];
}

var autoplay = "false";
var url_src = config_args["url_encoded_fmt_stream_map"].replace(/url=/g,"").split(",");
var allformats = [
{'key':'38','value':'Original Definition MP4 4K','format':'Video: MP4 H.264 <> Audio: AAC 48'},
{'key':'37','value':'Full High Definition MP4 1080p','format':'Video: MP4 H.264 <> Audio: AAC 44.1'},
{'key':'46','value':'Full High Definition WebM 1080p','format':'Video: WebM VP8 <> Audio: Vorbis 44.1'},
{'key':'22','value':'High Definition MP4 720p','format':'Video: MP4 H.264 <> Audio: AAC 44.1'},
{'key':'45','value':'High Definition WebM 720p','format':'Video: WebM VP8 <> Audio: Vorbis 44.1'},
{'key':'35','value':'Standard Definition FLV 480p','format':'Video: FLV H.264 <> Audio: AAC 44.1'},
{'key':'44','value':'Standard Definition WebM 480p','format':'Video: WebM VP8 <> Audio: Vorbis 44.1'},
{'key':'43','value':'Low Definition WebM 360p','format':'Video: WebM VP8 <> Audio: Vorbis 44.1'},
{'key':'34','value':'Low Definition FLV 360p','format':'Video: FLV H.264 <> Audio: AAC 44.1'},
{'key':'18','value':'Low Definition MP4 360p','format':'Video: MP4 H.264 <> Audio: AAC 44.1'},
{'key':'5','value':'Low Quality FLV 240p','format':'Video: FLV Sorenson Spark <> Audio: MP3 22.05'}
];

var title = "title="+ encodeURIComponent( document.getElementById("eow-title").getAttribute("title").replace(/(\?)/g,"_").replace(/(\?|\*|\"|\')/g,"%27").replace(/(\/|\\|\:)/g," - ") );

var createNode = (function(type, attributes, props ) {
var node = document.createElement(type);
if (attributes) { for (var attr in attributes) {if (attributes.hasOwnProperty(attr)) node.setAttribute(attr, attributes[attr]); }}
if (props) { for (var prop in props) {if ((props.hasOwnProperty(prop)) && (prop in node)) node[prop] = props[prop]; }}
return node;
});

var watchcontainer = document.getElementById("watch-actions");

mainbutton = createNode("button", {class: "yt-uix-button yt-uix-button-default yt-uix-tooltip yt-uix-tooltip-reverse", "data-button-menu-id": "yt-main-download-menu", id: "download-button", title: "Pobierz na dysk", type: "button"}, {disabled: false});
watchcontainer.insertBefore(mainbutton, watchcontainer.firstChild);

mainbutton.appendChild(createNode("span", {class: "yt-uix-button-content", id: "yt-main-download-button-content"},{textContent: "Pobierz: "}));
mainbutton.appendChild(createNode("img", {style: "vertical-align: baseline", class: "yt-uix-button-arrow"}));

maindiv = createNode("div", {class: "yt-uix-button-menu hid", id: "yt-main-download-menu"});
watchcontainer.appendChild(maindiv);

for (var i=0; i<allformats.length; i++){
for (var j=0; j<url_src.length; j++){
if (allformats[i].key == url_src[j].split("&itag=")[1]){
maindiv.appendChild(createNode("a", {"class":"yt-uix-button-menu-item", "title":allformats[i].format,"onClick":"document.location.href ='" + decodeURIComponent(url_src[j].split("&itag=")[0]) + "&" +title.replace(/\%2527/g,'%27')+ "'"},{textContent:allformats[i].value} ));
}
}
};

})();
Macierz "allformats" została posortowana wg. jakości materiałów, można sobie ją zmienić wg własnych preferencji, można też zmienić sobie opisy które pojawiają się w menu i po najechaniu przyciskiem, wreszcie można sobie dodać (bodź usunąć) inne formaty, np. 3d.

 

Drugi skrypt podmienia standardowy odtwarzacz na flowplayer, powiększa odtwarzany klip domyślnie do formatu 970x579 (można sobie dopasować do własnych preferencji/monitora), sam filmik natomiast jest odtwarzany w maksymalnej obsługiwanej przez odtwarzacz rozdzielczości:

A tak to wygląda po użyciu:post-67-0-72190900-1329095052_thumb.png







// ==UserScript==
// @name Alternatywny player YouTube - Flow Player
// @description Zastępuje standardowy odtwarzacz, inspirowane wersją by clicker dla JW Player- clickerinjo [at] gmail [dot] com
// @include http://*.youtube.com/watch?*v=*
// @include http://youtube.com/watch?*v=*
// @include http://*youtube.com/*
// ==/UserScript==

(function() {

if( location.pathname.match(/\.(txt|text|js|css|cpp|src)$/) ) { return; }

if (document.getElementsByTagName("embed")){

setTimeout(function(){

if(typeof(unsafeWindow)=='undefined'){unsafeWindow=window;}// Opera

if (typeof(unsafeWindow.yt.playerConfig) === "object"){
var config_attrs = unsafeWindow.yt.playerConfig["attrs"];
var config_args = unsafeWindow.yt.playerConfig["args"];
var config_params = unsafeWindow.yt.playerConfig["params"];
};

var original_sidebar = document.getElementById( "watch-sidebar" );
original_sidebar.setAttribute( "style", "margin-top:10px;");


var original_player = document.getElementById( config_attrs["id"] );
var container = original_player.parentNode;
container.removeChild(original_player);
container.setAttribute( "style", ( typeof container.getAttribute( "style" ) === "undefined" ) ? container.getAttribute( "style" )+" ;width: 970px; height: 579px;" : "width: 970px; height: 579px;" );
container.parentNode.setAttribute( "style", ( typeof container.parentNode.getAttribute( "style" ) === "undefined" ) ? container.parentNode.getAttribute( "style" )+" ;width: 970px; height: 579px;" : "width: 970px; height: 579px;" );

var autoplay = "false";
var url_src = config_args["url_encoded_fmt_stream_map"].replace(/url=/g,"").split(",");
var allfmts = [ "37","22","35","34","18","5" ];

for (var i=0; i<allfmts.length; i++){
for (var j=0; j<url_src.length; j++){
if (allfmts[i] == url_src[j].split("&itag=")[1]){ var format = allfmts[i]; var vidID = encodeURIComponent(decodeURIComponent(url_src[j].split("&quality=")[0])); break;}
}
if (vidID != null){break;}
};

var flvar = "config={"+
"'clip':{'url':'"+vidID+"','baseUrl':'http://172.16.0.5/flowplayer/','autoBuffering':true,'autoPlay':"+autoplay+"},"+
"'playerId':'myPlayer',"+
"'canvas':{'backgroundGradient': 'none','border':'2px solid #778899'},"+
"'play':{'url': 'http://172.16.0.5/flowplayer/play_large_red.png','width':83,'height':83,'opacity':0.8}"+
"}";

var player = document.createElement( "embed" );
player.setAttribute( "src", "http://172.16.0.5/flowplayer/flowplayer-3.2.7.swf" );
player.setAttribute( "style", "display: block !important;background-image:url(http://i.ytimg.com/vi/"+config_args['video_id']+"/hqdefault.jpg)");
player.setAttribute( "height", config_attrs["height"] );
player.setAttribute( "width", config_attrs["width"] );
player.setAttribute( "type", "application/x-shockwave-flash" );
player.setAttribute( "id", config_attrs["id"] );
player.setAttribute( "allowscriptaccess", config_params["allowscriptaccess"] );
player.setAttribute( "allowfullscreen", config_params["allowfullscreen"] );
player.setAttribute( "bgcolor", config_params["bgcolor"] );
player.setAttribute( "format", format );
player.setAttribute( "quality", "best" );
player.setAttribute( "wmode", "gpu" );
player.setAttribute( "seamlesstabbing", "true" );
player.setAttribute( "flashvars",flvar );
container.appendChild( player );

},10);

}

})();
Kolejność wg której odtwarzacz dobiera rozdzielczość została ustalona przez macierz "allfmts", jeżeli preferujemy inną kolejność można to łatwo zmienić.

Oczywiście potrzebujemy też serwera* z którego będzie wczytywany sam flowplayer (autorzy programu proszą aby nie podpinać się pod ich serwer), ja w przykładzie użyłem serwera lokalnego, może to być Apache a może też np. prosty i łatwy do skonfigurowania serwerek Serva który choćby do testów będzie bardzo wygodny (nie wymaga instalacji).

Oczywiście adres i ścieżkę do odtwarzacza należy podmienić na własną "http://172.16.0.5/flowplayer/flowplayer-3.2.7.swf" >

 

Serva znajdziemy pod adresem Serva

A odtwarzacz FlowPlayer pod adresem FlowPlayer

 

Trzeci skrypt jest podobny do poprzedniego z tą różnicą, że domyślny odtwarzacz zostaje podmieniony na JWPlayer:

Tak wygląda w działaniu: post-67-0-53354000-1329095042_thumb.png







// ==UserScript==
// @name Alternatywny player YouTube - JW Player
// @description Zastępuje standardowy odtwarzacz, inspirowane wersją by clicker - clickerinjo [at] gmail [dot] com
// @include http://*.youtube.com/watch?*v=*
// @include http://youtube.com/watch?*v=*
// @include http://*youtube.com/*
// ==/UserScript==

(function() {

if( location.pathname.match(/\.(txt|text|js|css|cpp|src)$/) ) { return; }

if (document.getElementsByTagName("embed")){

setTimeout(function(){

if(typeof(unsafeWindow)=='undefined'){unsafeWindow=window;}// Opera

if (typeof(unsafeWindow.yt.playerConfig) === "object"){
var config_attrs = unsafeWindow.yt.playerConfig["attrs"];
var config_args = unsafeWindow.yt.playerConfig["args"];
var config_params = unsafeWindow.yt.playerConfig["params"];
};

var original_sidebar = document.getElementById( "watch-sidebar" );
original_sidebar.setAttribute( "style", "margin-top:10px;");


var original_player = document.getElementById( config_attrs["id"] );
var container = original_player.parentNode;
container.removeChild(original_player);
container.setAttribute( "style", ( typeof container.getAttribute( "style" ) === "undefined" ) ? container.getAttribute( "style" )+" ;width: 970px; height: 579px;" : "width: 970px; height: 579px;" );
container.parentNode.setAttribute( "style", ( typeof container.parentNode.getAttribute( "style" ) === "undefined" ) ? container.parentNode.getAttribute( "style" )+" ;width: 970px; height: 579px;" : "width: 970px; height: 579px;" );

var autoplay = "false";
var url_src = config_args["url_encoded_fmt_stream_map"].replace(/url=/g,"").split(",");
var allfmts = [ "37","22","35","34","18","5" ];

for (var i=0; i<allfmts.length; i++){
for (var j=0; j<url_src.length; j++){
if (allfmts[i] == url_src[j].split("&itag=")[1]){ var format = allfmts[i]; var vidID = encodeURIComponent(decodeURIComponent(url_src[j].split("&quality=")[0])); break;}
}
if (vidID != null){break;}
};

var player = document.createElement( "embed" );
player.setAttribute( "src", "http://172.16.0.5/mediaplayer/player.swf" );
player.setAttribute( "style", "display: block !important;");
player.setAttribute( "height", config_attrs["height"] );
player.setAttribute( "width", config_attrs["width"] );
player.setAttribute( "type", "application/x-shockwave-flash" );
player.setAttribute( "id", config_attrs["id"] );
player.setAttribute( "allowscriptaccess", config_params["allowscriptaccess"] );
player.setAttribute( "allowfullscreen", config_params["allowfullscreen"] );
player.setAttribute( "bgcolor", config_params["bgcolor"] );
player.setAttribute( "format", format );
player.setAttribute( "quality", "best" );
player.setAttribute( "wmode", "gpu" );
player.setAttribute( "znak", "greg" );
player.setAttribute( "seamlesstabbing", "true" );
player.setAttribute( "flashvars", "image=http://i.ytimg.com/vi/"+config_args['video_id']+"/hqdefault.jpg&volume=75&provider=http&smoothing=true&autostart="+autoplay+"&frontcolor=0x888888&backcolor=0x000000&skin=http://172.16.0.5/mediaplayer/skin.zip&file="+vidID);
container.appendChild( player );

},10);

}

})();
Wszystkie uwagi podane przy wcześniejszym skrypcie dotyczą również tego, dodatkowo skrypt podstawia dla playera skórkę (skin.zip) którą również musimy podać z serwera.

 

JwPlayer znajdziemy pod adresem JwPlayer

 

Oba powyższe odtwarzacze obsługują wyłącznie flashowe wersje oryginalnego playerka choć nie powinno być problemu z dalszą rozbudową (ja na pewno spróbuję).

Wszystkie skrypty działają bez żadnych zmian również z Firefoxem (oczywiście potrzebny plugin Greasemonkey: http://www.greasespot.net

)

Skrypty w przypadku Opery należy zapisać z rozszerzeniem user.js, skrypty bez części "user" Opera interpretuje odmiennie co w tym przypadku nie jest wymagane/wskazane

 

*Niestety nie możemy użyć bezpośredniej ścieżki do pliku typu "file:///P:/--/baton/mediaplayer/" ze względu na zabezpieczenia zawarte w samym flashu.

 

Jeżeli ktoś poszukuje skrytptu pozwalającego w większym stopniu wpływać na wyglad i zachowanie Youtuba to oryginalne wersje "YousableTubeFix" znajdzie pod adresami:

Wersja podstawowa dla FF http://userscripts.o...ipts/show/13333

Wersja dla Opery http://userscripts.o...ipts/show/36453

I dla Chroma (z którym moje skrypty nie chcą działać ale nie drążyłem tematu) http://userscripts.o...ipts/show/57201

 

Dodatkowo jeżeli ktoś nie potrzebuje całego "YousableTubeFix" a mój skrypt mu nie działa lub się nie podoba polecam downloader z linku: http://userscripts.o...ipts/show/25105

 

Skrypty podmieniające odtwarzacz działają również w "komitywie" z "YousableTubeFix" ale muszą się wykonać po nim, w FF można kolejność skryptów ustawiać w Operze natomiast wykonują się w kolejności alfabetycznej więc należy to uwzględnić w nazwie pliku np. z9-jwplayer.user.js

 

pzdr

Odnośnik do komentarza
Pomoc jest darmowa, ale proszę rozważ przekazanie dotacji na utrzymanie serwisu: klik.
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...