PRS-505: Sbírky
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.
ColBuild
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.
ColBuild.ini
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 utilitlrf-meta.exe
,pdf-meta.exe
,rtf-meta.exe
aepub-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ž docolbuild.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é coBooksPath
, ale z pohledu čtečky. Jde o to, žeBooksPath
používá k hledání knih ColBuild aBooksBasePath
č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ímCollectionRegExpTitle
(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 vyhovujeCollectionRegExp
, 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 zCollectionRegExp
Příkladu výše odpovídá
CollectionRegExpTitle = $1
.
Definice sbírky (playlist)
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
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éž coRecursive = 1
-
-ms
je totéž coMemoryType = ms
-
-sd
je totéž coMemoryType = sd
-
-int
je totéž coMemoryType = int
-
-re regulární výraz
je totéž coFileNameRegExp = regulární výraz
-
-c soubor
je totéž coCache = soubor
-
-co soubor
je totéž coCache.out = soubor
-
-d číslo
je totéž coTimeDelta = číslo
-
-cr regulární výraz
je totéž coCollectionRegExp = regulární výraz
-
-crt regulární výraz
je totéž coCollectionRegExpTitle = regulární výraz
-
soubor
je totéž coPlaylist = soubor
-
adresář
je totéž coBooksPath = adresář
Reálný příklad
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.
Varianta se souborem playlistu
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]
Varianta bez souboru playlistu
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..
Download
Důležitá poznámka: Program byl kompletně přepsán na podporu řady dalších funkcí, mimo jiné tak, aby uměl spolupracovat s více čtečkami. Nová verze je dostupná na samostatné stránce ColBuild.
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.09 (6.1.2011, 431 KB) – podpora pro sbírky na PRS-600 (zatím jen na SD/MS kartách). Upřesněna licence (BSD), digitálně podepsáno.
-
ColBuild v0.08 (1.12.2009, 424 KB) – podpora pro češtinu v názvech kolekcí. Defaultně se očekává v OEM kódování, v českých Windows tedy CP852! Kódování se dá změnit pomocí parametru
Encoding=...
buď vcolbuild.ini
nebo v inicializační sekci playlistu. Povolené hodnoty jsouOEM
(v českých Windows CP852),ANSI
(v českých Windows CP1250) aUTF8
. -
ColBuild v0.07 (31.7.2009, 409 KB) – teď už doopravdy kompatibilita s Calibre 0.6, i přes změněný formát výstupu EBOOK-META.
-
ColBuild v0.05 (13.4.2009, 592 KB)
Verze 0.10: Program byl kompletně přepsán na podporu řady dalších funkcí, mimo jiné tak, aby uměl spolupracovat s více čtečkami. Nová verze je dostupná na samostatné stránce ColBuild.
Verze 0.09: Podpora pro sbírky na PRS-600 (zatím jen na SD/MS kartách). Upřesněna licence (BSD), digitálně podepsáno.
Když mi pošleš ukázkový soubor*), na kterém sbírky fungují, tak se podívám, v čem se to liší, a můžu to zkusit opravit. Ale je to nejisté, na tyhle věci je obvykle potřeba mít čtečku přímo v ruce, protože se vyskytují rozdíly, které nejsou na dálku vidět (jako že u PRS-505 se bere jiné datum v interní paměti a jiné na SD kartě). Poslat to můžeš na blog zavináč pepak net.
*) Nebo radši soubory tři – jeden z interní paměti, jeden z MS karty a jeden ze SD karty.
Ahoj, používal jsem Colbuild nějakou dobu a teď mi najednou přestal fungovat. Ať dělám, co dělám, čtečka mi kolekce vždycky zruší. Myslím, že se to stalo poté, co jsem si koupil 600-ku. Ta mi nainstalovala novou Reader Library (verze 3.3.00.07130 – umí vytvářet kolekce). Koukal jsem se na formát XML a vypadá to, že je trochu jiný. Takhle vypadá, když sbírku vytvořím přes ReaderLibrary“
Všimni si, že je tam UUID (které tam dřív nebylo a není tam „sourceid“.
Tipnul bych si, že na anglických Windows bude problém v tom, že jejich kódové stránky (ANSI i UTF8) jsou jiné než pod českými Windows, ale proč a jak konkrétně, to nedokážu říct. Na to bych asi musel mít anglické Windows, abych si mohl přímo v debuggeru zkoušet, kde se co kazí.
Mam to overene – na anglickych WinXP s pridanou ceskou podporou to dopadne tak, ze bud program nic nevytvori, nebo ctecka cely element s kolekcemi zrusi. Pokud tam zadnou cestinu nemam (encoding ANSI) xml upravim az nasledne, ctecka to vezme a vsechno funguje. Rekl bych, ze je to nekde v programu, nekde v miste, kde se prevadi na UTF8 a zapisuje do xml.
Pro uplnost – takhle vypadala hlavicka INI, s kterou to nefungovalo:
MemoryType=sd
Recursive=1
FileNameRegExp=\.(lrf|pdf|txt|rtf|epub)$
Cache=database\cache.xml
BooksPath=books\
BooksBasePath=books/
Encoding=UTF8
[Temná Věž]
King, Stephen\Temna Vez\TV1.lrf
Potřebuješ ColBuild 0.08 a do toho INI souboru mu musíš napsat, v jakém kódování je.
Ahoj, tak jsem delal pokusy a zjistil jsem, ze to nefunguje na diakritiku. Mam anglicke WinXP, s pridanou podporou na cestinu. At jsem pouzil na ulozeni INI souboru ANSI, nebo UTF8, nic nezafungovalo a kolekce se nevytvorily. Pokud bys mel zajem, mohu poskutnout INI file.
Verze 0.08.