local: Treat dots/periods as digits in destructuring directories.
[automanga.git] / automanga
index e581b74..6e51e29 100755 (executable)
--- a/automanga
+++ b/automanga
@@ -1,22 +1,24 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
-import sys, getopt
+import sys, getopt, pathlib
 import manga.lib, manga.reader, manga.profile, manga.local
-import glib, gobject, gtk
-
-gobject.threads_init()
-gtk.gdk.threads_init()
+from gi.repository import Gtk, Gdk, GObject
 
 def usage(out):
     out.write("usage: automanga [-h] [-p PROFILE] {DIRECTORY|-l LIBRARY ID|-a ALIAS}\n")
     out.write("       automanga -a ALIAS=LIBRARY:ID\n")
+    out.write("       automanga -t {DIRECTORY|-l LIBRARY ID|-a ALIAS} [-]TAG...\n")
     out.write("       automanga -{s|S} LIBRARY NAME\n")
+    out.write("       automanga -L TAG [-o ORDER]\n")
 
 libname = None
 search = None
 profile = ""
 alias = None
-opts, args = getopt.getopt(sys.argv[1:], "hl:sSp:a:")
+settags = False
+listtag = None
+listorder = None
+opts, args = getopt.getopt(sys.argv[1:], "hl:sSp:a:tL:o:")
 for o, a in opts:
     if o == "-h":
         usage(sys.stdout)
@@ -34,6 +36,12 @@ for o, a in opts:
             profile = None
         else:
             profile = a
+    elif o == "-t":
+        settags = True
+    elif o == "-L":
+        listtag = a
+    elif o == "-o":
+        listorder = a
 if profile == "":
     try:
         profile = manga.profile.profile.last()
@@ -68,6 +76,34 @@ def main():
             sys.stdout.write("\"%s\": %s\n" % (mng.name, mng.id))
         return
 
+    if listtag is not None:
+        if profile is not None:
+            results = []
+            for mprof in profile.bytag(listtag):
+                try:
+                    mng = mprof.open()
+                except KeyError:
+                    sys.stderr.write("%s %s: no longer found\n" % (mprof.libnm, mprof.id))
+                    continue
+                except Exception as exc:
+                    sys.stderr.write("%s %s: unexpected error: %s\n" % (mprof.libnm, mprof.id, str(exc)))
+                    continue
+                line = "%s %s: \"%s\"" % (mprof.libnm, mprof.id, mng.name)
+                if listorder is None:
+                    sys.stdout.write("%s\n" % (line,))
+                else:
+                    if listorder == "mtime":
+                        key = -mprof.mtime()
+                    else:
+                        sys.stderr.write("automanga: undefined order: %s\n" % (listorder,))
+                        sys.exit(1)
+                    results.append((line, key))
+            if len(results) > 0:
+                results.sort(key=lambda o: o[1])
+                for line, key in results:
+                    sys.stdout.write("%s\n" % (line,))
+        return
+
     if alias and (alias.find('=') > 0):
         tgt, nm = alias.split('=', 1)
         if not ':' in nm:
@@ -91,7 +127,7 @@ def main():
         try:
             libname, mid = profile.getalias(alias)
         except KeyError:
-            sys.stderr("automanga: no such alias: %s\n" % alias)
+            sys.stderr.write("automanga: no such alias: %s\n" % alias)
             sys.exit(1)
         try:
             lib = manga.lib.findlib(libname)
@@ -113,18 +149,18 @@ def main():
             sys.stderr.write("automanga: no such library: %s\n" % libname)
             sys.exit(1)
         try:
-            mng = lib.byid(args[0])
+            mng = lib.byid(args.pop(0))
         except KeyError as e:
             sys.stderr.write("automanga: no such manga: %s\n" % str(e))
             sys.exit(1)
     else:
         libname = "local"
         try:
-            if len(args) > 0:
-                mdir = args[0]
-            else:
-                mdir = "."
-            mng = manga.local.manga(mdir)
+            if len(args) < 1:
+                usage(sys.stderr)
+                sys.exit(1)
+            mdir = args.pop(0)
+            mng = manga.local.manga(pathlib.Path(mdir))
         except TypeError:
             sys.stderr.write("automanga: not a valid manga directory: %s\n" % mdir)
             sys.exit(1)
@@ -133,9 +169,17 @@ def main():
     if profile is not None:
         profile.setlast()
 
+    if settags:
+        if mprof is not None:
+            ntags = [tag for tag in args if tag[:1] != "-"]
+            rtags = [tag[1:] for tag in args if tag[:1] == "-"]
+            if ntags: mprof.tags.add(*ntags)
+            if rtags: mprof.tags.remove(*rtags)
+        return
+
     reader = manga.reader.reader(mng, mprof)
     reader.show()
-    gtk.main()
+    Gtk.main()
 
 try:
     main()