#!/usr/bin/python
# tidbits from booklistgen-0.3.4/src/OpenLibrie/LRFLib/LRFFile.cs
WORD_SIZE = 2
DWORD_SIZE = 4
# Offset of length of compressed info block in LRF file
LRF_OFFSET_CINFOBLOCK_LEN = 0x4C
# Offset of length of uncompressed info block in LRF file
LRF_OFFSET_UINFOBLOCK_LEN = 0x54
# Offset of compressed info block data in LRF file
LRF_OFFSET_CINFOBLOCK_DATA = LRF_OFFSET_UINFOBLOCK_LEN + DWORD_SIZE;
# Offset of length of GIF data in LRF file
LRF_OFFSET_GIF_LEN = 0x50
import struct
import zlib
def get_word_from(bytes, offset):
return struct.unpack("<H", bytes[offset:offset+2])[0]
def get_dword_from(bytes, offset):
return struct.unpack("<L", bytes[offset:offset+4])[0]
class LrfFile:
def __init__(self, path):
self.path = path
self.bytes = open(path,"r").read()
self.cinfoLength = get_word_from(self.bytes, LRF_OFFSET_CINFOBLOCK_LEN)
self.cinfo = self.bytes[LRF_OFFSET_CINFOBLOCK_DATA:
LRF_OFFSET_CINFOBLOCK_DATA + self.cinfoLength]
self.gifLength = get_dword_from(self.bytes, LRF_OFFSET_GIF_LEN)
self.gif = self.bytes[LRF_OFFSET_UINFOBLOCK_LEN + self.cinfoLength:
LRF_OFFSET_UINFOBLOCK_LEN + self.cinfoLength + self.gifLength]
self.uinfoLength = get_dword_from(self.bytes, LRF_OFFSET_UINFOBLOCK_LEN)
self.uinfo = zlib.decompress(self.cinfo)
# Sample value of uinfo:
## <?xml version="1.0" ?>
## <Info version="1.0" >
## <BookInfo>
## <Title>Lady Chatterly's Lover</Title>
## <Author>D H Lawrence</Author>
## <BookID>zdVnISprTxmeHKjx</BookID>
## <Publisher>manybooks.net</Publisher>
## <Label>LIBRIe Books</Label>
## <Category>\xe5\xad\xa6</Category>
## <Classification>\xe5\xa3\xb0</Classification>
## <FreeText>This book was generated by a preliminary version of makelrf.</FreeText>
## </BookInfo>
## <DocInfo>
## <Language>en</Language>
## <Creator>makelrf v0.3</Creator>
## <CreationDate>09.04.2005</CreationDate>
## <Producer>makelrf 0.3</Producer>
## <Page>0</Page>
## </DocInfo>
## </Info>
## \x00