60 lines
2 KiB
Bash
Executable file
60 lines
2 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
|
|
# Interactively select (in skim) an url from Firefox/Chrome/Chromium history to
|
|
# open in your browser (depends on $BROWSER). Should work on Linux and MacOS.
|
|
#
|
|
# requires: sqlite3
|
|
|
|
sep='{{::}}'
|
|
|
|
_do_rofi() {
|
|
for url in $(awk -F "${1:-$sep}" '{printf "%s, %s\n", $1, $2}' | rofi -dmenu -p='history > ' -multi-select | sed 's#.*\(https*://\)#\1#'); do
|
|
if command -v "$BROWSER" >/dev/null; then
|
|
$BROWSER "$url" &
|
|
elif command -v open >/dev/null; then
|
|
open "$url" &
|
|
else
|
|
xdg-open "$url" &
|
|
fi
|
|
done
|
|
}
|
|
|
|
case ${BROWSER:-firefox} in
|
|
qutebrowser)
|
|
sqlite3 -separator $sep "$XDG_DATA_HOME/qutebrowser/history.sqlite" \
|
|
"SELECT title, url FROM History \
|
|
WHERE title != '' \
|
|
GROUP BY url \
|
|
ORDER BY atime DESC" | _do_rofi
|
|
;;
|
|
firefox)
|
|
for dir in ~/.mozilla/firefox/*.default \
|
|
$XDG_CONFIG_HOME/firefox/.mozilla/firefox/*.default \
|
|
$XDG_DATA_HOME/mozilla/firefox/*.default \
|
|
~/Library/Application\ Support/Firefox/Profiles/*.default; do
|
|
if [[ -d "$dir" ]]; then
|
|
# The db can be locked from time to time. This is inefficient, but
|
|
# places.sqlite is usually under 30mb so this should be instant, and
|
|
# /tmp is cleared at boot so...
|
|
cp "$dir/places.sqlite" "/tmp/places.sqlite"
|
|
sqlite3 -separator $sep "/tmp/places.sqlite" \
|
|
"SELECT DISTINCT title, url FROM moz_places \
|
|
WHERE title IS NOT NULL \
|
|
ORDER BY last_visit_date DESC" | _do_rofi
|
|
break
|
|
fi
|
|
done
|
|
;;
|
|
*)
|
|
for dir in ~/.config/google-chrome/Default ~/.config/chromium/Default ~/Library/Application\ Support/Google/Chrome/Default; do
|
|
if [[ -f "$dir/History" ]]; then
|
|
cp -f "$dir/History" "/tmp/_h"
|
|
sqlite3 -separator $sep "/tmp/_h" \
|
|
"SELECT substr(title, 1, $((COLUMNS / 3))), url \
|
|
FROM urls ORDER BY last_visit_time DESC" | _do_rofi
|
|
break
|
|
fi
|
|
done
|
|
;;
|
|
esac
|