#!/bin/sh mkdir -p ~/.cache/rofi-bookmarks CACHEDIR="~/.cache/rofi-bookmarks" places_sqlite="$(find ~/.mozilla/firefox/*.default*/ -name "places.sqlite" -print -quit)" places_rofi_sqlite="$(dirname "${places_sqlite}")/places.rofi.sqlite" favicons_sqlite="$(find ~/.mozilla/firefox/*.default*/ -name "favicons.sqlite" -print -quit)" favicons_rofi_sqlite="$(dirname "${favicons_sqlite}")/favicons.rofi.sqlite" # path to the sqlite3 binary sqlite_path="$(which sqlite3)" # sqlite3 parameters (define separator character) sqlite_params="-separator ^" # browser path browser_path="$(which firefox)" # functions # create a backup file create_backup() { if [ "$#" -eq 2 ] && [ -n "$1" ] && [ -n "$2" ]; then if [ ! -f "$2" ] || [ "$1" -nt "$2" ]; then cp "$1" "$2" fi fi } # process bookmarks process_bookmarks() { query="select b.title, p.url, b.id, SUBSTR(SUBSTR(p.url, INSTR(url, '//') + 2), 0, INSTR(SUBSTR(p.url, INSTR(p.url, '//') + 2), '/')) as domain from moz_bookmarks as b left outer join moz_places as p on b.fk=p.id where b.type = 1 and p.hidden=0 and b.title not null" # and parent=$1 $sqlite_path $sqlite_params "$places_rofi_sqlite" "$query" | while IFS=^ read title url id domain; do if [ -z "$title" ]; then title="$url" fi page_id=$($sqlite_path $favicons_rofi_sqlite 'SELECT Id FROM 'moz_pages_w_icons' WHERE page_url="'$url'"') icon_id=$($sqlite_path $favicons_rofi_sqlite 'SELECT max(icon_id) FROM 'moz_icons_to_pages' WHERE page_id='$page_id'') icon_link=$($sqlite_path $favicons_rofi_sqlite 'SELECT icon_url FROM 'moz_icons' WHERE id='$icon_id'') wget -nc -O ~/.cache/rofi-bookmarks/$icon_id.png $icon_link & if [ $icon_id -eq $icon_id ]; then echo -en " $title \0icon\x1f$CACHEDIR/$icon_id.png\n" fi done } # process bookmark process_bookmark() { if [ "$#" = 1 ] && [ -n "$1" ]; then title="$(echo $1 | sed "s|.*{id:\(.*\)}$|\1|")" id=$($sqlite_path $places_rofi_sqlite 'SELECT id FROM 'moz_bookmarks' WHERE title="'"$title"'"') query="select p.url from moz_bookmarks as b left outer join moz_places as p on b.fk=p.id where b.type = 1 and p.hidden=0 and b.title not null and b.id=$id" url="$($sqlite_path $sqlite_params "$places_rofi_sqlite" "$query")" nohup $browser_path "$url" >/dev/null 2>&1 & fi } # application parameter="$1" # create a backup, as we cannot operate on a places.sqlite file directly due to exclusive lock create_backup "$places_sqlite" "$places_rofi_sqlite" create_backup "$favicons_sqlite" "$favicons_rofi_sqlite" # open a bookmark when there is a param sety if [ -n "$parameter" ]; then process_bookmark "$parameter" exit fi # process bookmarks process_bookmarks