// Get current URL
const url = window.location.href;
// Get time
function getCurrentUTCTimeFormatted() {
const now = new Date();
const year = now.getUTCFullYear();
const month = String(now.getUTCMonth() + 1).padStart(2, '0');
const day = String(now.getUTCDate()).padStart(2, '0');
const hours = String(now.getUTCHours()).padStart(2, '0'); // Get the hours (00-23) in UTC
const minutes = String(now.getUTCMinutes()).padStart(2, '0'); // minutes (00-59) in UTC
const seconds = String(now.getUTCSeconds()).padStart(2, '0'); // seconds (00-59) in UTC
return `${year}${month}${day}${hours}${minutes}${seconds}`;
}
const time = getCurrentUTCTimeFormatted();
// Get safe URL string
function urlSafeF(url) {
return url.replace(/[:\/?=@&(),+*%#]/g, '-');
}
const urlsafe = urlSafeF(url);
// Get DocType
const doctype = document.doctype;
let doctypeString = "";
if (doctype) {
doctypeString = `\n`;
} else {
doctypeString = "";
}
// Get webpage
const output = doctypeString + document.documentElement.outerHTML;
const blob = new Blob([output], { type: 'text/plain' });
const url1 = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url1;
a.download = time + "-" + urlsafe;
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
URL.revokeObjectURL(url1);
// Download URL to text file
const blob1 = new Blob([url + "\n"], { type: 'text/plain' });
const blobUrl = URL.createObjectURL(blob1);
const a1 = document.createElement('a');
a1.href = blobUrl;
a1.download = time + "-" + urlsafe + ".txt";
document.body.appendChild(a1);
a1.click();
document.body.removeChild(a1);
URL.revokeObjectURL(blobUrl);
read -p "url: " url; xdotool windowactivate $(xdotool search --name "Brave" | sort -n | head -1); sleep 0.1; xdotool key ctrl+t; sleep 0.1; xdotool type "$url"; xdotool key Return; sleep 2; xdotool key ctrl+shift+j; sleep 1; xdotool type "const base64String = \"Ly8gR2V0IGN1cnJlbnQgVVJMCmNvbnN0IHVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmOwoKLy8gR2V0IHRpbWUKZnVuY3Rpb24gZ2V0Q3VycmVudFVUQ1RpbWVGb3JtYXR0ZWQoKSB7CiAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpOwogICAgY29uc3QgeWVhciA9IG5vdy5nZXRVVENGdWxsWWVhcigpOwogICAgY29uc3QgbW9udGggPSBTdHJpbmcobm93LmdldFVUQ01vbnRoKCkgKyAxKS5wYWRTdGFydCgyLCAnMCcpOwogICAgY29uc3QgZGF5ID0gU3RyaW5nKG5vdy5nZXRVVENEYXRlKCkpLnBhZFN0YXJ0KDIsICcwJyk7CiAgICBjb25zdCBob3VycyA9IFN0cmluZyhub3cuZ2V0VVRDSG91cnMoKSkucGFkU3RhcnQoMiwgJzAnKTsgLy8gR2V0IHRoZSBob3VycyAoMDAtMjMpIGluIFVUQwogICAgY29uc3QgbWludXRlcyA9IFN0cmluZyhub3cuZ2V0VVRDTWludXRlcygpKS5wYWRTdGFydCgyLCAnMCcpOyAvLyBtaW51dGVzICgwMC01OSkgaW4gVVRDCiAgICBjb25zdCBzZWNvbmRzID0gU3RyaW5nKG5vdy5nZXRVVENTZWNvbmRzKCkpLnBhZFN0YXJ0KDIsICcwJyk7IC8vIHNlY29uZHMgKDAwLTU5KSBpbiBVVEMKICAgIHJldHVybiBgJHt5ZWFyfSR7bW9udGh9JHtkYXl9JHtob3Vyc30ke21pbnV0ZXN9JHtzZWNvbmRzfWA7Cn0KY29uc3QgdGltZSA9IGdldEN1cnJlbnRVVENUaW1lRm9ybWF0dGVkKCk7CgovLyBHZXQgc2FmZSBVUkwgc3RyaW5nCmZ1bmN0aW9uIHVybFNhZmVGKHVybCkgewogICAgcmV0dXJuIHVybC5yZXBsYWNlKC9bOlwvPz1AJigpLCsqJSNdL2csICctJyk7Cn0KY29uc3QgdXJsc2FmZSA9IHVybFNhZmVGKHVybCk7CgovLyBHZXQgRG9jVHlwZQpjb25zdCBkb2N0eXBlID0gZG9jdW1lbnQuZG9jdHlwZTsKbGV0IGRvY3R5cGVTdHJpbmcgPSAiIjsKaWYgKGRvY3R5cGUpIHsKICAgIGRvY3R5cGVTdHJpbmcgPSBgPCFET0NUWVBFICR7ZG9jdHlwZS5uYW1lfT5cbmA7Cn0gZWxzZSB7CiAgICBkb2N0eXBlU3RyaW5nID0gIiI7Cn0KCi8vIEdldCB3ZWJwYWdlCmNvbnN0IG91dHB1dCA9IGRvY3R5cGVTdHJpbmcgKyBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQub3V0ZXJIVE1MOwpjb25zdCBibG9iID0gbmV3IEJsb2IoW291dHB1dF0sIHsgdHlwZTogJ3RleHQvcGxhaW4nIH0pOwpjb25zdCB1cmwxID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTsKY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsKYS5ocmVmID0gdXJsMTsKYS5kb3dubG9hZCA9IHRpbWUgKyAiLSIgKyB1cmxzYWZlOwpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpOwphLmNsaWNrKCk7CmRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYSk7ClVSTC5yZXZva2VPYmplY3RVUkwodXJsMSk7CgovLyBEb3dubG9hZCBVUkwgdG8gdGV4dCBmaWxlCmNvbnN0IGJsb2IxID0gbmV3IEJsb2IoW3VybCArICJcbiJdLCB7IHR5cGU6ICd0ZXh0L3BsYWluJyB9KTsKY29uc3QgYmxvYlVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYjEpOwpjb25zdCBhMSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsKYTEuaHJlZiA9IGJsb2JVcmw7CmExLmRvd25sb2FkID0gdGltZSArICItIiArIHVybHNhZmUgKyAiLnR4dCI7CmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYTEpOwphMS5jbGljaygpOwpkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGExKTsKVVJMLnJldm9rZU9iamVjdFVSTChibG9iVXJsKTs=\";const decodedString = atob(base64String);eval(decodedString);"; xdotool key Return # "xdotool type" = takes a while, so remove comments and stuff from the JS code
export DISPLAY=:1; read -p "url: " url; xdotool windowactivate $(xdotool search --name "Brave" | sort -n | head -1); sleep 0.1; xdotool key ctrl+t; sleep 0.1; xdotool type "$url"; xdotool key Return; sleep 2; xdotool key ctrl+shift+j; sleep 1; echo "const base64String = \"Y29uc3QgdXJsPXdpbmRvdy5sb2NhdGlvbi5ocmVmO2Z1bmN0aW9uIGdldEN1cnJlbnRVVENUaW1lRm9ybWF0dGVkKCl7Y29uc3Qgbm93PW5ldyBEYXRlKCk7Y29uc3QgeWVhcj1ub3cuZ2V0VVRDRnVsbFllYXIoKTtjb25zdCBtb250aD1TdHJpbmcobm93LmdldFVUQ01vbnRoKCkrMSkucGFkU3RhcnQoMiwnMCcpO2NvbnN0IGRheT1TdHJpbmcobm93LmdldFVUQ0RhdGUoKSkucGFkU3RhcnQoMiwnMCcpO2NvbnN0IGhvdXJzPVN0cmluZyhub3cuZ2V0VVRDSG91cnMoKSkucGFkU3RhcnQoMiwnMCcpO2NvbnN0IG1pbnV0ZXM9U3RyaW5nKG5vdy5nZXRVVENNaW51dGVzKCkpLnBhZFN0YXJ0KDIsJzAnKTtjb25zdCBzZWNvbmRzPVN0cmluZyhub3cuZ2V0VVRDU2Vjb25kcygpKS5wYWRTdGFydCgyLCcwJyk7cmV0dXJuIGAke3llYXJ9JHttb250aH0ke2RheX0ke2hvdXJzfSR7bWludXRlc30ke3NlY29uZHN9YDt9Y29uc3QgdGltZT1nZXRDdXJyZW50VVRDVGltZUZvcm1hdHRlZCgpO2Z1bmN0aW9uIHVybFNhZmVGKHVybCl7cmV0dXJuIHVybC5yZXBsYWNlKC9bOlwvPz1AJigpLCsqJSNdL2csJy0nKTt9Y29uc3QgdXJsc2FmZSA9IHVybFNhZmVGKHVybCk7Y29uc3QgZG9jdHlwZT1kb2N1bWVudC5kb2N0eXBlO2xldCBkb2N0eXBlU3RyaW5nPSIiO2lmKGRvY3R5cGUpe2RvY3R5cGVTdHJpbmc9YDwhRE9DVFlQRSAke2RvY3R5cGUubmFtZX0+XG5gO31lbHNle2RvY3R5cGVTdHJpbmc9IiI7fWNvbnN0IG91dHB1dD1kb2N0eXBlU3RyaW5nK2RvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vdXRlckhUTUw7Y29uc3QgYmxvYj1uZXcgQmxvYihbb3V0cHV0XSx7dHlwZTondGV4dC9wbGFpbid9KTtjb25zdCB1cmwxPVVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7Y29uc3QgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7YS5ocmVmPXVybDE7YS5kb3dubG9hZD10aW1lKyItIit1cmxzYWZlO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7YS5jbGljaygpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYSk7VVJMLnJldm9rZU9iamVjdFVSTCh1cmwxKTtjb25zdCBibG9iMT1uZXcgQmxvYihbdXJsKyJcbiJdLHt0eXBlOid0ZXh0L3BsYWluJ30pO2NvbnN0IGJsb2JVcmw9VVJMLmNyZWF0ZU9iamVjdFVSTChibG9iMSk7Y29uc3QgYTE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO2ExLmhyZWY9YmxvYlVybDthMS5kb3dubG9hZD10aW1lKyItIit1cmxzYWZlKyIudHh0Ijtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGExKTthMS5jbGljaygpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYTEpO1VSTC5yZXZva2VPYmplY3RVUkwoYmxvYlVybCk7\";const decodedString = atob(base64String);eval(decodedString);" | xsel -ib; xdotool key ctrl+shift+v; xdotool key Return # dev tools console: "allow pasting" was previously typed and entered
# Turn off request from remote access to inputs KDE/Plasma popup
$ sudo mv -n /usr/share/applications/org.freedesktop.impl.portal.desktop.kde.desktop /usr/share/applications/.org.freedesktop.impl.portal.desktop.kde.desktop
# Doesn't work?
# https://old.reddit.com/r/kde/comments/1dlspdf/how_to_remove_remote_control_request_prompt/
# Does work :)
# https://invent.kde.org/plasma/xdg-desktop-portal-kde/-/merge_requests/326
# run $ flatpak permission-set kde-authorized remote-desktop org.kde.krdpserver yes
# $ flatpak permission-set kde-authorized remote-desktop "" yes
# No memento, for URLs containing "?"
basepath="/srv/http/selenium"; export DISPLAY=:1; read -p "url: " url; xdotool windowactivate $(xdotool search --name "Brave" | sort -n | head -1); sleep 0.1; xdotool key ctrl+t; sleep 0.1; xdotool type "$url"; xdotool key Return; sleep 2; xdotool key ctrl+shift+j; sleep 2; echo "const base64String = \"Y29uc3QgdXJsPXdpbmRvdy5sb2NhdGlvbi5ocmVmO2Z1bmN0aW9uIGdldEN1cnJlbnRVVENUaW1lRm9ybWF0dGVkKCl7Y29uc3Qgbm93PW5ldyBEYXRlKCk7Y29uc3QgeWVhcj1ub3cuZ2V0VVRDRnVsbFllYXIoKTtjb25zdCBtb250aD1TdHJpbmcobm93LmdldFVUQ01vbnRoKCkrMSkucGFkU3RhcnQoMiwnMCcpO2NvbnN0IGRheT1TdHJpbmcobm93LmdldFVUQ0RhdGUoKSkucGFkU3RhcnQoMiwnMCcpO2NvbnN0IGhvdXJzPVN0cmluZyhub3cuZ2V0VVRDSG91cnMoKSkucGFkU3RhcnQoMiwnMCcpO2NvbnN0IG1pbnV0ZXM9U3RyaW5nKG5vdy5nZXRVVENNaW51dGVzKCkpLnBhZFN0YXJ0KDIsJzAnKTtjb25zdCBzZWNvbmRzPVN0cmluZyhub3cuZ2V0VVRDU2Vjb25kcygpKS5wYWRTdGFydCgyLCcwJyk7cmV0dXJuIGAke3llYXJ9JHttb250aH0ke2RheX0ke2hvdXJzfSR7bWludXRlc30ke3NlY29uZHN9YDt9Y29uc3QgdGltZT1nZXRDdXJyZW50VVRDVGltZUZvcm1hdHRlZCgpO2Z1bmN0aW9uIHVybFNhZmVGKHVybCl7cmV0dXJuIHVybC5yZXBsYWNlKC9bOlwvPz1AJigpLCsqJSNdL2csJy0nKTt9Y29uc3QgdXJsc2FmZSA9IHVybFNhZmVGKHVybCk7Y29uc3QgZG9jdHlwZT1kb2N1bWVudC5kb2N0eXBlO2xldCBkb2N0eXBlU3RyaW5nPSIiO2lmKGRvY3R5cGUpe2RvY3R5cGVTdHJpbmc9YDwhRE9DVFlQRSAke2RvY3R5cGUubmFtZX0+XG5gO31lbHNle2RvY3R5cGVTdHJpbmc9IiI7fWNvbnN0IG91dHB1dD1kb2N0eXBlU3RyaW5nK2RvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vdXRlckhUTUw7Y29uc3QgYmxvYj1uZXcgQmxvYihbb3V0cHV0XSx7dHlwZTondGV4dC9wbGFpbid9KTtjb25zdCB1cmwxPVVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7Y29uc3QgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7YS5ocmVmPXVybDE7YS5kb3dubG9hZD10aW1lKyItIit1cmxzYWZlO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7YS5jbGljaygpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYSk7VVJMLnJldm9rZU9iamVjdFVSTCh1cmwxKTtjb25zdCBibG9iMT1uZXcgQmxvYihbdXJsKyJcbiJdLHt0eXBlOid0ZXh0L3BsYWluJ30pO2NvbnN0IGJsb2JVcmw9VVJMLmNyZWF0ZU9iamVjdFVSTChibG9iMSk7Y29uc3QgYTE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO2ExLmhyZWY9YmxvYlVybDthMS5kb3dubG9hZD10aW1lKyItIit1cmxzYWZlKyIudHh0Ijtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGExKTthMS5jbGljaygpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYTEpO1VSTC5yZXZva2VPYmplY3RVUkwoYmxvYlVybCk7\";const decodedString = atob(base64String);eval(decodedString);" | xsel -ib; xdotool key ctrl+shift+v; xdotool key Return; sleep 2; newest="$(ls /srv/http/selenium/dl -t | head -n2 | tail -n1)"; newpath="$basepath/dl/$newest"; cid="$(curl -sLk -XPOST -F file=@$newpath "https://10.0.0.231:5001/api/v0/add?cid-version=1&chunker=size-1048576&recursive=true&pin=false" | jq .Hash | sed "s/\"//g")"; curl -sLk -XPOST "https://10.0.0.231:5001/api/v0/files/cp?arg=/ipfs/$cid&arg=/created/cid/$cid"; time="$(echo $newest | sed "s/-.*//g")"; urlsafe="$(echo $newest | sed "s/^...............//g")"; url="$(cat "$basepath/dl/$time-$urlsafe.txt")"; arr="$(echo "$url" | sed "s/^https\?:\/\///g" | sed "s/\/.*//g" | sed "s/\./ /g")"; echo "$(echo "${arr[@]}" | tr ' ' '\n' | tac | tr '\n' ' ' | sed "s/ $//g" | sed "s/ /,/g")$(echo "$url" | sed "s/^https\?:\/\/[^\/]*/)/g" | tr "[:upper:]" "[:lower:]") $time {\"locator\": \"urn:ipfs/bafkreihdwdcefgh4dqkjv67uzcmw7ojee6xedzdetojuzjevtenxquvyku/$cid\", \"status_code\": \"200\", \"mime_type\": \"text/html;charset=UTF-8\", \"original_uri\": \"$url\", \"title\": \"$(cat "$basepath/dl/$time-$urlsafe" | htmlq --text title)\"}" > $basepath/dl/$time-$urlsafe.cdxj
# Upper to lowercase ('tr "[:upper:]" "[:lower:]"') is needed for the
# com,example/case lookup thing, but replay incorrectly links to
# example.com/case even if the original URL was example.com/CASE
# Memento, for URLs not containing "?"
basepath="/srv/http/selenium"; export DISPLAY=:1; read -p "url: " url; xdotool windowactivate $(xdotool search --name "Brave" | sort -n | head -1); sleep 0.1; xdotool key ctrl+t; sleep 0.1; xdotool type "$url"; xdotool key Return; sleep 2; xdotool key ctrl+shift+j; sleep 2; echo "const base64String = \"Y29uc3QgdXJsPXdpbmRvdy5sb2NhdGlvbi5ocmVmO2Z1bmN0aW9uIGdldEN1cnJlbnRVVENUaW1lRm9ybWF0dGVkKCl7Y29uc3Qgbm93PW5ldyBEYXRlKCk7Y29uc3QgeWVhcj1ub3cuZ2V0VVRDRnVsbFllYXIoKTtjb25zdCBtb250aD1TdHJpbmcobm93LmdldFVUQ01vbnRoKCkrMSkucGFkU3RhcnQoMiwnMCcpO2NvbnN0IGRheT1TdHJpbmcobm93LmdldFVUQ0RhdGUoKSkucGFkU3RhcnQoMiwnMCcpO2NvbnN0IGhvdXJzPVN0cmluZyhub3cuZ2V0VVRDSG91cnMoKSkucGFkU3RhcnQoMiwnMCcpO2NvbnN0IG1pbnV0ZXM9U3RyaW5nKG5vdy5nZXRVVENNaW51dGVzKCkpLnBhZFN0YXJ0KDIsJzAnKTtjb25zdCBzZWNvbmRzPVN0cmluZyhub3cuZ2V0VVRDU2Vjb25kcygpKS5wYWRTdGFydCgyLCcwJyk7cmV0dXJuIGAke3llYXJ9JHttb250aH0ke2RheX0ke2hvdXJzfSR7bWludXRlc30ke3NlY29uZHN9YDt9Y29uc3QgdGltZT1nZXRDdXJyZW50VVRDVGltZUZvcm1hdHRlZCgpO2Z1bmN0aW9uIHVybFNhZmVGKHVybCl7cmV0dXJuIHVybC5yZXBsYWNlKC9bOlwvPz1AJigpLCsqJSNdL2csJy0nKTt9Y29uc3QgdXJsc2FmZSA9IHVybFNhZmVGKHVybCk7Y29uc3QgZG9jdHlwZT1kb2N1bWVudC5kb2N0eXBlO2xldCBkb2N0eXBlU3RyaW5nPSIiO2lmKGRvY3R5cGUpe2RvY3R5cGVTdHJpbmc9YDwhRE9DVFlQRSAke2RvY3R5cGUubmFtZX0+XG5gO31lbHNle2RvY3R5cGVTdHJpbmc9IiI7fWNvbnN0IG91dHB1dD1kb2N0eXBlU3RyaW5nK2RvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vdXRlckhUTUw7Y29uc3QgYmxvYj1uZXcgQmxvYihbb3V0cHV0XSx7dHlwZTondGV4dC9wbGFpbid9KTtjb25zdCB1cmwxPVVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7Y29uc3QgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7YS5ocmVmPXVybDE7YS5kb3dubG9hZD10aW1lKyItIit1cmxzYWZlO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7YS5jbGljaygpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYSk7VVJMLnJldm9rZU9iamVjdFVSTCh1cmwxKTtjb25zdCBibG9iMT1uZXcgQmxvYihbdXJsKyJcbiJdLHt0eXBlOid0ZXh0L3BsYWluJ30pO2NvbnN0IGJsb2JVcmw9VVJMLmNyZWF0ZU9iamVjdFVSTChibG9iMSk7Y29uc3QgYTE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO2ExLmhyZWY9YmxvYlVybDthMS5kb3dubG9hZD10aW1lKyItIit1cmxzYWZlKyIudHh0Ijtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGExKTthMS5jbGljaygpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYTEpO1VSTC5yZXZva2VPYmplY3RVUkwoYmxvYlVybCk7\";const decodedString = atob(base64String);eval(decodedString);" | xsel -ib; xdotool key ctrl+shift+v; xdotool key Return; sleep 2; newest="$(ls /srv/http/selenium/dl -t | head -n2 | tail -n1)"; newpath="$basepath/dl/$newest"; cid="$(curl -sLk -XPOST -F file=@$newpath "https://10.0.0.231:5001/api/v0/add?cid-version=1&chunker=size-1048576&recursive=true&pin=false" | jq .Hash | sed "s/\"//g")"; curl -sLk -XPOST "https://10.0.0.231:5001/api/v0/files/cp?arg=/ipfs/$cid&arg=/created/cid/$cid"; time="$(echo $newest | sed "s/-.*//g")"; urlsafe="$(echo $newest | sed "s/^...............//g")"; url="$(cat "$basepath/dl/$time-$urlsafe.txt")"; arr="$(echo "$url" | sed "s/^https\?:\/\///g" | sed "s/\/.*//g" | sed "s/\./ /g")"; echo "$(echo "${arr[@]}" | tr ' ' '\n' | tac | tr '\n' ' ' | sed "s/ $//g" | sed "s/ /,/g")$(echo "$url" | sed "s/^https\?:\/\/[^\/]*/)/g" | tr "[:upper:]" "[:lower:]") $time {\"locator\": \"urn:ipfs/bafkreihdwdcefgh4dqkjv67uzcmw7ojee6xedzdetojuzjevtenxquvyku/$cid\", \"status_code\": \"200\", \"mime_type\": \"text/html;charset=UTF-8\", \"original_uri\": \"$url\", \"title\": \"$(cat "$basepath/dl/$time-$urlsafe" | htmlq --text title)\"}" > "$basepath/dl/$time-$urlsafe.cdxj"; membase="$basepath/dl/m/$(date +%s)"; urlpath="$(echo "$url" | sed "s/^https\?:\/\///g" | sed "s/\/$//g")"; if [[ "$url" =~ .*/$ ]]; then mkdir -p "$membase/memento/$time/$urlpath"; cp -n "$time-$urlsafe" "$membase/memento/$time/$urlpath/index.html"; else urlpathnolast="$(echo "$urlpath" | sed "s/\/[^\/]*$//g")"; lastpart="$(echo $urlpath | sed "s/.*\///g")"; mkdir -p "$membase/memento/$time/$urlpathnolast"; cp -n "$time-$urlsafe" "$membase/memento/$time/$urlpathnolast/$lastpart"; fi; cp -n "$basepath/dl/$time-$urlsafe.cdxj" "$membase"; cp -n "$basepath/dl/$time-$urlsafe.txt" "$membase"; cp -n "$basepath/dl/$time-$urlsafe" "$membase"
The key is "charset utf-8;".
/etc/nginx/sites-available/default
--->
map $http_content_type $to {
"~^text/html" "text/html; charset=utf-8";
}
<---
/etc/nginx/conf.d/ipfs.conf
--->
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name 10.0.0.229;
ssl_certificate /etc/ssl/private/ssigned.crt;
ssl_certificate_key /etc/ssl/private/ssigned.key;
charset utf-8;
location ~ ^/(ipfs|ipns) {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection upgrade;
proxy_set_header Content-Type $to;
proxy_cache_bypass $http_upgrade;
allow all;
}
}
<---
# Memento, for URLs not containing "?"
localip=10.0.0.231; basepath="/srv/http/selenium"; export DISPLAY=:1; flatpak permission-set kde-authorized remote-desktop org.kde.krdpserver yes; flatpak permission-set kde-authorized remote-desktop "" yes; read -p "url: " url; xdotool windowactivate $(xdotool search --name "Brave" | sort -n | head -1); sleep 0.1; xdotool key ctrl+t; sleep 0.1; xdotool type "$url"; xdotool key Delete; xdotool key Return; sleep 2; xdotool type " "; sleep 0.2; xdotool key ctrl+shift+j; sleep 2; echo "const base64String = \"Y29uc3QgdXJsPXdpbmRvdy5sb2NhdGlvbi5ocmVmO2Z1bmN0aW9uIGdldEN1cnJlbnRVVENUaW1lRm9ybWF0dGVkKCl7Y29uc3Qgbm93PW5ldyBEYXRlKCk7Y29uc3QgeWVhcj1ub3cuZ2V0VVRDRnVsbFllYXIoKTtjb25zdCBtb250aD1TdHJpbmcobm93LmdldFVUQ01vbnRoKCkrMSkucGFkU3RhcnQoMiwnMCcpO2NvbnN0IGRheT1TdHJpbmcobm93LmdldFVUQ0RhdGUoKSkucGFkU3RhcnQoMiwnMCcpO2NvbnN0IGhvdXJzPVN0cmluZyhub3cuZ2V0VVRDSG91cnMoKSkucGFkU3RhcnQoMiwnMCcpO2NvbnN0IG1pbnV0ZXM9U3RyaW5nKG5vdy5nZXRVVENNaW51dGVzKCkpLnBhZFN0YXJ0KDIsJzAnKTtjb25zdCBzZWNvbmRzPVN0cmluZyhub3cuZ2V0VVRDU2Vjb25kcygpKS5wYWRTdGFydCgyLCcwJyk7cmV0dXJuIGAke3llYXJ9JHttb250aH0ke2RheX0ke2hvdXJzfSR7bWludXRlc30ke3NlY29uZHN9YDt9Y29uc3QgdGltZT1nZXRDdXJyZW50VVRDVGltZUZvcm1hdHRlZCgpO2Z1bmN0aW9uIHVybFNhZmVGKHVybCl7cmV0dXJuIHVybC5yZXBsYWNlKC9bOlwvPz1AJigpLCsqJSNdL2csJy0nKTt9Y29uc3QgdXJsc2FmZSA9IHVybFNhZmVGKHVybCk7Y29uc3QgZG9jdHlwZT1kb2N1bWVudC5kb2N0eXBlO2xldCBkb2N0eXBlU3RyaW5nPSIiO2lmKGRvY3R5cGUpe2RvY3R5cGVTdHJpbmc9YDwhRE9DVFlQRSAke2RvY3R5cGUubmFtZX0+XG5gO31lbHNle2RvY3R5cGVTdHJpbmc9IiI7fWNvbnN0IG91dHB1dD1kb2N0eXBlU3RyaW5nK2RvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vdXRlckhUTUw7Y29uc3QgYmxvYj1uZXcgQmxvYihbb3V0cHV0XSx7dHlwZTondGV4dC9wbGFpbid9KTtjb25zdCB1cmwxPVVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7Y29uc3QgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7YS5ocmVmPXVybDE7YS5kb3dubG9hZD10aW1lKyItIit1cmxzYWZlO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7YS5jbGljaygpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYSk7VVJMLnJldm9rZU9iamVjdFVSTCh1cmwxKTtjb25zdCBibG9iMT1uZXcgQmxvYihbdXJsKyJcbiJdLHt0eXBlOid0ZXh0L3BsYWluJ30pO2NvbnN0IGJsb2JVcmw9VVJMLmNyZWF0ZU9iamVjdFVSTChibG9iMSk7Y29uc3QgYTE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO2ExLmhyZWY9YmxvYlVybDthMS5kb3dubG9hZD10aW1lKyItIit1cmxzYWZlKyIudHh0Ijtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGExKTthMS5jbGljaygpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYTEpO1VSTC5yZXZva2VPYmplY3RVUkwoYmxvYlVybCk7\";const decodedString = atob(base64String);eval(decodedString);" | xsel -ib; xdotool key ctrl+shift+v; xdotool key Return; sleep 2; newest="$(ls /srv/http/selenium/dl -t | head -n2 | tail -n1)"; newpath="$basepath/dl/$newest"; cid="$(curl -sLk -XPOST -F file=@$newpath "https://$localip:5001/api/v0/add?cid-version=1&chunker=size-1048576&recursive=true&pin=false" | jq .Hash | sed "s/\"//g")"; curl -sLk -XPOST "https://$localip:5001/api/v0/files/cp?arg=/ipfs/$cid&arg=/created/cid/$cid"; time="$(echo $newest | sed "s/-.*//g")"; urlsafe="$(echo $newest | sed "s/^...............//g")"; url="$(cat "$basepath/dl/$time-$urlsafe.txt")"; arr="$(echo "$url" | sed "s/^https\?:\/\///g" | sed "s/\/.*//g" | sed "s/\./ /g")"; echo "$(echo "${arr[@]}" | tr ' ' '\n' | tac | tr '\n' ' ' | sed "s/ $//g" | sed "s/ /,/g")$(echo "$url" | sed "s/^https\?:\/\/[^\/]*/)/g" | tr "[:upper:]" "[:lower:]") $time {\"locator\": \"urn:ipfs/bafkreihdwdcefgh4dqkjv67uzcmw7ojee6xedzdetojuzjevtenxquvyku/$cid\", \"status_code\": \"200\", \"mime_type\": \"text/html;charset=UTF-8\", \"original_uri\": \"$url\", \"title\": \"$(cat "$basepath/dl/$time-$urlsafe" | htmlq --text title)\"}" > "$basepath/dl/$time-$urlsafe.cdxj"; membase="$basepath/dl/m/$(date +%s)"; urlpath="$(echo "$url" | sed "s/^https\?:\/\///g" | sed "s/\/$//g")"; if [[ "$url" =~ .*/$ ]]; then mkdir -p "$membase/memento/$time/$urlpath"; cp -n "$basepath/dl/$time-$urlsafe" "$membase/memento/$time/$urlpath/index.html"; else urlpathnolast="$(echo "$urlpath" | sed "s/\/[^\/]*$//g")"; lastpart="$(echo $urlpath | sed "s/.*\///g")"; mkdir -p "$membase/memento/$time/$urlpathnolast"; cp -n "$basepath/dl/$time-$urlsafe" "$membase/memento/$time/$urlpathnolast/$lastpart"; fi; cp -n "$basepath/dl/$time-$urlsafe.cdxj" "$membase"; cp -n "$basepath/dl/$time-$urlsafe.txt" "$membase"; cp -n "$basepath/dl/$time-$urlsafe" "$membase"; filesf() { basedir="$membase"; basedirlen=$(echo "$basedir" | wc --bytes); find "$basedir" -type f | basedirlen="$basedirlen" xargs -d "\n" sh -c 'for args do nobasedir=$(echo "$args" | sed -E "s/^.{$basedirlen}//g"); echo " -F "file=@"\"$args\";filename=\"$nobasedir\"" | tr -d \\n; done' _; }; cid="$(curl -sLk -XPOST -H "Content-Type: multipart/form-data" $(filesf) "https://$localip:5001/api/v0/add?cid-version=1&chunker=size-1048576&recursive=true&wrap-with-directory=true&pin=false" | tail -n1 | jq .Hash | sed "s/\"//g")"; curl -sLk -XPOST "https://$localip:5001/api/v0/files/cp?arg=/ipfs/$cid/memento/$time&arg=/memento/$time"; curl -sLk -XPOST "https://$localip:5001/api/v0/files/cp?arg=/ipfs/$cid&arg=/memento/srccid/$cid"; curl -sLk https://$localip/cgi-bin/taildh?id=$cid; echo $cid; echo $cid | xsel -ib
# filesf fails with " " in filename
# load page as max zoomed out and scroll down (28 space-bar scrolls)
Previous version of this file, "devtools.txt":
/ipfs/bafkreihax245t36jyatxf6jeiemgcsq3hurnveyxxoretxurblgay7uveq
#!/bin/bash
localip=10.0.0.231;
basepath="/srv/http/selenium";
export DISPLAY=:1;
flatpak permission-set kde-authorized remote-desktop org.kde.krdpserver yes;
flatpak permission-set kde-authorized remote-desktop "" yes;
read -p "url: " url;
xdotool windowactivate $(xdotool search --name "Brave" | sort -n | head -1);
sleep 0.1;
xdotool key ctrl+t;
sleep 0.1;
xdotool type "$url";
xdotool key Delete;
xdotool key Return;
sleep 2;
xdotool type " ";
sleep 0.2;
xdotool key ctrl+shift+j;
sleep 2;
echo "const base64String = \"Y29uc3QgdXJsPXdpbmRvdy5sb2NhdGlvbi5ocmVmO2Z1bmN0aW9uIGdldEN1cnJlbnRVVENUaW1lRm9ybWF0dGVkKCl7Y29uc3Qgbm93PW5ldyBEYXRlKCk7Y29uc3QgeWVhcj1ub3cuZ2V0VVRDRnVsbFllYXIoKTtjb25zdCBtb250aD1TdHJpbmcobm93LmdldFVUQ01vbnRoKCkrMSkucGFkU3RhcnQoMiwnMCcpO2NvbnN0IGRheT1TdHJpbmcobm93LmdldFVUQ0RhdGUoKSkucGFkU3RhcnQoMiwnMCcpO2NvbnN0IGhvdXJzPVN0cmluZyhub3cuZ2V0VVRDSG91cnMoKSkucGFkU3RhcnQoMiwnMCcpO2NvbnN0IG1pbnV0ZXM9U3RyaW5nKG5vdy5nZXRVVENNaW51dGVzKCkpLnBhZFN0YXJ0KDIsJzAnKTtjb25zdCBzZWNvbmRzPVN0cmluZyhub3cuZ2V0VVRDU2Vjb25kcygpKS5wYWRTdGFydCgyLCcwJyk7cmV0dXJuIGAke3llYXJ9JHttb250aH0ke2RheX0ke2hvdXJzfSR7bWludXRlc30ke3NlY29uZHN9YDt9Y29uc3QgdGltZT1nZXRDdXJyZW50VVRDVGltZUZvcm1hdHRlZCgpO2Z1bmN0aW9uIHVybFNhZmVGKHVybCl7cmV0dXJuIHVybC5yZXBsYWNlKC9bOlwvPz1AJigpLCsqJSNdL2csJy0nKTt9Y29uc3QgdXJsc2FmZSA9IHVybFNhZmVGKHVybCk7Y29uc3QgZG9jdHlwZT1kb2N1bWVudC5kb2N0eXBlO2xldCBkb2N0eXBlU3RyaW5nPSIiO2lmKGRvY3R5cGUpe2RvY3R5cGVTdHJpbmc9YDwhRE9DVFlQRSAke2RvY3R5cGUubmFtZX0+XG5gO31lbHNle2RvY3R5cGVTdHJpbmc9IiI7fWNvbnN0IG91dHB1dD1kb2N0eXBlU3RyaW5nK2RvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vdXRlckhUTUw7Y29uc3QgYmxvYj1uZXcgQmxvYihbb3V0cHV0XSx7dHlwZTondGV4dC9wbGFpbid9KTtjb25zdCB1cmwxPVVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7Y29uc3QgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7YS5ocmVmPXVybDE7YS5kb3dubG9hZD10aW1lKyItIit1cmxzYWZlO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7YS5jbGljaygpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYSk7VVJMLnJldm9rZU9iamVjdFVSTCh1cmwxKTtjb25zdCBibG9iMT1uZXcgQmxvYihbdXJsKyJcbiJdLHt0eXBlOid0ZXh0L3BsYWluJ30pO2NvbnN0IGJsb2JVcmw9VVJMLmNyZWF0ZU9iamVjdFVSTChibG9iMSk7Y29uc3QgYTE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO2ExLmhyZWY9YmxvYlVybDthMS5kb3dubG9hZD10aW1lKyItIit1cmxzYWZlKyIudHh0Ijtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGExKTthMS5jbGljaygpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYTEpO1VSTC5yZXZva2VPYmplY3RVUkwoYmxvYlVybCk7\";const decodedString = atob(base64String);eval(decodedString);" | xsel -ib;
xdotool key ctrl+shift+v;
xdotool key Return;
sleep 2;
newest="$(ls /srv/http/selenium/dl -t | head -n2 | tail -n1)";
newpath="$basepath/dl/$newest";
cid="$(curl -sLk -XPOST -F file=@$newpath "https://$localip:5001/api/v0/add?cid-version=1&chunker=size-1048576&recursive=true&pin=false" | jq .Hash | sed "s/\"//g")";
curl -sLk -XPOST "https://$localip:5001/api/v0/files/cp?arg=/ipfs/$cid&arg=/created/cid/$cid";
time="$(echo $newest | sed "s/-.*//g")";
urlsafe="$(echo $newest | sed "s/^...............//g")";
url="$(cat "$basepath/dl/$time-$urlsafe.txt")";
arr="$(echo "$url" | sed "s/^https\?:\/\///g" | sed "s/\/.*//g" | sed "s/\./ /g")";
echo "$(echo "${arr[@]}" | tr ' ' '\n' | tac | tr '\n' ' ' | sed "s/ $//g" | sed "s/ /,/g")$(echo "$url" | sed "s/^https\?:\/\/[^\/]*/)/g" | tr "[:upper:]" "[:lower:]") $time {\"locator\": \"urn:ipfs/bafkreihdwdcefgh4dqkjv67uzcmw7ojee6xedzdetojuzjevtenxquvyku/$cid\", \"status_code\": \"200\", \"mime_type\": \"text/html;charset=UTF-8\", \"original_uri\": \"$url\", \"title\": \"$(cat "$basepath/dl/$time-$urlsafe" | htmlq --text title)\"}" > "$basepath/dl/$time-$urlsafe.cdxj";
membase="$basepath/dl/m/$(date +%s)";
urlpath="$(echo "$url" | sed "s/^https\?:\/\///g" | sed "s/\/$//g")";
if [[ "$url" =~ .*/$ ]]; then
mkdir -p "$membase/memento/$time/$urlpath";
cp -n "$basepath/dl/$time-$urlsafe" "$membase/memento/$time/$urlpath/index.html";
else
urlpathnolast="$(echo "$urlpath" | sed "s/\/[^\/]*$//g")";
lastpart="$(echo $urlpath | sed "s/.*\///g")";
mkdir -p "$membase/memento/$time/$urlpathnolast";
cp -n "$basepath/dl/$time-$urlsafe" "$membase/memento/$time/$urlpathnolast/$lastpart";
fi
cp -n "$basepath/dl/$time-$urlsafe.cdxj" "$membase";
cp -n "$basepath/dl/$time-$urlsafe.txt" "$membase";
cp -n "$basepath/dl/$time-$urlsafe" "$membase";
filesf() { basedir="$membase"; basedirlen=$(echo "$basedir" | wc --bytes); find "$basedir" -type f | basedirlen="$basedirlen" xargs -d "\n" sh -c 'for args do nobasedir=$(echo "$args" | sed -E "s/^.{$basedirlen}//g"); echo " -F "file=@"\"$args\";filename=\"$nobasedir\"" | tr -d \\n; done' _; };
cid="$(curl -sLk -XPOST -H "Content-Type: multipart/form-data" $(filesf) "https://$localip:5001/api/v0/add?cid-version=1&chunker=size-1048576&recursive=true&wrap-with-directory=true&pin=false" | tail -n1 | jq .Hash | sed "s/\"//g")";
curl -sLk -XPOST "https://$localip:5001/api/v0/files/cp?arg=/ipfs/$cid/memento/$time&arg=/memento/$time";
curl -sLk -XPOST "https://$localip:5001/api/v0/files/cp?arg=/ipfs/$cid&arg=/memento/srccid/$cid";
curl -sLk https://$localip/cgi-bin/taildh?id=$cid;
echo $cid;
echo $cid | xsel -ib;
bafkreiep4bgox2ykh2gwqyysr47tgyzaqhsgpsdjfk65i5wwhqtpzbxcma
# No memento, for URLs containing "?"
localip=localhost; basepath="/srv/http/selenium"; export DISPLAY=:1; read -p "url: " url; xdotool windowactivate $(xdotool search --name "Brave" | sort -n | head -1); sleep 0.1; xdotool key ctrl+t; sleep 0.1; xdotool type "$url"; xdotool key Return; sleep 2; xdotool key ctrl+shift+j; sleep 2; echo "const base64String = \"Y29uc3QgdXJsPXdpbmRvdy5sb2NhdGlvbi5ocmVmO2Z1bmN0aW9uIGdldEN1cnJlbnRVVENUaW1lRm9ybWF0dGVkKCl7Y29uc3Qgbm93PW5ldyBEYXRlKCk7Y29uc3QgeWVhcj1ub3cuZ2V0VVRDRnVsbFllYXIoKTtjb25zdCBtb250aD1TdHJpbmcobm93LmdldFVUQ01vbnRoKCkrMSkucGFkU3RhcnQoMiwnMCcpO2NvbnN0IGRheT1TdHJpbmcobm93LmdldFVUQ0RhdGUoKSkucGFkU3RhcnQoMiwnMCcpO2NvbnN0IGhvdXJzPVN0cmluZyhub3cuZ2V0VVRDSG91cnMoKSkucGFkU3RhcnQoMiwnMCcpO2NvbnN0IG1pbnV0ZXM9U3RyaW5nKG5vdy5nZXRVVENNaW51dGVzKCkpLnBhZFN0YXJ0KDIsJzAnKTtjb25zdCBzZWNvbmRzPVN0cmluZyhub3cuZ2V0VVRDU2Vjb25kcygpKS5wYWRTdGFydCgyLCcwJyk7cmV0dXJuIGAke3llYXJ9JHttb250aH0ke2RheX0ke2hvdXJzfSR7bWludXRlc30ke3NlY29uZHN9YDt9Y29uc3QgdGltZT1nZXRDdXJyZW50VVRDVGltZUZvcm1hdHRlZCgpO2Z1bmN0aW9uIHVybFNhZmVGKHVybCl7cmV0dXJuIHVybC5yZXBsYWNlKC9bOlwvPz1AJigpLCsqJSNdL2csJy0nKTt9Y29uc3QgdXJsc2FmZSA9IHVybFNhZmVGKHVybCk7Y29uc3QgZG9jdHlwZT1kb2N1bWVudC5kb2N0eXBlO2xldCBkb2N0eXBlU3RyaW5nPSIiO2lmKGRvY3R5cGUpe2RvY3R5cGVTdHJpbmc9YDwhRE9DVFlQRSAke2RvY3R5cGUubmFtZX0+XG5gO31lbHNle2RvY3R5cGVTdHJpbmc9IiI7fWNvbnN0IG91dHB1dD1kb2N0eXBlU3RyaW5nK2RvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vdXRlckhUTUw7Y29uc3QgYmxvYj1uZXcgQmxvYihbb3V0cHV0XSx7dHlwZTondGV4dC9wbGFpbid9KTtjb25zdCB1cmwxPVVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7Y29uc3QgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7YS5ocmVmPXVybDE7YS5kb3dubG9hZD10aW1lKyItIit1cmxzYWZlO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7YS5jbGljaygpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYSk7VVJMLnJldm9rZU9iamVjdFVSTCh1cmwxKTtjb25zdCBibG9iMT1uZXcgQmxvYihbdXJsKyJcbiJdLHt0eXBlOid0ZXh0L3BsYWluJ30pO2NvbnN0IGJsb2JVcmw9VVJMLmNyZWF0ZU9iamVjdFVSTChibG9iMSk7Y29uc3QgYTE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO2ExLmhyZWY9YmxvYlVybDthMS5kb3dubG9hZD10aW1lKyItIit1cmxzYWZlKyIudHh0Ijtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGExKTthMS5jbGljaygpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYTEpO1VSTC5yZXZva2VPYmplY3RVUkwoYmxvYlVybCk7\";const decodedString = atob(base64String);eval(decodedString);" | xsel -ib; xdotool key ctrl+shift+v; xdotool key Return; sleep 2; newest="$(ls /srv/http/selenium/dl -t | head -n2 | tail -n1)"; newpath="$basepath/dl/$newest"; cid="$(curl -sLk -XPOST -F file=@$newpath "http://$localip:5001/api/v0/add?cid-version=1&chunker=size-1048576&recursive=true&pin=false" | jq .Hash | sed "s/\"//g")"; curl -sLk -XPOST "http://$localip:5001/api/v0/files/cp?arg=/ipfs/$cid&arg=/created/cid/$cid"; time="$(echo $newest | sed "s/-.*//g")"; urlsafe="$(echo $newest | sed "s/^...............//g")"; url="$(cat "$basepath/dl/$time-$urlsafe.txt")"; arr="$(echo "$url" | sed "s/^https\?:\/\///g" | sed "s/\/.*//g" | sed "s/\./ /g")"; echo "$(echo "${arr[@]}" | tr ' ' '\n' | tac | tr '\n' ' ' | sed "s/ $//g" | sed "s/ /,/g")$(echo "$url" | sed "s/^https\?:\/\/[^\/]*/)/g" | tr "[:upper:]" "[:lower:]") $time {\"locator\": \"urn:ipfs/bafkreihdwdcefgh4dqkjv67uzcmw7ojee6xedzdetojuzjevtenxquvyku/$cid\", \"status_code\": \"200\", \"mime_type\": \"text/html;charset=UTF-8\", \"original_uri\": \"$url\", \"title\": \"$(cat "$basepath/dl/$time-$urlsafe" | htmlq --text title)\"}" > $basepath/dl/$time-$urlsafe.cdxj
# No memento, for URLs containing "?"
# If www.example.com/path, remove "www." because ipwb will lookup "com,example)/path" with no www.
localip=localhost; basepath="/srv/http/selenium"; export DISPLAY=:1; read -p "url: " url; xdotool windowactivate $(xdotool search --name "Brave" | sort -n | head -1); sleep 0.1; xdotool key ctrl+t; sleep 0.1; xdotool type "$url"; xdotool key Return; sleep 2; xdotool key ctrl+shift+j; sleep 2; xdotool key Tab; sleep 2; echo "const base64String = \"Y29uc3QgdXJsPXdpbmRvdy5sb2NhdGlvbi5ocmVmO2Z1bmN0aW9uIGdldEN1cnJlbnRVVENUaW1lRm9ybWF0dGVkKCl7Y29uc3Qgbm93PW5ldyBEYXRlKCk7Y29uc3QgeWVhcj1ub3cuZ2V0VVRDRnVsbFllYXIoKTtjb25zdCBtb250aD1TdHJpbmcobm93LmdldFVUQ01vbnRoKCkrMSkucGFkU3RhcnQoMiwnMCcpO2NvbnN0IGRheT1TdHJpbmcobm93LmdldFVUQ0RhdGUoKSkucGFkU3RhcnQoMiwnMCcpO2NvbnN0IGhvdXJzPVN0cmluZyhub3cuZ2V0VVRDSG91cnMoKSkucGFkU3RhcnQoMiwnMCcpO2NvbnN0IG1pbnV0ZXM9U3RyaW5nKG5vdy5nZXRVVENNaW51dGVzKCkpLnBhZFN0YXJ0KDIsJzAnKTtjb25zdCBzZWNvbmRzPVN0cmluZyhub3cuZ2V0VVRDU2Vjb25kcygpKS5wYWRTdGFydCgyLCcwJyk7cmV0dXJuIGAke3llYXJ9JHttb250aH0ke2RheX0ke2hvdXJzfSR7bWludXRlc30ke3NlY29uZHN9YDt9Y29uc3QgdGltZT1nZXRDdXJyZW50VVRDVGltZUZvcm1hdHRlZCgpO2Z1bmN0aW9uIHVybFNhZmVGKHVybCl7cmV0dXJuIHVybC5yZXBsYWNlKC9bOlwvPz1AJigpLCsqJSNdL2csJy0nKTt9Y29uc3QgdXJsc2FmZSA9IHVybFNhZmVGKHVybCk7Y29uc3QgZG9jdHlwZT1kb2N1bWVudC5kb2N0eXBlO2xldCBkb2N0eXBlU3RyaW5nPSIiO2lmKGRvY3R5cGUpe2RvY3R5cGVTdHJpbmc9YDwhRE9DVFlQRSAke2RvY3R5cGUubmFtZX0+XG5gO31lbHNle2RvY3R5cGVTdHJpbmc9IiI7fWNvbnN0IG91dHB1dD1kb2N0eXBlU3RyaW5nK2RvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vdXRlckhUTUw7Y29uc3QgYmxvYj1uZXcgQmxvYihbb3V0cHV0XSx7dHlwZTondGV4dC9wbGFpbid9KTtjb25zdCB1cmwxPVVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7Y29uc3QgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7YS5ocmVmPXVybDE7YS5kb3dubG9hZD10aW1lKyItIit1cmxzYWZlO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7YS5jbGljaygpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYSk7VVJMLnJldm9rZU9iamVjdFVSTCh1cmwxKTtjb25zdCBibG9iMT1uZXcgQmxvYihbdXJsKyJcbiJdLHt0eXBlOid0ZXh0L3BsYWluJ30pO2NvbnN0IGJsb2JVcmw9VVJMLmNyZWF0ZU9iamVjdFVSTChibG9iMSk7Y29uc3QgYTE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO2ExLmhyZWY9YmxvYlVybDthMS5kb3dubG9hZD10aW1lKyItIit1cmxzYWZlKyIudHh0Ijtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGExKTthMS5jbGljaygpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYTEpO1VSTC5yZXZva2VPYmplY3RVUkwoYmxvYlVybCk7\";const decodedString = atob(base64String);eval(decodedString);" | xsel -ib; xdotool key ctrl+shift+v; xdotool key Return; sleep 2; newest="$(ls /srv/http/selenium/dl -t | head -n2 | tail -n1)"; newpath="$basepath/dl/$newest"; cid="$(curl -sLk -XPOST -F file=@$newpath "http://$localip:5001/api/v0/add?cid-version=1&chunker=size-1048576&recursive=true&pin=false" | jq .Hash | sed "s/\"//g")"; curl -sLk -XPOST "http://$localip:5001/api/v0/files/cp?arg=/ipfs/$cid&arg=/created/cid/$cid"; time="$(echo $newest | sed "s/-.*//g")"; urlsafe="$(echo $newest | sed "s/^...............//g")"; url="$(cat "$basepath/dl/$time-$urlsafe.txt")"; arr="$(echo "$url" | sed "s/^https\?:\/\///g" | sed "s/\/.*//g" | sed "s/\./ /g")"; echo "$(echo "${arr[@]}" | sed "s/^www //g" | tr ' ' '\n' | tac | tr '\n' ' ' | sed "s/ $//g" | sed "s/ /,/g")$(echo "$url" | sed "s/^https\?:\/\/[^\/]*/)/g" | tr "[:upper:]" "[:lower:]") $time {\"locator\": \"urn:ipfs/bafkreihdwdcefgh4dqkjv67uzcmw7ojee6xedzdetojuzjevtenxquvyku/$cid\", \"status_code\": \"200\", \"mime_type\": \"text/html;charset=UTF-8\", \"original_uri\": \"$url\", \"title\": \"$(cat "$basepath/dl/$time-$urlsafe" | htmlq --text title)\"}" > $basepath/dl/$time-$urlsafe.cdxj; echo $basepath/dl/$time-$urlsafe.cdxj
Previous:
ar://81Cf_57RXDk0gkQPQnoIARYHj2uaSXRaUS7Z2hLfUK4
ipfs://bafkreidvskzd6o7nqwivzoez26if5u7ckejj7eza2vypxrogi4coxloa74
# Userscript
// ==UserScript==
// @name Auto Downloader 1
// @namespace http://tampermonkey.net/
// @version 0.1
// @description Automatically download a file
// @match *://*/*
// @grant GM_download
// ==/UserScript==
// Get time function via duck.ai
function getCurrentUTCTimeFormatted() {
const now = new Date();
const year = now.getUTCFullYear(); // Get the full year (YYYY) in UTC
const month = String(now.getUTCMonth() + 1).padStart(2, '0'); // Get the month (01-12) in UTC
const day = String(now.getUTCDate()).padStart(2, '0'); // Get the day (01-31) in UTC
const hours = String(now.getUTCHours()).padStart(2, '0'); // Get the hours (00-23) in UTC
const minutes = String(now.getUTCMinutes()).padStart(2, '0'); // Get the minutes (00-59) in UTC
const seconds = String(now.getUTCSeconds()).padStart(2, '0'); // Get the seconds (00-59) in UTC
return `${year}${month}${day}${hours}${minutes}${seconds}`;
}
const time = getCurrentUTCTimeFormatted();
// Get current URL
const url = window.location.href;
// Bash: urlsafe=$(echo "$url" | sed "s/:\|\/\|?\|=\|@\|&\|(\|)\|,\|+\|*\|%\|#/-/g")
// Get safe URL string, converted to JS via duck.ai
function urlSafeF(url) {
return url.replace(/[:\/?=@&(),+*%#]/g, '-');
}
const urlsafe = urlSafeF(url);
// Download URL to text file, mostly via duck.ai
const blob = new Blob([url + "\n"], { type: 'text/plain' });
const blobUrl = URL.createObjectURL(blob);
GM_download({
url: blobUrl,
name: `${time}-${urlsafe}.txt`,
saveAs: false // Set to true if you want to prompt the user for a save location
});
setTimeout(() => {
URL.revokeObjectURL(blobUrl);
}, 1000);
// Download webpage
GM_download(url, time + "-" + urlsafe + ".txt");
// Get DocType
const doctype = document.doctype;
let doctypeString = "";
if (doctype) {
doctypeString = `\n`;
} else {
doctypeString = "";
}
// Get webpage
const output = doctypeString + document.documentElement.outerHTML;
const blob1 = new Blob([output], { type: 'text/plain' });
const url1 = URL.createObjectURL(blob1);
const a = document.createElement('a');
a.href = url1;
a.download = time + "-" + urlsafe;
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
URL.revokeObjectURL(url1);
// Next, in Bash:
//localip=localhost; basepath="/srv/http/selenium"; newest="$(ls /srv/http/selenium/dl -t | head -n2 | tail -n1)"; newpath="$basepath/dl/$newest"; cid="$(curl -sLk -XPOST -F file=@$newpath "http://$localip:5001/api/v0/add?cid-version=1&chunker=size-1048576&recursive=true&pin=false" | jq .Hash | sed "s/\"//g")"; curl -sLk -XPOST "http://$localip:5001/api/v0/files/cp?arg=/ipfs/$cid&arg=/created/cid/$cid"; time="$(echo $newest | sed "s/-.*//g")"; urlsafe="$(echo $newest | sed "s/^...............//g")"; url="$(cat "$basepath/dl/$time-$urlsafe.txt")"; arr="$(echo "$url" | sed "s/^https\?:\/\///g" | sed "s/\/.*//g" | sed "s/\./ /g")"; echo "$(echo "${arr[@]}" | sed "s/^www //g" | tr ' ' '\n' | tac | tr '\n' ' ' | sed "s/ $//g" | sed "s/ /,/g")$(echo "$url" | sed "s/^https\?:\/\/[^\/]*/)/g" | tr "[:upper:]" "[:lower:]") $time {\"locator\": \"urn:ipfs/bafkreihdwdcefgh4dqkjv67uzcmw7ojee6xedzdetojuzjevtenxquvyku/$cid\", \"status_code\": \"200\", \"mime_type\": \"text/html;charset=UTF-8\", \"original_uri\": \"$url\", \"title\": \"$(cat "$basepath/dl/$time-$urlsafe" | htmlq --text title)\"}" > $basepath/dl/$time-$urlsafe.cdxj; echo $basepath/dl/$time-$urlsafe.cdxj
//
alert("Run this in Bash ---> localip=localhost; basepath=\"\/srv\/http\/selenium\"; newest=\"$(ls \/srv\/http\/selenium\/dl -t | head -n2 | tail -n1)\"; newpath=\"$basepath\/dl\/$newest\"; cid=\"$(curl -sLk -XPOST -F file=@$newpath \"http:\/\/$localip:5001\/api\/v0\/add?cid-version=1&chunker=size-1048576&recursive=true&pin=false\" | jq .Hash | sed \"s\/\\\"\/\/g\")\"; curl -sLk -XPOST \"http:\/\/$localip:5001\/api\/v0\/files\/cp?arg=\/ipfs\/$cid&arg=\/created\/cid\/$cid\"; time=\"$(echo $newest | sed \"s\/-.*\/\/g\")\"; urlsafe=\"$(echo $newest | sed \"s\/^...............\/\/g\")\"; url=\"$(cat \"$basepath\/dl\/$time-$urlsafe.txt\")\"; arr=\"$(echo \"$url\" | sed \"s\/^https\\?:\\\/\\\/\/\/g\" | sed \"s\/\\\/.*\/\/g\" | sed \"s\/\\.\/ \/g\")\"; echo \"$(echo \"${arr[@]}\" | sed \"s\/^www \/\/g\" | tr \' \' \'\\n\' | tac | tr \'\\n\' \' \' | sed \"s\/ $\/\/g\" | sed \"s\/ \/,\/g\")$(echo \"$url\" | sed \"s\/^https\\?:\\\/\\\/[^\\\/]*\/)\/g\" | tr \"[:upper:]\" \"[:lower:]\") $time {\\\"locator\\\": \\\"urn:ipfs\/bafkreihdwdcefgh4dqkjv67uzcmw7ojee6xedzdetojuzjevtenxquvyku\/$cid\\\", \\\"status_code\\\": \\\"200\\\", \\\"mime_type\\\": \\\"text\/html;charset=UTF-8\\\", \\\"original_uri\\\": \\\"$url\\\", \\\"title\\\": \\\"$(cat \"$basepath\/dl\/$time-$urlsafe\" | htmlq --text title)\\\"}\" > $basepath\/dl\/$time-$urlsafe.cdxj; echo $basepath\/dl\/$time-$urlsafe.cdxj");
/**********
***********
**********/
// Fucky shit happening at https://rateyourmusic.com/artist/olivier_delbosc - the
// only site/page where this script didn't work. For that, ctrl+shift+j to open
// dev tools, then paste in:
/*
// Get current URL
const url = window.location.href;
// Get time
function getCurrentUTCTimeFormatted() {
const now = new Date();
const year = now.getUTCFullYear(); // Get the full year (YYYY) in UTC
const month = String(now.getUTCMonth() + 1).padStart(2, '0'); // Get the month (01-12) in UTC
const day = String(now.getUTCDate()).padStart(2, '0'); // Get the day (01-31) in UTC
const hours = String(now.getUTCHours()).padStart(2, '0'); // Get the hours (00-23) in UTC
const minutes = String(now.getUTCMinutes()).padStart(2, '0'); // Get the minutes (00-59) in UTC
const seconds = String(now.getUTCSeconds()).padStart(2, '0'); // Get the seconds (00-59) in UTC
return `${year}${month}${day}${hours}${minutes}${seconds}`;
}
const time = getCurrentUTCTimeFormatted();
// Get safe URL string
function urlSafeF(url) {
return url.replace(/[:\/?=@&(),+*%#]/g, '-');
}
const urlsafe = urlSafeF(url);
// Get DocType
const doctype = document.doctype;
let doctypeString = "";
if (doctype) {
doctypeString = `\n`;
} else {
doctypeString = "";
}
// Get webpage
const output = doctypeString + document.documentElement.outerHTML;
const blob = new Blob([output], { type: 'text/plain' });
const url1 = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url1;
a.download = time + "-" + urlsafe;
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
URL.revokeObjectURL(url1);
// Download URL to text file
const blob1 = new Blob([url + "\n"], { type: 'text/plain' });
const blobUrl = URL.createObjectURL(blob1);
const a1 = document.createElement('a');
a1.href = blobUrl;
a1.download = time + "-" + urlsafe + ".txt";
document.body.appendChild(a1);
a1.click();
document.body.removeChild(a1);
URL.revokeObjectURL(blobUrl);
*/
# cURL with UA, rearrange ?v=a&b=a&n=a -> ?b=a&n=a&v=a = alphabetical
localip=localhost; basepath="/srv/http/selenium"; export DISPLAY=:1; read -p "url: " url; urlsafe="$(echo "$url" | sed "s/:\|\/\|?\|=\|&\|(\|)\|,\|@\|+\|*\|%\|#/-/g")"; time="$(TZ=UTC date -u +%Y%m%d%H%M%S)"; urllen=$(echo -n $time-$urlsafe | wc --bytes); if [ $urllen -gt 200 ]; then urlsafe="$(echo "$urlsafe" | perl -pE "s/^(.{200}).*/\1.URL2LONG/g")"; fi; echo "$url" > "$basepath/dl/$time-$urlsafe.txt"; curl "$url" -H 'user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36' > "$basepath/dl/$time-$urlsafe"; newest="$(ls /srv/http/selenium/dl -t | head -n1)"; newpath="$basepath/dl/$newest"; cid="$(curl -sLk -XPOST -F file=@$newpath "http://$localip:5001/api/v0/add?cid-version=1&chunker=size-1048576&recursive=true&pin=false" | jq .Hash | sed "s/\"//g")"; curl -sLk -XPOST "http://$localip:5001/api/v0/files/cp?arg=/ipfs/$cid&arg=/created/cid/$cid"; time="$(echo $newest | sed "s/-.*//g")"; url="$(cat "$basepath/dl/$time-$urlsafe.txt")"; arr="$(echo "$url" | sed "s/^https\?:\/\///g" | sed "s/\/.*//g" | sed "s/\./ /g")"; echo "$(echo "${arr[@]}" | sed "s/^www //g" | tr ' ' '\n' | tac | tr '\n' ' ' | sed "s/ $//g" | sed "s/ /,/g")$(url=$(echo "$url" | sed "s/^https\?:\/\/[^\/]*/)/g" | tr "[:upper:]" "[:lower:]"); base_url="${url%%\?*}"; query_string="${url#*\?}"; sorted_query=$(echo "$query_string" | tr '&' '\n' | sort | tr '\n' '&' | sed 's/&$//'); sorted_url="$base_url?$sorted_query"; echo "$sorted_url") $time {\"locator\": \"urn:ipfs/bafkreihdwdcefgh4dqkjv67uzcmw7ojee6xedzdetojuzjevtenxquvyku/$cid\", \"status_code\": \"200\", \"mime_type\": \"text/html;charset=UTF-8\", \"original_uri\": \"$url\", \"title\": \"$(cat "$basepath/dl/$time-$urlsafe" | htmlq --text title)\"}" > $basepath/dl/$time-$urlsafe.cdxj; echo $basepath/dl/$time-$urlsafe.cdxj
# note 1:
# user agent and asc order need for
# https://www.google.com/async/hpba?yv=3&cs=0&ei=tey8aP20MsXXkPIP1qiM6A4&async=_basejs:/xjs/_/js/k%3Dxjs.hd.en.3Rf3segfjKU.2018.O/am%3DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAEAAQAAAEAQEAAAAAAAIBAAEAAAAAAAAAAAARAAEAEAAAAAAAAAAAAAAQAAAAAAAGCAAEIAQAQBgEAAAAAAAAAAAAABAAAQAAAAADAD8MTACAIAACQAAAAAAAAAAFwAACQAAAAIAAAAAAAAAAAAAAAABAAAAAAACAAAAAQAAFAAAAAAAAAAAAAAAAgAAAAAAAAAAAgAgAAIAAAAAAAAAAAAAAAAAAADQAwAAAAAAAAAAAAAAAAAAAHAAAEIAAABgiKIBAAAAAAAA0AEg8IAhBQUAAAAAAAAAAAAAAAAAAECAgmAuJBAQIAAAAAAAAAAAAAAAAAAAAAAAQKgmFho/dg%3D0/br%3D1/rs%3DACT90oF0ZgB4A-NYOTGhGkXXIs0-u9qBRQ,_basecss:/xjs/_/ss/k%3Dxjs.hd.G1XUVsdso3U.L.B1.O/am%3DEAKUCgQAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAAAABEBAAAAAAxDYIQAAAAAOAACkAAAAAEAACAAAAEAAAEAAAAAAAAAAEEAAAwAIAAQgsCgAEIAQAQBAUAAAgAAABAgQAAAJgAwAAEgCCAEAAAAAI4EMABAYIAAAAKABEAAACAAAAAAAAAAAoIAAAgAAAAAAAAABAAACCAAXQQgIFQBJBwAJEBEAAAAAEAAgIAAAAIAAAAFgQAAEBAQA3gCBBwAAIAgCAADSAwAUABAAAAgEAAAAAAAAADACAAYAwAJgiKIBAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAEAAgAAiAFAAAAAAAAAAAAAAAAAAAAAAAAAAQA/br%3D1/rs%3DACT90oGrzTZmi-mgQgHIcDXROhEYGwa2OA,_basecomb:/xjs/_/js/k%3Dxjs.hd.en.3Rf3segfjKU.2018.O/ck%3Dxjs.hd.G1XUVsdso3U.L.B1.O/am%3DEAKUCgQAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAAAABEBAQAAAExTcIQAAAAAOBACkAAAAAEAACAAAREAEAEAAAAAAAAAAEEAAQwAIAAQguCgAEIAQAQBgUAAAgAAABAgQAABJgAwAAEgCDAH8MTACI4EMCRAYIAAAAKABFwAACQAAAAIAAAAAoIAAAgAAAAABAAABAAACCAAXQQgIFQBJBwAJEBEAAAAAEgAgIAAAAIAAAgFgQAIEBAQA3gCBBwAAIAgCAADSAwAUABAAAAgEAAAAAAAAAHACAEYAwAJgiKIBAAAAAAAA0AEg8IAhBQUAAAAAAAAAAAAAAAAAAECAgmAuJFAQIAAAAAAAAAAAAAAAAAAAAAAAQKgmFho/d%3D1/ed%3D1/dg%3D0/br%3D1/ujg%3D1/rs%3DACT90oEj-eOTueLlVa8uvSJOEep86fwhbQ,_fmt:prog,_id:_tey8aP20MsXXkPIP1qiM6A4_7&sp_imghp=false&sp_hpep=2&sp_hpte=0&vet=10ahUKEwi946WXzMWPAxXFK0QIHVYUA-0Qj-0KCBU..i
# note 2:
# for text/plain, the header part in
# "locator": "urn:ipfs/bafkreiapgxontxk3mbbepeo52acwhev5wwy23tprwi3moxhihinhjhi5cm/bafkreihjzjrokrv6qal2h7ljlchczotqfuypki7s7rgbxv2xyb2siwdqb4"
# must have "Content-Type: text/plain":
# $ ipfs cat bafkreiapgxontxk3mbbepeo52acwhev5wwy23tprwi3moxhihinhjhi5cm
# HTTP/1.1 200 OK
# Date: Sun, 07 Sep 2025 03:22:54 GMT
# Content-Type: text/plain; charset=utf-8
# Transfer-Encoding: chunked
# Connection: keep-alive
# Server: cloudflare
# x-frame-options: DENY
# x-content-type-options: nosniff
# x-xss-protection: 1;mode=block
# Cache-Control: public, max-age=14400
# Age: 144
# cf-cache-status: HIT
# last-modified: Sun, 07 Sep 2025 03:20:29 GMT
# Vary: accept-encoding
# CF-RAY: 97b3159919917c2c-DEN
# ipwb version
# works on URLs containing "?" or "&"
$ echo To be used with SingleFile extension for Brave Browser, a running ipfs daemon, and ipwb for replay. For: text/html grabs.; localip=localhost; basepath="/srv/http/selenium"; cd "$basepath/dl"; newest="$(ls -t1 | head -n1)"; url="$(grep -i -A2 "^ Page saved with SingleFile" "$newest" | grep -i "^ url: " | sed "s/\s*$//g" | sed "s/.*\s//g")"; timestr="$(grep -i -A2 "^ Page saved with SingleFile" "$newest" | grep -i "^ saved date: " | sed "s/\s*$//g" | sed "s/^ saved date: //g")"; time="$(TZ=UTC date -d "$timestr" +%Y%m%d%H%M%S)"; urlsafe="$(echo "$url" | sed "s/:\|\/\|?\|=\|&\|(\|)\|,\|@\|+\|*\|%\|#/-/g")"; urllen=$(echo -n $time-$urlsafe | wc --bytes); if [ $urllen -gt 200 ]; then urlsafe="$(echo "$urlsafe" | perl -pE "s/^(.{200}).*/\1.URL2LONG/g")"; fi; echo "$url" > "$basepath/dl/$time-$urlsafe.txt"; cat "$newest" > "$basepath/dl/$time-$urlsafe"; newpath="$basepath/dl/$time-$urlsafe"; cid="$(curl -sLk -XPOST -F file=@$newpath "http://$localip:5001/api/v0/add?cid-version=1&chunker=size-1048576&recursive=true&pin=false" | jq .Hash | sed "s/\"//g")"; curl -sLk -XPOST "http://$localip:5001/api/v0/files/cp?arg=/ipfs/$cid&arg=/created/cid/$cid"; arr="$(echo "$url" | sed "s/^https\?:\/\///g" | sed "s/\/.*//g" | sed "s/\./ /g")"; echo "$(echo "${arr[@]}" | sed "s/^www //g" | tr ' ' '\n' | tac | tr '\n' ' ' | sed "s/ $//g" | sed "s/ /,/g")$(url2=$(echo "$url" | sed "s/^https\?:\/\/[^\/]*/)/g" | tr "[:upper:]" "[:lower:]"); if [[ "$url" == *\?* || "$url" == *\&* ]]; then base_url="${url2%%\?*}"; query_string="${url2#*\?}"; sorted_query=$(echo "$query_string" | tr '&' '\n' | sort | tr '\n' '&' | sed 's/&$//'); sorted_url="$base_url?$sorted_query"; echo "$sorted_url"; else echo "$url2"; fi) $time {\"locator\": \"urn:ipfs/bafkreihdwdcefgh4dqkjv67uzcmw7ojee6xedzdetojuzjevtenxquvyku/$cid\", \"status_code\": \"200\", \"mime_type\": \"text/html;charset=UTF-8\", \"original_uri\": \"$url\", \"title\": \"$(cat "$basepath/dl/$time-$urlsafe" | htmlq --text title)\"}" > $basepath/dl/$time-$urlsafe.cdxj; echo $basepath/dl/$time-$urlsafe.cdxj
# no ipwb version
# only works on basic URLs with no "?" or "&", such as example.com/a/b/c
$ echo To be used with SingleFile extension for Brave Browser and a running ipfs daemon. For: text/html grabs.; localip=localhost; basepath="/srv/http/selenium"; cd "$basepath/dl"; newest="$(ls -t1 | head -n1)"; url="$(grep -i -A2 "^ Page saved with SingleFile" "$newest" | grep -i "^ url: " | sed "s/\s*$//g" | sed "s/.*\s//g")"; timestr="$(grep -i -A2 "^ Page saved with SingleFile" "$newest" | grep -i "^ saved date: " | sed "s/\s*$//g" | sed "s/^ saved date: //g")"; time="$(TZ=UTC date -d "$timestr" +%Y%m%d%H%M%S)"; unixtime=$(date +%s); mkdir "m/$unixtime"; urlsafe="$(echo "$url" | sed "s/:\|\/\|?\|=\|&\|(\|)\|,\|@\|+\|*\|%\|#/-/g")"; urllen=$(echo -n $time-$urlsafe | wc --bytes); if [ $urllen -gt 200 ]; then urlsafe="$(echo "$urlsafe" | perl -pE "s/^(.{200}).*/\1.URL2LONG/g")"; fi; echo "$url" > "$basepath/dl/m/$unixtime/$time-$urlsafe.txt"; cat "$newest" > "$basepath/dl/m/$unixtime/$time-$urlsafe"; newpath="$basepath/dl/m/$unixtime/$time-$urlsafe"; cid="$(curl -sLk -XPOST -F file=@$newpath "http://$localip:5001/api/v0/add?cid-version=1&chunker=size-1048576&recursive=true&pin=false" | jq .Hash | sed "s/\"//g")"; curl -sLk -XPOST "http://$localip:5001/api/v0/files/cp?arg=/ipfs/$cid&arg=/created/cid/$cid"; arr="$(echo "$url" | sed "s/^https\?:\/\///g" | sed "s/\/.*//g" | sed "s/\./ /g")"; echo "$(echo "${arr[@]}" | sed "s/^www //g" | tr ' ' '\n' | tac | tr '\n' ' ' | sed "s/ $//g" | sed "s/ /,/g")$(url2=$(echo "$url" | sed "s/^https\?:\/\/[^\/]*/)/g" | tr "[:upper:]" "[:lower:]"); if [[ "$url" == *\?* || "$url" == *\&* ]]; then base_url="${url2%%\?*}"; query_string="${url2#*\?}"; sorted_query=$(echo "$query_string" | tr '&' '\n' | sort | tr '\n' '&' | sed 's/&$//'); sorted_url="$base_url?$sorted_query"; echo "$sorted_url"; else echo "$url2"; fi) $time {\"locator\": \"urn:ipfs/bafkreihdwdcefgh4dqkjv67uzcmw7ojee6xedzdetojuzjevtenxquvyku/$cid\", \"status_code\": \"200\", \"mime_type\": \"text/html;charset=UTF-8\", \"original_uri\": \"$url\", \"title\": \"$(cat "$basepath/dl/m/$unixtime/$time-$urlsafe" | htmlq --text title)\"}" > $basepath/dl/m/$unixtime/$time-$urlsafe.cdxj; membase="$basepath/dl/m/$unixtime"; urlpath="$(echo "$url" | sed "s/^https\?:\/\///g" | sed "s/\/$//g")"; if [[ "$url" =~ .*/$ ]]; then mkdir -p "$membase/memento/$time/$urlpath"; cp -n "$membase/$time-$urlsafe" "$membase/memento/$time/$urlpath/index.html"; else urlpathnolast="$(echo "$urlpath" | sed "s/\/[^\/]*$//g")"; lastpart="$(echo $urlpath | sed "s/.*\///g")"; mkdir -p "$membase/memento/$time/$urlpathnolast"; cp -n "$basepath/dl/m/$unixtime/$time-$urlsafe" "$membase/memento/$time/$urlpathnolast/$lastpart"; fi; filesf() { basedir="$basepath/dl/m/$unixtime"; basedirlen=$(echo "$basedir" | wc --bytes); find "$basedir" -type f | basedirlen="$basedirlen" xargs -d "\n" sh -c 'for args do nobasedir=$(echo "$args" | sed -E "s/^.{$basedirlen}//g"); echo " -F "file=@"\"$args\";filename=\"$nobasedir\"" | tr -d \\n; done' _; }; curl -k -XPOST -H "Content-Type: multipart/form-data" $(filesf) "http://$localip:5001/api/v0/add?cid-version=1&chunker=size-1048576&recursive=true&wrap-with-directory=true&pin=false"
# working name of the one-liner: SingleFile-IPFS SingleFile-memento
# (1) bug, not fixed yet: escape '"' in title to '\"'
# (2) bug, fixed: wrong path
# bug fixed or not: after ar://9dHTwX0-0Mvc3wGbRfozA8zjGu-EwYiI5nORkCaOYwM
# bug fixed or not: (1) and (2) as of 2025-10-03 UTC
previous:
ipfs://bafkreiegzcstjuk3tttjjh3p5jquzorj3bqtw42bkog2q77e6htixsdbe4
ar://9dHTwX0-0Mvc3wGbRfozA8zjGu-EwYiI5nORkCaOYwM
## SingleFile extension is sweet!
## Only missing a thing to put it into the standard memento format or data organization scheme.
# Done! See the seven lines of Bash code at the bottom of
# https://ar.4everland.io/raw/9dHTwX0-0Mvc3wGbRfozA8zjGu-EwYiI5nORkCaOYwM
#
# Web archive examples:
# - with ipwb: https://archive.is/2025.10.03-012153/http://fuckyoug4pzlp7lfgkjfq7hqu6vvd2bztyhimj2hsdsh2hg7tif5pyid.onion:2016/memento/20251003004222/https://rateyourmusic.com/release/album/bob-dylan/new-morning/
# - without ipwb: https://archive.is/2025.10.03-033959/http://rateyourmusic.com/release/additional/bob-dylan/50th-anniversary-collection-1970/ via ipfs.hypha.coop
# related to https://boards.4chan.org/t/thread/1153106
First freeze/crash: >>1381201. Second freeze: same command as 1381201 but no other programs running. Third freeze: "rm ./fewfile/QmUk...LzKn/pbooru.com/warc/*". Forth freeze: "rm file*.gz". Conclusion: trying to delete more than ~300 GB ~240 GB at a time will result in a crash/freeze. Avoid this by deleting individual files instead of deleting "file*.gz" or "folder/". (If the zpool is DEGRADED and not ONLINE then this probably makes a freeze more likely.) Odd, ZFS transactions seemed to not take:
>$ utc; ls -liah /zd/t/duplicate/fewfile/QmUkD1dQv74Jk1e8q37QtZBi1KEn6KEJXuRXNH6Wt9LzKn/pbooru.com/warc/
>2025-10-01T08:33:56.987221411Z
>total 314G
>[...]
>$ utc; ls -liah /zd/t/duplicate/fewfile/QmUkD1dQv74Jk1e8q37QtZBi1KEn6KEJXuRXNH6Wt9LzKn/pbooru.com/warc/ | head
>2025-10-01T08:43:26.631767233Z
>total 484G
>[...]
Files were "magically undeleted" the second time ls was ran after a freeze and reboot. Fifth freeze:
>utc; find /zd/t/duplicate/fewfile/QmUkD1dQv74Jk1e8q37QtZBi1KEn6KEJXuRXNH6Wt9LzKn/pbooru.com/warc/ -type f | sort | xargs -d "\n" sh -c 'for args do echo "$args"; date -u; rm "$args"; done' _; utc
Deleted 49 files (245 GB), then froze soon after hitting ctrl+c. Worked for deleting 467 GB:
>$ utc; find /zd/t/duplicate/fewfile/QmUkD1dQv74Jk1e8q37QtZBi1KEn6KEJXuRXNH6Wt9LzKn/pbooru.com/warc/ -type f | sort | xargs -d "\n" sh -c 'for args do echo "$args"; date -u; rm "$args"; sleep 60; done' _; utc # command abc
One-minute wait before each file deletion, but the computer froze ~one hour later after "command abc" finished. Seemed like it all worked, but not in the long run.
# duplicate text, put at the bottom:
# ipwb version
# works on URLs containing "?" or "&"
$ echo To be used with SingleFile extension for Brave Browser, a running ipfs daemon, and ipwb for replay. For: text/html grabs.; localip=localhost; basepath="/srv/http/selenium"; cd "$basepath/dl"; newest="$(ls -t1 | head -n1)"; url="$(grep -i -A2 "^ Page saved with SingleFile" "$newest" | grep -i "^ url: " | sed "s/\s*$//g" | sed "s/.*\s//g")"; timestr="$(grep -i -A2 "^ Page saved with SingleFile" "$newest" | grep -i "^ saved date: " | sed "s/\s*$//g" | sed "s/^ saved date: //g")"; time="$(TZ=UTC date -d "$timestr" +%Y%m%d%H%M%S)"; urlsafe="$(echo "$url" | sed "s/:\|\/\|?\|=\|&\|(\|)\|,\|@\|+\|*\|%\|#/-/g")"; urllen=$(echo -n $time-$urlsafe | wc --bytes); if [ $urllen -gt 200 ]; then urlsafe="$(echo "$urlsafe" | perl -pE "s/^(.{200}).*/\1.URL2LONG/g")"; fi; echo "$url" > "$basepath/dl/$time-$urlsafe.txt"; cat "$newest" > "$basepath/dl/$time-$urlsafe"; newpath="$basepath/dl/$time-$urlsafe"; cid="$(curl -sLk -XPOST -F file=@$newpath "http://$localip:5001/api/v0/add?cid-version=1&chunker=size-1048576&recursive=true&pin=false" | jq .Hash | sed "s/\"//g")"; curl -sLk -XPOST "http://$localip:5001/api/v0/files/cp?arg=/ipfs/$cid&arg=/created/cid/$cid"; arr="$(echo "$url" | sed "s/^https\?:\/\///g" | sed "s/\/.*//g" | sed "s/\./ /g")"; echo "$(echo "${arr[@]}" | sed "s/^www //g" | tr ' ' '\n' | tac | tr '\n' ' ' | sed "s/ $//g" | sed "s/ /,/g")$(url2=$(echo "$url" | sed "s/^https\?:\/\/[^\/]*/)/g" | tr "[:upper:]" "[:lower:]"); if [[ "$url" == *\?* || "$url" == *\&* ]]; then base_url="${url2%%\?*}"; query_string="${url2#*\?}"; sorted_query=$(echo "$query_string" | tr '&' '\n' | sort | tr '\n' '&' | sed 's/&$//'); sorted_url="$base_url?$sorted_query"; echo "$sorted_url"; else echo "$url2"; fi) $time {\"locator\": \"urn:ipfs/bafkreihdwdcefgh4dqkjv67uzcmw7ojee6xedzdetojuzjevtenxquvyku/$cid\", \"status_code\": \"200\", \"mime_type\": \"text/html;charset=UTF-8\", \"original_uri\": \"$url\", \"title\": \"$(cat "$basepath/dl/$time-$urlsafe" | htmlq --text title)\"}" > $basepath/dl/$time-$urlsafe.cdxj; echo $basepath/dl/$time-$urlsafe.cdxj
# no ipwb version
# only works on basic URLs with no "?" or "&", such as example.com/a/b/c
$ echo To be used with SingleFile extension for Brave Browser and a running ipfs daemon. For: text/html grabs.; localip=localhost; basepath="/srv/http/selenium"; cd "$basepath/dl"; newest="$(ls -t1 | head -n1)"; url="$(grep -i -A2 "^ Page saved with SingleFile" "$newest" | grep -i "^ url: " | sed "s/\s*$//g" | sed "s/.*\s//g")"; timestr="$(grep -i -A2 "^ Page saved with SingleFile" "$newest" | grep -i "^ saved date: " | sed "s/\s*$//g" | sed "s/^ saved date: //g")"; time="$(TZ=UTC date -d "$timestr" +%Y%m%d%H%M%S)"; unixtime=$(date +%s); mkdir "m/$unixtime"; urlsafe="$(echo "$url" | sed "s/:\|\/\|?\|=\|&\|(\|)\|,\|@\|+\|*\|%\|#/-/g")"; urllen=$(echo -n $time-$urlsafe | wc --bytes); if [ $urllen -gt 200 ]; then urlsafe="$(echo "$urlsafe" | perl -pE "s/^(.{200}).*/\1.URL2LONG/g")"; fi; echo "$url" > "$basepath/dl/m/$unixtime/$time-$urlsafe.txt"; cat "$newest" > "$basepath/dl/m/$unixtime/$time-$urlsafe"; newpath="$basepath/dl/m/$unixtime/$time-$urlsafe"; cid="$(curl -sLk -XPOST -F file=@$newpath "http://$localip:5001/api/v0/add?cid-version=1&chunker=size-1048576&recursive=true&pin=false" | jq .Hash | sed "s/\"//g")"; curl -sLk -XPOST "http://$localip:5001/api/v0/files/cp?arg=/ipfs/$cid&arg=/created/cid/$cid"; arr="$(echo "$url" | sed "s/^https\?:\/\///g" | sed "s/\/.*//g" | sed "s/\./ /g")"; echo "$(echo "${arr[@]}" | sed "s/^www //g" | tr ' ' '\n' | tac | tr '\n' ' ' | sed "s/ $//g" | sed "s/ /,/g")$(url2=$(echo "$url" | sed "s/^https\?:\/\/[^\/]*/)/g" | tr "[:upper:]" "[:lower:]"); if [[ "$url" == *\?* || "$url" == *\&* ]]; then base_url="${url2%%\?*}"; query_string="${url2#*\?}"; sorted_query=$(echo "$query_string" | tr '&' '\n' | sort | tr '\n' '&' | sed 's/&$//'); sorted_url="$base_url?$sorted_query"; echo "$sorted_url"; else echo "$url2"; fi) $time {\"locator\": \"urn:ipfs/bafkreihdwdcefgh4dqkjv67uzcmw7ojee6xedzdetojuzjevtenxquvyku/$cid\", \"status_code\": \"200\", \"mime_type\": \"text/html;charset=UTF-8\", \"original_uri\": \"$url\", \"title\": \"$(cat "$basepath/dl/m/$unixtime/$time-$urlsafe" | htmlq --text title)\"}" > $basepath/dl/m/$unixtime/$time-$urlsafe.cdxj; membase="$basepath/dl/m/$unixtime"; urlpath="$(echo "$url" | sed "s/^https\?:\/\///g" | sed "s/\/$//g")"; if [[ "$url" =~ .*/$ ]]; then mkdir -p "$membase/memento/$time/$urlpath"; cp -n "$membase/$time-$urlsafe" "$membase/memento/$time/$urlpath/index.html"; else urlpathnolast="$(echo "$urlpath" | sed "s/\/[^\/]*$//g")"; lastpart="$(echo $urlpath | sed "s/.*\///g")"; mkdir -p "$membase/memento/$time/$urlpathnolast"; cp -n "$basepath/dl/m/$unixtime/$time-$urlsafe" "$membase/memento/$time/$urlpathnolast/$lastpart"; fi; filesf() { basedir="$basepath/dl/m/$unixtime"; basedirlen=$(echo "$basedir" | wc --bytes); find "$basedir" -type f | basedirlen="$basedirlen" xargs -d "\n" sh -c 'for args do nobasedir=$(echo "$args" | sed -E "s/^.{$basedirlen}//g"); echo " -F "file=@"\"$args\";filename=\"$nobasedir\"" | tr -d \\n; done' _; }; curl -k -XPOST -H "Content-Type: multipart/form-data" $(filesf) "http://$localip:5001/api/v0/add?cid-version=1&chunker=size-1048576&recursive=true&wrap-with-directory=true&pin=false"