Upload image from upload page

Upload album art from within the PTH upload page

当前为 2018-02-21 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Upload image from upload page
  3. // @version 1.6
  4. // @description Upload album art from within the PTH upload page
  5. // @author Chameleon
  6. // @include http*://*redacted.ch/upload.php*
  7. // @include http*://*redacted.ch/forums.php*threadid=1725*
  8. // @include http*://*redacted.ch/artist.php*action=edit*
  9. // @include http*://*redacted.ch/torrents.php*action=editgroup*
  10. // @grant GM_xmlhttpRequest
  11. // @namespace https://greasyfork.org/users/87476
  12. // ==/UserScript==
  13.  
  14. (function() {
  15. 'use strict';
  16. var settings=getSettings();
  17.  
  18. if(settings.showSettings)
  19. showSettings();
  20. if(window.location.href.indexOf("threadid=1725") != -1)
  21. showSettings();
  22. else if(window.location.href.indexOf('upload.php') != -1)
  23. {
  24. showUpload();
  25. }
  26. else if(window.location.href.indexOf('artist.php') != -1 || window.location.href.indexOf('torrents.php') != -1)
  27. {
  28. showArtistEdit();
  29. }
  30. }());
  31.  
  32. function showSettings(message)
  33. {
  34. var div=document.getElementById('rehostToSettings');
  35. if(!div)
  36. {
  37. var before = document.getElementsByClassName('forum_post')[0];
  38. if(!before)
  39. before=document.getElementsByTagName('table')[1];
  40. if(!before)
  41. before=document.getElementsByClassName('box')[0];
  42. div = document.createElement('div');
  43. div.setAttribute('id', 'rehostToSettings');
  44. before.parentNode.insertBefore(div, before);
  45. div.setAttribute('style', 'width: 100%; text-align: center; padding-bottom: 10px;');
  46. div.setAttribute('class', 'box');
  47. }
  48. div.innerHTML = '<h2>Upload image from upload page Settings</h2><br />';
  49. var settings = getSettings();
  50.  
  51. var a=document.createElement('a');
  52. a.href='javascript:void(0);';
  53. a.innerHTML = 'Use image host: '+settings.site;
  54. a.addEventListener('click', changeSite.bind(undefined, a, div), false);
  55. div.appendChild(a);
  56. div.appendChild(document.createElement('br'));
  57.  
  58. var a=document.createElement('a');
  59. a.href='javascript:void(0);';
  60. a.innerHTML = 'Show settings on upload page: '+(settings.showSettings ? 'true':'false');
  61. a.addEventListener('click', changeShowSettings.bind(undefined, a, div), false);
  62. div.appendChild(a);
  63. div.appendChild(document.createElement('br'));
  64.  
  65. var labelStyle = '';
  66.  
  67. var label = document.createElement('span');
  68. label.setAttribute('style', labelStyle);
  69. label.innerHTML = 'ptpimg.me API Key: ';
  70. div.appendChild(label);
  71. var input=document.createElement('input');
  72. input.setAttribute('style', 'width: 21em;');
  73. input.placeholder='ptpimg.me API Key';
  74. input.value = settings.apiKey ? settings.apiKey:'';
  75. div.appendChild(input);
  76. input.addEventListener('keyup', changeSettings.bind(undefined, div), false);
  77.  
  78. var a=document.createElement('a');
  79. a.href='javascript:void(0);';
  80. a.innerHTML = 'Get ptpimg.me API Key';
  81. div.appendChild(document.createElement('br'));
  82. div.appendChild(a);
  83. div.appendChild(document.createTextNode(' '));
  84. var s=document.createElement('span');
  85. s.innerHTML = message ? message : '';
  86. div.appendChild(s);
  87. a.addEventListener('click', getAPIKey.bind(undefined, input, s, div), false);
  88. }
  89.  
  90. function getAPIKey(input, span, div)
  91. {
  92. span.innerHTML = 'Loading ptpimg.me';
  93. /*var xhr=new XMLHttpRequest();
  94. xhr.open('GET', "https://ptpimg.me");
  95. xhr.onreadystatechange = xhr_func.bind(undefined, span, xhr, gotAPIKey.bind(undefined, input, span, div), rehost.bind(undefined, input, span, div));
  96. xhr.send();*/
  97. GM_xmlhttpRequest({
  98. method: "GET",
  99. url: 'https://ptpimg.me',
  100. onload: function(response) { if(response.status == 200) {gotAPIKey(input, span, div, response.responseText); } else { span.innerHTML = 'ptpimg.me error: '+response.status; } }
  101. });
  102.  
  103. }
  104.  
  105. function gotAPIKey(input, span, div, response)
  106. {
  107. var key=response.split("value='")[1].split("'")[0];
  108. if(key.length != 36)
  109. {
  110. span.innerHTML = "You aren't logged in to ptpimg.me";
  111. return;
  112. }
  113. input.value=key;
  114. changeSettings(div, 0, "Successfully added API Key");
  115. }
  116.  
  117. function changeSite(a, div)
  118. {
  119. if(a.innerHTML.indexOf('imgur.com') != -1)
  120. {
  121. a.innerHTML = a.innerHTML.replace('imgur.com', 'ptpimg.me');
  122. }
  123. else if(a.innerHTML.indexOf('ptpimg.me') != -1)
  124. {
  125. a.innerHTML = a.innerHTML.replace('ptpimg.me', 'imgur.com');
  126. }
  127.  
  128. changeSettings(div);
  129. }
  130.  
  131. function changeShowSettings(a, div)
  132. {
  133. if(a.innerHTML.indexOf('false') != -1)
  134. a.innerHTML = a.innerHTML.replace('false', 'true');
  135. else
  136. a.innerHTML = a.innerHTML.replace('true', 'false');
  137. changeSettings(div);
  138. }
  139.  
  140. function changeSettings(div, nul, message)
  141. {
  142. var settings = getSettings();
  143. var as=div.getElementsByTagName('a');
  144. if(as[0].innerHTML.indexOf('imgur.com') != -1)
  145. settings.site = 'imgur.com';
  146. else if(as[0].innerHTML.indexOf('ptpimg.me') != -1)
  147. settings.site = 'ptpimg.me';
  148. if(as[1].innerHTML.indexOf('false') != -1)
  149. settings.showSettings=false;
  150. else
  151. settings.showSettings=true;
  152.  
  153. var inputs=div.getElementsByTagName('input');
  154. settings.apiKey = inputs[0].value;
  155. window.localStorage.ptpimgAPIKey = settings.apiKey;
  156.  
  157. window.localStorage.uploadFromUploadPageSettings = JSON.stringify(settings);
  158. showSettings(message);
  159. }
  160.  
  161. function getSettings()
  162. {
  163. var settings = window.localStorage.uploadFromUploadPageSettings;
  164. if(!settings)
  165. {
  166. settings = {site:'imgur.com', apiKey:window.localStorage.ptpimgAPIKey ? window.localStorage.ptpimgAPIKey : ''};
  167. }
  168. else
  169. settings = JSON.parse(settings);
  170. return settings;
  171. }
  172.  
  173. function showArtistEdit()
  174. {
  175. var image=document.getElementsByName('image')[0];
  176. var div=document.createElement('div');
  177. image.parentNode.insertBefore(div, image);
  178. div.appendChild(image);
  179. image.setAttribute('id', 'image');
  180. showUpload();
  181. }
  182.  
  183. function showUpload()
  184. {
  185. var imageInput = document.getElementById('image');
  186. var parent = imageInput.parentNode;
  187. if(imageInput.parentNode.innerHTML.indexOf('Auto-rehost') == -1)
  188. {
  189. var span=document.createElement('span');
  190. var a=document.createElement('a');
  191. a.href='javascript:void(0);';
  192. a.innerHTML = 'Auto-rehost: Off';
  193. a.addEventListener('click', toggleAutoRehost.bind(undefined, a, imageInput, span), false);
  194. parent.appendChild(document.createTextNode(' '));
  195. parent.appendChild(a);
  196. parent.appendChild(document.createTextNode(' '));
  197. parent.appendChild(span);
  198. if(window.localStorage.autoUpload == "true")
  199. {
  200. imageInput.setAttribute('autorehost', 'true');
  201. a.innerHTML = 'Auto-rehost: On';
  202. }
  203. imageInput.addEventListener('keyup', rehost.bind(undefined, imageInput, span), false);
  204. }
  205. var file = document.createElement('input');
  206. file.type='file';
  207. parent.appendChild(file);
  208. var status = document.createElement('div');
  209. parent.appendChild(status);
  210. file.addEventListener('change', uploadFile.bind(undefined, status), false);
  211. file.accept="image/*";
  212. var dropzone = document.createElement('div');
  213. parent.appendChild(dropzone);
  214. dropzone.addEventListener("dragenter", dragenter, false);
  215. dropzone.addEventListener("dragover", dragenter, false);
  216. dropzone.addEventListener("drop", drop.bind(undefined, status), false);
  217. dropzone.innerHTML = 'Or drop files here';
  218. dropzone.setAttribute('style', 'width: 400px; height: 30px; background: rgba(64,64,64,0.8); border: dashed; border-radius: 10px; margin: auto; text-align: center; font-size: 20px;');
  219. }
  220.  
  221. function dragenter(event)
  222. {
  223. event.preventDefault();
  224. event.stopPropagation();
  225. }
  226.  
  227. function drop(status, event)
  228. {
  229. event.preventDefault();
  230. event.stopPropagation();
  231. var dt = event.dataTransfer;
  232. var files = dt.files;
  233. uploadFile(status, {target:{files:files}});
  234. }
  235.  
  236. function rehost(imageInput, span)
  237. {
  238. if(imageInput.getAttribute('autorehost') != "true")
  239. return;
  240. var whitelisted = ["imgur.com", "ptpimg.me"];
  241. if(imageInput.value.length < 1)
  242. return;
  243. for(var i=0; i<whitelisted.length; i++)
  244. {
  245. var whitelist=whitelisted[i];
  246. if(imageInput.value.indexOf(whitelist) != -1)
  247. return;
  248. }
  249.  
  250. if(imageInput.value.indexOf("discogs.com") != -1)
  251. {
  252. imageInput.value = "http://reho.st/"+imageInput.value;
  253. }
  254.  
  255. span.innerHTML = 'Rehosting';
  256. var formData = new FormData();
  257. formData.append('image', imageInput.value);
  258. if(imageInput.getAttribute('working') == "true")
  259. return;
  260. imageInput.setAttribute('working', "true");
  261. window.setTimeout(unworking.bind(undefined, imageInput), 1000);
  262.  
  263. var settings = getSettings();
  264.  
  265. if(settings.site == 'imgur.com')
  266. {
  267. var xhr = new XMLHttpRequest();
  268. xhr.open('POST', 'https://api.imgur.com/3/image');
  269. xhr.setRequestHeader('Authorization', 'Client-ID 735033a56fe790b');
  270. xhr.onreadystatechange = xhr_func.bind(undefined, span, xhr, rehosted.bind(undefined, imageInput, span), rehost.bind(undefined, imageInput, span));
  271. xhr.send(formData);
  272. }
  273. else if(settings.site == 'ptpimg.me')
  274. {
  275. if(!settings.apiKey || settings.apiKey.length != 36)
  276. {
  277. a.innerHTML = 'No valid ptpimg.me API key set';
  278. return;
  279. }
  280. /*var formData = new FormData();
  281. formData.append('link-upload', image_input.value);
  282. formData.append('api_key', 'xx');
  283. // ptpimg.me doesn't have 'Access-Control-Allow-Origin' set
  284. var xhr = new XMLHttpRequest();
  285. xhr.open('POST', 'https://ptpimg.me/upload.php');
  286. xhr.onreadystatechange = xhr_func.bind(undefined, a, xhr, uploaded.bind(undefined, a, form, settings), doRehost.bind(undefined, a, image_input, form, settings));
  287. xhr.send(formData);*/
  288. // use GM_xmlhttpRequest for cross-domain
  289. GM_xmlhttpRequest({
  290. method: "POST",
  291. url: 'https://ptpimg.me/upload.php',
  292. data: "link-upload="+encodeURIComponent(imageInput.value)+'&api_key='+settings.apiKey,
  293. headers: {
  294. "Content-Type": "application/x-www-form-urlencoded"
  295. },
  296. onload: function(response) { rehosted(imageInput, span, response.responseText); }
  297. });
  298. }
  299. }
  300.  
  301. function unworking(input)
  302. {
  303. input.setAttribute('working', "false");
  304. }
  305.  
  306. function rehosted(imageInput, span, response)
  307. {
  308. var settings = getSettings();
  309. var newLink='';
  310. try
  311. {
  312. if(settings.site == 'imgur.com')
  313. newLink = JSON.parse(response).data.link.replace(/http:/, 'https:');
  314. else if(settings.site == 'ptpimg.me')
  315. {
  316. var r=JSON.parse(response)[0];
  317. newLink = "https://ptpimg.me/"+r.code+'.'+r.ext;
  318. }
  319. }
  320. catch(err)
  321. {
  322. span.innerHTML = err.message;
  323. return;
  324. }
  325. span.innerHTML = 'Rehosted';
  326. imageInput.value = newLink;
  327. }
  328.  
  329. function toggleAutoRehost(a, input, span)
  330. {
  331. if(a.innerHTML.indexOf('Off') != -1)
  332. {
  333. input.setAttribute('autorehost', 'true');
  334. a.innerHTML = 'Auto-rehost: On';
  335. window.localStorage.autoUpload = 'true';
  336. rehost(input, span);
  337. }
  338. else
  339. {
  340. input.setAttribute('autorehost', 'false');
  341. a.innerHTML = 'Auto-rehost: Off';
  342. window.localStorage.autoUpload = 'false';
  343. }
  344. }
  345.  
  346. function uploadFile(status, event)
  347. {
  348. var files=event.target.files;
  349. for(var i=0; i<files.length; i++)
  350. {
  351. var f=files[i];
  352. if(f.type.indexOf("image") != -1)
  353. {
  354. status.innerHTML = 'Uploading...';
  355. upload(status, f);
  356. break;
  357. }
  358. else
  359. {
  360. status.innerHTML = 'Not an image';
  361. }
  362. }
  363. }
  364.  
  365. function upload(status, file)
  366. {
  367. var settings = getSettings();
  368.  
  369. if(settings.site == 'imgur.com')
  370. {
  371. var formData = new FormData();
  372. formData.append('image', file);
  373. var xhr = new XMLHttpRequest();
  374. xhr.open('POST', 'https://api.imgur.com/3/image');
  375. xhr.setRequestHeader('Authorization', 'Client-ID 735033a56fe790b');
  376. xhr.onreadystatechange = xhr_func.bind(undefined, status, xhr, uploaded.bind(undefined, status), upload.bind(undefined, status, file));
  377. xhr.send(formData);
  378. }
  379. else if(settings.site == 'ptpimg.me')
  380. {
  381. if(!settings.apiKey || settings.apiKey.length != 36)
  382. {
  383. a.innerHTML = 'No valid ptpimg.me API key set';
  384. return;
  385. }
  386. /*var formData = new FormData();
  387. formData.append('link-upload', image_input.value);
  388. formData.append('api_key', 'xx');
  389. // ptpimg.me doesn't have 'Access-Control-Allow-Origin' set
  390. var xhr = new XMLHttpRequest();
  391. xhr.open('POST', 'https://ptpimg.me/upload.php');
  392. xhr.onreadystatechange = xhr_func.bind(undefined, a, xhr, uploaded.bind(undefined, a, form, settings), doRehost.bind(undefined, a, image_input, form, settings));
  393. xhr.send(formData);*/
  394. // use GM_xmlhttpRequest for cross-domain
  395. var formData = new FormData();
  396. formData.append('file-upload[0]', file);
  397. formData.append('api_key', settings.apiKey);
  398. GM_xmlhttpRequest({
  399. method: "POST",
  400. url: 'https://ptpimg.me/upload.php',
  401. //binary: true,
  402. data: formData,
  403. /* headers: {
  404. "Content-Type": "multipart/form-data"
  405. },*/
  406. onload: function(response) {
  407. if(response.status == 200)
  408. {
  409. uploaded(status, response.responseText);
  410. }
  411. else
  412. {
  413. console.log("Failed to upload: \n"+response.responseHeaders+' '+response.status+' '+response.statusText);
  414. status.innerHTML = "Failed to upload to ptpimg.me: "+response.status;
  415. return;
  416. }
  417. }
  418. });
  419. }
  420. }
  421.  
  422. function uploaded(status, response)
  423. {
  424. var settings=getSettings();
  425. console.log(response);
  426. var newLink='';
  427. try
  428. {
  429. if(settings.site == 'imgur.com')
  430. newLink = JSON.parse(response).data.link;
  431. else if(settings.site == 'ptpimg.me')
  432. {
  433. var r=JSON.parse(response)[0];
  434. newLink = "https://ptpimg.me/"+r.code+'.'+r.ext;
  435. }
  436. }
  437. catch(err)
  438. {
  439. status.innerHTML = err.message;
  440. status.style.color = 'red';
  441. return;
  442. }
  443.  
  444. status.innerHTML = 'Uploaded<br />';
  445. var img=document.createElement('img');
  446. var a=document.createElement('a');
  447. status.appendChild(a);
  448. status.appendChild(document.createElement('br'));
  449. status.appendChild(img);
  450. a.innerHTML='Hide image';
  451. a.href='javascript:void(0);';
  452. a.addEventListener('click', toggleImage.bind(undefined, a, img), false);
  453. img.src=newLink;
  454. document.getElementById('image').value = newLink;
  455. }
  456.  
  457. function toggleImage(a, img)
  458. {
  459. if(img.style.display=='none')
  460. {
  461. img.style.display='initial';
  462. a.innerHTML = 'Hide image';
  463. }
  464. else
  465. {
  466. img.style.display='none';
  467. a.innerHTML = 'Show image';
  468. }
  469. }
  470.  
  471. function xhr_func(messageDiv, xhr, func, repeatFunc)
  472. {
  473. if(xhr.readyState == 4)
  474. {
  475. if(xhr.status == 200)
  476. func(xhr.responseText);
  477. else
  478. {
  479. messageDiv.innerHTML = 'Error: '+xhr.status+'<br />retrying in 1 second';
  480. window.setTimeout(repeatFunc, 1000);
  481. }
  482. }
  483. }