Fix path length restriction code in device drivers

This commit is contained in:
Kovid Goyal 2009-07-13 22:28:37 -06:00
parent 91cfafdeb9
commit ca5960365d
3 changed files with 75 additions and 62 deletions

View File

@ -43,6 +43,8 @@ class PRS505(CLI, Device):
CARD_PATH_PREFIX = __appname__ CARD_PATH_PREFIX = __appname__
SUPPORTS_SUB_DIRS = True
def open(self): def open(self):
Device.open(self) Device.open(self)

View File

@ -9,11 +9,13 @@ device. This class handles device detection.
import os, subprocess, time, re, sys, glob, shutil import os, subprocess, time, re, sys, glob, shutil
from itertools import repeat from itertools import repeat
from math import ceil
from calibre.devices.interface import DevicePlugin from calibre.devices.interface import DevicePlugin
from calibre.devices.errors import DeviceError from calibre.devices.errors import DeviceError
from calibre.devices.usbms.deviceconfig import DeviceConfig from calibre.devices.usbms.deviceconfig import DeviceConfig
from calibre import iswindows, islinux, isosx, __appname__ from calibre import iswindows, islinux, isosx, __appname__
from calibre import sanitize_file_name as sanitize
class Device(DeviceConfig, DevicePlugin): class Device(DeviceConfig, DevicePlugin):
''' '''
@ -41,6 +43,8 @@ class Device(DeviceConfig, DevicePlugin):
STORAGE_CARD_VOLUME_LABEL = '' STORAGE_CARD_VOLUME_LABEL = ''
STORAGE_CARD2_VOLUME_LABEL = None STORAGE_CARD2_VOLUME_LABEL = None
SUPPORTS_SUB_DIRS = False
FDI_TEMPLATE = \ FDI_TEMPLATE = \
''' '''
<device> <device>
@ -605,3 +609,72 @@ class Device(DeviceConfig, DevicePlugin):
pass pass
self._main_prefix = self._card_a_prefix = self._card_b_prefix = None self._main_prefix = self._card_a_prefix = self._card_b_prefix = None
def create_upload_path(self, path, mdata, fname):
resizable = []
newpath = path
if self.SUPPORTS_SUB_DIRS:
if 'tags' in mdata.keys():
for tag in mdata['tags']:
if tag.startswith(_('News')):
newpath = os.path.join(newpath, 'news')
c = sanitize(mdata.get('title', ''))
if c:
newpath = os.path.join(newpath, c)
resizable.append(c)
c = sanitize(mdata.get('timestamp', ''))
if c:
newpath = os.path.join(newpath, c)
resizable.append(c)
break
elif tag.startswith('/'):
for c in tag.split('/'):
c = sanitize(c)
if not c: continue
newpath = os.path.join(newpath, c)
resizable.append(c)
break
if newpath == path:
c = sanitize(mdata.get('authors', _('Unknown')))
if c:
newpath = os.path.join(newpath, c)
resizable.append(c)
c = sanitize(mdata.get('title', _('Unknown')))
if c:
newpath = os.path.join(newpath, c)
resizable.append(c)
newpath = os.path.abspath(newpath)
fname = sanitize(fname)
resizable.append(fname)
filepath = os.path.join(newpath, fname)
if len(filepath) > 245:
extra = len(filepath) - 245
delta = int(ceil(extra/float(len(resizable))))
for x in resizable:
if delta > len(x):
r = x[0] if x is resizable[-1] else ''
else:
if x is resizable[-1]:
b, e = os.path.splitext(x)
r = b[:-delta]+e
if r.startswith('.'): r = x[0]+r
else:
r = x[:-delta]
if x is resizable[-1]:
filepath = filepath.replace(os.sep+x, os.sep+r)
else:
filepath = filepath.replace(os.sep+x+os.sep, os.sep+r+os.sep)
filepath = filepath.replace(os.sep+os.sep, os.sep)
newpath = os.path.dirname(filepath)
if not os.path.exists(newpath):
os.makedirs(newpath)
return filepath

View File

@ -10,10 +10,8 @@ for a particular device.
import os import os
import fnmatch import fnmatch
import shutil import shutil
from math import ceil
from itertools import cycle from itertools import cycle
from calibre import sanitize_file_name as sanitize
from calibre.ebooks.metadata import authors_to_string from calibre.ebooks.metadata import authors_to_string
from calibre.devices.usbms.cli import CLI from calibre.devices.usbms.cli import CLI
from calibre.devices.usbms.device import Device from calibre.devices.usbms.device import Device
@ -34,7 +32,6 @@ class USBMS(CLI, Device):
EBOOK_DIR_MAIN = '' EBOOK_DIR_MAIN = ''
EBOOK_DIR_CARD_A = '' EBOOK_DIR_CARD_A = ''
EBOOK_DIR_CARD_B = '' EBOOK_DIR_CARD_B = ''
SUPPORTS_SUB_DIRS = False
CAN_SET_METADATA = False CAN_SET_METADATA = False
def reset(self, key='-1', log_packets=False, report_progress=None): def reset(self, key='-1', log_packets=False, report_progress=None):
@ -149,65 +146,6 @@ class USBMS(CLI, Device):
return zip(paths, cycle([on_card])) return zip(paths, cycle([on_card]))
def create_upload_path(self, path, mdata, fname):
resizable = []
newpath = path
if self.SUPPORTS_SUB_DIRS:
if 'tags' in mdata.keys():
for tag in mdata['tags']:
if tag.startswith(_('News')):
newpath = os.path.join(newpath, 'news')
c = sanitize(mdata.get('title', ''))
if c:
newpath = os.path.join(newpath, c)
resizable.append(c)
c = sanitize(mdata.get('timestamp', ''))
if c:
newpath = os.path.join(newpath, c)
resizable.append(c)
break
elif tag.startswith('/'):
for c in tag.split('/'):
c = sanitize(c)
if not c: continue
newpath = os.path.join(newpath, c)
resizable.append(c)
break
if newpath == path:
c = sanitize(mdata.get('authors', _('Unknown')))
if c:
newpath = os.path.join(newpath, c)
resizable.append(c)
c = sanitize(mdata.get('title', _('Unknown')))
if c:
newpath = os.path.join(newpath, c)
resizable.append(c)
newpath = os.path.abspath(newpath)
fname = sanitize(fname)
resizable.append(fname)
filepath = os.path.join(newpath, fname)
if len(filepath) > 250:
extra = len(filepath) - 250
delta = int(ceil(extra/float(len(resizable))))
for x in resizable:
if delta > len(x):
r = ''
else:
r = x[:-delta]
filepath = filepath.replace(os.sep+x+os.sep, os.sep+r+os.sep)
filepath = filepath.replace(os.sep+os.sep, os.sep)
newpath = os.path.dirname(filepath)
if not os.path.exists(newpath):
os.makedirs(newpath)
return filepath
def add_books_to_metadata(self, locations, metadata, booklists): def add_books_to_metadata(self, locations, metadata, booklists):
for i, location in enumerate(locations): for i, location in enumerate(locations):