]> git.phdru.name Git - m_librarian.git/blobdiff - scripts/ml-search.py
Search books by language
[m_librarian.git] / scripts / ml-search.py
index 81d74f9a2cdb1a35fa396880b6ba767a3817166e..4757628807985ed55ade487dab79e5df88059762 100755 (executable)
@@ -5,8 +5,9 @@ import sys
 from sqlobject.sqlbuilder import CONCAT
 
 from m_lib.defenc import default_encoding
-from m_librarian.db import Author, open_db
-from m_librarian.search import search_authors, search_books, \
+from m_librarian.db import Author, Book, Extension, Language, open_db
+from m_librarian.search import mk_search_conditions, \
+    search_authors, search_books, \
     search_extensions, search_genres, search_languages
 
 from m_librarian.translations import translations
@@ -53,16 +54,35 @@ def _search_authors(case_sensitive, search_type, args):
 
 def _search_books(case_sensitive, search_type, args):
     values = {}
+    join_expressions = []
     for column in 'title', 'series', 'archive', 'file':
         value = getattr(args, column)
         if value:
             values[column] = unicode(value, default_encoding)
     if case_sensitive is None:
-        case_sensitive = _guess_case_sensitivity(values)
+        test_values = values.copy()
+        for column in 'ext', 'lang':
+            value = getattr(args, column)
+            if value:
+                test_values[column] = unicode(value, default_encoding)
+        case_sensitive = _guess_case_sensitivity(test_values)
+    if args.ext:
+        join_expressions.append(Book.j.extension)
+        conditions = mk_search_conditions(
+            Extension, search_type, case_sensitive,
+            {'name': args.ext})
+        join_expressions.extend(conditions)
+    if args.lang:
+        join_expressions.append(Book.j.language)
+        conditions = mk_search_conditions(
+            Language, search_type, case_sensitive,
+            {'name': args.lang})
+        join_expressions.extend(conditions)
     for book in search_books(search_type, case_sensitive, values,
-                             orderBy='title'):
+                             join_expressions,
+                             orderBy=('series', 'ser_no', 'title')):
         print book.title.encode(default_encoding)
-        if args.details > 0:
+        if args.details >= 1:
             print " ", _("Author(s)"), ":",
             for author in book.authors:
                 names = filter(None,
@@ -70,6 +90,25 @@ def _search_books(case_sensitive, search_type, args):
                 fullname = u' '.join(names)
                 print fullname.encode(default_encoding),
             print
+            print " ", _("Genre(s)"), ":",
+            for genre in book.genres:
+                print (genre.title or genre.name).encode(default_encoding),
+            print
+            if book.series:
+                print " ", _("Series"), ":",
+                print book.series.encode(default_encoding), \
+                    "(%d)" % book.ser_no
+
+        if args.details >= 2:
+            print " ", _("Date"), ":", book.date
+            print " ", _("Language"), ":", book.language.name
+
+        if args.details >= 3:
+            print " ", _("Archive"), ":", book.archive
+            print " ", _("File"), ":", book.file
+            print " ", _("Extension"), ":", book.extension.name
+            print " ", _("Size"), ":", book.size, _("bytes")
+            print " ", _("Deleted"), ":", _(str(book.deleted))
 
 
 def _search_extensions(case_sensitive, search_type, args):
@@ -145,6 +184,8 @@ if __name__ == '__main__':
     parser.add_argument('-d', '--details', action='count',
                         help='output more details about books; '
                         'repeat for even more details')
+    parser.add_argument('-e', '--ext', help='search by file extension')
+    parser.add_argument('-l', '--lang', help='search by language')
     parser.set_defaults(func=_search_books)
 
     parser = subparsers.add_parser('ext', help='Search extensions')