Skip to content

Instantly share code, notes, and snippets.

@lostdj
Forked from jscher2000/syncedTabsToBookmarksHTML.js
Last active March 12, 2024 15:21
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 lostdj/39570a3ce747d67a51e3cde8a8356c02 to your computer and use it in GitHub Desktop.
Save lostdj/39570a3ce747d67a51e3cde8a8356c02 to your computer and use it in GitHub Desktop.
Export Synced Tabs List to "bookmarks.html" file (Browser Console script)
// ctrl+shft+j
// Run code in Browser Console after enabling chrome debugging --
// about:config => devtools.chrome.enabled => true
// https://developer.mozilla.org/docs/Tools/Browser_Console
try {
var tabPromise = SyncedTabs._internal.getTabClients();
tabPromise.then((arrDevices) => {
if (arrDevices && arrDevices.length > 0){
// Generate a string with the format of a bookmark export file
var d, e, out = '<!DOCTYPE NETSCAPE-Bookmark-file-1>\n<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">\n<TITLE>Bookmarks</TITLE>\n<H1>Bookmarks Menu</H1>\n<DL><p>\n';
const escapeHtmlEntities = function(aText){return (aText || '').replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&#39;')};
for (var j=0; j<arrDevices.length; j++){
// Create a folder for each device
d = new Date(arrDevices[j].lastModified);
e = Math.floor(d.getTime()/1000);
out += '<DT><H3 ADD_DATE="' + e + '" LAST_MODIFIED="' + e + '">Synced Tabs from ' + escapeHtmlEntities(arrDevices[j].name) + ' as of ' + d.toString() + '</H3>\n<DL><p>\n';
// Sort tabs by most recently used
var arrTabs = arrDevices[j].tabs;
arrTabs.sort(function(a, b){return b.lastUsed - a.lastUsed;});
for (var i=0; i<arrTabs.length; i++){
// Create a bookmark (link) for each tab
d = new Date(arrTabs[i].lastUsed * 1000);
e = Math.floor(d.getTime()/1000);
out += ' <DT><A HREF="' + arrTabs[i].url + '" ADD_DATE="' + e + '" LAST_MODIFIED="' + e + '">' + escapeHtmlEntities(arrTabs[i].title) + '</A>\n';
// Show last access date/time in a note (comment out or delete the next line if you don't want that)
out += ' <DD>Last acccessed: ' + d.toString() + '\n'
}
out += '</DL><p>\n';
}
out += '</DL><p>\n</DL>';
// Set up Save As dialog with proposed file name
var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(Components.interfaces.nsIFilePicker);
fp.init(window, 'Open File', Components.interfaces.nsIFilePicker.modeSave);
fp.appendFilter('HTML Files', '*.html');
d = new Date();
d.setMinutes(d.getMinutes() - d.getTimezoneOffset());
var dt = d.toISOString().split('.')[0].replace(/-/g, '').replace(/:/g, '').replace(/T/, '_');
fp.defaultString = 'bookmarks-from-synced-tabs_' + dt + '.html';
// Call Save As dialog and (unless user cancels) write the file
fp.open((aResult) => {
if (aResult == Components.interfaces.nsIFilePicker.returnOK ||
aResult == Components.interfaces.nsIFilePicker.returnReplace) {
try {
IOUtils.writeUTF8(fp.file.path, out);
alert('Look for ' + fp.file.path);
} catch (err) {
alert(err);
}
} else {
alert('Okay, not saving');
}
});
} else {
console.log('NO SYNCED TABS RETRIEVED');
}
}).catch((err) => {
console.log('Problem reading or outputting synced tabs: '+err);
});
} catch (err) {
console.log('Problem reading or outputting synced tabs: '+err);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment