Source code for m_librarian.download

#! /usr/bin/env python

from __future__ import print_function
import os
from time import mktime
from shutil import copyfileobj
from zipfile import ZipFile
from .config import get_config

__all__ = ['download']


format = '%f'
compile_format = True
compiled_format = '%(file)s'


def _compile_format():
    global format, compile_format, compiled_format
    if not compile_format:
        return
    compile_format = False
    format = get_config().get('download', 'format')
    if not format:
        return
    got_percent = False
    compiled = []
    for c in format:
        if c == '%':
            if got_percent:
                got_percent = False
                compiled.append('%')
            else:
                got_percent = True
        else:
            if got_percent:
                got_percent = False
                if c == 'a':
                    new_format = u'%(author1)s'
                elif c == 'A':
                    new_format = u'%(authors)s'
                elif c == 'e':
                    new_format = u'%(extension)s'
                elif c == 'f':
                    new_format = u'%(file)s'
                elif c == 'G':
                    new_format = u'%(gname)s'
                elif c == 'g':
                    new_format = u'%(gtitle)s'
                elif c == 'J':
                    new_format = u'%(gname_list)s'
                elif c == 'j':
                    new_format = u'%(gtitle_list)s'
                elif c == 'l':
                    new_format = u'%(language)s'
                elif c == 'n':
                    new_format = u'%(ser_no)d'
                elif c == 's':
                    new_format = u'%(series)s'
                elif c == 't':
                    new_format = u'%(title)s'
                else:
                    raise ValueError('Bad format specifier "%%%c"' % c)
                compiled.append(new_format)
            else:
                compiled.append(c)
    compiled_format = ''.join(compiled)


_library_path = None


[docs]def download(book, dest_path=None, lib_path=None, a_format=None): if dest_path is None: dest_path = get_config().getpath('download', 'path') if lib_path is None: global _library_path if _library_path is None: _library_path = get_config().getpath('library', 'path') lib_path = _library_path global format, compile_format, compiled_format if a_format: compile_format = True format = a_format _compile_format() if compiled_format[-1] in ('\0', '\\', '/'): raise ValueError('Bad format: "%s"' % compiled_format) bdict = {} bdict['author1'] = book.author1 bdict['authors'] = book.author_list bdict['extension'] = book.extension.name bdict['file'] = book.file genre = book.genres[0] bdict['gname'] = genre.name bdict['gtitle'] = genre.title bdict['gname_list'] = book.genre_name_list bdict['gtitle_list'] = book.genre_title_list bdict['language'] = book.language.name bdict['ser_no'] = book.ser_no or 0 bdict['series'] = book.series bdict['title'] = book.title if '%(extension)s' not in compiled_format: compiled_format += '.%(extension)s' filename = compiled_format % bdict full_path = os.path.join(dest_path, filename) try: os.makedirs(os.path.dirname(full_path)) except OSError: pass # Already exists zf = ZipFile(os.path.join(lib_path, book.archive), 'r') infile = zf.open('%s.%s' % (book.file, book.extension.name)) outfile = open(full_path, 'wb') copyfileobj(infile, outfile) outfile.close() infile.close() zf.close() dt = mktime(book.date.timetuple()) os.utime(full_path, (dt, dt))
def test(): _compile_format() print(compiled_format) if __name__ == '__main__': test()