pomf-rehost/background.js

336 lines
8.5 KiB
JavaScript

function getCurrentTabUrl(callback) {
var queryInfo = {
active: true,
currentWindow: true
};
chrome.tabs.query(queryInfo, function(tabs) {
var tab = tabs[0];
var url = tab.url;
callback(url);
});
}
function replaceBookmark(oldUrl, newUrl) {
chrome.bookmarks.search({url: oldUrl}, function(bookmarks) {
for(bookmark of bookmarks) {
chrome.bookmarks.update(bookmark.id, {url: newUrl});
}
});
}
function copyToClipboard(url) {
document.oncopy = function(event) {
event.clipboardData.setData("text/plain", url);
event.preventDefault();
};
document.execCommand('Copy', false, null);
}
var blacklist = ["pomf.", "mixtape.moe", "catgirlsare.sexy", "p.fuwafuwa.moe", "/wiki/", "catbox.moe", "fuwa.se", "cuntflaps.me", "steamy.moe"];
chrome.pageAction.onClicked.addListener(function(tab) {
getCurrentTabUrl(function(url) {
getBetterUrl(url, function(betterUrl) {
filenameUrl = getProxiedUrl(betterUrl) || betterUrl;
var filename = filenameUrl.substr(filenameUrl.lastIndexOf("/"));
filename = cleanExtension(filename);
if(filename.indexOf('.') == -1) {
filename = filename + '.jpg'; //on average, it's probably JPEG if it doesn't have an extension
}
chrome.storage.sync.get({url: '', tabbehaviour: '', copytoclipboard: false, replacebookmark: false, disableblacklist: false}, function(config) {
if(config.url == '') {
alert("Please select a Pomf clone.");
chrome.tabs.create({ url: "options.html" });
return;
}
if(!config.disableblacklist) {
for(black of blacklist) {
if(url.indexOf(black) != -1) {
return;
}
}
}
var worker = new Worker('worker.js');
worker.onmessage = function(event) {
var response = JSON.parse(event.data);
var newUrl = response.files[0].url;
switch(config.tabbehaviour)
{
case "newtab":
chrome.tabs.create({url: newUrl});
break;
case "replacetab":
chrome.tabs.update(tab.id, {url: newUrl});
break;
}
if(config.copytoclipboard) {
copyToClipboard(newUrl);
}
if(config.replacebookmark) {
replaceBookmark(url, newUrl);
}
worker.terminate();
};
worker.postMessage(JSON.stringify({pomfclone: config.url, url: betterUrl, filename: filename}));
});
});
});
});
function getBetterUrl(url, callback) {
var extensionIndex = url.lastIndexOf('.');
var extension = url.substr(extensionIndex + 1);
if(extension == "gifv") {
url = url.replace("gifv", "mp4");
}
if(isTwitterImageUrl(url)) {
if(url.indexOf(':') != url.lastIndexOf(':')) { //Match if there are occurences of ':' other than the ':' in 'https://', such as in '.jpg:large'
url = url.substr(0, url.lastIndexOf(':'));
}
url = url + ':orig';
callback(url);
} else if(isInstagramUrl(url)) {
var request = new XMLHttpRequest();
request.open('GET', cleanExtension(url) + '?__a=1', true);
request.onload = function () {
var json = JSON.parse(request.responseText);
callback(json.graphql.shortcode_media.display_url);
};
request.send();
} else if(isPixivUrl(url)) {
//TODO: Use a content script instead of re-fetching the page
var pageRequest = new XMLHttpRequest();
pageRequest.open('GET', url, true);
pageRequest.onload = function () {
var regex = /<div class="_layout-thumbnail ui-modal-trigger"><img src="[^"]+img-master\/([^"]+)_master[0-9]+(\.[^"]+)".*>/g;
var match = regex.exec(pageRequest.responseText);
var imageUrl = 'http://i3.pixiv.net/img-original/' + match[1];
var onload = function (imageRequest, extension) {
if(imageRequest.status == 404 && extension == "jpg") {
makerequest("png");
} else {
callback(imageUrl + "." + extension);
}
};
var makerequest = function(extension) {
var imageRequest = new XMLHttpRequest();
imageRequest.open('GET', imageUrl + "." + extension, true);
imageRequest.setRequestHeader('X-Pixiv-Referer', url);
imageRequest.onload = function() { onload(imageRequest, extension); };
imageRequest.send();
};
makerequest("jpg");
};
pageRequest.send();
} else if(isSkypeUrl(url)) {
url = url.substr(0, url.lastIndexOf('/'));
url = url + '/imgpsh_fullsize';
callback(url);
} else if(isGfycatUrl(url)) {
var id = url.substr(url.lastIndexOf('/') + 1);
var request = new XMLHttpRequest();
request.open('GET', 'http://gfycat.com/cajax/get/' + id, true);
request.onload = function () {
var json = JSON.parse(request.responseText);
var webmUrl = json.gfyItem.webmUrl;
callback(webmUrl);
};
request.send();
} else if(isIxquickProxyUrl(url)) {
//ugh
var query = getQueryObject(url);
var base = 'https://ixquick.com/cgi-bin/serveimage';
callback(base + "?url=" + encodeURI(query.oiu) + "&sp=" + query.sp);
} else if(is500pxUrl(url)) {
//TODO: Use a content script instead of re-fetching the page
var pageRequest = new XMLHttpRequest();
pageRequest.open('GET', url, true);
pageRequest.onload = function () {
var regex = /window.PxPreloadedData = (.*);/g;
var match = regex.exec(pageRequest.responseText);
var json = match[1];
var object = JSON.parse(json);
var imageUrl = object.photo.images.filter(function (image) { return image.size >= 2048; })[0].https_url;
callback(imageUrl);
};
pageRequest.send();
} else {
callback(url);
}
}
chrome.webRequest.onBeforeSendHeaders.addListener(
function(details) {
if(details.url.indexOf('pixiv') != -1) {
for (var i = 0; i < details.requestHeaders.length; ++i) {
if (details.requestHeaders[i].name === 'X-Pixiv-Referer') {
var referer = details.requestHeaders[i].value;
details.requestHeaders.splice(i, 1);
break;
}
}
details.requestHeaders.push({
name: 'Referer',
value: referer
});
}
return {requestHeaders: details.requestHeaders};
},
{urls: ["*://*/*"], types: ["xmlhttprequest"]},
["blocking", "requestHeaders"]
);
function getQueryObject(url) {
var queryString = url.substring(url.indexOf('?') + 1);
var split = queryString.split('&');
var query = {};
for(var pair of split)
{
if(pair.indexOf('=') != -1) {
var keyValue = /(.*)=(.*)/.exec(pair);
query[keyValue[1]] = decodeURIComponent(keyValue[2]);
} else {
query[pair] = null;
}
}
return query;
}
function getProxiedUrl(url) {
var query = getQueryObject(url);
for(var key in query) {
if(query[key] != null && query[key].indexOf('http') != -1) { //HACK: Use a regex
return query[key];
}
}
return null;
}
function cleanExtension(url) {
var trailingStrings = ["?", ":orig", ":large", ":small", ":thumb", ":medium"];
for(trailingString of trailingStrings) {
if(url.indexOf(trailingString) != -1) {
url = url.substr(0, url.indexOf(trailingString));
}
}
return url;
}
function isTwitterImageUrl(url) {
return url.indexOf('pbs.twimg.com/media/') != -1;
}
function isInstagramUrl(url) {
return url.indexOf('instagram.com/p') != -1;
}
function isPixivUrl(url) {
return url.indexOf('pixiv.net/member_illust.php') != -1;
}
function isSkypeUrl(url) {
return url.indexOf('api.asm.skype.com/v1/objects/') != -1;
}
function isGfycatUrl(url) {
return url.indexOf('gfycat.com/') != -1;
}
function isIxquickProxyUrl(url) {
return url.indexOf('ixquick-proxy.com/do/spg/show_picture.pl') != -1;
}
function is500pxUrl(url) {
return url.indexOf('500px.com/photo/') != -1;
}
function isCoolUrl(url, callback) {
var proxiedUrl = getProxiedUrl(url);
if(proxiedUrl != null) {
url = proxiedUrl;
}
url = url.toLowerCase();
var extensionIndex = url.lastIndexOf('.');
var extension = cleanExtension(url.substr(extensionIndex + 1));
var validExtensions = ["jpg", "jpeg", "png", "gif", "webm", "gifv", "mp4", "mp3", "ogg", "opus", "pdf", "mkv", "ogv", "swf", "flv", "svg", "webp"];
chrome.storage.sync.get({ disableblacklist: false }, function(config) {
if(!config.disableblacklist) {
for(black of blacklist) {
if(url.indexOf(black) != -1) {
return false;
}
}
} else {
console.log('blacklist disabled!');
}
callback(validExtensions.indexOf(extension) != -1 || isInstagramUrl(url) || isPixivUrl(url) || isSkypeUrl(url) || isGfycatUrl(url) || isIxquickProxyUrl(url) || is500pxUrl(url));
});
}
chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
if(tab.active) {
isCoolUrl(tab.url, function (cool) {
if(cool) {
chrome.pageAction.show(tabId);
}
});
}
});
chrome.tabs.onActivated.addListener(function(activeInfo) {
chrome.tabs.get(activeInfo.tabId, function(tab) {
isCoolUrl(tab.url, function(cool) {
if (cool) {
chrome.pageAction.show(activeInfo.tabId);
}
});
});
});