Kdybych měl jmenovat jednu věc, která mi na Sony Readeru opravdu vadí, tak to je jeho podpora-nepodpora pro adresáře: Reader sice správně najde všechny knihy, ať jsou rozházené po adresářích jak chtějí, ale potom je uživateli nabídne jen v plochém seznamu. Jaký je to problém ví každý, kdo má na čtečce víc než takových sto knih, případně víc než dvacet knih začínajících na jednu skupinu písmen - velmi to znepříjemňuje hledání konkrétní knihy. Sony Reader sice nabízí tzv. sbírky (collections - něco velmi podobného playlistu z hudebních přehrávačů), ale to je jen slabá náhrážka. Základní problém je v tom, že ačkoliv počet sbírek je teoreticky neomezený, praktickým maximem je tak dvacet, možná třicet kousků - potom už začne být vyhledávání sbírky natolik pracné, že to skoro nestojí za to. Bohužel, když nic lepšího není, musíme vzít zavděk i touto náhrážkou. Jediný problém je, jak ji vytvořit. Stejně jako v případě hromadných konverzí z HTML jsem se nespokojil se zjištěním, že to Calibre ani eBook Library neumí podle mých představ, a napsal jsem si vlastní prográmek založený na stejných principech jako H2LRF - práce z příkazové řádky a vytváření sbírek na co nejméně zmáčknutých kláves.
Nástroj pro vytváření sbírek jsem nazval ColBuild a stejně jako H2LRF je to aplikace spouštěná z příkazové řádky. Její činnost ovládají jednak parametry na příkazové řádce, jednak dva definiční soubory - společný colbuild.ini
a pro to které paměťové médium specifický soubor s libovolným jménem. Všechny tyto soubory jsou programem pouze čteny a mohou tedy být umístěny na médiu se zakázaným zápisem.
Soubor colbuild.ini
je standardní Windowsovský INI soubor obsahuje definici všech společných parametrů. Definice se nachází v sekci Config
a mohou nabývat těchto hodnot:
CalibrePath = adresář
určuje cestu k adresáři, ve kterém je nainstalován Calibre. Calibre by v zásadě nebyl pro vytváření sbírky potřeba, ale když už utilita modifikuje XML soubor s definicemi knih, může zrovna tak dobře zaktualizovat údaje o názvu a autorovi - a tyto údaje zjišťuji právě pomocí Calibrovských utilit lrf-meta.exe
, pdf-meta.exe
, rtf-meta.exe
a epub-meta.exe
.
GenerateMetadata = 0/1
říká, jestli se metadata mají (1) nebo nemají (0) generovat. Doporučuji spíš generovat (1), protože ColBuild v tom dělá dokonce lepší práci než samotná čtečka (v původní verzi firmwaru 1.0 ještě generování probíhalo dobře i ve čtečce, ale ve verzi 1.1 už čtečka přestala generovat i používat obsah parametru --author-sort
a sice používá, ale už negeneruje, --title-sort
; ColBuild pochopitelně oba parametry vygeneruje a čtečka je může použít, pokud je zrovna dobře naladěná). Nevýhodou ovšem je, že generování metadat je velmi pomalé - je to způsobené tím, že se pro každou knihu zvlášť volá příslušný prográmek Calibru, a jak víte, spouštění Calibrovských utilit je poněkud pomalejší.
RefreshExisting = 0/1
říká, co se má dělat s případnými už existujícími záznamy v XML souborech čtečky - jestli se mají přepsat (1) nebo nechat být (0). Prakticky asi nemá smysl nic jiného než "přepsat".
MemoryType = int/ms/sd
- na kterém typu paměťového média se sbírka vytváří. Je to dané tím, že PRS-505 používá na paměťových kartách poněkud odlišnou strukturu XML než v interní paměti a dokonce se řídí odlišnými pravidly (zatímco na kartě detekuje změny podle data podlední modifikace souboru, v paměti podle data vytvoření souboru). ColBuild tedy potřebuje vědět, podle jakých pravidel má postupovat.
Pozn.: Tento parametr téměř jistě nebudete chtít uvádět v colbuild.ini
ale spíš v příslušných definičních souborech sbírek nebo možná na příkazové řádce.
Recursive = 1/0
- jednička říká, že se při hledání knih mají procházet i podadresáře, nula hledá jen v zadaném adresáři. Nenapadá mě důvod, proč by se neměly podadresáře procházet, ale kdyby po tom někdo toužil, má možnost.
FileNameRegExp = regulární výraz
- ColBuild bude zpracovávat jenom soubory vyhovující tomuto regulárnímu výrazu, ostatní bude ignorovat. Reálně nemá smysl měnit výchozí hodnotu \.(lrf|pdf|txt|rtf|epub)$
(všechny soubory s podporovanými příponami).
Playlist = soubor
určuje definiční soubor sbírky, který se má použít. Je to tu jen pro kompletnost, daleko lepší je playlist zadat na příkazové řádce.
Cache = soubor
určuje cestu (relativní nebo absolutní) k XML souboru čtečky. Opět jde o nastavení, které se hodí spíš do playlistu než do colbuild.ini
, kde slouží jenom jako přijatelná výchozí hodnota.
Cache.out = soubor
určuje cestu k souboru, do kterého se zapíše nový XML soubor. Pokud není uvedena, zapisují se změny rovnou do vstupního souboru (po vytvoření záložní kopie, pochopitelně), což je také ideální chování - toto nastavení je tu jen pro účely ladění.
BooksPath = adresář
určuje cestu do adresáře, ve kterém (a případně v jehož podadresářích) se mají knihy hledat. Opět se hodí spíš do playlistu.
BooksBasePath = adresář
je téměř to samé co BooksPath
, ale z pohledu čtečky. Jde o to, že BooksPath
používá k hledání knih ColBuild a BooksBasePath
čtečka.
Pozn.: BooksBasePath
musí být zapsán podle Linuxových konvencí (adresáře oddělené normálním lomítkem, ne zpětným) a nesmí začínat lomítkem.
TimeDelta = celé číslo
udává počet hodin, o kolik se liší interní čas čtečky a čas počítače. Zjistit se dá tak, že do čtečky nahrajete nějaký soubor se známým datem a časem vytvoření i změny, odpojíte čtečku (což vyvolá přepočet XML souboru) a pak se do toho XML souboru podíváte, jaký čas je tam ve skutečnosti uveden. TimeDelta pak značí počet hodin, které je třeba přičíst (nebo odečíst) k datumu souboru, aby vzniklo datum XML. Na mém počítači má hodnotu -1, ale viděl jsem i nulu a jsou možné i další hodnoty.
Mrzí mě, že je třeba provádět takovouhle relativně složitou akci, ale bohužel jsem dosud plně nepronikl do pravidel, podle kterých čtečka určuje čas. Přinejhorším to můžete vyzkoušet - hodnota bude pravděpodobně v rozmezí -2 až +2. Správná hodnota se pozná podle toho, že čtečka sbírky vytvořené ColBuildem správně zobrazí (momentálně se skoro zdá, že ve firmwaru 1.1 by to mohlo fungovat s každou hodnotou).
CollectionRegExp = regulární výraz
slouží k automatickému vytváření sbírek, kdy jsou parametry sbírky určeny přímo názvem souboru knihy nebo adresářem, ve kterém je kniha uložená. Může tady být libovolný regulární výraz, a pokud mu celá cesta ke knize vyhovuje, bude kniha zařazena do sbírky. Název sbírky je přitom určen nastavením CollectionRegExpTitle
(viz níže).
Příklad pro knihu, jejíž název souboru je vytvářen podle pravidla sbírka --- název knihy.přípona
: CollectionRegExp = ([^/]+) --- ([^/]+)\.([^./]+)$
CollectionRegExpTitle = nahrazovací řetězec
- pokud kniha vyhovuje CollectionRegExp
, bude zařazena do sbírky, jejíž název vznikne nahrazením v tomto řetězci. Na přesná pravidla se můžete podívat do dokumentace metody Substitute knihovny RegExpr ve zdrojácích, ale zjednodušeně řečeno všechny znaky zůstanou zachovány, kromě řetězce $číslo
, který bude nahrazen obsahem číslo-té závorky z CollectionRegExp
Příkladu výše odpovídá CollectionRegExpTitle = $1
.
Definice sbírky má strukturu velmi podobnou standardnímu INI souboru - jeho sekce tvoří názvy playlistu, obsahem každé sekce je seznam souborů, které do toho playlistu patří (v pořadí, v jakém jsou v sekci zapsané). Tzn. playlist s obsahem:
[Pan prstenu] Tolkien\Spolecenstvo_prstenu.pdf Tolkien\Dve_veze.lrf Tolkien\Navrat_krale.lrf [Oblibene] Tolkien\Dve_veze.pdf Pratchett\Barva_kouzel.txt cool.rtf
vytvoří dvě sbírky, jednu pojmenovanou Pan prstenu
a druhou Oblibene
. Pozor! V názvech souborů záleží na velikosti písmen a vřele nedoporučuji ani v názvech souborů ani názvech sbírek používat znaky s diakritikou.
Před definicí první sbírky mohou být vypsány libovolné z parametrů povolených v ColBuild.ini, které v tom případě budou použity přednostně. Sem patří právě ty parametry, u kterých jsem výše psal, že je lepší dávat je do playlistu.
Příkazový řádek ColBuild opět do jisté míry duplikuje parametry z ColBuild.ini. Drtivou většinu z nich asi napíšete rovnou do colbuild.ini
nebo do playlistu a na příkazové řádce zadáte parametr jediný - cestu k playlistu. Ale pokud se chcete obejít bez souboru playlistu, máte možnost. Povolené parametry jsou:
-r
je totéž co Recursive = 1
-ms
je totéž co MemoryType = ms
-sd
je totéž co MemoryType = sd
-int
je totéž co MemoryType = int
-re regulární výraz
je totéž co FileNameRegExp = regulární výraz
-c soubor
je totéž co Cache = soubor
-co soubor
je totéž co Cache.out = soubor
-d číslo
je totéž co TimeDelta = číslo
-cr regulární výraz
je totéž co CollectionRegExp = regulární výraz
-crt regulární výraz
je totéž co CollectionRegExpTitle = regulární výraz
soubor
je totéž co Playlist = soubor
adresář
je totéž co BooksPath = adresář
Reálný příklad. Calibre mám nainstalován v d:\progs\calibre
. Knihy mám nahrané v interní paměti čtečky v adresáři books:
/books/Lynn Jonathan/JPM/01-jiste_pane_ministre_1.lrf /books/Lynn Jonathan/JPM/02-jiste_pane_ministre_2.lrf /books/Lynn Jonathan/JPM/03-jiste_pane_premiere_1.lrf /books/Lynn Jonathan/JPM/04-jiste_pane_premiere_2.lrf /books/Pratchett Terry/Zemeplocha/01-barva_kouzel.lrf /books/Pratchett Terry/Zemeplocha/02-lehke_fantasticno.lrf
Chci vytvořit dvě sbírky (JPM a Zeměplocha). Soubor playlistu bude uložen v kořenovém adresáři interní paměti čtečky v souboru playlist.ini
a celé vytváření playlistu chci mít na co nejméně kláves (tj. na dvě).
V zásadě mám dvě varianty, jak to udělat - jednu s playlistem a jednu bez něj.
colbuild.ini
:
[Config] CalibrePath=D:\Progs\Calibre GenerateMetadata=1 RefreshExisting=1 Recursive=1 FileNameRegExp=\.(lrf|pdf|txt|rtf|epub)$ TimeDelta=0
playlist.ini
:
MemoryType=int Cache=database\cache\media.xml BooksPath=\books\ BooksBasePath=books/ [JPM] Lynn Jonathan/JPM/01-jiste_pane_ministre_1.lrf Lynn Jonathan/JPM/02-jiste_pane_ministre_2.lrf Lynn Jonathan/JPM/03-jiste_pane_premiere_1.lrf Lynn Jonathan/JPM/04-jiste_pane_premiere_2.lrf [Zemeplocha] Pratchett Terry/Zemeplocha/01-barva_kouzel.lrf Pratchett Terry/Zemeplocha/02-lehke_fantasticno.lrf
Příkazový řádek:
colbuild.exe playlist.ini
Abych splnil požadavek "dvě klávesy", tak si pro tento příkazový řádek vytvořím dávkový (BAT) soubor např. c:\windows\c.bat
:
@echo off colbuild.exe playlist.ini
který pak budu spouštět prostě c [enter]
colbuild.ini
je přesně stejný jako v první variantě, playlist.ini
nemám vůbec, zato mám složitější příkazový řádek:
colbuild.exe -int -c database\cache\media.xml -cr books/[^^/]+/([^^/]+)/[^^/]+\.lrf -crt $1
Ten si opět uložím do příslušného BAT souboru.
Vytváření sbírek bez souboru playlistu má ovšem několik drobných nevýhod:
Jen obtížně lze jednu knihu zařadit do víc sbírek.
Pokud mají být sbírky ve správném pořadí, musí jít jména souborů abecedně po sobě (proto ta čísla na začátku názvů souborů knih).
Celý archív musí dodržovat stejnou strukturu.
Musíte dokázat zformulovat příslušný regulární výraz a zapsat ho prostředky příkazového řádku (proto jsou ve druhé variantě zdvojená "mocnítka" ^^
- znak ^
má v příkazovém řádku Windows zvláštní význam a zápis to musí reflektovat..
Program je určen a testován pro prostředí Windows a docela jistě nebude fungovat na jiném operačním systému bez úprav. Při přeložení FreePascalem doporučuju používat pouze první variantu se souborem playlistu, protože pod FPC bůhvíproč neproběhne seřazení souborů podle abecedy a sbírky tak nejspíš budou mít špatné pořadí knih, i kdyby jejich soubory byly pojmenovány správně. Samozřejmě jde opět o freeware pod podmínkou, že nebude prodáván a bude zachován odkaz na mě jakožto autora.
ColBuild v0.05 (13.4.2009, 591 KB)