This script removes redirection and ads of Caoliu.
// ==UserScript==
// @name Better.Caoliu
// @version 3.0.1
// @namespace me.opengg
// @description This script removes redirection and ads of Caoliu.
// @license GPL-3.0-or-later
// @supportURL https://github.com/OpenGG/Better.Caoliu/issues
// @grant none
// @run-at document-start
// t66y:
// @match http://t66y.com/htm_data/*
// @match http://www.t66y.com/htm_data/*
// ==/UserScript==
(function () {
'use strict';
var toArray = function toArray(input) {
return Array.prototype.slice.call(input);
};
var querySelectorAll = function querySelectorAll(selector) {
return toArray(document.querySelectorAll(selector));
};
var parseQuery = function parseQuery(query) {
var ret = Object.create(null);
query.split('&').forEach(function (part) {
var pair = part.split('=');
var decodedKey = decodeURIComponent(pair[0]);
ret[decodedKey] = pair.length > 1 ? decodeURIComponent(pair[1]) : '';
});
return ret;
};
var tmp = null;
var parseUrl = function parseUrl(url) {
if (!tmp) {
tmp = document.createElement('a');
}
tmp.href = url;
return tmp;
};
var hasOwnPropertyInternal = Object.prototype.hasOwnProperty;
var hasOwnProperty = function hasOwnProperty(obj, key) {
return hasOwnPropertyInternal.call(obj, key);
};
var isReady = function isReady() {
var _document = document,
readyState = _document.readyState;
return readyState === 'interactive' || readyState === 'complete';
};
var ready = function ready(fn) {
if (isReady()) {
fn();
} else {
var called = false;
var listener = function listener() {
if (called) {
return;
}
if (isReady()) {
called = true;
document.removeEventListener('readystatechange', listener, false);
fn();
}
};
document.addEventListener('readystatechange', listener, false);
}
};
var removeUnderscores = function removeUnderscores(url) {
return url.replace(/______/g, '.');
};
var parseJump = function parseJump(url) {
var _parseUrl = parseUrl(url),
hostname = _parseUrl.hostname,
search = _parseUrl.search;
if (hostname !== 'www.viidii.info') {
return null;
}
var simple = /^\?https?:\/\//.test(search);
if (simple) {
return removeUnderscores(search.slice(1));
}
var query = parseQuery(search.slice(1));
return query.url;
};
var isAllowLink = function isAllowLink(url, allowLinks) {
var jump = parseJump(url);
if (!jump) {
return true;
}
for (var i = 0; i < allowLinks.length; ++i) {
var allowLink = allowLinks[i];
if (jump.indexOf(allowLink) !== -1) {
return true;
}
}
return false;
};
var hide = function hide(el) {
// eslint-disable-next-line no-param-reassign
el.style.display = 'none';
};
var findContainer = function findContainer(el) {
var curr = el;
while (curr.parentNode.childNodes.length === 1) {
curr = curr.parentNode;
}
return curr;
};
var shouldHideBr = function shouldHideBr(br) {
var nextSibling = br.nextSibling;
if (nextSibling && nextSibling.tagName) {
if (nextSibling.tagName.toLowerCase() === 'br') {
return true;
}
if (nextSibling.style.display === 'none') {
return true;
}
}
return false;
};
var wrapImage = function wrapImage(img, link) {
var el = document.createElement('a');
el.href = link;
el.referrerPolicy = 'no-referrer';
el.target = '_blank';
var parentNode = img.parentNode,
nextSibling = img.nextSibling;
el.appendChild(img);
parentNode.insertBefore(el, nextSibling);
};
var parseOnClick = function parseOnClick(img, onClick) {
if (!/^window\.open\(/.test(onClick)) {
return null;
}
var matches = onClick.match(/https?:\/\/[^'"]+/);
if (!matches) {
return null;
}
return matches[0];
};
var allowLinks = ['rmdown.com', '88files.net', 'pan.com'];
var imgRules = {
'imagetwist.com': ['/th/', '/i/'],
'img599.net': ['.th.', '.'],
'img588.net': ['.th.', '.']
};
var getImageRect = function getImageRect(url) {
return new Promise(function (resolve) {
var img = new Image();
img.onerror = function () {
return resolve([0, 0]);
};
img.onload = function () {
return resolve([img.naturalWidth, img.naturalHeight]);
};
img.src = url;
});
};
var detectImgUrl = function detectImgUrl(url) {
var _parseUrl = parseUrl(url),
hostname = _parseUrl.hostname;
var matches = hostname.match(/[^.]+\.[^.]+$/);
if (!matches) {
return null;
}
var top = matches[0];
if (!hasOwnProperty(imgRules, top)) {
return null;
}
var _imgRules$top = imgRules[top],
find = _imgRules$top[0],
replacement = _imgRules$top[1];
var transformed = url.replace(find, replacement);
var jpeg = transformed.replace('.jpg', '.jpeg');
var promises = [getImageRect(transformed)];
promises.push(jpeg !== transformed ? getImageRect(jpeg) : [0, 0]);
var limit = 200 * 200;
return Promise.all(promises).then(function (_ref) {
var _ref$ = _ref[0],
w = _ref$[0],
h = _ref$[1],
_ref$2 = _ref[1],
wJ = _ref$2[0],
hJ = _ref$2[1];
var size = w * h;
var sizeJ = wJ * hJ;
if (sizeJ > size && sizeJ > limit) {
return jpeg;
} else if (size > limit) {
return transformed;
}
return null;
});
};
var init = function init() {
// hide non-allow links
querySelectorAll('.tpc_content a').forEach(function (a) {
var attr = a.getAttribute('onclick');
if (attr && attr.indexOf('iframe')) {
hide(a);
return;
}
var allow = a.querySelector('img') || isAllowLink(a.href, allowLinks);
if (!allow) {
var container = findContainer(a);
hide(container);
} else {
// do nothing
}
});
// hide gif images
querySelectorAll('.tpc_content iframe').forEach(hide);
// hide gif images
querySelectorAll('.tpc_content img').forEach(function (image) {
var isGif = image.src.indexOf('.gif') !== -1;
if (isGif) {
hide(image);
}
});
// hide unnecessary <br>
querySelectorAll('.tpc_content br').forEach(function (br) {
if (shouldHideBr(br)) {
hide(br);
}
});
// rewrite img
querySelectorAll('.tpc_content img').forEach(function (img) {
var url = parseOnClick(img, img.getAttribute('onclick'));
if (img.style.display === 'none') {
return;
}
if (!url) {
return;
}
img.removeAttribute('onclick');
// eslint-disable-next-line no-param-reassign
img.onclick = null;
wrapImage(img, url);
});
// rewrite links
querySelectorAll('.tpc_content a').forEach(function (a) {
// eslint-disable-next-line no-param-reassign
a.referrerPolicy = 'no-referrer';
var url = parseJump(a.href);
if (url) {
// eslint-disable-next-line no-param-reassign
a.href = url;
}
});
querySelectorAll('.tpc_content a>img').forEach(function (img) {
return Promise.resolve(detectImgUrl(img.src)).then(function (url) {
if (url) {
// eslint-disable-next-line no-param-reassign
img.parentNode.href = url;
}
});
});
};
ready(init);
}());