-#!/usr/bin/python
+#!/usr/bin/python3
import sys, getopt
import manga.lib, manga.reader, manga.profile, manga.local
-#!/usr/bin/python
+#!/usr/bin/python3
import sys, getopt
import manga.lib, manga.profile
-import os, md5, urllib, time
+import os, hashlib, urllib.request, time
pj = os.path.join
class cache(object):
self.dir = dir
def mangle(self, url):
- n = md5.new()
- n.update(url)
+ n = hashlib.md5()
+ n.update(url.encode("ascii"))
return n.hexdigest()
def miss(self, url):
- s = urllib.urlopen(url)
- try:
+ with urllib.request.urlopen(url) as s:
if s.headers.get("content-encoding") == "gzip":
- import gzip, StringIO
- return gzip.GzipFile(fileobj=StringIO.StringIO(s.read()), mode="r").read()
+ import gzip, io
+ return gzip.GzipFile(fileobj=io.BytesIO(s.read()), mode="r").read()
return s.read()
- finally:
- s.close()
- def fetch(self, url, expire = 3600):
+ def fetch(self, url, expire=3600):
path = pj(self.dir, self.mangle(url))
if os.path.exists(path):
if time.time() - os.stat(path).st_mtime < expire:
- with open(path) as f:
+ with open(path, "rb") as f:
return f.read()
data = self.miss(url)
if not os.path.isdir(self.dir):
os.makedirs(self.dir)
- with open(path, "w") as f:
+ with open(path, "wb") as f:
f.write(data)
return data
raise Exception("Could not find home directory for HTTP caching")
default = cache(pj(home, ".manga", "htcache"))
-def fetch(url, expire = 3600):
+def fetch(url, expire=3600):
return default.fetch(url, expire)
"""Close this stream."""
raise NotImplementedError()
- def read(self, sz = None):
+ def read(self, sz=None):
"""Read SZ bytes from the stream, or the entire rest of the
stream of SZ is not given."""
raise NotImplementedError()
have no particular implementation requirements."""
def __init__(self, url):
- import urllib
- self.bk = urllib.urlopen(url)
+ import urllib.request
+ self.bk = urllib.request.urlopen(url)
ok = False
try:
if self.bk.getcode() != 200:
def close(self):
self.bk.close()
- def read(self, sz = None):
+ def read(self, sz=None):
if sz is None:
return self.bk.read()
else:
loaded = {}
def findlib(name):
def load(name):
- mod = __import__(name, fromlist=["dummy"])
+ import importlib
+ mod = importlib.import_module(name)
if not hasattr(mod, "library"):
raise ImportError("module " + name + " is not a manga library")
return mod.library()
import os
-import lib
+from . import lib
pj = os.path.join
def decode1(nm):
self.stack = []
if os.path.exists(pj(self.path, "name")):
with open(pj(self.path, "name")) as s:
- self.name = s.readline().strip().decode("utf-8")
+ self.name = s.readline().strip()
else:
- self.name = os.path.basename(path).decode("utf-8")
+ self.name = os.path.basename(path)
self.direct = self.destruct()
def __len__(self):
raise Exception("Could not find home directory for profile keeping")
basedir = pj(home, ".manga", "profiles")
-class txfile(file):
+class txfile(object):
def __init__(self, name, mode):
self.realname = name
self.tempname = name + ".new"
- super(txfile, self).__init__(self.tempname, mode)
+ self.bk = open(self.tempname, mode)
def close(self, abort=False):
- super(txfile, self).close()
+ self.bk.close()
if abort:
os.unlink(self.tempname)
else:
os.rename(self.tempname, self.realname)
+ def read(self, sz=-1):
+ return self.bk.read(sz)
+
+ def write(self, data):
+ return self.bk.write(data)
+
def __enter__(self):
return self
self.close(False)
def openwdir(nm, mode="r"):
- ft = file
+ ft = open
if mode == "W":
mode = "w"
ft = txfile
self.props = self.loadprops()
def open(self):
- import lib
+ from . import lib
return lib.findlib(self.libnm).byid(self.id)
def save(self):
@staticmethod
def save(profile, m):
with profile.file("tags", "W") as fp:
- for (libnm, id), tags in m.iteritems():
+ for (libnm, id), tags in m.items():
fp.write(consline(libnm, id, *tags) + "\n")
@staticmethod
def save(self):
with openwdir(self.path, "W") as f:
- for key, val in self.props.iteritems():
+ for key, val in self.props.items():
if isinstance(val, str):
f.write(consline("set", key, val) + "\n")
else:
def savemapping(self, seq, m):
with openwdir(pj(self.dir, "map"), "W") as f:
f.write(consline("seq", str(seq)) + "\n")
- for (libnm, id), num in m.iteritems():
+ for (libnm, id), num in m.items():
f.write(consline("manga", libnm, id, str(num)) + "\n")
def getmanga(self, libnm, id, creat=False):
def savealiases(self, map):
with openwdir(pj(self.dir, "alias"), "W") as f:
- for nm, (libnm, id) in map.iteritems():
+ for nm, (libnm, id) in map.items():
f.write(consline("alias", nm, libnm, id) + "\n")
def file(self, name, mode="r"):
import threading
from gi.repository import Gtk as gtk, GdkPixbuf as gdkpix, Gdk as gdk, GObject as gobject
-import lib, profile
+from . import lib, profile
class notdone(Exception): pass
self._val = None
self._exc = None
self._notlist = []
- self._started = False
+ self._tstarted = False
self.setDaemon(True)
def start(self):
- if not self._started:
+ if not self._tstarted:
super(future, self).start()
- self._started = True
+ self._tstarted = True
def run(self):
try:
self.st = st
while True:
read = st.read(1024)
- if read == "":
+ if read == b"":
break
self.p += len(read)
buf.write(read)
self.pfr.show()
self.sboxbar = gtk.HBox()
algn = gtk.Alignment(xalign=0.0, yalign=0.5, xscale=0.0, yscale=0.0)
- sboxlbl = gtk.Label(self.manga.name + u": ")
+ sboxlbl = gtk.Label(self.manga.name + ": ")
algn.add(sboxlbl)
sboxlbl.show()
self.sboxbar.pack_start(algn, False, True, 0)
self.pagelbl.set_text("")
else:
w, h = self.page.get_osize()
- self.pagelbl.set_text(u"%s\u00d7%s (%d%%)" % (w, h, int(self.page.zoom * 100)))
+ self.pagelbl.set_text("%s\u00d7%s (%d%%)" % (w, h, int(self.page.zoom * 100)))
def updsboxes(self, page):
nodes = [node for node, idx in page.stack[1:]] + [page]
if pbox.node != node:
l = i
break
- for i in xrange(l, len(self.sboxes)):
+ for i in range(l, len(self.sboxes)):
self.sboxbar.remove(self.sboxes[i])
self.sboxes = self.sboxes[:l]
- for i in xrange(l, len(nodes)):
+ for i in range(l, len(nodes)):
new = sbox(self, nodes[i])
self.sboxbar.pack_start(new, False, True, 5)
self.sboxes.append(new)
return proc
def updtitle(self):
- self.set_title(u"Automanga \u2013 " + self.manga.name)
+ self.set_title("Automanga \u2013 " + self.manga.name)
@property
def zoom(self):