mirror of
https://github.com/gryf/ebook-converter.git
synced 2026-04-20 13:11:27 +02:00
Added calibre fb2 modules
This commit is contained in:
@@ -0,0 +1,50 @@
|
||||
#!/usr/bin/env python2
|
||||
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
|
||||
from __future__ import absolute_import, division, print_function, unicode_literals
|
||||
|
||||
__license__ = 'GPL v3'
|
||||
__copyright__ = '2012, Kovid Goyal <kovid@kovidgoyal.net>'
|
||||
__docformat__ = 'restructuredtext en'
|
||||
|
||||
|
||||
def base64_decode(raw):
|
||||
from io import BytesIO
|
||||
from polyglot.binary import from_base64_bytes
|
||||
|
||||
# First try the python implementation as it is faster
|
||||
try:
|
||||
return from_base64_bytes(raw)
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
# Try a more robust version (adapted from FBReader sources)
|
||||
A, Z, a, z, zero, nine, plus, slash, equal = bytearray(b'AZaz09+/=')
|
||||
raw = bytearray(raw)
|
||||
out = BytesIO()
|
||||
pos = 0
|
||||
while pos < len(raw):
|
||||
tot = 0
|
||||
i = 0
|
||||
while i < 4 and pos < len(raw):
|
||||
byt = raw[pos]
|
||||
pos += 1
|
||||
num = 0
|
||||
if A <= byt <= Z:
|
||||
num = byt - A
|
||||
elif a <= byt <= z:
|
||||
num = byt - a + 26
|
||||
elif zero <= byt <= nine:
|
||||
num = byt - zero + 52
|
||||
else:
|
||||
num = {plus:62, slash:63, equal:64}.get(byt, None)
|
||||
if num is None:
|
||||
# Ignore this byte
|
||||
continue
|
||||
tot += num << (6 * (3 - i))
|
||||
i += 1
|
||||
triple = bytearray(3)
|
||||
for j in (2, 1, 0):
|
||||
triple[j] = tot & 0xff
|
||||
tot >>= 8
|
||||
out.write(bytes(triple))
|
||||
return out.getvalue()
|
||||
Reference in New Issue
Block a user