Last active
December 6, 2022 01:57
-
-
Save hagb4rd/6843803a6674fe1b9ead6f1e60f14f15 to your computer and use it in GitHub Desktop.
bookmarklets
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(async(window, document)=>{ | |
// https://gist.github.com/hagb4rd/6843803a6674fe1b9ead6f1e60f14f15#file-queue-download-images-js | |
// ----------- | |
// queue() returns a promise returning function. 'tasks' is an array of higher order functions that return 'promise returning'/'async' functions [()=>async(){ }]. | |
// the purpose of that wrapping is not to start resolving the promise immediately, but being able to map parameters for the task. | |
//'concurrent' is the max. number of tasks to be executed in parallel. | |
function queue(tasks, concurrent) { | |
return function() { | |
var result = new Array(tasks.length); | |
var running = 0; | |
var pending = tasks.length; | |
var cursor = 0; | |
function next(onDone, onError) { | |
if (cursor < tasks.length && running < concurrent) { | |
let index = cursor; | |
++cursor; | |
++running; | |
function save(v) { | |
result[index] = v; | |
--running; | |
--pending; | |
if (pending === 0) | |
onDone(result); | |
else | |
next(onDone, onError); | |
return v; | |
} | |
//execute task/resolve promise, and save result | |
tasks[index]().then(save, save); | |
//load next task | |
next(onDone, onError); | |
} | |
} | |
return new Promise(function(resolve, reject) { | |
next(function(result) { | |
resolve(result); | |
}, reject); | |
}); | |
} | |
} | |
window.urlcreate=(u=`https://content4.coedcherry.com/watch-my-gf/184395/91122_#.jpg`,n=1,m=20)=>[...(new Array(m-n+1)).keys()].map(x=>(x+n)).map(x=>{ var pad=u.match(/#+/)[0].length; return u.replace(`#`.repeat(pad), String(x).padStart(pad, '0'));}) | |
window.loadImage=(u)=>new Promise((resolve,reject)=>{var i=new Image(); i.onload=(e)=>resolve(i); i.onerror=(e)=>{var a=document.createElement('a');a.target='imageview';a.href=u; a.innerText=u;resolve(a)}; i.src=u; }); | |
window.findImageLinks=(extensions=['.jpg','.png','.jpeg','.gif','.tif','.wbem'])=>[...document.querySelectorAll('a')].map(a=>a.href).filter(href=>extensions.some(ext=>ext==href.slice(-ext.length))); | |
window.prepend=(elem)=>(document.body||document.rootElement).prepend(elem); | |
window.loadImages=(list)=>(document.documentElement.innerHTML=``,list.map(u=>()=>(console.log(u), loadImage(u)).then(x=>prepend(x))).reduce((prev,next)=>prev.then(next),Promise.resolve())) | |
window.linkedImages=(d)=>{ | |
d=d||window.document; | |
var xs=d.querySelectorAll("[href$=\".jpg\"],[href$=\".png\"]") | |
var is=[...xs].map(x=>x.href); | |
return is; | |
} | |
window.embedImages=(minW=250,minH=250)=>[...document.querySelectorAll('img')].filter(({width, height})=>(width>=minW && height>=minH)); | |
window.dataUrlFromCanvas=(img)=>new Promise((resolve,reject) => { | |
if(img instanceof Image) { | |
try { | |
var n=document.createElement("CANVAS"); | |
n.height=img.height; | |
n.width=img.width; | |
n.getContext("2d").drawImage(img,0,0); | |
var dataUrl=n.toDataURL("image/jpeg"); | |
return resolve(dataUrl); | |
} catch(err) { | |
reject(err.message); | |
} | |
} else { | |
var e=new Image(); | |
e.crossOrigin='Anonymous'; | |
var n=document.createElement("CANVAS"); | |
e.addEventListener("error", (e)=>reject(e.message)); | |
e.addEventListener("load", () => { | |
try { | |
n.height=e.height; | |
n.width=e.width; | |
n.getContext("2d").drawImage(e,0,0); | |
var dataUrl=n.toDataURL("image/jpeg"); | |
resolve(dataUrl); | |
} catch(err) { | |
reject(err.message); | |
} | |
}); | |
e.src = img.src ? img.src : img; | |
} | |
}) | |
window.dataUrlByFileReader = (url) => new Promise((resolve, reject) => { | |
var xhr = new XMLHttpRequest(); | |
xhr.responseType = 'blob'; | |
xhr.onerror=(e)=>reject(e); | |
xhr.onload = function () { | |
var reader = new FileReader(); | |
reader.onerror = function(e) { | |
reject(e.message) | |
} | |
reader.onloadend = function () { | |
resolve(reader.result); | |
} | |
reader.readAsDataURL(xhr.response); | |
}; | |
xhr.open('GET', url); | |
xhr.send(); | |
}) | |
window.readAsDataUrl=async(img)=>{ | |
var dataUrl; | |
try { | |
dataUrl=await dataUrlFromCanvas(img); | |
return dataUrl; | |
} catch(err) { | |
conole.log(err); | |
} | |
try { | |
dataUrl=await dataUrlFromCanvas(`https://jslave.herokuapp.com/proxy/?url=${img}`); | |
return dataUrl; | |
} catch(err) { | |
conole.log(err); | |
} | |
try { | |
dataUrl=await dataUrlFromCanvas(`https://jslave2.herokuapp.com/proxy/?url=${img}`); | |
return dataUrl; | |
} catch(err) { | |
conole.log(err); | |
} | |
try { | |
dataUrl=await dataUrlByFileReader(img); | |
return dataUrl; | |
} catch(err) { | |
console.log(err); | |
} | |
try { | |
dataUrl=await dataUrlByFileReader(`https://jslave.herokuapp.com/proxy/?url=${img}`); | |
return dataUrl; | |
} catch(err) { | |
console.log(err); | |
} | |
try { | |
dataUrl=await dataUrlByFileReader(`https://jslave2.herokuapp.com/proxy/?url=${img}`); | |
return dataUrl; | |
} catch(err) { | |
console.log(err); | |
} | |
throw Error('could not resolve create dataUrl'); | |
}; | |
window.download=async(image,name)=>{ | |
try { | |
var a=document.createElement('a'); | |
var dataUrl=await readAsDataUrl(image); | |
a.href=dataUrl; | |
a.setAttribute('download', name); | |
a.style.display='none'; | |
(document.body || document.documentElement).appendChild(a); | |
console.log('dowload:'+name); | |
console.log(image); | |
a.click(); | |
} catch (err) { | |
console.log(err, [image, name]); | |
} | |
return [image, name] | |
} | |
window.downloadText=async(txt,name)=>{ | |
try { | |
var rndName=()=>Date.now()+(Math.random()*100000|0)+'.txt' | |
name=name||rndName(); | |
var a=document.createElement('a'); | |
var dataUrl=`data:text/plain;charset=utf-8,${encodeURIComponent(txt)}`; | |
a.href=dataUrl; | |
a.setAttribute('download', name); | |
a.style.display='none'; | |
(document.body || document.documentElement).appendChild(a); | |
console.log(`downloading: ${name}`); | |
console.log(`--------------`); | |
console.log(txt); | |
a.click(); | |
} catch (err) { | |
console.log(err, [txt, name]); | |
} | |
return [txt, name] | |
} | |
window.downloadLinkedImages=()=>{ | |
return [...linkedImages()].map((url)=>{ | |
var name=`${location.host}${location.pathname.replace(/\//g,'.')}.${url.split(/\//).pop()}`; | |
return ()=>download(url,name) | |
}) | |
}; | |
window.downloadImages=(w=250,h=250)=>embedImages(w,h).map((i)=>{ | |
var url=new URL(i.src); | |
var name=[url.host].concat(i.alt?i.alt.match(/\w+/g):[]).concat(url.pathname.match(/[^/\?]+/g)).filter(x=>!!x).join('-'); | |
return ()=>download(i.src,name); | |
}); | |
downloadText(findImageLinks().join('\n')); | |
})(window, window.document) | |
//Bookmarklet |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(async function(window,document) { | |
var urlcreate=(u=`https://content4.coedcherry.com/watch-my-gf/184395/91122_#.jpg`,n=1,m=20)=>[...(new Array(m-n+1)).keys()].map(x=>(x+n)).map(x=>{ var pad=u.match(/#+/)[0].length; return u.replace(`#`.repeat(pad), String(x).padStart(pad, '0'));}) | |
var loadImage=(u)=>new Promise((resolve,reject)=>{var i=new Image(); i.onload=(e)=>resolve(i); i.onerror=(e)=>{var a=document.createElement('a');a.target='imageview';a.href=u; a.innerText=u;resolve(a)}; i.src=u; }); | |
var findImageLinks=(extensions=['.jpg','.png','.jpeg','.gif','.tif','.wbem'])=>[...document.querySelectorAll('a')].map(a=>a.href).filter(href=>extensions.some(ext=>ext==href.slice(-ext.length))); | |
var prepend=(elem)=>(document.body||document.rootElement).prepend(elem); | |
var loadImages=(list)=>(document.documentElement.innerHTML=``,list.map(u=>()=>(console.log(u), loadImage(u)).then(x=>prepend(x))).reduce((prev,next)=>prev.then(next),Promise.resolve())) | |
var downloadText=(text,filename)=>{ | |
//var toDataUrl=(s)=>`data:text/plain;base64,${btoa(s)}`; | |
var toDataUrl=(s)=>`data:text/plain;charset=utf-8,`+ encodeURIComponent(s); | |
var a=document.createElement('a'); | |
a.setAttribute('download',filename||'images'+(String(Math.floor(Math.random()*99999))).padStart(6,'0')+'.txt'); | |
a.href=toDataUrl(text); | |
a.style.visibility='hidden'; | |
document.body.appendChild(a); | |
a.click(); | |
document.body.removeChild(a); | |
} | |
downloadText(findImageLinks().join('\n')); | |
})(window,window.document) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var main = async() => { | |
// https://gist.github.com/hagb4rd/6843803a6674fe1b9ead6f1e60f14f15#file-queue-download-images-js | |
// ----------- | |
// queue() returns a promise returning function. 'tasks' is an array of higher order functions that return 'promise returning'/'async' functions [()=>async(){ }]. | |
// the purpose of that wrapping is not to start resolving the promise immediately, but being able to map parameters for the task. | |
//'concurrent' is the max. number of tasks to be executed in parallel. | |
function queue(tasks, concurrent) { | |
return function() { | |
var result = new Array(tasks.length); | |
var running = 0; | |
var pending = tasks.length; | |
var cursor = 0; | |
function next(onDone, onError) { | |
if (cursor < tasks.length && running < concurrent) { | |
let index = cursor; | |
++cursor; | |
++running; | |
function save(v) { | |
result[index] = v; | |
--running; | |
--pending; | |
if (pending === 0) | |
onDone(result); | |
else | |
next(onDone, onError); | |
return v; | |
} | |
//execute task/resolve promise, and save result | |
tasks[index]().then(save, save); | |
//load next task | |
next(onDone, onError); | |
} | |
} | |
return new Promise(function(resolve, reject) { | |
next(function(result) { | |
resolve(result); | |
}, reject); | |
}); | |
} | |
} | |
var linkedImages=(d)=>{ | |
d=d||window.document; | |
var xs=d.querySelectorAll("[href$=\".jpg\"],[href$=\".png\"]") | |
var is=[...xs].map(x=>x.href); | |
return is; | |
} | |
var embedImages=(minW=250,minH=250)=>[...document.querySelectorAll('img')].filter(({width, height})=>(width>=minW && height>=minH)); | |
var dataUrlFromCanvas=(img)=>new Promise((resolve,reject) => { | |
if(img instanceof Image) { | |
try { | |
n.height=img.height; | |
n.width=img.width; | |
n.getContext("2d").drawImage(img,0,0); | |
var dataUrl=n.toDataURL("image/jpeg"); | |
return resolve(dataUrl); | |
} catch(err) { | |
reject(err.message); | |
} | |
} else { | |
var e=new Image(); | |
e.crossOrigin='Anonymous'; | |
var n=document.createElement("CANVAS"); | |
e.addEventListener("error", (e)=>reject(e.message)); | |
e.addEventListener("load", () => { | |
try { | |
n.height=e.height; | |
n.width=e.width; | |
n.getContext("2d").drawImage(e,0,0); | |
var dataUrl=n.toDataURL("image/jpeg"); | |
resolve(dataUrl); | |
} catch(err) { | |
reject(err.message); | |
} | |
}); | |
e.src = img.src ? img.src : img; | |
} | |
}) | |
var dataUrlByFileReader = (url) => new Promise((resolve, reject) => { | |
var xhr = new XMLHttpRequest(); | |
xhr.responseType = 'blob'; | |
xhr.onerror=(e)=>reject(e); | |
xhr.onload = function () { | |
var reader = new FileReader(); | |
reader.onerror = function(e) { | |
reject(e.message) | |
} | |
reader.onloadend = function () { | |
resolve(reader.result); | |
} | |
reader.readAsDataURL(xhr.response); | |
}; | |
xhr.open('GET', url); | |
xhr.send(); | |
}) | |
var readAsDataUrl=async(img)=>{ | |
var dataUrl; | |
try { | |
dataUrl=await dataUrlFromCanvas(img); | |
return dataUrl; | |
} catch(err) { | |
conole.log(err); | |
} | |
try { | |
dataUrl=await dataUrlFromCanvas(`https://jslave.herokuapp.com/proxy/?url=${img}`); | |
return dataUrl; | |
} catch(err) { | |
conole.log(err); | |
} | |
try { | |
dataUrl=await dataUrlFromCanvas(`https://jslave2.herokuapp.com/proxy/?url=${img}`); | |
return dataUrl; | |
} catch(err) { | |
conole.log(err); | |
} | |
try { | |
dataUrl=await dataUrlByFileReader(img); | |
return dataUrl; | |
} catch(err) { | |
console.log(err); | |
} | |
try { | |
dataUrl=await dataUrlByFileReader(`https://jslave.herokuapp.com/proxy/?url=${img}`); | |
return dataUrl; | |
} catch(err) { | |
console.log(err); | |
} | |
try { | |
dataUrl=await dataUrlByFileReader(`https://jslave2.herokuapp.com/proxy/?url=${img}`); | |
return dataUrl; | |
} catch(err) { | |
console.log(err); | |
} | |
throw Error('could not resolve create dataUrl'); | |
}; | |
var download=async(image,name)=>{ | |
try { | |
var a=document.createElement('a'); | |
var dataUrl=await readAsDataUrl(image); | |
a.href=dataUrl; | |
a.setAttribute('download', name); | |
a.style.display='none'; | |
(document.body || document.documentElement).appendChild(a); | |
a.click(); | |
} catch (err) { | |
console.log(err, [image, name]); | |
} | |
return [image, name] | |
} | |
var downloadLinkedImages=()=>{ | |
return [...linkedImages()].map((url)=>{ | |
var name=`${location.host}${location.pathname.replace(/\//g,'.')}.${url.split(/\//).pop()}`; | |
return ()=>download(url,name) | |
}) | |
}; | |
var downloadImages=(w=350,h=350)=>embedImages(w,h).map((i)=>{ | |
var url=new URL(i.src); | |
var name=[url.host].concat(i.alt?i.alt.match(/\w+/g):[]).concat(url.pathname.match(/[^/\?]+/g)).filter(x=>!!x).join('-'); | |
var ext=name.slice(name.lastIndexOf('.')); ['jpg','jpeg','gif','tif','wbem'].includes(ext) || (name+=".jpg") | |
return ()=>download(i.src,name); | |
}); | |
//download max. 2 images in parallel | |
var queueImages=queue(downloadImages(350,350),2); | |
var queueLinkedImages=queue(downloadLinkedImages(),2); | |
var A=[],B=[]; | |
try { | |
A=await queueImages(); | |
console.log('A',A); | |
} catch(err) { | |
console.log(err) | |
} | |
try { | |
B=await queueLinkedImages(); | |
console.log('B',B); | |
} catch(err) { | |
console.log(err) | |
} | |
return [A,B] | |
}; | |
main().then(console.log).catch(console.log); | |
//Bookmarklet | |
//javascript:(function(){!function(){var e;(async()=>{function t(e,t){return function(){var r=new Array(e.length),o=0,a=e.length,n=0;return new Promise(function(c,l){!function c(l,s){if(n<e.length&&o<t){let t=n;function i(e){return r[t]=e,--o,0==--a?l(r):c(l,s),e}++n,++o,e[t]().then(i,i),c(l,s)}}(function(e){c(e)},l)})}}var r=e=>new Promise((t,r)=>{if(e instanceof Image)try{n.height=e.height,n.width=e.width,n.getContext("2d").drawImage(e,0,0);var o=n.toDataURL("image/jpeg");return t(o)}catch(e){r(e.message)}else{var a=new Image;a.crossOrigin="Anonymous";var n=document.createElement("CANVAS");a.addEventListener("error",e=>r(e.message)),a.addEventListener("load",()=>{try{n.height=a.height,n.width=a.width,n.getContext("2d").drawImage(a,0,0);var e=n.toDataURL("image/jpeg");t(e)}catch(e){r(e.message)}}),a.src=e.src?e.src:e}}),o=e=>new Promise((t,r)=>{var o=new XMLHttpRequest;o.responseType="blob",o.onerror=(e=>r(e)),o.onload=function(){var e=new FileReader;e.onerror=function(e){r(e.message)},e.onloadend=function(){t(e.result)},e.readAsDataURL(o.response)},o.open("GET",e),o.send()}),a=async(e,t)=>{try{var a=document.createElement("a"),n=await(async e=>{try{return await r(e)}catch(e){conole.log(e)}try{return await r(`https://jslave.herokuapp.com/proxy/?url=${e}`)}catch(e){conole.log(e)}try{return await r(`https://jslave2.herokuapp.com/proxy/?url=${e}`)}catch(e){conole.log(e)}try{return await o(e)}catch(e){console.log(e)}try{return await o(`https://jslave.herokuapp.com/proxy/?url=${e}`)}catch(e){console.log(e)}try{return await o(`https://jslave2.herokuapp.com/proxy/?url=${e}`)}catch(e){console.log(e)}throw Error("could not resolve create dataUrl")})(e);a.href=n,a.setAttribute("download",t),a.style.display="none",(document.body||document.documentElement).appendChild(a),a.click()}catch(r){console.log(r,[e,t])}return[e,t]},n=t(((e=250,t=250)=>((e=250,t=250)=>[...document.querySelectorAll("img")].filter(({width:r,height:o})=>r>=e&&o>=t))(e,t).map(e=>{var t=new URL(e.src),r=[t.host].concat(e.alt?e.alt.match(/\w+/g):[]).concat(t.pathname.match(/[^/\?]+/g)).filter(e=>!!e).join("-");return()=>a(e.src,r)}))(100,100),2),c=t((()=>[...[...(e=e||window.document).querySelectorAll('[href$=".jpg"],[href$=".png"]')].map(e=>e.href)].map(e=>{var t=`${location.host}${location.pathname.replace(/\//g,".")}.${e.split(/\//).pop()}`;return()=>a(e,t)}))(),2),l=[],s=[];try{l=await n(),console.log("A",l)}catch(e){console.log(e)}try{s=await c(),console.log("B",s)}catch(e){console.log(e)}})()}();})(); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var main = async() => { | |
// https://gist.github.com/hagb4rd/6843803a6674fe1b9ead6f1e60f14f15#file-queue-download-images-js | |
// ----------- | |
// queue() returns a promise returning function. 'tasks' is an array of higher order functions that return 'promise returning'/'async' functions [()=>async(){ }]. | |
// the purpose of that wrapping is not to start resolving the promise immediately, but being able to map parameters for the task. | |
//'concurrent' is the max. number of tasks to be executed in parallel. | |
function queue(tasks, concurrent) { | |
return function() { | |
var result = new Array(tasks.length); | |
var running = 0; | |
var pending = tasks.length; | |
var cursor = 0; | |
function next(onDone, onError) { | |
if (cursor < tasks.length && running < concurrent) { | |
let index = cursor; | |
++cursor; | |
++running; | |
function save(v) { | |
result[index] = v; | |
--running; | |
--pending; | |
if (pending === 0) | |
onDone(result); | |
else | |
next(onDone, onError); | |
return v; | |
} | |
//execute task/resolve promise, and save result | |
tasks[index]().then(save, save); | |
//load next task | |
next(onDone, onError); | |
} | |
} | |
return new Promise(function(resolve, reject) { | |
next(function(result) { | |
resolve(result); | |
}, reject); | |
}); | |
} | |
} | |
var linkedImages=(d)=>{ | |
d=d||window.document; | |
var xs=d.querySelectorAll("[href$=\".jpg\"],[href$=\".png\"]") | |
var is=[...xs].map(x=>x.href); | |
return is; | |
} | |
var embedImages=(minW=250,minH=250)=>[...document.querySelectorAll('img')].filter(({width, height})=>(width>=minW && height>=minH)); | |
var dataUrlFromCanvas=(img)=>new Promise((resolve,reject) => { | |
if(img instanceof Image) { | |
try { | |
n.height=img.height; | |
n.width=img.width; | |
n.getContext("2d").drawImage(img,0,0); | |
var dataUrl=n.toDataURL("image/jpeg"); | |
return resolve(dataUrl); | |
} catch(err) { | |
reject(err.message); | |
} | |
} else { | |
var e=new Image(); | |
e.crossOrigin='Anonymous'; | |
var n=document.createElement("CANVAS"); | |
e.addEventListener("error", (e)=>reject(e.message)); | |
e.addEventListener("load", () => { | |
try { | |
n.height=e.height; | |
n.width=e.width; | |
n.getContext("2d").drawImage(e,0,0); | |
var dataUrl=n.toDataURL("image/jpeg"); | |
resolve(dataUrl); | |
} catch(err) { | |
reject(err.message); | |
} | |
}); | |
e.src = img.src ? img.src : img; | |
} | |
}) | |
var dataUrlByFileReader = (url) => new Promise((resolve, reject) => { | |
var xhr = new XMLHttpRequest(); | |
xhr.responseType = 'blob'; | |
xhr.onerror=(e)=>reject(e); | |
xhr.onload = function () { | |
var reader = new FileReader(); | |
reader.onerror = function(e) { | |
reject(e.message) | |
} | |
reader.onloadend = function () { | |
resolve(reader.result); | |
} | |
reader.readAsDataURL(xhr.response); | |
}; | |
xhr.open('GET', url); | |
xhr.send(); | |
}) | |
var readAsDataUrl=async(img)=>{ | |
var dataUrl; | |
try { | |
dataUrl=await dataUrlFromCanvas(img); | |
return dataUrl; | |
} catch(err) { | |
conole.log(err); | |
} | |
try { | |
dataUrl=await dataUrlFromCanvas(`https://jslave.herokuapp.com/proxy/?url=${img}`); | |
return dataUrl; | |
} catch(err) { | |
conole.log(err); | |
} | |
try { | |
dataUrl=await dataUrlFromCanvas(`https://jslave2.herokuapp.com/proxy/?url=${img}`); | |
return dataUrl; | |
} catch(err) { | |
conole.log(err); | |
} | |
try { | |
dataUrl=await dataUrlByFileReader(img); | |
return dataUrl; | |
} catch(err) { | |
console.log(err); | |
} | |
try { | |
dataUrl=await dataUrlByFileReader(`https://jslave.herokuapp.com/proxy/?url=${img}`); | |
return dataUrl; | |
} catch(err) { | |
console.log(err); | |
} | |
try { | |
dataUrl=await dataUrlByFileReader(`https://jslave2.herokuapp.com/proxy/?url=${img}`); | |
return dataUrl; | |
} catch(err) { | |
console.log(err); | |
} | |
throw Error('could not resolve create dataUrl'); | |
}; | |
var download=async(image,name)=>{ | |
try { | |
var a=document.createElement('a'); | |
var dataUrl=await readAsDataUrl(image); | |
a.href=dataUrl; | |
a.setAttribute('download', name); | |
a.style.display='none'; | |
(document.body || document.documentElement).appendChild(a); | |
a.click(); | |
} catch (err) { | |
console.log(err, [image, name]); | |
} | |
return [image, name] | |
} | |
var downloadLinkedImages=()=>{ | |
return [...linkedImages()].map((url)=>{ | |
var name=`${location.host}${location.pathname.replace(/\//g,'.')}.${url.split(/\//).pop()}`; | |
return ()=>download(url,name) | |
}) | |
}; | |
var downloadImages=(w=250,h=250)=>embedImages(w,h).map((i)=>{ | |
var url=new URL(i.src); | |
var name=[url.host].concat(i.alt?i.alt.match(/\w+/g):[]).concat(url.pathname.match(/[^/\?]+/g)).filter(x=>!!x).join('-'); | |
return ()=>download(i.src,name); | |
}); | |
//download max. 2 images in parallel | |
var queueImages=queue(downloadImages(100,100),2); | |
var queueLinkedImages=queue(downloadLinkedImages(),2); | |
var A=[],B=[]; | |
try { | |
A=await queueImages(); | |
console.log('A',A); | |
} catch(err) { | |
console.log(err) | |
} | |
try { | |
B=await queueLinkedImages(); | |
console.log('B',B); | |
} catch(err) { | |
console.log(err) | |
} | |
return [A,B] | |
}; | |
main().then(console.log).catch(console.log); | |
//Bookmarklet | |
//javascript:(function(){!function(){var e;(async()=>{function t(e,t){return function(){var r=new Array(e.length),o=0,a=e.length,n=0;return new Promise(function(c,l){!function c(l,s){if(n<e.length&&o<t){let t=n;function i(e){return r[t]=e,--o,0==--a?l(r):c(l,s),e}++n,++o,e[t]().then(i,i),c(l,s)}}(function(e){c(e)},l)})}}var r=e=>new Promise((t,r)=>{if(e instanceof Image)try{n.height=e.height,n.width=e.width,n.getContext("2d").drawImage(e,0,0);var o=n.toDataURL("image/jpeg");return t(o)}catch(e){r(e.message)}else{var a=new Image;a.crossOrigin="Anonymous";var n=document.createElement("CANVAS");a.addEventListener("error",e=>r(e.message)),a.addEventListener("load",()=>{try{n.height=a.height,n.width=a.width,n.getContext("2d").drawImage(a,0,0);var e=n.toDataURL("image/jpeg");t(e)}catch(e){r(e.message)}}),a.src=e.src?e.src:e}}),o=e=>new Promise((t,r)=>{var o=new XMLHttpRequest;o.responseType="blob",o.onerror=(e=>r(e)),o.onload=function(){var e=new FileReader;e.onerror=function(e){r(e.message)},e.onloadend=function(){t(e.result)},e.readAsDataURL(o.response)},o.open("GET",e),o.send()}),a=async(e,t)=>{try{var a=document.createElement("a"),n=await(async e=>{try{return await r(e)}catch(e){conole.log(e)}try{return await r(`https://jslave.herokuapp.com/proxy/?url=${e}`)}catch(e){conole.log(e)}try{return await r(`https://jslave2.herokuapp.com/proxy/?url=${e}`)}catch(e){conole.log(e)}try{return await o(e)}catch(e){console.log(e)}try{return await o(`https://jslave.herokuapp.com/proxy/?url=${e}`)}catch(e){console.log(e)}try{return await o(`https://jslave2.herokuapp.com/proxy/?url=${e}`)}catch(e){console.log(e)}throw Error("could not resolve create dataUrl")})(e);a.href=n,a.setAttribute("download",t),a.style.display="none",(document.body||document.documentElement).appendChild(a),a.click()}catch(r){console.log(r,[e,t])}return[e,t]},n=t(((e=250,t=250)=>((e=250,t=250)=>[...document.querySelectorAll("img")].filter(({width:r,height:o})=>r>=e&&o>=t))(e,t).map(e=>{var t=new URL(e.src),r=[t.host].concat(e.alt?e.alt.match(/\w+/g):[]).concat(t.pathname.match(/[^/\?]+/g)).filter(e=>!!e).join("-");return()=>a(e.src,r)}))(100,100),2),c=t((()=>[...[...(e=e||window.document).querySelectorAll('[href$=".jpg"],[href$=".png"]')].map(e=>e.href)].map(e=>{var t=`${location.host}${location.pathname.replace(/\//g,".")}.${e.split(/\//).pop()}`;return()=>a(e,t)}))(),2),l=[],s=[];try{l=await n(),console.log("A",l)}catch(e){console.log(e)}try{s=await c(),console.log("B",s)}catch(e){console.log(e)}})()}();})(); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(async function(window,document) { | |
//you can load any gist here by pasting its link as this urls hash (after #) | |
try { | |
//ea-webkit | |
await loadScript('https://unpkg.com/ea-webkit@latest/dist/webkit.min.js'); | |
console.log($); | |
//creates this bookmarklet editor widget | |
$.toolbox() | |
.then(({editor, btnToolbox,btnBookmarklet}) => { | |
//this (or any) gist link | |
var defaultGistUrl = 'https://gist.github.com/hagb4rd/6843803a6674fe1b9ead6f1e60f14f15#file-toolbox-js'; | |
//var defaultGistUrl = 'https://gist.github.com/hagb4rd/6843803a6674fe1b9ead6f1e60f14f15#file-queue-download-images-js'; | |
//var defaultGistUrl = 'https://gist.github.com/hagb4rd/6843803a6674fe1b9ead6f1e60f14f15#download-linked-images-text-js' | |
//load-gist-contents | |
$.gist.file(defaultGistUrl).then(file=>{ | |
editor.session.setValue(file.content) | |
}) | |
}) | |
window.loadScript=loadScript; | |
function loadScript(e='') { | |
return new Promise((t,n)=>{ | |
var i='mk'+(e=>[...String(e)].reduce((e,t)=>e^=t.charCodeAt(0),255))(e); | |
var r=document.querySelector('[src="' + e + '"]');r?t():((r=document.createElement('script')).id=i,r.setAttribute('async',''),r.addEventListener('load',e=>t()),r.addEventListener('error',e=>n()),r.src=e,(document.head||document.body||document.documentElement).appendChild(r)) | |
}); | |
}; | |
} catch(err) { | |
console.log(err); | |
throw err; | |
} | |
})(window,window.document) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment