您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Combines several userscripts. Includes Shift-Copy, Image Transformation, Html Element Deletion, Mousegrab for Link selection
// ==UserScript== // @name frisch's Utilities // @namespace http://null.frisch-live.de/ // @version 0.35 // @description Combines several userscripts. Includes Shift-Copy, Image Transformation, Html Element Deletion, Mousegrab for Link selection // @author frisch // @grant GM_openInTab // @include * // ==/UserScript== console.log("Initializing frisch Utilities..."); var jq = document.fExt.jq; var ctxUtil = document.fExt.ctxMenu.addCtxSub("Utilities"); // #################### Shift-Copy - Start var cpyText = ''; function clickOverride(e){ var retVal = true; if(e.shiftKey){ e.preventDefault(); var src = document.fExt.getSelection() || document.fExt.getSource(e.target); switch(e.which){ case 1: document.fExt.clipboard("Copy", src); retVal = false; break; case 2: cpyText += src + '\n'; retVal = false; break; case 3: break; default: break; } } return retVal; } jq(document).on("auxclick", clickOverride); jq(document).on("click", clickOverride); jq(document).keyup(function(e) { if (e.which === 16){ // Shift if(cpyText.length > 0) document.fExt.clipboard("Copy", cpyText); cpyText = ''; } }); // #################### Shift-Copy - End // #################### Html Elements Deleter - Start var ctxDelHtml = document.fExt.ctxMenu.addCtxItem("Delete Element", ctxUtil); ctxDelHtml.Action = function(event, sender, actor) { if(delHtmlTarget !== undefined) { jq(delHtmlTarget).remove(); delHtmlTarget = undefined; } }; var delHtmlTarget; // #################### Html Elements Deleter - End // #################### GENERAL CTX HANDLING - Start jq("#fExtContextMenu").on("fExtContextMenuOpening", function(event, actor){ delHtmlTarget = actor; }); // #################### GENERAL CTX HANDLING - End // #################### Image Rotation - Start var subTransf = document.fExt.ctxMenu.addCtxSub("Transformation", ctxUtil); document.fExt.ctxMenu.addCtxItem("Rotate left", subTransf).Action = function(event, sender, actor){ document.fExt.rotate(actor, -90); }; document.fExt.ctxMenu.addCtxItem("Rotate right", subTransf).Action = function(event, sender, actor){ document.fExt.rotate(actor, 90); }; document.fExt.ctxMenu.addCtxItem("Zoom in", subTransf).Action = function(event, sender, actor){ document.fExt.zoomIn(actor, 20); }; document.fExt.ctxMenu.addCtxItem("Zoom out", subTransf).Action = function(event, sender, actor){ document.fExt.zoomOut(actor, 20); }; // #################### Image Rotation - End // #################### Cloud Converter - Start var allowedExtensions = ["webm", "gif"]; var cApiKey = 'pUrKocUqgi32gMrbsDNgqhfTu6leQzBhpI5PhqgzWkdOoysidU892f0M9AvjJUBW5gVpgWWhTQdybz54ygK3cQ'; // Enter your API-Key here, get it at https://cloudconvert.com/ if(cApiKey.length > 0) { var jq = document.fExt.jq; var ccContainer = jq("<div id='ccContainer' style='display:none;' ><a href='#' id='ccLink' style=''>Convert</a></div>"); document.fExt.createStyle("#ccContainer { width: 60px; height: 18px; border: 2px solid black; font-weight: bold; text-align: center; padding: 2px 4px; position: absolute; background-color: #fff; }"); ccContainer.appendTo("body"); var ctxItemConv = document.fExt.ctxMenu.addCtxItem('Convert to MP4', ctxUtil); ctxItemConv.Action = function(event, sender){ document.fExt.message("Starting conversion..."); var src = jq("#ccLink").attr("href"); var ext = grabExtension(src); jq.ajax({ url: "https://api.cloudconvert.com/process", beforeSend: function(xhr) { xhr.setRequestHeader("Authorization", cApiKey); }, type: 'POST', dataType: 'json', data: { "apikey": cApiKey, "inputformat" : ext, "outputformat": "mp4" }, success: function (data) { var convertLnk = "https:" + data.url; startConversion(src, convertLnk); console.log("Process URL = " + convertLnk); }, error: function(data){ document.fExt.message("Error converting file: " + data.responseText); } }); return false; }; jq("#fExtContextMenu").on("fExtContextMenuOpening", function(event, actor){ var src = document.fExt.getSource(actor.get(0)); var ext = grabExtension(src); ctxItemConv.Toggle(jq.inArray(ext, allowedExtensions) >= 0); jq("#ccLink").attr("href",src); }); } else { console.log("No CloudConverter APIKey found."); } function startConversion(srcLnk, convLnk){ document.fExt.message("Processing item..."); jq.ajax({ url: convLnk, type: 'POST', dataType: 'json', data: { "wait": true, "input": "download", "file": srcLnk, "outputformat": "mp4" }, success: function(data){ var url = "https:" + data.output.url; GM_openInTab(url, true); document.fExt.message(); }, error: function(data){ document.fExt.message("Error converting " + srcLnk + ": " + data.responseText); } }); } function grabExtension(src){ var start, end; start = src.lastIndexOf(".") + 1; if(src.lastIndexOf("?") >= 0) end = src.lastIndexOf("?"); else end = src.length; return src.substring(start, end); } // #################### Cloud Converter - End // #################### Image Info - Start /* document.fExt.ctxMenu.addCtxItem("View Image Info", ctxUtil).Action = function(event, sender, actor){ $.getImageData({ url: actor.get(0).src, success: function(image){ // Do something with the now local version of the image }, error: function(xhr, text_status){ // Handle your error here } }); }; */ // #################### Image Info - End // #################### YouTubeInMP4 - Start var ytimp4Url = "http://youtubeinmp4.com/youtube.php?video="; document.fExt.ctxMenu.addCtxItem("Download on Youtubeinmp4.com", ctxUtil).Action = function(event, sender, actor){ var src = window.location.href; if(src.indexOf("/watch") < 0) src = document.fExt.getSource(actor.get(0)); var url = encodeURI(ytimp4Url + src); GM_openInTab(url); }; // #################### YouTubeInMP4 - End // #################### Mousegrab for Link - Start var holdInfo = { id: 0, actor: undefined, display: undefined, height: 0, width: 0, offset: undefined, value: undefined, set: function(actor){ this.id++; this.actor = actor; this.display = jq(actor).css("display"); this.height = jq(actor).outerHeight(); this.width = jq(actor).outerWidth(); this.offset = jq(actor).offset(); this.value = jq(actor).text(); return this.id; }, reset: function(){ this.hide(); this.id++; this.actor = undefined; this.display = undefined; this.height = undefined; this.width = undefined; this.offset = undefined; this.value = undefined; }, show: function(){ if(this.actor) { /* jq(this.actor).hide(); */ selectorBox.show(0) .text(this.value) .offset(this.offset) .val(this.value) .width(this.width) .height(this.height) .focus(); } }, hide: function(){ /* if(this.actor){ if(this.display) jq(this.actor).css("display", this.display); else jq(this.actor).show(); } */ if(selectorBox.is(":visible")) { selectorBox.hide(); selectorBox.val(''); } }, }; var msNeededToHold = 350; // Time needed to hold mousebutton in milliseconds var selectorBox = jq("<input type='text' style='display: none;' id='fExtUtilSelectorBox' value=''></input>"); document.fExt.createStyle("#fExtUtilSelectorBox { font-size: 14px !important; background-color: white !important; color: black !important; z-index: " + document.fExt.TopZIndex() + " !important; padding: 6px !important; position: absolute; }"); selectorBox.focusout(function(){ holdInfo.reset(); }); selectorBox.appendTo("body"); jq(document).on("mousedown", "a", function(e) { if(e.which === 1){ holdInfo.reset(); var holdID = holdInfo.set(e.target); jq(document).on("mousemove", cancelAtDrag); setTimeout(function(){ if(e.target === holdInfo.actor && holdID === holdInfo.id) { holdInfo.show(); } }, msNeededToHold); } return true; }); function cancelAtDrag(e){ if(e.which === 1){ holdInfo.reset(); } jq(document).off("mousemove", cancelAtDrag); } jq(document).on("mouseup", "a", function(e) { if(e.target === holdInfo.actor) { holdInfo.reset(); } else return true; }); // #################### Mousegrab for Link - End // #################### Copy links from Domain - Start var ctxSubCpyDom = document.fExt.ctxMenu.addCtxSub("Copy Domain Links", ctxUtil); var objCpyDom = []; var cpyLnks = []; jq("a[href]").each(function(ind, itm) { var hnSplit = itm.hostname.split("."); var domainName; if(hnSplit.length === 3) domainName = hnSplit[1]; else domainName = hnSplit[0]; if(domainName) { var dictCpyDom; for (var i in objCpyDom) { var currCpyDom = objCpyDom[i]; if (currCpyDom.Domain === domainName) { dictCpyDom = currCpyDom; break; } } if (dictCpyDom !== undefined) { if(jq.inArray(itm.href, dictCpyDom.Links) < 0) dictCpyDom.Links.push(itm.href); } else { dictCpyDom = { Domain: domainName, Links: [itm.href], }; objCpyDom.push(dictCpyDom); } } }); objCpyDom.sort(function(a, b) { return a.Domain.localeCompare(b.Domain); }); for(var i = 0; i < objCpyDom.length; i++) { var objDomain = objCpyDom[i]; var ctxCpyDom = document.fExt.ctxMenu.addCtxItem(objDomain.Domain + "(" + objDomain.Links.length + ")", ctxSubCpyDom); ctxCpyDom.ClickCloses = false; ctxCpyDom.Domain = objDomain; ctxCpyDom.Action = function() { cpyLnks = cpyLnks.concat(this.Domain.Links); }; } jq("#fExtContextMenu").on("fExtContextMenuClosing", function(event, actor){ if(cpyLnks.length > 0) { if(document.fExt.clipboard("Copy", cpyLnks.join('\n') + '\n')) document.fExt.popup("Copied " + cpyLnks.length + " links."); cpyLnks = []; } }); jq("#fExtContextMenu").on("fExtContextMenuOpening", function(event, actor){ cpyLnks = []; }); // #################### Copy links from Domain - End