%PDF- %PDF-
| Direktori : /usr/lib/calibre/calibre/devices/nook/ |
| Current File : //usr/lib/calibre/calibre/devices/nook/driver.py |
__license__ = 'GPL v3'
__copyright__ = '2009, John Schember <john at nachtimwald.com>'
__docformat__ = 'restructuredtext en'
'''
Device driver for Barns and Nobel's Nook
'''
import io, os, errno
from calibre import fsync, prints
from calibre.constants import DEBUG
from calibre.devices.usbms.driver import USBMS
class NOOK(USBMS):
name = 'Nook Device Interface'
gui_name = _('The Nook')
description = _('Communicate with the Nook e-book reader.')
author = 'John Schember'
icon = I('devices/nook.png')
supported_platforms = ['windows', 'linux', 'osx']
# Ordered list of supported formats
FORMATS = ['epub', 'pdb', 'pdf']
VENDOR_ID = [0x2080, 0x18d1] # 0x18d1 is for softrooted nook
PRODUCT_ID = [0x001]
BCD = [0x322]
VENDOR_NAME = 'B&N'
WINDOWS_MAIN_MEM = 'NOOK'
WINDOWS_CARD_A_MEM = 'NOOK'
OSX_MAIN_MEM = 'B&N nook Media'
OSX_CARD_A_MEM = OSX_MAIN_MEM
MAIN_MEMORY_VOLUME_LABEL = 'Nook Main Memory'
STORAGE_CARD_VOLUME_LABEL = 'Nook Storage Card'
EBOOK_DIR_MAIN = 'my documents'
THUMBNAIL_HEIGHT = 144
DELETE_EXTS = ['.jpg']
SUPPORTS_SUB_DIRS = True
def upload_cover(self, path, filename, metadata, filepath):
from PIL import Image, ImageDraw
coverdata = getattr(metadata, 'thumbnail', None)
if coverdata and coverdata[2]:
cover = Image.open(io.BytesIO(coverdata[2]))
else:
coverdata = lopen(I('library.png'), 'rb').read()
cover = Image.new('RGB', (96, 144), 'black')
im = Image.open(io.BytesIO(coverdata))
im.thumbnail((96, 144), Image.ANTIALIAS)
x, y = im.size
cover.paste(im, ((96-x)/2, (144-y)/2))
draw = ImageDraw.Draw(cover)
draw.text((1, 15), metadata.get('title', _('Unknown')).encode('ascii', 'ignore'))
draw.text((1, 115), metadata.get('authors', _('Unknown')).encode('ascii', 'ignore'))
data = io.BytesIO()
cover.save(data, 'JPEG')
coverdata = data.getvalue()
with lopen('%s.jpg' % os.path.join(path, filename), 'wb') as coverfile:
coverfile.write(coverdata)
fsync(coverfile)
def sanitize_path_components(self, components):
return [x.replace('#', '_').replace('%', '_') for x in components]
class NOOK_COLOR(NOOK):
name = 'Nook Color Device Interface'
description = _('Communicate with the Nook Color, TSR, Glowlight and Tablet e-book readers.')
PRODUCT_ID = [
0x002, 0x003, 0x004,
0x005, # Nook HD+
0x007, # Glowlight from 2013
0xb, # Glowlight from 2017
0xc, # Glowlight from 2019
0xd, # Glowlight from 2021
]
BCD = [0x216, 0x9999, 0x409]
WINDOWS_MAIN_MEM = WINDOWS_CARD_A_MEM = ['EBOOK_DISK', 'NOOK_TABLET',
'NOOK_SIMPLETOUCH', 'NOOK_GLOWLIGHT']
EBOOK_DIR_MAIN = 'My Files'
SCAN_FROM_ROOT = True
NEWS_IN_FOLDER = False
def upload_cover(self, path, filename, metadata, filepath):
pass
def post_open_callback(self):
product_id = self.device_being_opened[1]
if DEBUG:
prints('Opened NOOK with product id:', product_id)
if product_id in (0xb, 0xc, 0xd):
if DEBUG:
prints('Setting Nook upload directory to NOOK/My Files')
self.EBOOK_DIR_MAIN = 'NOOK/My Files'
try:
os.makedirs(os.path.join(self._main_prefix, *self.EBOOK_DIR_MAIN.split('/')))
except OSError as err:
if err.errno != errno.EEXIST:
self.EBOOK_DIR_MAIN = 'NOOK'
def get_carda_ebook_dir(self, for_upload=False):
if for_upload:
return self.EBOOK_DIR_MAIN
return ''
def create_upload_path(self, path, mdata, fname, create_dirs=True):
is_news = mdata.tags and _('News') in mdata.tags
subdir = 'Magazines' if is_news else 'Books'
path = os.path.join(path, subdir)
return USBMS.create_upload_path(self, path, mdata, fname,
create_dirs=create_dirs)