Forked from jscher2000/syncedTabsToBookmarksHTML.js
Created
February 26, 2024 19:55
-
-
Save likeshumidity/8bc33b053bc8fad3de1f06eabda52c15 to your computer and use it in GitHub Desktop.
Export Synced Tabs List to "bookmarks.html" file (Browser Console script)
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
// 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, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"').replace(/'/g, ''')}; | |
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