Don't crash on tag listing when a manga has ceased to exist.
[automanga.git] / automanga
CommitLineData
e26514bb
FT
1#!/usr/bin/python
2
3import sys, getopt
012c4cae 4import manga.lib, manga.reader, manga.profile, manga.local
e26514bb
FT
5import glib, gobject, gtk
6
7gobject.threads_init()
8gtk.gdk.threads_init()
9
10def usage(out):
271d68da
FT
11 out.write("usage: automanga [-h] [-p PROFILE] {DIRECTORY|-l LIBRARY ID|-a ALIAS}\n")
12 out.write(" automanga -a ALIAS=LIBRARY:ID\n")
5c000565 13 out.write(" automanga -t {DIRECTORY|-l LIBRARY ID|-a ALIAS} [-]TAG...\n")
ffd12e71 14 out.write(" automanga -{s|S} LIBRARY NAME\n")
5c000565 15 out.write(" automanga -L TAG\n")
e26514bb
FT
16
17libname = None
ffd12e71 18search = None
012c4cae 19profile = ""
271d68da 20alias = None
5c000565
FT
21settags = False
22listtag = None
23opts, args = getopt.getopt(sys.argv[1:], "hl:sSp:a:tL:")
e26514bb
FT
24for o, a in opts:
25 if o == "-h":
26 usage(sys.stdout)
27 sys.exit(0)
28 elif o == "-l":
29 libname = a
271d68da
FT
30 elif o == "-a":
31 alias = a
e26514bb 32 elif o == "-s":
ffd12e71
FT
33 search = "name"
34 elif o == "-S":
35 search = "match"
012c4cae
FT
36 elif o == "-p":
37 if a == "":
38 profile = None
39 else:
40 profile = a
5c000565
FT
41 elif o == "-t":
42 settags = True
43 elif o == "-L":
44 listtag = a
012c4cae
FT
45if profile == "":
46 try:
47 profile = manga.profile.profile.last()
48 except KeyError:
49 profile = manga.profile.profile.byname("default")
50elif profile is not None:
51 profile = manga.profile.profile.byname(profile)
e26514bb 52
299d3f50 53def main():
41a034f6
FT
54 global libname
55
299d3f50
FT
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
e26514bb 78
5c000565
FT
79 if listtag is not None:
80 if profile is not None:
81 for mprof in profile.bytag(listtag):
acdde6ca
FT
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))
5c000565
FT
87 return
88
299d3f50 89 if alias and (alias.find('=') > 0):
41a034f6 90 tgt, nm = alias.split('=', 1)
299d3f50
FT
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)
d39faa3f
FT
102 except KeyError as e:
103 sys.stderr.write("automanga: no such manga: %s\n" % str(e))
299d3f50 104 sys.exit(1)
41a034f6 105 profile.setalias(tgt, libname, mng.id)
299d3f50 106 return
271d68da 107
299d3f50
FT
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:
5c000565 134 mng = lib.byid(args.pop(0))
d39faa3f
FT
135 except KeyError as e:
136 sys.stderr.write("automanga: no such manga: %s\n" % str(e))
299d3f50
FT
137 sys.exit(1)
138 else:
139 libname = "local"
140 try:
141 if len(args) > 0:
5c000565 142 mdir = args.pop(0)
299d3f50
FT
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()
e26514bb 153
5c000565
FT
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] == "-"]
5c000565
FT
158 if ntags: mprof.tags.add(*ntags)
159 if rtags: mprof.tags.remove(*rtags)
160 return
161
299d3f50
FT
162 reader = manga.reader.reader(mng, mprof)
163 reader.show()
164 gtk.main()
012c4cae 165
299d3f50
FT
166try:
167 main()
168except KeyboardInterrupt:
169 pass