]> git.phdru.name Git - m_librarian.git/commitdiff
Pass format of the downloaded file name in the command line
authorOleg Broytman <phd@phdru.name>
Thu, 9 Jun 2016 18:10:04 +0000 (21:10 +0300)
committerOleg Broytman <phd@phdru.name>
Thu, 9 Jun 2016 18:19:48 +0000 (21:19 +0300)
docs-ru/command_line.rst
docs/command_line.rst
m_librarian/download.py
scripts/ml-search.py
tests/test_format.py

index a86687e59f2295e29e94b51ed427d8696545ee05..8bf74c88692ed5ba8d4fce1a463c88f17b4aa59d 100644 (file)
@@ -121,7 +121,7 @@ ml-search.py
 
 Использование::
 
-    ml-search.py books [-t title] [-s series] [-a archive] [-f file] [-p path] [--get] [--get-many N] [--id id] [--surname name] [--name name] [--misc-name name] [--fullname name] [--aid aid] [-e ext] [--eid eid] [--gname name] [--gtitle title] [--gid gid] [-l lang] [--lid lid]
+    ml-search.py books [-t title] [-s series] [-a archive] [-f file] [-p path] [--format f] [--get] [--get-many N] [--id id] [--surname name] [--name name] [--misc-name name] [--fullname name] [--aid aid] [-e ext] [--eid eid] [--gname name] [--gtitle title] [--gid gid] [-l lang] [--lid lid]
 
 Искать и печатать список книг по заголовку, серии, архиву, имени файла.
 
@@ -132,6 +132,7 @@ ml-search.py
     -a, --archive архив    Искать по имени архива (zip-файла)
     -f, --file файл        Искать по имени файла (без расширения)
     -p, --path path        Путь к директории с архивами библиотеки
+    --format format        Формат имени сохраняемого файла
     --get                  Загрузить ровно один файл
     --get-many N           Загрузить не больше указанного числа файлов
     --id id                Искать по id книги
@@ -195,6 +196,8 @@ ml-search.py
 в конец с точкой в качестве разделителя. Т.о. формат `%f` эквивалентен
 формату `%f.%e`.
 
+Опция `--format format` позволяет указать формат в командной строке.
+
 Опция `--get-many N` позволяет загрузить указанное число книг (не больше
 чем N, где N — целое число.) Опции `--get-many N` и `--get` взаимно
 исключают друг друга и не должны использоваться одновременно.
index 5125d0e6dc9f6a588b6f654bb8b8b075b394ea57..2196791d417609bb909f923a284b62cf7aac4b72 100644 (file)
@@ -118,7 +118,7 @@ Book searching and downloading
 
 Usage::
 
-    ml-search.py books [-t title] [-s series] [-a archive] [-f file] [-p path] [--get] [--get-many N] [--id id] [--surname name] [--name name] [--misc-name name] [--fullname name] [--aid aid] [-e ext] [--eid eid] [--gname name] [--gtitle title] [--gid gid] [-l lang] [--lid lid]
+    ml-search.py books [-t title] [-s series] [-a archive] [-f file] [-p path] [--format f] [--get] [--get-many N] [--id id] [--surname name] [--name name] [--misc-name name] [--fullname name] [--aid aid] [-e ext] [--eid eid] [--gname name] [--gtitle title] [--gid gid] [-l lang] [--lid lid]
 
 Search and print a list of books by title, series, archive or file name.
 
@@ -130,6 +130,7 @@ Options::
     -f, --file file        Search by file name (without extension)
     -p, --path path        Path to the directory with the library
                            archives
+    --format format        Format of the downloaded file name
     --get                  Download exactly one book
     --get-many N           Download at most this many books
     --id id                Search by database id
@@ -191,6 +192,8 @@ Format must not end in directory separator (`/` or `\\`). If specifier
 unconditionally with a dot. That is, format `%f` is equivalent to
 `%f.%e`.
 
+Option `--format format` allows to overwrite this configuration value.
+
 Option `--get-many N` allows to download many books (at most N, where N
 is an integer). Options `--get-many N` and `--get` are, of course,
 mutually incompatible.
index a66e6925a6e160d4d4913ee89832bc030eaf6b42..8e309cb3cbda9a26b856d4f778fbcb25157740ab 100755 (executable)
@@ -9,22 +9,22 @@ from .config import get_config
 __all__ = ['download']
 
 
-_format = '%f'
-_compile_format = True
-_compiled_format = '%(file)s'
+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
+def _compile_format():
+    global format, compile_format, compiled_format
+    if compile_format:
+        compile_format = False
         try:
-            _format = get_config().get('download', 'format')
+            format = get_config().get('download', 'format')
         except:
             return
     got_percent = False
     compiled = []
-    for c in _format:
+    for c in format:
         if c == '%':
             if got_percent:
                 got_percent = False
@@ -57,23 +57,26 @@ def _do_compile_format():
                 compiled.append(new_format)
             else:
                 compiled.append(c)
-    _compiled_format = ''.join(compiled)
+    compiled_format = ''.join(compiled)
 
 
 _library_path = None
 
 
-def download(book, path=None):
+def download(book, path=None, a_format=None):
     if path is None:
         global _library_path
         if _library_path is None:
             _library_path = get_config().get('library', 'path')
         path = _library_path
 
-    global _compiled_format
-    _do_compile_format()
-    if _compiled_format[-1] in ('\0', '\\', '/'):
-        raise ValueError('Bad format: "%s"' % _compiled_format)
+    global format, compile_format, compiled_format
+    if a_format:
+        format = a_format
+        compile_format = True
+    _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
@@ -85,9 +88,9 @@ def download(book, path=None):
     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
+    if '%(extension)s' not in compiled_format:
+        compiled_format += '.%(extension)s'
+    filename = compiled_format % bdict
     try:
         os.makedirs(os.path.dirname(filename))
     except OSError:
@@ -104,8 +107,8 @@ def download(book, path=None):
 
 
 def test():
-    _do_compile_format()
-    print _compiled_format
+    _compile_format()
+    print compiled_format
 
 if __name__ == '__main__':
     test()
index 9f06657e9fe717a03e0bf9a3dba94751c443632e..a6fe3e5e076c0d893748f0967db284acbf4cba6a 100755 (executable)
@@ -189,7 +189,7 @@ def _search_books(case_sensitive, search_type, args):
             print " ", _("Deleted").encode(default_encoding), ":", \
                 _(str(book.deleted)).encode(default_encoding)
         if args.get or args.get_many:
-            download(book, args.path)
+            download(book, args.path, args.format)
         count += 1
     print_count(count)
 
@@ -295,6 +295,7 @@ if __name__ == '__main__':
     parser.add_argument('-a', '--archive', help='search by archive (zip file)')
     parser.add_argument('-f', '--file', help='search by file name')
     parser.add_argument('-p', '--path', help='path to the library archives')
+    parser.add_argument('--format', help='download format, default is %f')
     parser.add_argument('--get', action='store_true',
                         help='download exactly one book')
     parser.add_argument('--get-many', type=int,
index 9d52fb905e5f673b81ef286939b8f083b314e409..8dc1a2294f79523c0d8970f82b1b4aba273a4097 100755 (executable)
@@ -9,8 +9,8 @@ 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,
+        download._compile_format()
+        self.assertEqual(download.compiled_format,
                          u'%(author)s/%(series)s/%(ser_no)d %(title)s')