Sony Readerでフォルダを自動的にコレクション登録する

Sony Readerの書籍管理効率化について、昨日PDFを連結するスクリプトを作成したばかりですが、よりスマートな管理方法を見つけてしまいました。

Sony Readerではbooks.dbというSQLiteのデータベースファイルで書籍のデータが管理されており、ここにSQLのトリガを仕込むことで挙動をカスタマイズすることができるようです。

今回は、このbooks.dbに対するハックで、Sony Readerにフォルダ分けして保存した書籍を自動的にコレクションとして登録する方法を紹介します。

どのように役立つのか?

Sony Readerでは、SDカード内に自由にフォルダ分けしてPDF等を保存することができますが、書籍の一覧画面では全てフラットに表示されてしまいます。

また、一覧とは別に書籍を管理できるコレクション機能は、標準では端末や専用ソフト上からちまちまと設定しなければならず、登録作業が面倒です。

今回紹介する方法では、Sony Readerのデータベースに新たな書籍のデータが登録されるタイミングで、自動的にフォルダ名のコレクションを作成することができます。

Sony Readerでフォルダを自動的にコレクション登録する

以下のページを参考に進めます。

手順をまとめると以下のとおりです。

  • SQLiteSpyをダウンロード・解凍
  • PRS-T1をデータ転送モードでPCに接続
  • SQLiteSpyで「File」→「Open Database」から「X:\Sony_Reader\database\books.db」を開く(Xは本体メモリのドライブ名)
  • SQLiteSpyの右上の入力欄にSQL文を入力し、「Execute」→「Execute SQL」を実行
  • 左側のツリーから「main」→「Tables」→「books」→「Triggers」を開き、「recently_added_trigger」が追加されていることを確認
  • SQLiteSpyを閉じる(SQL文を保存するか尋ねるダイアログが出るので「NO」で終了)
  • SDカード内の「books.db」に対して同様にSQL文を実行

私の方で使用したSQL文はこちらです。「Sony_Reader/media/books」内に書籍データを保存しているため、上記参考ページのものを少し修正しています。

CREATE TRIGGER auto_collection_trigger AFTER INSERT ON books
WHEN new.file_path LIKE 'Sony_Reader/media/books/_%'
BEGIN
    INSERT OR IGNORE INTO collection (_id, title, source_id)
    VALUES (
        (SELECT _id FROM collection WHERE title = substr(new.file_path, 25, length(new.file_path) - length(new.file_name) - 25)),
        substr(new.file_path, 25, length(new.file_path) - length(new.file_name) - 25),
        new.source_id
    );
    INSERT INTO collections (collection_id, content_id)
    VALUES (
        (SELECT _id FROM collection WHERE title = substr(new.file_path, 25, length(new.file_path) - length(new.file_name) - 25)),
        new._id
    );
END

以降、新たに書籍が登録されるタイミンで自動的にフォルダ名のコレクションが作成されるようになります。

改造を元に戻す

本体メモリとSDカードのbooks.dbを削除すれば、自動的にbooks.dbが再生成され標準の状態に戻ります。

また、SQLiteSpyで「main」→「Tables」→「books」→「Triggers」内の「recently_added_trigger」を右クリックし、「Drop trigger」することでも元に戻せます。

おまけ:ホーム画面に最近読んだ書籍を直近4件まで表示する

参考ページに載っていた、ホーム画面の「最近追加された書籍」欄に「最近読んだ書籍」を表示させる改造も便利だったので併せて紹介しておきます。

標準ではホーム画面の「最近読んだ書籍」は1件しか表示されませんが、この改造では直近4件まで表示できるため、複数の書籍を並行して読み進める際に役立ちます。

私の方では特定フォルダ内の書籍をホーム画面に表示させないように修正して使うことにしました。(追記@2012/08/06 recently_added_exclude_triggerを追加)

CREATE TRIGGER recently_opened_trigger AFTER UPDATE OF reading_time ON books
WHEN new.file_path NOT LIKE 'Sony_Reader/media/books/{exclude}/_%'
BEGIN
    UPDATE books SET added_date = 0 WHERE _id = new._id;
    UPDATE books SET added_date = reading_time WHERE reading_time NOT NULL AND _id <> new._id;
END

CREATE TRIGGER recently_opened_exclude_trigger AFTER UPDATE OF reading_time ON books
WHEN new.file_path LIKE 'Sony_Reader/media/books/{exclude}/_%'
BEGIN
    UPDATE books SET reading_time = added_date WHERE _id = new._id;
END

CREATE TRIGGER recently_added_exclude_trigger AFTER INSERT ON books
WHEN new.file_path LIKE 'Sony_Reader/media/books/{exclude}/_%'
BEGIN
    UPDATE books SET added_date = 0 WHERE _id = new._id;
END

おわりに

このような改造は、メーカーで想定していない使い方になると思うので、万一不具合が発生してもサポート対象外となる可能性が高いです。

PRS-T1:2.0.02.06220で動作を確認していますが、保証はできませんので、試される際は自己責任でお願いします。

blog comments powered by Disqus