FB2 Tags

File:fb2tags.py - прототип программы извлечения тегов из FB2-файла.

Пример:

 fb2tags.py --fields=FILE,SIZE,MD5,@lib@fbtags.ini Book.fb2.zip

Вывод:

  FILE='gluhovskiyi_metro_1_metro_2033.fb2'
  SIZE=1898829
  MD5='df83be12abcd953c5020219a358595b4'
  XML.FictionBook.description.title-info.genre=sf_action

Поддерживаются форматы FB2 и FB2.zip

Понимаются следующие поля:

  1. FILE -- имя файла
  2. PATH -- настоящий путь файла (без имени)
  3. NAME -- настоящее имя файла (без префикса пути)
  4. ZNAME -- настоящее имя файла или имя записи в ZIP-файле
  5. DIR -- последняя папка в пути
  6. SIZE -- размер текста (без компрессии)
  7. FSIZE -- размер файла
  8. MTIME -- местное "время модификации" в формате ISO
  9. CTIME -- местное "время создания" в формате ISO
  10. ZTIME -- местное "время модификации" или отметка записи ZIP-файла в формате ISO
  11. MD5 -- "контрольная сумма" файла, рассчитанная по алгоритму MD5
  12. ENCODING, SCS, DCS -- кодировка файла по заголовку, дйствующая исходная, действующая целевая
  13. XML.* -- имя (XML-путь) любого тега (берётся первое значение) в FB2-файле

< Если требуется значение не тэга, а его атрибута, добавить суффикс вида :attribute.
< Если требуется N-ное значение, добавить суффикс вида #N.
< Суффиксы могут использоваться оба - в том же порядке: :attr#N. < @section@file -- значения секции section из файла file < Префикс "XML.FictionBook" (но не точка после него!) может быть опущен.

< file в случае MS Windows может выглядеть как ++C:\My\Dir\MyFile.ini++

Пример извлечения 2-го параграфа основного текста:

 .body.section.p#2

Пример файла полей:

 # fb2tags.py field specification file
 # option numbers are just for ordering
 # values of @sec@file are still supported
 
 [MyLibrary]
 99=@CommonLibrary@commLib.ini
 1=FILE
 2=SIZE
 3=MD5
 4=ENCODING
 5=XML.FictionBook
 6=XML.FictionBook.body
 7=XML.FictionBook.body.section
 8=XML.FictionBook.body.section.p#2
 9=XML.FictionBook.body.title
 10=XML.FictionBook.body.title.p
 11=XML.FictionBook.description
 12=XML.FictionBook.description.custom-info
 13=XML.FictionBook.description.document-info
 14=XML.FictionBook.description.document-info.author
 15=XML.FictionBook.description.document-info.author.first-name
 16=XML.FictionBook.description.document-info.author.last-name
 17=XML.FictionBook.description.document-info.date
 18=XML.FictionBook.description.document-info.history
 19=XML.FictionBook.description.document-info.history.p
 20=XML.FictionBook.description.document-info.id
 21=XML.FictionBook.description.document-info.program-used
 22=XML.FictionBook.description.document-info.src-url
 23=XML.FictionBook.description.document-info.version
 24=XML.FictionBook.description.title-info
 25=XML.FictionBook.description.title-info.author
 26=XML.FictionBook.description.title-info.author.first-name
 27=XML.FictionBook.description.title-info.author.last-name
 28=XML.FictionBook.description.title-info.book-title
 29=XML.FictionBook.description.title-info.date:value
 30=XML.FictionBook.description.title-info.genre
 31=XML.FictionBook.description.title-info.lang

Пример вывода "так" (длинные строки свёрнуты):

 Default encoding is 'UTF-8'
 Language is ('en_US', 'UTF8')
 Reading file fb2t.ini section [a]
 = fb2t.ini[a] - 31 field specs found
 	FILE='A.Nemanis-Kartofelbniy pes.fb2'
 	SIZE=48211
 	MD5='12611e1bedd2d5aca1e1844eadd42537'
 	ENCODING='utf-8'
 	XML.FictionBook=
 	XML.FictionBook.body=
 	XML.FictionBook.body.section=
 	XML.FictionBook.body.section.p=На поле рос картофель. Он цвел.
 Охранником при нем состоял пес Лай.
 	XML.FictionBook.body.title=
 	XML.FictionBook.body.title.p=Александр Неманис
 	XML.FictionBook.description=
 	XML.FictionBook.description.custom-info=Данное художественное
 произведение распространяется в электронной форме с ведома и согласия
 владельца авторских прав на некоммерческой основе при условии
 сохранения целостности и неизменности текста, включая сохранение
 настоящего уведомления. Любое коммерческое использование настоящего
 текста без ведома и прямого согласия владельца авторских прав НЕ
 ДОПУСКАЕТСЯ. &#171;Книжная полка&#187;, http://www.rusf.ru/books/:
 15.12.2005 16:25
 	XML.FictionBook.description.document-info=
 	XML.FictionBook.description.document-info.author=
 	XML.FictionBook.description.document-info.author.first-name=TaKir
 	XML.FictionBook.description.document-info.author.last-name=
 	XML.FictionBook.description.document-info.date=07.05.2008
 	XML.FictionBook.description.document-info.history=
 	XML.FictionBook.description.document-info.history.p=version 1.1
 &#8212; TaKir &#8212; создание документа
 	XML.FictionBook.description.document-info.id=4E7198-1C86-3B4D-A8B4-AFB8-ABB0-141B91
 	XML.FictionBook.description.document-info.program-used=Fiction
 Book Designer, FB Editor v2.0
 	XML.FictionBook.description.document-info.src-url=http://www.rusf.ru/books/
 	XML.FictionBook.description.document-info.version=1.1
 	XML.FictionBook.description.title-info=
 	XML.FictionBook.description.title-info.author=
 	XML.FictionBook.description.title-info.author.first-name=Александр
 	XML.FictionBook.description.title-info.author.last-name=Неманис
 	XML.FictionBook.description.title-info.book-title=Картофельный пес
 	XML.FictionBook.description.title-info.date:value=''
 	XML.FictionBook.description.title-info.genre=adv_animal
 	XML.FictionBook.description.title-info.lang=ru

Пример вывода в CSV (длинная строка):

 'A.Nemanis-Kartofelbniy pes.fb2',48211,'12611e1bedd2d5aca1e1844eadd42537','utf-8',,,,На поле рос картофель. Он цвел. Охранником при нем состоял пес Лай.,,Александр Неманис,,"Данное художественное произведение распространяется в электронной форме с ведома и согласия владельца авторских прав на некоммерческой основе при условии сохранения целостности и неизменности текста, включая сохранение настоящего уведомления. Любое коммерческое использование настоящего текста без ведома и прямого согласия владельца авторских прав НЕ ДОПУСКАЕТСЯ. &#171;Книжная полка&#187;, http://www.rusf.ru/books/: 15.12.2005 16:25",,,TaKir,,07.05.2008,,version 1.1 &#8212; TaKir &#8212; создание документа,4E7198-1C86-3B4D-A8B4-AFB8-ABB0-141B91,"Fiction Book Designer, FB Editor v2.0",http://www.rusf.ru/books/,1.1,,,Александр,Неманис,Картофельный пес,'',adv_animal,ru

Пример темплейта:

 FILE=%(FILE)s
 PATH=%(PATH)s
 NAME=%(NAME)s
 ZNAME=%(ZNAME)s
 DIR=%(DIR)s
 FSIZE=%(FSIZE)s
 SIZE=%(SIZE)s
 MD5=%(MD5)s
 ENCODING=%(ENCODING)s
 MTIME=%(MTIME)s
 CTIME=%(CTIME)s
 ZTIME=%(ZTIME)s
 XML.FictionBook.body.section.p#1=%(XML.FictionBook.body.section.p#1)s
 XML.FictionBook.body.section.p#2=%(XML.FictionBook.body.section.p#2)s
 XML.FictionBook.body.title.p#1=%(XML.FictionBook.body.title.p#1)s
 XML.FictionBook.body.title.p#2=%(XML.FictionBook.body.title.p#2)s

К нему - файл полей:

 [a1]
 0=FILE
 1=PATH
 2=NAME
 3=ZNAME
 4=DIR
 5=FSIZE
 6=SIZE
 7=MD5
 8=ENCODING
 9=MTIME
 10=CTIME
 11=ZTIME
 12=XML.FictionBook.body.section.p#1
 13=XML.FictionBook.body.section.p#2
 14=XML.FictionBook.body.title.p#1
 15=XML.FictionBook.body.title.p#2

Вызов:

 fb2tags.py -Tfb2t.tpl -f@a1@fb2t.ini Nemanis_Kartofelnyiy_pes.111173.fb2.zip 

Результат (длинные строки свёрнуты):

 Default encoding is 'UTF-8'
 Language is ('en_US', 'UTF8')
 Will format as fb2t.tpl
 Reading file fb2t.ini section [a1]
 = fb2t.ini[a1] - 16 field specs found
 
 FILE='Nemanis_Kartofelnyiy_pes.111173.fb2.zip/Aleksandr_Nemanis_Kartofelnyiy_pes.fb2'
 PATH=''
 NAME='Nemanis_Kartofelnyiy_pes.111173.fb2.zip'
 ZNAME='Aleksandr_Nemanis_Kartofelnyiy_pes.fb2'
 DIR=''
 FSIZE=11163L
 SIZE=28481
 MD5='8e2c520af93352a434b473e58fd3f734'
 ENCODING='windows-1251'
 MTIME='2008-07-14T18:45:50'
 CTIME='2008-07-14T18:47:13'
 ZTIME='2008-07-14T02:09:44'
 XML.FictionBook.body.section.p#1=На поле рос картофель. Он цвел.\\
 Охранником при нем состоял пес Лай.
 XML.FictionBook.body.section.p#2=В один прекрасный полдень, когда пес\\
 дремал, пригревшись на солнцепеке, поблизости опустился космический\\
 корабль. Лай открыл глаза и посмотрел. Корабль был внеземного\\
 происхождения.
 XML.FictionBook.body.title.p#1=Александр Неманис
 XML.FictionBook.body.title.p#2=Картофельный пес