Skip to content

Instantly share code, notes, and snippets.

@hbussell
Created January 28, 2010 00:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hbussell/288293 to your computer and use it in GitHub Desktop.
Save hbussell/288293 to your computer and use it in GitHub Desktop.
greasemonkey script to download page resources with wget
// ==UserScript==
// @name Download with Wget
// @namespace http://userscripts.org/users/14536
// @description Creates code to download web pages, images and other files using wget
// @include *
// ==/UserScript==
// Last updated 2009-01-13
function $(id) { return document.getElementById(id); }
function l(id,f) { $(id).addEventListener('click',f,false); }
function v(id,val) { if (val!=null) { $(id).value=val; } return $(id).value; }
function popup() {
var loc = location.href.toLowerCase();
if ($('wgetoptions')) { return; }
var style = '#wgetcontainer { position:absolute; top:10px; left:0; right:0; z-index:10000000; }'+
'#wgetoptions { width:700px; margin:0 auto; background:#f9f9f9; border:3px double black; padding:10px; font-family:serif; }'+
'#wgetoptions table { margin:0 auto; }'+
'#wgetoptions td { vertical-align:top; padding-bottom:10px; border:none; text-align:left; }'+
'#wgetoptions td, #wgetoptions label { font-size:14px; font-weight:normal; font-family:serif; color:black; }'+
'#wgetoptions .wgetpreset { font-size:11px; }'+
'#wgetoptions .wgetpreset span { color:#003399; font-style:italic; cursor:pointer; }'+
'#wgetoptions input[type=text] { width:500px; }'+
'#wgetoptions input[type=button], #wgetoptions input[type=submit] { width:150px; }'+
'#wgetcode { width:100%; height:200px; }'+
'#wgetshadow { background:black; opacity:0.6; z-index:9999999; top:0; right:0; left:0; bottom:0; position:fixed; }';
GM_addStyle(style.replace(/;/g,' ! important;'));
GM_addStyle('.wgetadvanced { display:none; }');
var shadow = document.createElement('shadow');
shadow.id = 'wgetshadow';
var div = document.createElement('div');
div.id = 'wgetcontainer';
div.innerHTML = '<div id="wgetoptions"><form onsubmit="return false;"><table>'+
'<tr><td></td><td></td></tr>'+
'<tr><td>Source: </td><td><input type="checkbox" id="wgetlinks" ' + (GM_getValue('links',true) ? 'checked="checked" ' : '') + '/><label for="wgetlinks">Links</label> <input type="checkbox" id="wgetimages" ' + (GM_getValue('images',false) ? 'checked="checked" ' : '') + '/><label for="wgetimages">Images</label> <input type="checkbox" id="wgetcss" ' + (GM_getValue('css',false) ? 'checked="checked" ' : '') + '/><label for="wgetcss">CSS</label></td><td style="text-align:right ! important;"><select id="wgetmode"><option>Manual</option><option>Facebook Pictures</option><option>Google Image Search</option><option>MySpace Pictures</option></select></td></tr>'+
'<tr><td>Extensions Filter: </td><td colspan="2"><input type="text" id="wgetextensions" /><br /><span class="wgetpreset">presets: <span id="wgetextall">All</span> - <span id="wgetextimg">Images</span> - <span id="wgetextav">Audio/Video</span> - <span id="wgetextweb">Web Pages</span></span></td></tr>'+
'<tr class="wgetadvanced"><td>Regex Filter: </td><td colspan="2"><input type="text" id="wgetregex" /></td></tr>'+
'<tr class="wgetadvanced"><td>Regex Replace: </td><td colspan="2"><input type="text" id="wgetfind" style="width:248px ! important;" /> <input type="text" id="wgetreplace" style="width:247px ! important;" /></td></tr>'+
'<tr class="wgetadvanced"><td>User Agent: </td><td colspan="2"><input type="text" id="wgetuseragent" value="' + navigator.userAgent + '" /><br /><span class="wgetpreset">presets: <span id="wgetuadef">Browser Default</span> - <span id="wgetuawget">Wget</span> - <span id="wgetuaffl">Firefox on Linux</span> - <span id="wgetuaie">IE on Windows</span></span></td></tr>'+
'<tr><td><input type="checkbox" id="wgetadvanced" /><label for="wgetadvanced">Advanced</label><input type="checkbox" id="wgetfile" /><label for="wgetfile">Each resource as line</label></td><td colspan="2" style="text-align:right ! important;"><input type="submit" id="wgetcreate" value="Create Code" /> <input type="button" id="wgetreset" value="Reset" /> <input type="button" id="wgetclose" value="Close" /></td></tr>'+
'<tr><td colspan="3"><textarea id="wgetcode" onmouseover="this.focus(); this.select();"></textarea></td></tr>'+
'<tr><td colspan="3" id="status">Ready...</td></tr>'+
'</table></form>';
document.body.appendChild(div);
document.body.appendChild(shadow);
window.scroll(0,0);
if (GM_getValue('advanced',false)) { $('wgetadvanced').checked = 'checked'; toggleAdvanced(true); }
if (loc.indexOf('images.google.')!=-1) { changeMode('Google Image Search'); }
else if (loc.indexOf('facebook.com')!=-1) { changeMode('Facebook Pictures'); }
else if (loc.indexOf('myspace.com')!=-1) { changeMode('MySpace Pictures'); }
l('wgetadvanced',function(e){ GM_setValue('advanced',e.target.checked); toggleAdvanced(e.target.checked); });
l('wgetlinks',function(e){ GM_setValue('links',e.target.checked); });
l('wgetimages',function(e){ GM_setValue('images',e.target.checked); });
l('wgetcss',function(e){ GM_setValue('css',e.target.checked); });
l('wgetuaffl',function(){ v('wgetuseragent','Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.5) Gecko/2008121622 Firefox/3.0.5'); });
l('wgetuaie',function(){ v('wgetuseragent','Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)'); });
l('wgetuadef',function(){ v('wgetuseragent',navigator.userAgent); });
l('wgetuawget',function(){ v('wgetuseragent',''); });
l('wgetextall',function(){ v('wgetextensions',''); });
l('wgetextimg',function(){ v('wgetextensions','jpg,jpeg,gif,png,bmp,svg'); });
l('wgetextav',function(){ v('wgetextensions','avi,flv,mp3,mp4,mpg,mpeg,m4a,m4v,ogg,aac,wma,wmv'); });
l('wgetextweb',function(){ v('wgetextensions','htm,html,php,asp'); });
l('wgetcreate',function(){ makeCode(); });
l('wgetreset',function(){ changeFields('','','','',navigator.userAgent,true,false,false); });
l('wgetclose',function(){ closePopup(); });
$('wgetmode').addEventListener('change', function(e) { changeMode(e.target.options[e.target.selectedIndex].value); }, false);
}
function toggleAdvanced(bool) {
var adv = document.evaluate("//tr[contains(@class,'wgetadvanced')]", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE , null);
for (var i=0; i<adv.snapshotLength; i++) { adv.snapshotItem(i).style.display = bool ? 'table-row' : 'none'; }
}
function changeFields(ext,regex,find,replace,ua,links,images,css) {
v('wgetextensions',ext);
v('wgetregex',regex);
v('wgetfind',find);
v('wgetreplace',replace);
v('wgetuseragent',ua);
if (links!=null) { $('wgetlinks').checked = links ? 'checked' : ''; }
if (images!=null) { $('wgetimages').checked = images ? 'checked' : ''; }
if (css!=null) { $('wgetcss').checked = css ? 'checked' : ''; }
}
function changeMode(mode) {
$('wgetmode').value = mode;
GM_setValue('mode',mode);
click('wgetuadef');
if (mode=='Manual') { changeFields('','','','',null,true,false,false); }
if (mode=='Facebook Pictures') { changeFields('jpg','photos.*\\d\\/[st]\\d','\\/[st]','/n',null,false,true,false); }
if (mode=='Google Image Search') { changeFields('','imgurl=','^.*imgurl=([^&]+).*$','$1',null,true,false,false); }
if (mode=='MySpace Pictures') { changeFields('jpg','images.*(\\/[am]_|_m\\.)','(\\/|_)[am](_|\\.)','$1l$2',null,false,true,false); }
}
function closePopup() {
$('wgetcontainer').parentNode.removeChild($('wgetcontainer'));
$('wgetshadow').parentNode.removeChild($('wgetshadow'));
}
function click(id) {
var evt = document.createEvent('MouseEvents');
evt.initMouseEvent( 'click', true, true, window, 0, 1, 1, 1, 1, false, false, false, false, 0, null );
$(id).dispatchEvent(evt);
}
function makeCode() {
var code = 'wget';
var as_file = v('wgetfile');
if (v('wgetuseragent')!='') { code = code + ' -U "' + v('wgetuseragent').replace(/"/g,'\"') + '"'; }
var count = 0;
var ext=null, regex=null;
if (v('wgetextensions')!='') { ext = new RegExp('\\.(' + v('wgetextensions').replace(/,/g,'|') + ')(\\?.*)?$', 'i'); }
if (v('wgetregex')!='') { regex = new RegExp(v('wgetregex'), 'i'); }
var doReplace = v('wgetfind')!='' && v('wgetreplace')!='';
var find = doReplace ? new RegExp(v('wgetfind')) : null;
var replace = doReplace ? v('wgetreplace') : null;
if(as_file){
code = '';
}
function addURL(url) {
if ((ext==null || ext.test(url)) && (regex==null || regex.test(url))) {
if (doReplace) { url = url.replace(find,replace); }
if (code.indexOf(url)==-1) {
if(as_file){
code = code + url +"\n";
}else{
code = code + ' ' + url;
}
count++;
}
}
}
if ($('wgetlinks').checked) {
var elms = document.getElementsByTagName('a');
for (var i=0; i<elms.length; i++) { addURL(elms[i].href); }
}
if ($('wgetimages').checked) {
var elms = document.getElementsByTagName('img');
for (var i=0; i<elms.length; i++) { addURL(elms[i].src); }
}
if ($('wgetcss').checked) {
function checkCSS(elms) {
for (var i=0; i<elms.length; i++) {
buf = document.defaultView.getComputedStyle(elms[i],null).getPropertyValue('background-image');
if (buf!='none') { addURL(buf.match(/url\((.+)\)/)[1]); }
}
}
var elements = ['body','div','table','tr','th','td','tbody','thead','tfoot'
,'button','caption','cite','code','col','colgroup','dd','del','dl','dt','em'
,'fieldset','form','h1','h2','h3','h4','h5','h6','i','iframe','img',
,'input','ins','label','legend','li','map','menu','ol','optiongroup','option','p',
,'pre','q','s','samp','select','small','span','strike','strong','sub','sup',
,'textarea','tt','u','var'];
for (var i in elements){
var elem = elements[i];
checkCSS(document.getElementsByTagName(elem));
}
}
$('status').innerHTML = count==0 ? 'No matches found' : count + ' matches found';
$('wgetcode').innerHTML = code;
}
window.addEventListener('keydown', function(e) {
if (e.keyCode==68 && e.shiftKey && e.ctrlKey) { popup(); }
if (e.keyCode==27 && $('wgetoptions')) { closePopup(); e.preventDefault(); }
}, false);
GM_registerMenuCommand('Download with Wget', popup);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment