// ==UserScript==
// @name vipVideos_skipAd
// @namespace vipVideos_skipAd
// @author xinggsf~gmail。com
// @description 优酷、土豆VIP免费看,去iqiyi、pps、sohu视频广告
// @homepageURL https://greasyfork.org/scripts/8561
// downloadURL https://greasyfork.org/scripts/8561/code/vipVideos_skipAd.user.js
// @license GPL version 3
// @include http://www.iqiyi.com/*
// @include http://v.pps.tv/play_*
// @include http://ipd.pps.tv/play_*
// @include http://www.tudou.com/albumplay/*
// @include http://www.tudou.com/listplay/*
// @include http://www.tudou.com/programs/view/*
// @include http://v.youku.com/v_show/id_*
// @include http://v.youku.com/v_playlist/*
// @include http://*.sohu.com/*
// @version 2.1.1
// @modified 2015.03.24
// @encoding utf-8
// @grant none
// grant unsafeWindow
// ==/UserScript==
+function(win) {
var doc = win.document,
style = doc.createElement('style');
style.textContent = '@-webkit-keyframes gAnimatInserted{from{opacity:0.99;}to{opacity:1;}}@keyframes gAnimatInserted{from{opacity:0.99;}to{opacity:1;}}embed,object{animation:gAnimatInserted 1ms;-webkit-animation:gAnimatInserted 1ms;}';
doc.head.appendChild(style);
function Overload(fn_objs) {
var is_match = function (x, y) {
if (x == y)
return true;
if (x.indexOf("*") == -1)
return false;
var x_arr = x.split(","),
y_arr = y.split(",");
if (x_arr.length != y_arr.length)
return false;
while (x_arr.length) {
var x_first = x_arr.shift(),
y_first = y_arr.shift();
if (x_first != "*" && x_first != y_first)
return false;
}
return true;
};
var ret = function () {
var args = arguments,
args_len = args.length,
args_types = [],
args_type,
fn_objs = args.callee._fn_objs,
match_fn = function () {};
for (var i = 0; i < args_len; i++) {
var type = typeof args[i];
type == "object" && (args[i].length > -1) && (type = "array");
args_types.push(type);
}
args_type = args_types.join(",");
for (var k in fn_objs) {
if (is_match(k, args_type)) {
match_fn = fn_objs[k];
break;
}
}
return match_fn.apply(this, args);
};
ret._fn_objs = fn_objs;
return ret;
}
String.prototype.format = Overload({
"array" : function (params) {
var reg = /{(\d+)}/gm;
return this.replace(reg, function (match, key) {
return params[~~key];
});
},
"object" : function (param) {
var reg = /{([^{}]+)}/gm;
return this.replace(reg, function (match, key) {
return param[key];
});
}
});
if (typeof String.prototype.startsWith !== 'function') {
String.prototype.startsWith = function (str){
return this.slice(0, str.length) === str;
};
String.prototype.endsWith = function (str){
return this.slice(-str.length) === str;
};
}
Object.prototype.extend = function(obj){
for (var i in obj) {
//obj.hasOwnProperty(i) &&
(this[i] = obj[i]);
}
};
var PLAYER_DOM = {'OBJECT':'data','EMBED':'src'},//,'IFRAME':'src'
PLAYER_URL = {
youku: {
urls: [
/^http:\/\/static\.youku\.com\/.*?q?(player|loader)(_[^.]+)?\.swf/,
/^http:\/\/player\.youku\.com\/player\.php\/.*sid\/(.*)\/.*v\.swf$/,
/^http:\/\/player\.youku\.com\/embed\//,
],
swfMark: '<embed type="application/x-shockwave-flash" src="http://v.baidu.com.id97.com/plugins/youku2015020902/loader.swf?VideoIDS={vid}&isAutoPlay=true" width="100%" height="100%" align="middle" allowfullscreen="true">',
varsMatch: /VideoIDS=([^&]+)/
},
tudou: {
urls: [
/^http:\/\/js\.tudouui\.com\/.*?\/TudouYoukuPlayer_Homer[^.]*?\.swf/,
/^http:\/\/js\.tudouui\.com\/.*?\/PortalPlayer[^.]*?\.swf/,
/^http:\/\/js\.tudouui\.com\/.*?\/TudouVideoPlayer_Homer_[^.]*?.swf/,
],
swfMark: '<embed type="application/x-shockwave-flash" src="http://v.baidu.com.id97.com/plugins/youku2015020902/loader.swf?VideoIDS={vid}&isAutoPlay=true" width="100%" height="100%" align="middle" allowfullscreen="true">',
varsMatch: /vcode=([^&]+)/,
isProc: function(p, fv) {
//有播放时间限制即进行处理
return /paidTime=\d{2,}&/.test(fv);
}
},
iqiyi: {
urls: [
/^http:\/\/www\.iqiyi\.com\/common\/flashplayer\/\d+\/MainPlayer_.+\.swf/,
],
swfMark: '<embed data-widget-player="flash" pluginspage="http://www.macromedia.com/go/getflashplayer" play="true" quality="hight" devicefont="false" allowfullscreen="true" menu="true" type="application/x-shockwave-flash" width="100%" height="100%" id="flash" bgcolor="#000" wmode="transparent" align="middle" allowscriptaccess="always" src="{src}" flashvars="{fvars}&components=fefb1060e&autoplay=true&cid=qc_100001_300089&origin=true&outsite=false">',
varsMatch: /(?:tvId|flashP2PCoreUrl|definitionID|vid)=[^&]+/g,
run: function(p, src, t) {
var m = {'src': src},
s = getFlashvars(p, 'flashVars');
console.log('flashVars:', s);
m.fvars = s.match(t.varsMatch).join('&')
.replace('vid=','definitionID=');
console.log('run var m:', m);
setPlayer(p, t.swfMark.format(m));
}
},
pps: {
urls: [
/^http:\/\/www\.iqiyi\.com\/common\/flashplayer\/\d+\/PPS.+\.swf/,
//old /^http:\/\/www\.iqiyi\.com\/player\/cupid\/common\/pps_flvplay_s\.swf/,
],
swfMark: '<embed data-widget-player="flash" pluginspage="http://www.macromedia.com/go/getflashplayer" play="true" quality="hight" devicefont="false" allowfullscreen="true" menu="true" type="application/x-shockwave-flash" width="100%" height="100%" align="middle" allowscriptaccess="always" src="http://www.iqiyi.com/common/flashplayer/20150319/MainPlayer_5_2_20_2_c3_2_6.swf" id="flash" bgcolor="#000" wmode="transparent" flashvars="components=feffbfe6e0&{fvars}&autoplay=true&flashP2PCoreUrl=http://www.iqiyi.com/common/flashplayer/20150319/30033.swf&cid=qc_100001_100141&origin=true&outsite=false">',
varsMatch: /(?:tvId|definitionID|vid)=[^&]+/g,
run: function(p, src, t) {
var m = {},
s = getFlashvars(p);
m.fvars = s.match(t.varsMatch).join('&')
.replace('vid=','definitionID=');
setPlayer(p, t.swfMark.format(m));
}
},
sohu: {
urls: [
/^http:\/\/(?:\d+\.){3}\d+\/webplayer\/Main\.swf$/,
/^http:\/\/tv\.sohu\.com\/upload\/swf\/.+\/Main\.swf/,
],
run: function(p, src, t) {
if (src.endsWith('/webplayer/Main.swf') &&
!doc.domain.endsWith('sohu.com'))
return;
var s = p.getAttribute('flashvars').replace(/.*?&vid=([^&]+).*/,'&vid=$1&plid=7038006&changeRateBtn=1&jump=0&skin=0&likeBtn=0&autoplay=true&downloadBtn=0&cinemaBtn=0&bfBtn=0&shareBtn=0&sogouBtn=0&showRecommend=0&showCtrlBar=1&skinNum=1&ua=http://tv.&api_key=647bfb88a84fc3c469d289f961993be6&cmscat=1&topBarFull=1&imgCutBtn=0&sid=null&isListPlay=1&playListId=1&nid=1&pid=1&pageurl=http://www.sohu.com');
s = p.outerHTML.replace(/flashvars="[^"]+"/,
'flashvars="'+ s +'"');
setPlayer(p, s);
}
}
};
function getStyle(o, s) {
if (o.style[s]) return o.style[s];
if (win.getComputedStyle) {//DOM
var x = win.getComputedStyle(o, null);
//s = s.replace(/([A-Z])/g,'-$1').toLowerCase();
return x && x[s];
}
}
function setPlayer(play, oHtml) {
doc.body.removeEventListener('animationstart', onAnimationStart);
doc.body.removeEventListener('webkitAnimationStart', onAnimationStart);
doc.body.removeEventListener('oAnimationStart', onAnimationStart);
//win.setTimeout(clearScripts, 299);
play.outerHTML = oHtml;
}
function getFlashvars(p, vName) {
arguments.length < 2 && (vName = 'flashvars');
return 'EMBED' === p.tagName ?
p.getAttribute(vName) :
p.children[vName].value;
}
function clearScripts() {
Array.prototype.forEach.call(
doc.querySelectorAll('script'), function(t) {
t.parentNode.removeChild(t);
});
}
var blackList = ['||irs01.','||cnzz.','||admaster.']
function onAnimationStart(ev) {
if (ev.animationName !== 'gAnimatInserted') return !0;
var e = ev.target;//(ev && ev.target) || Event.srcElement
console.log('AnimationStart:', ev, e);
ev.preventDefault();
ev.stopPropagation();
if ('EMBED' === e.tagName && 'OBJECT' === e.parentNode.tagName)
return;
var i, t,
pn = PLAYER_DOM[e.tagName],//地址属性名 OBJECT:'data', EMBED:'src'
addr = e[pn],
domain = addr.match(/^https?:\/\/([^/]+)/)[1];
//flash block
if (blackList.some(function(r) {
if (r instanceof RegExp)
return r.test(addr);
if (r.startsWith('||')) {
r = r.slice(2);
i = domain.indexOf(r);
return -1 === i ? !1 :
i === 0 || domain[i-1] === '.';
}
if (r[0] === '|') {
r = r.slice(1);
return addr.startsWith(r);
}
})) {
e.parentNode.removeChild(e);
return;
}
for (i in PLAYER_URL) {
t = PLAYER_URL[i];
if (t.urls.some(function(reg) {
return reg.test(addr);
})) {//if
console.log('reg:', t);
if (t.run) {//自定义处理过程
t.run(e, addr, t);
return;
}
var s, v = getFlashvars(e);
if (t.isProc && !t.isProc(e, v)) return;
s = v.match(t.varsMatch)[1];
if (!s) return;
s = {'vid': s};
setPlayer(e, t.swfMark.format(s));
return;
}
}
}
//Firefox
doc.body.addEventListener('animationstart', onAnimationStart, false);
//Chrome
doc.body.addEventListener('webkitAnimationStart', onAnimationStart, false);
//Opera 12+
doc.body.addEventListener('oAnimationStart', onAnimationStart, false);
}(window);