// ==UserScript==
// @name yahvt
// @description yet another html5 video tool
// @namespace gnblizz
// @include *
// @version 1.04
// @grant GM_xmlhttpRequest
// @downloadURL none
// ==/UserScript==
"use strict";
var domain = document.domain ? document.domain.match(/^(?:www\.)?(.*)$/)[1] : 'none';
yahvt();
function sites(){
var a,i,o,e,b;
switch(domain) {
case 'animeseason.com':
if(obj('#series_info'))
SetStyle('table a:visited{color:gray;}table a:hover{color:#FC0;}');
allowFullscreen('#video_source', '#player_list A');
break;
case 'anime-exceed.com':
if(!/^\/cool\//.test(location.pathname))
allowFullscreen((window.self==window.top)?'#player':'body');
break;
case 'animefreak.tv':
i=(a=objs('.multi')).length;
if(i)do {
o = a[--i];
e = o.getAttribute('onclick');
if(e && /loadParts\('http/.test(e))
o.onclick = function(event) {
var vid_file = decodeURIComponent(this.getAttribute('onclick').match(/loadParts\('([^']+)'/)[1]);
document.getElementById("player").innerHTML = '';
}
} while(i);
break;
case 'bestanimes.tv':
allowFullscreen('.post');
break;
case 'clipfish.de':
obj('+SCRIPT', document.body).innerHTML = 'checkMobile=function(){isMobile=true;}';
break;
case 'freeanime.com':
obj('+SCRIPT', document.body).innerHTML = '$(window).unbind();\n$("#header").css("background-attachment","scroll")';
window.setTimeout( function() { allowFullscreen('.z-video', 'ul.z-tabs-nav LI'); }, 999);
break;
case 'videowing.me':
if(!/\bnoflash\b/i.test(location.search))
location.search = location.search ? (location.search+'&noflash') : '?noflash';
case 'player.arkvid.tv':
case 'gogoanime.com':
return 1;
case 'yucache.net':
case 'yourupload.com':
if(document.URL.match(/[?&]/) == '&') // bad URL?
document.location.replace(document.URL.replace('&', '?'));
default:
return(/\/((?:new)?embed|gogo\/|widget\/)/.test(document.URL));
}
function allowFullscreen(video, mirrors) {
if(mirrors) {
var a = document.querySelectorAll(mirrors), i = a.length;
if(i) do {
a[--i].addEventListener('click', function() {
window.setTimeout( function() { document.querySelector(video+' IFRAME').setAttribute('allowfullscreen', 'true'); }, 99);
});
} while(i);
}
var ifr = document.querySelector(video+' IFRAME');
if(ifr) ifr.setAttribute('allowfullscreen', 'true');
else {
console.log(video+' IFRAME not found in '+document.URL);
window.setTimeout( function() { document.querySelector(video+' IFRAME').setAttribute('allowfullscreen', 'true'); }, 999);
}
}}
function yahvt() {
if(sites()) {
var vf, autoplay = false;;
try { vf = findVideoFile(); } catch(e) { console.log('yahvt: ' + e); }
if(vf) {
vf = decodeURIComponent(vf).replace(/\?/g,'&').replace('&','?');
if(GetCookie('us_autoplay','')=='yes') {
SetCookie('us_autoplay', '', -1);
autoplay = true;
}
if(window.self != window.top && !autoplay) {
document.body.innerHTML = '
Video '+((/(part|clip)_?\d/.test(vf+document.URL)) ? 'part ' : '')+'found at ' + domainName(document.URL) + '.
';
obj('BUTTON').onclick = function() { autoplay = true; insertVideo(); }
} else {
insertVideo();
}
} else {
var as = objs('SCRIPT'), i = as.length;
if(i) do {
if(/_url.*=.*\"video not found\"/i.test(as[--i].innerHTML)) {
document.body.innerHTML = 'Video not found.
';
break;
}
} while(i);
}
}
function insertVideo() {
document.body.innerHTML = '';
var v = obj('VIDEO'), fs = GetCookie('us_fullscreen', '')=='yes', nvf = NextPart(document.URL), retry = 3;
console.log('starting ' + domain + (nvf ? (' video part '+nvf[2]+': ') : ' video: ') + vf);
if(fs) SetCookie('us_fullscreen', '', -1);
v.oncanplay = function(e) {
if(fs) SetFullScreenMode();
// v.parentNode.onclick=function(ev) { ev.preventDefault(); ev.stopPropagation(); };
}
v.onerror = function(e) {
if((e.target.error.code == 4) && (--retry >= 0)) {
//console.log('retry ' + retry);
v.removeAttribute('src');
if(vf.match(/&html5(=true)?/))
vf = vf.replace(/&html5(=true)?/, '&noflash');
else if(vf.match(/&noflash(=true)?/))
vf = vf.replace(/&noflash(=true)?/, '');
else
vf = vf + '&html5=true';
v.setAttribute('src', vf);
v.setAttribute('autoplay', 'true');
return;
}
if((e.target.error.code==4) && nvf && (nvf[0]>2))
document.body.innerHTML = 'The End';
else if(!/\bnoflash\b/.test(location.search))
location.search = location.search ? location.search + '&noflash' : '?noflash';
else
console.log('e.target.error.code='+e.target.error.code);
}
v.onended = function(e) {
var scr = EndFullScreenMode();
if(window.self != window.top && !obj('#VideoCloseButton')) {
var btnClose = MakeAButton('x', 'close', 0);
btnClose.id = 'VideoCloseButton';
btnClose.onclick = function(e){ location.replace('about:blank'); }
}
if(nvf) {
console.log('redirecting to part '+nvf[0]);
console.log(nvf);
var btnNext = MakeAButton(nvf[0], 'on to part '+nvf[0], 1);
btnNext.onclick = function(e) {
SetCookie('us_autoplay', 'yes', 3);
SetCookie('us_fullscreen', 'yes', (scr ? 3 : -1));
location.replace(nvf[1]);
}
switch(resourceExists(nvf[1])) { // can't tell if it's valid, though
case true: btnNext.click();
case false: RemoveElement(btnNext);
}
} else if(vf) {
m = vf.match(/^(.*(?:part|clip)_?0?)(\d+)(.*)$/);
if(m) {
var inp = parseInt(m[2])+1;
vf = m[1] + inp + m[3];
var btnNext2 = MakeAButton(inp, 'on to part '+inp, 1);
btnNext2.onclick = function(e) {
SetCookie('us_fullscreen', 'yes', (scr ? 3 : -1));
insertVideo();
}
console.log('about to insert video part '+inp);
if(GM_xmlhttpRequest) {
var rv = GM_xmlhttpRequest({
url: vf,
method: "HEAD",
onload: function(response) {
console.log(' response.status='+response.status
+'\n response.statusText='+response.statusText
+'\n response.readyState='+response.readyState
+'\n response.responseHeaders='+response.responseHeaders
+'\n response.responseText='+response.responseText
+'\n response.finalUrl='+response.finalUrl
+'\n');
if(/^Content-Type:[^\n]*video/m.test(response.responseHeaders)) {
console.log('video resource found');
btnNext2.click();
} else {
console.log('invalid video resource');
}
RemoveElement(btnNext2);
},
onerror: function(response) {
console.log('--onerror-response:\n'+response.responseHeaders);
RemoveElement(btnNext2);
}
});
} else {
switch(resourceExists(vf)) { // CORS blocked most likely
case true: btnNext2.click();
case false: RemoveElement(btnNext2);
}
}
} else {
//console.log('no match');
}
}
}//.onended
function NextPart(name) {
var m = name.match(/^(.*(?:part|clip)_?0?)(\d+)(.*)$/);
if(m) {
m[2] = parseInt(m[2]);
m[1] = m[1]+(m[2]+1)+m.pop();
m[0] = m[2]+1;
}
return m;
}}}
function resourceExists(url){
try {
var http = new XMLHttpRequest();
http.open('HEAD', url, false);
http.send();
return http.status != 404;
} catch(e){}
}
function allowFullscreenFix() {/*
var af = objs('IFRAME'), i = af.length;
if(i) do {
var e = af[--i];
if(!e.getAttribute('allowfullscreen'))
e.setAttribute('allowfullscreen', 'true');
} while(i);*/
}
function SetFullScreenMode() {
var v = obj('VIDEO'); // full-screen-api.allow-trusted-requests-only;false (about:config)
try{
v.mozRequestFullScreen();
}catch(e){
console.log('mozRequestFullScreen did throw an error.');
alert('Please inform the autor of yahvt,\nthat someone uses it with a browser\nwhich is possibly not FireFox.\nThank You');
}
}
function EndFullScreenMode() {
try {
if(document.mozFullScreenElement) {
document.mozCancelFullScreen();
return true;
}
}catch(e){}
return false;
}
function obj(name, parent) {
if(!parent) parent = document;
var node = null;
switch (name.charAt(0)) {
case '#': node = parent.getElementById(name.slice(1)); break;
case '.': node = parent.getElementsByClassName(name.slice(1))[0]; break;
case '+': node = document.createElement(name.slice(1).toUpperCase()); if(parent != document) parent.appendChild(node); break;
default: node = parent.getElementsByTagName(name)[0]; break;
}
return node;
}
function objs(name, parent) {
if(!parent) parent = document;
return (name.charAt(0)=='.') ? parent.getElementsByClassName(name.slice(1)) : parent.getElementsByTagName(name);
}
function SetStyle(style) {
obj('+STYLE', obj('HEAD')).innerHTML = style;
}
function RemoveElement(node) {
if(typeof(node)=='string') node = obj(node);
if(node) return node.parentNode.removeChild(node);
}
function domainName(href) {
if(!href) href = location.href;
var m = href.match(/\:\/\/(?:www\.|embed\.)?([^\/]+)/);
if(m) return m[1];
return 'unknown';
}
function SetCookie(name, value, min) {
if(!min) min = 10080; // a week as default
var d = new Date();
d.setTime(min*60000+d.getTime());
document.cookie=name+'='+value+';expires='+ d.toUTCString()+';'+'path=..';
}
function GetCookie(name, dflt) {
var r = new RegExp(name+'=([^;]+)', '')
var m = document.cookie.match(r);
return(m ? m[1] : dflt);
}
function findVideoFile() {
}
// videonest.net
function primeval(x) {
}
function MakeAButton(caption, help, style, parent) {
}
// public domain by gnblizz
// contact me with my username + '@web.de'