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

(Přeskočit návod)

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 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 (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éž 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

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:

  1. Jen obtížně lze jednu knihu zařadit do víc sbírek.

  2. 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).

  3. Celý archív musí dodržovat stejnou strukturu.

  4. 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ď v colbuild.ini nebo v inicializační sekci playlistu. Povolené hodnoty jsou OEM (v českých Windows CP852), ANSI (v českých Windows CP1250) a UTF8.

  • 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)

Podobné příspěvky:

9 Responses to “PRS-505: Sbírky”

  1. avatar pepak napsal:

    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.

  2. avatar pepak napsal:

    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.

  3. avatar pepak napsal:

    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.

  4. avatar JirkaS napsal:

    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“.

  5. avatar pepak napsal:

    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í.

  6. avatar JirkaS napsal:

    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

  7. avatar pepak napsal:

    Potřebuješ ColBuild 0.08 a do toho INI souboru mu musíš napsat, v jakém kódování je.

    MemoryType=sd
    Cache=Sony Reader\database\cache.xml
    Encoding=UTF8
    [Příliš žluťoučký kůň]
    kniha1.lrf
    kniha2.lrf
  8. avatar JirkaS napsal:

    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.

  9. avatar pepak napsal:

    Verze 0.08.

Leave a Reply

Themocracy iconWordPress Themes

css.php