LINUX.ORG.RU
ФорумTalks

прошу любить и жаловать — программа для каталогизации fb2-книг


0

0

Итак, представляю вниманию местный троллей и примкнувшим к ним свою новую программу pybookshelf.

Назначение программы — каталогизация локальной библиотеки fb2-файлов. Язык программы — python. Целевая ось — Linux/UNIX, на винде не пробовал запускать, да и не хочется.

Как работает. Указываете каталоги, в которых лежат книги, после чего программа их рекурсивно индексирует, находя файлы fb2 (зазипованные тоже). После индексации можно использовать.

Задача стояла не визуализировать реляционную субд, а предоставить удобные возможности навигации и поиска. Поиск работает по авторам-названиям. Навигация — по авторам, названиям, жанрам и всему такого прочему. Текущие скриншоты можно посмотреть тут ( http://code.google.com/p/pybookshelf/wiki/ScreenshotsAlpha001 ).

Статус разработки. Пока ещё полуконцепт-полуальфа. Ядро программы есть, всякие рендерилки и прочее — тоже. Осталось забить фичами. Отзывы и прочие предложения приветствуются.

Как установить. Поскольку программа в стадии разработки, готовых архивов/пакетов нет, получить можно напрямую из subversion, например, так:

svn checkout http://pybookshelf.googlecode.com/svn/trunk/ pybookshelf-read-only

Заходим в каталог и запускаем pybookshelf.py

Системные требования. python2.5, python-lxml, python-gtkmozembed, python-gtk, pysqlite3, PIL. Возможно, что-то забыл, если вспомню, добавлю на главной странице проекта ( http://code.google.com/p/pybookshelf/ )

Координаты обратной связи тут http://code.google.com/p/pybookshelf/wiki/Feedback

Ответ на: комментарий от annoynymous

aifiltr0@invyl:~$ env
SSH_AGENT_PID=4886
DM_CONTROL=/var/run/xdmctl
TERM=xterm
DESKTOP_STARTUP_ID=
SHELL=/bin/bash
XDM_MANAGED=method=classic
KONSOLE_DBUS_SERVICE=:1.27
GTK2_RC_FILES=/home/aifiltr0/.gtkrc-2.0-kde4
GS_LIB=/home/aifiltr0/.fonts
WINDOWID=10485763
KDE_FULL_SESSION=true
USER=aifiltr0
LS_COLORS=no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:do=01;35:bd=40;33;01: cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:tw=30;42:ow=34;42:st=37;44:ex=01;32:*. tar=01;31:*.tgz=01;31:*.svgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01 ;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31 :*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=0 1;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.g if=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35 :*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.mng=01;35:*.pcx= 01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:* .mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01; 35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.gl= 01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.aac=00;36:*.au=00;36:*.fl ac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;3 6:*.ra=00;36:*.wav=00;36:
SSH_AUTH_SOCK=/tmp/ssh-BtMWbb4844/agent.4844
SESSION_MANAGER=local/invyl:/tmp/.ICE-unix/4933
PATH=/usr/local/bin:/usr/bin:/bin:/usr/games
DESKTOP_SESSION=kde
PWD=/home/aifiltr0
KDE_SESSION_UID=1000
LANG=ru_RU.UTF-8
KONSOLE_DBUS_SESSION=/Sessions/2
HISTCONTROL=ignoredups
COLORFGBG=15;0
HOME=/home/aifiltr0
SHLVL=2
KDE_SESSION_VERSION=4
LANGUAGE=en_US
XCURSOR_THEME=oxy-red
LOGNAME=aifiltr0
XDG_DATA_DIRS=/usr/share:/usr/share:/usr/local/share
DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-rrdAGLEsl2,guid=d5caee418bba32 0a7f510a2849119f3a
LESSOPEN=| /usr/bin/lesspipe %s
WINDOWPATH=7
PROFILEHOME=
DISPLAY=:0
QT_PLUGIN_PATH=/home/aifiltr0/.kde4/lib/kde4/plugins/:/usr/lib/kde4/plugins/
LESSCLOSE=/usr/bin/lesspipe %s %s
_=/usr/bin/env
OLDPWD=/tmp
aifiltr0@invyl:~$

AiFiLTr0 ★★★★★
()

Понравилось. :)

Для убунтоидов: нужно установить пакеты
python-gnome2-extras
python-pysqlite2
python-imaging

Тоже вылетает с ошибкой unsupported locale setting.
Заменил в файле pybookshel.py:
locale.setlocale(locale.LC_ALL, 'ru')
на
locale.setlocale(locale.LC_ALL, '')
Сделал:
mkdir -p po/ru/LC_MESSAGES/
msgfmt -o po/ru/LC_MESSAGES/pybookshelf.mo po/ru.po
Всё заработало.

Идея с браузерным интерфейсом очень понравилась.

Футуре реквесты:
добавить закладки как в обычном браузере
сохранять открытые вкладки при выходе
(на отдаленное будущее;) сделать в виде http-сервера, чтобы можно было обычным браузером пользоваться

> версия sqlite3?


А почему sqlite3? Там же вроде sqlite2 используется?

mnt
()
Ответ на: комментарий от mnt

>Заменил в файле pybookshel.py:
>locale.setlocale(locale.LC_ALL, 'ru')

О, спасибо, мой косяк. Этой строчки там вообще не должно быть.

> А почему sqlite3? Там же вроде sqlite2 используется?

sqlite3, просто соответствующая питоновская либа называется python-pysqlite2.

> добавить закладки как в обычном браузере

Будет.

> сохранять открытые вкладки при выходе
Тоже в планах.

Насчёт ru.po. Там в файле BUILD написано, как собирать файлы локализации, достаточно запустить
./po/createpot.py compile

Спасибо за комментарии!

annoynymous ★★
() автор топика
Ответ на: комментарий от annoynymous

> ./po/createpot.py compile

что-то у меня не получилось:

$ ./po/createpot.py compile
Wrote ../pybookshelf.glade.h
Building messages.pot...
Running xgettext --add-comments --directory=. --default-domain=messages --flag=g_strdup_printf:1:c-format --flag=g_string_printf:2:c-format --flag=g_string_append_printf:2:c-format --flag=g_error_new:3:c-format --flag=g_set_error:4:c-format --flag=g_markup_printf_escaped:1:c-format --flag=g_log:3:c-format --flag=g_print:1:c-format --flag=g_printerr:1:c-format --flag=g_printf:1:c-format --flag=g_fprintf:2:c-format --flag=g_sprintf:2:c-format --flag=g_snprintf:3:c-format --flag=g_scanner_error:2:c-format --flag=g_scanner_warn:2:c-format --output=messages.pot --files-from=./POTFILES.in.temp --keyword=_ --keyword=N_ --keyword=U_ --keyword=Q_ --from-code=UTF-8
Removing generated header (.h) files...done.
./.././pybookshelf/gui/collectiondirs.py:61: предупреждение: Форматная строка 'msgid' с безымянными аргументами не может быть
правильно локализована: переводчик не может поменять местами
аргументы.
Пожалуйста, используйте форматную строку с именованными аргументами и отображение вместо кортежа для аргументов.
xgettext: ошибка открытия файла "./.././pybookshelf/config.py" для чтения: No such file or directory
ERROR: xgettext failed to generate PO template file. Please consult
error message above if there is any.
Generating translation for ru locale
msgmerge: ошибка открытия файла "messages.pot" для чтения: No such file or directory
msgfmt: (null): предупреждение: заголовок PO-файла отсутствует или неправилен
предупреждение: преобразование кодировок не будет работать
msgfmt: найдена 1 критическая ошибка

Ну и создется mo-файл в каталоге locale а ищется в po.


Кстати, вот еще.

Если открыто много вкладок, то окно расширяется. Исправил: в glade -> main_notebook -> properties -> scollable поставил yes

А ещё он на битых софтлинках вываливается.

Сейчас пробую загрузить библиотеку траума - пока полет нормальный :)

mnt
()
Ответ на: комментарий от mnt

> что-то у меня не получилось:

Традиционный вопрос, какая ось?

> Если открыто много вкладок, то окно расширяется. Исправил: в glade -> main_notebook -> properties -> scollable поставил yes

Это известная «фича», я так и не решил, как заставить этот уродский GtkNotebook нормально работать. Текущее поведение при большом количестве табов очень не нравится. Но пока сделаю scrollable и text ellipsize для табов (если получится).

> Сейчас пробую загрузить библиотеку траума - пока полет нормальный :)

Это только так кажется. Я эту «библиотеку» всю разобрал и отсортировал. Там дикое количество битых файлов. При индексировании создаётся отчёт в каталоге ~/.pybookshelf/reports/, можно убедиться.

annoynymous ★★
() автор топика
Ответ на: комментарий от AiFiLTr0

> алсо, стукни в жаббер. `whoami` [at] invyl.ath.cx, чтобы тут не захлалять топик.

Я что-то не осилил этот ребус с jid-ом. Лучше ты стукни cancel[gav]regolit.com

annoynymous ★★
() автор топика
Ответ на: комментарий от annoynymous

>> что-то у меня не получилось:

>Традиционный вопрос, какая ось?

Всё, вопрос снимается. Сейчас проапдейтил систему и «приехала» новая версия xgettext, которая это же выдаёт. Буду заменять все неименованные параметры на именованные.

annoynymous ★★
() автор топика
Ответ на: комментарий от mnt

> Сейчас пробую загрузить библиотеку траума

Итого: 68316 книг загружалось около 2-х часов.

Поиск проходит достаточно быстро, а вот если зайти в какой-нибудь жанр, то начинает тормозить. :(

mnt
()
Ответ на: комментарий от mnt

> Поиск проходит достаточно быстро, а вот если зайти в какой-нибудь жанр, то начинает тормозить. :(

Это вообще странно. Надо будет тоже поиндексировать большую коллекцию.

annoynymous ★★
() автор топика
Ответ на: комментарий от annoynymous

> При индексировании создаётся отчёт в каталоге ~/.pybookshelf/reports/, можно убедиться.

grep ^ERR ~/.pybookshelf/reports/update-20081106-1255-17.log | wc -l 2516

Ага, 2516 книг не загрузилось. Черт с ними :)

mnt
()
Ответ на: комментарий от annoynymous

> Это известная «фича», я так и не решил, как заставить этот уродский GtkNotebook нормально работать. Текущее поведение при большом количестве табов очень не нравится. Но пока сделаю scrollable и text ellipsize для табов (если получится).

Ну у меня вроде не глючит: http://img406.imageshack.us/img406/3822/screenfp8.png

(Я только scrollable поставил)

mnt
()
Ответ на: комментарий от mnt

> Ну у меня вроде не глючит
Это потому что пока в заголовке таба стоит заглушка, а должен быть нормальный текст типа названия книги или текст запроса. Но я ещё над этим работаю.

annoynymous ★★
() автор топика
Ответ на: комментарий от mnt

> Кстати, тормозит только если в жанре много книг (несколько сотен). Там где мало - нормально.

Ага, уже проиндексировал большое количество, сейчас займусь профилированием.

annoynymous ★★
() автор топика
Ответ на: комментарий от annoynymous

> Кстати, тормозит только если в жанре много книг (несколько сотен). Там где мало - нормально.

Баг :) Очень ресурсозатратная функция вызывалась два раза.

annoynymous ★★
() автор топика

Очередной апдейт. СИЛЬНО увеличена производительность за счёт правильных SQL-индексов. Также в некоторых местах сильно увеличена скорость генерации страниц.

Так как схема базы поменялась, нужно старую базу дропнуть. Если дропать не хочется, можно вручную исправить: запустить `sqlite3 ~/.pybookshelf/collection.db` и выполнить вот такой запрос:

DROP INDEX search_table_index;
CREATE INDEX search_index_table_index_1 ON search_index_table(index_string);
CREATE INDEX authors_books_link_index_1 ON authors_books_link(author_id);
CREATE INDEX authors_books_link_index_2 ON authors_books_link(file_id);
CREATE INDEX genres_books_link_index_1 ON genres_books_link(genre_id);
CREATE INDEX genres_books_link_index_2 ON genres_books_link(file_id);
CREATE INDEX series_books_link_index_1 ON series_books_link(series_id);
CREATE INDEX series_books_link_index_2 ON series_books_link(file_id);

annoynymous ★★
() автор топика

Баг с падением на UTF8 пофиксен.

annoynymous ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.