Don't crash on tag listing when a manga has ceased to exist.
[automanga.git] / automanga
1 #!/usr/bin/python
2
3 import sys, getopt
4 import manga.lib, manga.reader, manga.profile, manga.local
5 import glib, gobject, gtk
6
7 gobject.threads_init()
8 gtk.gdk.threads_init()
9
10 def usage(out):
11     out.write("usage: automanga [-h] [-p PROFILE] {DIRECTORY|-l LIBRARY ID|-a ALIAS}\n")
12     out.write("       automanga -a ALIAS=LIBRARY:ID\n")
13     out.write("       automanga -t {DIRECTORY|-l LIBRARY ID|-a ALIAS} [-]TAG...\n")
14     out.write("       automanga -{s|S} LIBRARY NAME\n")
15     out.write("       automanga -L TAG\n")
16
17 libname = None
18 search = None
19 profile = ""
20 alias = None
21 settags = False
22 listtag = None
23 opts, args = getopt.getopt(sys.argv[1:], "hl:sSp:a:tL:")
24 for o, a in opts:
25     if o == "-h":
26         usage(sys.stdout)
27         sys.exit(0)
28     elif o == "-l":
29         libname = a
30     elif o == "-a":
31         alias = a
32     elif o == "-s":
33         search = "name"
34     elif o == "-S":
35         search = "match"
36     elif o == "-p":
37         if a == "":
38             profile = None
39         else:
40             profile = a
41     elif o == "-t":
42         settags = True
43     elif o == "-L":
44         listtag = a
45 if profile == "":
46     try:
47         profile = manga.profile.profile.last()
48     except KeyError:
49         profile = manga.profile.profile.byname("default")
50 elif profile is not None:
51     profile = manga.profile.profile.byname(profile)
52
53 def main():
54     global libname
55
56     if search:
57         if len(args) < 2:
58             usage(sys.stderr)
59             sys.exit(1)
60         try:
61             lib = manga.lib.findlib(args[0])
62         except ImportError:
63             sys.stderr.write("automanga: no such library: %s\n" % args[0])
64             sys.exit(1)
65         try:
66             if search == "name":
67                 results = lib.byname(args[1])
68             elif search == "match":
69                 results = lib.search(args[1])
70                 if hasattr(results, "__length_hint__"):
71                     sys.stderr.write("%i results:\n" % results.__length_hint__())
72         except NotImplementedError:
73             sys.stderr.write("automanga: %s does not support searching\n" % args[0])
74             sys.exit(1)
75         for mng in results:
76             sys.stdout.write("\"%s\": %s\n" % (mng.name, mng.id))
77         return
78
79     if listtag is not None:
80         if profile is not None:
81             for mprof in profile.bytag(listtag):
82                 try:
83                     mng = mprof.open()
84                     sys.stdout.write("%s %s: \"%s\"\n" % (mprof.libnm, mprof.id, mng.name))
85                 except KeyError:
86                     sys.stdout.write("%s %s: no longer exists\n" % (mprof.libnm, mprof.id))
87         return
88
89     if alias and (alias.find('=') > 0):
90         tgt, nm = alias.split('=', 1)
91         if not ':' in nm:
92             usage(sys.stderr)
93             sys.exit(1)
94         libname, mid = nm.split(':', 1)
95         try:
96             lib = manga.lib.findlib(libname)
97         except ImportError:
98             sys.stderr.write("automanga: no such library: %s\n" % libname)
99             sys.exit(1)
100         try:
101             mng = lib.byid(mid)
102         except KeyError as e:
103             sys.stderr.write("automanga: no such manga: %s\n" % str(e))
104             sys.exit(1)
105         profile.setalias(tgt, libname, mng.id)
106         return
107
108     if alias:
109         try:
110             libname, mid = profile.getalias(alias)
111         except KeyError:
112             sys.stderr("automanga: no such alias: %s\n" % alias)
113             sys.exit(1)
114         try:
115             lib = manga.lib.findlib(libname)
116         except ImportError:
117             sys.stderr.write("automanga: no such library: %s\n" % libname)
118             sys.exit(1)
119         try:
120             mng = lib.byid(mid)
121         except KeyError:
122             sys.stderr.write("automanga: manga no longer found: %s\n" % mid)
123             sys.exit(1)
124     elif libname is not None:
125         if len(args) < 1:
126             usage(sys.stderr)
127             sys.exit(1)
128         try:
129             lib = manga.lib.findlib(libname)
130         except ImportError:
131             sys.stderr.write("automanga: no such library: %s\n" % libname)
132             sys.exit(1)
133         try:
134             mng = lib.byid(args.pop(0))
135         except KeyError as e:
136             sys.stderr.write("automanga: no such manga: %s\n" % str(e))
137             sys.exit(1)
138     else:
139         libname = "local"
140         try:
141             if len(args) > 0:
142                 mdir = args.pop(0)
143             else:
144                 mdir = "."
145             mng = manga.local.manga(mdir)
146         except TypeError:
147             sys.stderr.write("automanga: not a valid manga directory: %s\n" % mdir)
148             sys.exit(1)
149
150     mprof = None if profile is None else profile.getmanga(libname, mng.id, True)
151     if profile is not None:
152         profile.setlast()
153
154     if settags:
155         if mprof is not None:
156             ntags = [tag for tag in args if tag[:1] != "-"]
157             rtags = [tag[1:] for tag in args if tag[:1] == "-"]
158             if ntags: mprof.tags.add(*ntags)
159             if rtags: mprof.tags.remove(*rtags)
160         return
161
162     reader = manga.reader.reader(mng, mprof)
163     reader.show()
164     gtk.main()
165
166 try:
167     main()
168 except KeyboardInterrupt:
169     pass