PTPImg It script for PTH
// ==UserScript== // @name PTH PTPImg It // @namespace https://orbitalzero.ovh/scripts // @description PTPImg It script for PTH // @include https://ptpimg.me/ // @include https://passtheheadphones.me/upload.php* // @include https://passtheheadphones.me/torrents.php?action=editgroup* // @include https://passtheheadphones.me/torrents.php?id=* // @include https://passtheheadphones.me/user.php?action=edit&userid=* // @include https://passtheheadphones.me/artist.php?action=edit&artistid=* // @include https://passtheheadphones.me/requests.php?action=new* // @include https://passtheheadphones.me/requests.php?action=edit* // @include https://redacted.ch/upload.php* // @include https://redacted.ch/torrents.php?action=editgroup* // @include https://redacted.ch/torrents.php?id=* // @include https://redacted.ch/user.php?action=edit&userid=* // @include https://redacted.ch/artist.php?action=edit&artistid=* // @include https://redacted.ch/requests.php?action=new // @include https://redacted.ch/requests.php?action=edit* // @require https://greasemonkey.github.io/gm4-polyfill/gm4-polyfill.js // @version 0.15 // @grant GM_xmlhttpRequest // @grant GM_setValue // @grant GM_getValue // @grant GM_addStyle // @grant GM.xmlHttpRequest // @grant GM.setValue // @grant GM.getValue // @grant GM.addStyle // @require https://code.jquery.com/jquery-3.1.1.min.js // ==/UserScript== var css = ` input[type="button"]:disabled { opacity: 0.5; cursor: not-allowed; } `; var default_settings = { alert_when_done: true, api_key: "", host: "lutim" }; function get_api_key() { if (!window.localStorage.ptpimg_it) window.localStorage.ptpimg_it = JSON.stringify(default_settings); var settings = JSON.parse(window.localStorage.ptpimg_it); switch (settings.host) { default: window.localStorage.ptpimg_it = JSON.stringify(default_settings); case "lutim": return Promise.resolve(""); case "ptpimg": return ptpimg_get_api_key(); } } function ptpimg_get_api_key() { if (!window.localStorage.ptpimg_it) window.localStorage.ptpimg_it = JSON.stringify(default_settings); var settings = JSON.parse(window.localStorage.ptpimg_it); if (settings.api_key) return new Promise(function (resolve, reject) { resolve(settings.api_key); }); return new Promise( function (resolve, reject) { var request = GM.xmlHttpRequest({method: "GET", url: "https://ptpimg.me/", onload: function(response) { if (response.status != 200) reject("Response error " + response.status); if (response.finalUrl !== "https://ptpimg.me/") reject("Couldn't retrieve api key"); settings.api_key = $(response.response).find("#api_key").first().val(); window.localStorage.ptpimg_it = JSON.stringify(settings); resolve(settings.api_key); } }); }); } function prep_urls(urls) { return urls.map(function (url) { if (url.indexOf("reho.st") == -1 && url.indexOf("discogs.com") != -1) return "http://reho.st/" + url; return url; }); } function send_images(urls, api_key) { if (!window.localStorage.ptpimg_it) window.localStorage.ptpimg_it = JSON.stringify(default_settings); var settings = JSON.parse(window.localStorage.ptpimg_it); switch (settings.host) { default: window.localStorage.ptpimg_it = JSON.stringify(default_settings); case "lutim": return lutim_send_images(urls); case "ptpimg": return ptpimg_send_images(urls, api_key); } } function ptpimg_send_images(urls, api_key) { return new Promise(function(resolve, reject) { urls = prep_urls(urls); var boundary = "--NN-GGn-PTPIMG"; var data = ""; data += boundary + "\n"; data += "Content-Disposition: form-data; name=\"link-upload\"\n\n"; data += urls.join("\n") + "\n"; data += boundary + "\n"; data += "Content-Disposition: form-data; name=\"api_key\"\n\n"; data += api_key + "\n"; data += boundary + "--"; var request = GM.xmlHttpRequest({"method": "POST", "url": "https://ptpimg.me/upload.php", "responseType": "json", "headers": { "Content-type": "multipart/form-data; boundary=NN-GGn-PTPIMG" }, "data": data, "onload": function(response) { if (response.status != 200) reject("Response error " + response.status); resolve(response.response.map(function (item) { return "https://ptpimg.me/" + item.code + "." + item.ext; })); } }); }); } function lutim_send_images(urls) { urls = prep_urls(urls); var promises = urls.map(function (url) { return new Promise(function (resolve, reject) { var data = "lutim-file-url="+url+"&"+ "format=json&"+ "first-view=0&"+ "crypt=0&"+ "delete-day=0&"; var request = GM.xmlHttpRequest({"method": "POST", "url": "https://lut.im/", "responseType": "json", "headers": { "Content-Type": "application/x-www-form-urlencoded" }, "data": data, "onload": function (response) { if (response.status != 200) reject("Response error " + response.status); if (response.response.success !== true) reject("Failed rehosting image to lut.im"); else { var msg = response.response.msg; resolve("https://lut.im/" + msg.short + "." + msg.ext); } } }); }); }); return Promise.all(promises); } function get_settings() { if (!window.localStorage.ptpimg_it) window.localStorage.ptpimg_it = JSON.stringify(default_settings); return JSON.parse(window.localStorage.ptpimg_it); } function rehost_button() { var settings = get_settings(); var button = $(this); button.prop("disabled", true); var input = $("input[name='image']"); var url = input.val(); get_api_key().then(function (key) { return send_images([url], key); }).then(function (new_urls) { input.val(new_urls[0]); if (settings.alert_when_done) alert("Image successfully uploaded to " + settings.host + "!"); button.prop("disabled", false); }).catch(function (message) { button.prop("disabled", false); alert(message); }); } function rehost_button_alt() { var settings = get_settings(); var button = $(this); button.prop("disabled", true); var inputs = $("input[name='image[]']"); var urls = inputs.map(function () { return this.value; }).get(); get_api_key().then(function (key) { return send_images(urls, key); }).then(function (new_urls) { inputs.map(function (index) { $(this).val(new_urls[index]); }); if (settings.alert_when_done) alert("Image successfully uploaded to " + settings.host + "!"); button.prop("disabled", false); }).catch(function (message) { button.prop("disabled", false); alert(message); }); } function add_cover_button() { var settings = get_settings(); $("input[name='image']").after("<input type='button' value='Rehost It!' class='rehost_it_cover'>"); $(".rehost_it_cover").click(rehost_button); } function add_cover_button_alt() { var settings = get_settings(); $(".box.box_image a.brackets[href='#']").click(function () { if ($("#rehost_it_cover").length === 0) { $("#add_cover").after("<input type='button' value='Rehost It!' id='rehost_it_cover'>"); $("#rehost_it_cover").click(rehost_button_alt); } }); } function add_config() { var settings = get_settings(); $(".main_column").append("<table id='pth_ptpimg_it'><tbody></tbody</table>"); $("#pth_ptpimg_it>tbody").append("<tr class='colhead_dark'><td colspan='2'><strong>PTPIMG It Settings</strong></td></tr>"); $("#pth_ptpimg_it>tbody").append("<tr><td class='label'>PTPIMG API Key</td><td><input type='text' id='api_key' placeholder='Enter your API Key here' value='" + (settings.api_key ? settings.api_key : "") + "'></td></tr>"); $("#pth_ptpimg_it>tbody").append("<tr><td class='label'>Alert when done ?</td><td><input type='checkbox' id='alert_when_done' value='Alert when done ?'" + (settings.alert_when_done ? "checked" : "") + "></td></tr>"); $("#pth_ptpimg_it>tbody").append("<tr><td class='label'>Image host provider:</td><td><select id='image_host_provider'><option value='lutimg' " + (settings.host === "lutimg" ? "selected": "") + ">lut.img</option><option value='ptpimg' " + (settings.host === "ptpimg" ? "selected": "") + ">ptpimg.me</option></select></td></tr>"); $("#pth_ptpimg_it>tbody").append("<tr><td colspan='2'><input type='button' id='save' value='Save settings'></td></tr>"); $("#pth_ptpimg_it #save").click(function () { var settings_form = $("#pth_ptpimg_it"); settings = { alert_when_done: settings_form.find("#alert_when_done").prop("checked"), api_key: $("#api_key").val() === "" ? undefined : $("#api_key").val(), host: $("#image_host_provider").val() }; window.localStorage.ptpimg_it = JSON.stringify(settings); alert("Settings saved !"); }); } (function() { 'use strict'; GM.addStyle(css); if (/user\.php\?action=edit/.test(window.location.href)) { add_config(); } else if (/torrents\.php\?id=/.test(window.location.href)) { add_cover_button_alt(); } else { $("#categories").on("change", function () { setTimeout(add_cover_button, 250); }); add_cover_button(); } })();