0

Safari, have the Bookmark all tabs, function in the menu Bookmarks -> Add Bookmarks for these N tabs. I looking for a way how to do this automatically with applescript in all opened Safari windows.

With other words, want

  1. choose some bookmark folder, let says "Favorites -> Sessions"
  2. cycle over all Safari windows
  3. if the window has only one TAB simply bookmark it into the above folder
  4. otherwise
    • call the Bookmarks -> Add Bookmarks for these N tabs menu item
    • fill the popup window automatically (e.g. Saved Tabs window1, Saved Tabs window2 ... etc.)
  5. repeat from 2

Here https://gist.github.com/kshiteesh/b72e93d31d65008fcd11 is a nice applescript, (also similarly this which could be an good starting point for the development, but asking first here - maybe someone already has done this. :)

Any help, please?

Ps - motivation - The Apple's new policy, (blocking support for legacy Safari extensions), unfortunately caused that one of "must to have" Safari extension - Sessions - stops working in the Safari 12. So, looking for some home-grown functionality.

9
  • Just out of curiosity, why would you want to bookmark so many pages? And why would you keep many windows open instead of one with several tabs? Oct 18 '18 at 14:57
  • @MateusRibeiro - just want bookmark pages when I quitting the browser. One window? Lol - just for fun - now I have opened 9 windows in 4 desktops and each window have 1 up to 9 opened tabs... Simply working (browsing) simultaneously on more topices... For example have 1 window (2 tabs) for stackexchange (stackoverflow and this), 1 window youtube - just 1 tab, 1 window arduino (9 tabs), 2 windows about World of warcraft 3 & 6 tabs), 2 windows for company intranet (1x ledger), 1x for managing my employes, and 2 more windows for other unspecified things.. :) :) Im pretty busy.. :)
    – jm666
    Oct 19 '18 at 23:00
  • Firefox has reopen all windows and tabs as an option on restart. Doesn't safari have the same thing? Jan 4 '19 at 20:57
  • @historystamp Let define the session as a list of all tabs in all windows. Then opening the last session (as you said) is something very different as have a possibility to store and retrieve an history of sessions. Just click on the killed addon page to see about what I talking. Bookmarking isn't the optimal solution, but better as nothing...
    – jm666
    Jan 5 '19 at 11:23
  • Thanks for mentioning sessions. I'm collecting too many tab windows these days. Jan 5 '19 at 21:00
1

As I told in the above comment, now me using an self-developed automator workflow-app.

I'm an perl language developer, so in the workflow me using an custom-installed perl interpreter and many perl modules too - definitely NOT a solution for an average (common) mac user.

But posting it, mainly for reference and maybe someone could hack it to some better solution. How it works - how to use it:

  • unfortunately it must be run manually - i'm unable figure out how to run some automator workflow (service or app) when the Safari receives the quit event. :(

  • The automator (service) script has two actions:

    • run javascript (I don't know applescript nor Javascript, but the javascript is more understandable for me) - it simply gathers all URL's from all tabs and windows and create a JSON structure, which is passed to the next
    • run a shell script - which runs my perl script with custom installed perl interpreter.
  • when the app is executed, it saves an HTML file into the folder Sessions in my Desktop.
  • The name of the file is like s20190107-164908.html e.g. the current date-time string.
  • it is easy to use the Finder's quick-look feature (spacebar) to quicky check the content of the file.

It is far-far beyond of the original Sessions addon, but it is usable for me.

enter image description here

The full content of the above actions are:

1.) the Javascript

function run(input, parameters) {
    var tablist = [];
    var Safari = Application('Safari');
    Safari.includeStandardAdditions = true;
    Safari.activate();
    var windows = Safari.windows();
    for(let iw=0, wsize=windows.length; iw<wsize; iw++) {
        var wintabs = [];
        var tabs = windows[iw].tabs();
        if (!tabs) continue;
        for(let it=0, tsize=tabs.length; it<tsize; it++) {
            if( tabs[it].url() ) {
                wintabs.push( {"name": tabs[it].name(), "url": tabs[it].url()} );
            }
        }
        if( wintabs.length ) {
            tablist.push(wintabs);
        }
    }
    return JSON.stringify(tablist);
}

and the shell script

export ANYENV_ROOT=/opt/anyenv
export PATH="$ANYENV_ROOT/bin:$PATH"
eval "$(anyenv init -)"

perl -MJSON -MPath::Tiny -MTime::Piece -M5.014 -w -E '
    my $jsonstr = do { local $/; <STDIN> };
    my $j = decode_json($jsonstr);
    my @lines;
    lsay("<ol>");
    for my $w (@$j) {
        lsay("<li><ul>");
        for my $t (@$w) {
            my $astr = "<li><a href=\"$t->{url}\">$t->{name}</a></li>";
            lsay($astr);
        }
        lsay("</ul></li>");
    }
    lsay("</ol>");
    my $sessdir=path( $ENV{HOME}, "Desktop/Sessions");
    $sessdir->mkpath;
    my $sessfile=$sessdir->child(localtime->strftime("s%Y%m%d-%H%M%S.html"));
    $sessfile->spew_utf8(@lines);;
    sub lsay { push @lines, $_ for @_ }
'

Example what do you see in the quick-look:

enter image description here

As I already told - it is NOT a solution for an common user. It is usable only by an developers... :(

4
  • Interesting app, not for you: fireeye.com/blog/threat-research/2017/03/… Jan 11 '19 at 4:54
  • Maybe you could install a keylogger like Keyboard maestro and trap the quit events, run your scripts, then relaunch the quit. very fragile You could certainly trap command + q not sure about the mousing around. Jan 11 '19 at 4:57
  • I've developed a javascript program for Waterfox. It intercepts the user typing command+s. You could write a javascript to intercept what the user is doing and invoke your app when the user quits. discussions.apple.com/docs/DOC-250000368 Jan 17 '19 at 21:55
  • @historystamp The main problem is that the automator's javascript isn't executed inside of Safari. It is a Applescript environment -javascript, not a browser javascript = different environment, e.g. no page-load events and like. Your script in the pastebin captures the keypress in a javascript runing inside of a browser. Also as I said, my Javascript knowledge is terrible. Thanx anyway.
    – jm666
    Jan 18 '19 at 2:53

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .