Qutebrowserのsqlite3履歴にURLリストを追加する

Qutebrowserのsqlite3履歴にURLリストを追加する

一般概要

次の形式の `history.csv url' という CSV ファイルがあります。

<url>;<title>;2024-03-30T12:00:00;2024-03-30T12:00:00

(これ2024-03-30T12:00:00同じです)

目的は、sqlite3のQutebrowser履歴からこのURLを取得することです。

私がしたこと

事前リクエスト

まずQutebrowserを閉じました。

データベースを開く

私は走る:

sqlite3 ~/.local/share/qutebrowser/history.sqlite

新しいURLを追加

sqlite3シェルで次のことを行いました。

.mode csv
.separator ';'
.import urls.txt History

以下のいくつかの誤った行を除いて、すべてが正常です。

history.csv:11671: unescaped " character
history.csv:11671: unescaped " character
history.csv:11772: expected 4 columns but found 6 - extras ignored

確認する

以下で変更が発生したことを確認しました。

SELECT * FROM History;

はい、URLを見ました。

閉幕式

最後にコンソールを閉じました。

.quit

質問

Qutebrowserに戻って動作することを確認するために一部のURLを開こうとすると機能しません。 URLを取得できないようです。

質問

Qutebrowserの履歴にURLを取得する方法は?私が説明した方法や他の方法で。

修正する

:historyQutebrowserでコマンドを有効にすると、私が追加したリンクが表示されます。しかし歴史的完成には現れない。したがって、データベースの問題ではありません。

答え1

SQLiteは列型を適用せず、Cutebrowser履歴SQLの時間列は単純な整数(おそらくエポック以降の秒)です。あなたの文字列は、ISO形式の日付/時刻を含む完全な文字列です!したがって、qutebrowserはそれを解析できない可能性があります。

"あなたのCSVがまたはその中にあると思われるという事実は、;あなたがデータを正しく前処理していないことをもう一度示唆し、最初にURLをurlencodeする必要があります。 sqliteにエスケープされていない引用符があることを知らせるのは本当に悪い兆候です。一般に、パーサーには特定の許容誤差があり、実際にはCSVで明示的に解析できないデータがある可能性があります。テキストエディタでこの行をチェックしてください((neo)vimは何千行ものファイルを開くのに問題はありません)。

sqlite3したがって、「拡張」SQLシェルを介して直接インポートすることはうまくいきません。選択した言語でスクリプトを書くのはとても簡単です。ここでは基本的に組み込みのpython3を使用しています。

  • このsqlite3モジュールを使用すると、テーブルに行を簡単に挿入できます。
  • datetime日付変換の場合、
  • csvCSVファイルを読み取るための簡単な行読み取り処理のためのモジュールもあります。予期しない場所に引用符があるように見えるので、ここでは手動解析を好みます。

私が思いついたプログラムスタブはおおよそ次のようになります。

#!/usr/bin/env python3
from datetime import datetime
# Need to install python3-requests:
from requests.utils import requote_uri
import sqlite3
from sys import argv

def parseline(line: str) -> tuple:
    components = line.split(";")
    url = requote_uri(components[0])

    raw_title = components[1]
    if raw_title[0] == '"' and raw_title[-1] == '"':
        raw_title = raw_title[1:-1]
    title = raw_title

    timestamp1 = int(datetime.fromisoformat(components[-2]).timestamp())
    return (url, title, timestamp1, 0)

assert(len(argv) == 3)

with sqlite3.Connection(argv[1]) as db:
    handle = db.cursor()
    with open(argv[2], "r", encoding="utf-8") as textfile:
        handle.executemany("INSERT INTO History VALUES(?, ?, ?, ?)", 
            (parseline(line) for line in textfile))

上記のスクリプトは完全にテストされておらず、単に私の想像上の製品であることに注意してください。実行可能にし、セミコロンで区切られたファイルパスをパラメータとして使用してディレクトリからchmod a+x scriptname実行できます。.local/share/qutebrowsercd ~/.local/share/qutebrowser; ~/bin/scriptname ~/urls.txt

デバッグ

次のスクリプトを実行できます

#!/usr/bin/env python3
from datetime import datetime
# Need to install python3-requests:
from requests.utils import requote_uri
import sqlite3
from sys import argv

def parseline(line: str) -> tuple:
    components = line.split(";")
    url = requote_uri(components[0])

    raw_title = components[1]
    if raw_title[0] == '"' and raw_title[-1] == '"':
        raw_title = raw_title[1:-1]
    title = raw_title

    timestamp1 = int(datetime.fromisoformat(components[-2]).timestamp())
    return (url, title, timestamp1, 0)

assert(len(argv) == 3)

with sqlite3.Connection(argv[1]) as db:
    handle = db.cursor()
    with open(argv[2], "r", encoding="utf-8") as textfile:
        handle.executemany("INSERT INTO History VALUES(?, ?, ?, ?)", 
            (parseline(line) for line in textfile))

そしてpython3 importHistory.py ~/.local/share/qutebrowser/history.sqlite history.csv

私のスクリプトはデータベースパスを提供する必要があります。

関連情報