При использовании опции `-v` также выводится id из БД.
-Поиск книг
-^^^^^^^^^^
+п÷п╬п╦я│п╨ п╦ п╥п╟пЁя─я┐п╥п╨п╟ п╨п╫п╦пЁ
+^^^^^^^^^^^^^^^^^^^^^
Использование::
использовать эту команду — совместно с опцией `--id`. Файл сохраняется в
текущую директорию с тем именем, под которым он храниться в библиотеке.
+Ключ `format` в секции `[download]` файла конфигурации m_librarian.conf
+
+| [download]
+| format = %a/%s/%n %t
+
+позволяет управлять именами директорий и именем файла, куда m_Librarian
+будет сохранять файлы. Формат по умолчанию `%f`, т.е. просто имя файла.
+Другие доступные спецификаторы::
+
+ %a - автор (один из, если их несколько)
+ %e - расширение имени файла
+ %f - имя файла
+ %G - жанр (один из, если их несколько), имя из БД
+ %g - жанр (один из, если их несколько), название
+ %l - язык
+ %n - номер в серии (или 0)
+ %s - серия
+ %t - название
+
+Формат не должен заканчиваться на разделитель директорий (`/` или `\\`).
+Если спецификатор `%e` (расширение) не найден в формате, он добавляется
+в конец с точкой в качестве разделителя. Т.о. формат `%f` эквивалентен
+формату `%f.%e`.
+
Поиск расширений
^^^^^^^^^^^^^^^^
With one option `-v` it also prints database id.
-Book search
-^^^^^^^^^^^
+Book searching and downloading
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Usage::
to use it is via option `--id`. The file is downloaded into the current
directory with the name from the library.
+Configuration key
+
+| [download]
+| format = %a/%s/%n %t
+
+allows to set format for the download file pathname. Default format is
+`%f`, i.e. just filename. Other format specifiers are::
+
+ %a - author (one of if many)
+ %e - file extension
+ %f - file name in archive
+ %G - genre (one of if many), name
+ %g - genre (one of if many), title
+ %l - language
+ %n - series number (or 0)
+ %s - series
+ %t - title
+
+Format must not end in directory separator (`/` or `\\`). If specifier
+`%e` (extension) is not found in the format it is appended
+unconditionally with a dot. That is, format `%f` is equivalent to
+`%f.%e`.
+
Extension search
^^^^^^^^^^^^^^^^
#! /usr/bin/env python
import os
-from ConfigParser import SafeConfigParser
+from ConfigParser import RawConfigParser
__all__ = ['get_config']
if _ml_config is None:
if config_filename is None:
config_filename = find_config_file()
- _ml_config = SafeConfigParser()
+ _ml_config = RawConfigParser()
_ml_config.read(config_filename)
return _ml_config
__all__ = ['download']
+_format = '%f'
+_compile_format = True
+_compiled_format = '%(file)s'
+
+
+def _do_compile_format():
+ global _format, _compile_format, _compiled_format
+ if _compile_format:
+ _compile_format = False
+ try:
+ _format = get_config().get('download', 'format')
+ except:
+ 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'%(author)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 == '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
-def download(archive, filename, date, path=None):
+def download(book, path=None):
if path is None:
global _library_path
if _library_path is None:
_library_path = get_config().get('library', 'path')
path = _library_path
- zf = ZipFile(os.path.join(path, archive), 'r')
- infile = zf.open(filename)
+ global _compiled_format
+ _do_compile_format()
+ if _compiled_format[-1] in ('\0', '\\', '/'):
+ raise ValueError('Bad format: "%s"' % _compiled_format)
+ bdict = {}
+ bdict['author'] = book.authors[0].fullname
+ bdict['extension'] = book.extension.name
+ bdict['file'] = book.file
+ genre = book.genres[0]
+ bdict['gname'] = genre.name
+ bdict['gtitle'] = genre.title
+ 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
+ try:
+ os.makedirs(os.path.dirname(filename))
+ except OSError:
+ pass # Already exists
+ zf = ZipFile(os.path.join(path, book.archive), 'r')
+ infile = zf.open('%s.%s' % (book.file, book.extension.name))
outfile = open(filename, 'wb')
copyfileobj(infile, outfile)
outfile.close()
infile.close()
zf.close()
- dt = mktime(date.timetuple())
+ dt = mktime(book.date.timetuple())
os.utime(filename, (dt, dt))
+
+
+def test():
+ _do_compile_format()
+ print _compiled_format
+
+if __name__ == '__main__':
+ test()
[library]
path = /var/lib/LRE_Flibusta
+
+[download]
+# Download formats:
+# %a - author (one of)
+# %e - file extension
+# %f - file name in archive
+# %G - genre (one of), name
+# %g - genre (one of), title
+# %l - language
+# %n - series number (or 0)
+# %s - series
+# %t - title
+# Examples:
+# format = %f (this is the default)
+# format = %a/%s/%n %t
"(found %d).\n" % count)
sys.exit(1)
book = books[0]
- download(book.archive, '%s.%s' % (book.file, book.extension.name),
- book.date, args.path)
+ download(book, args.path)
return
count = 0
for book in books:
--- /dev/null
+#! /usr/bin/env python
+
+
+import unittest
+from tests import main
+from m_librarian import config, download
+
+
+class TestFormat(unittest.TestCase):
+ def test_compile_format(self):
+ config.get_config().set('download', 'format', '%a/%s/%n %t')
+ download._do_compile_format()
+ self.assertEqual(download._compiled_format,
+ u'%(author)s/%(series)s/%(ser_no)d %(title)s')
+
+
+if __name__ == "__main__":
+ main()