Use profile module for consistent work-directory.
[automanga.git] / manga / htcache.py
CommitLineData
3cc7937c 1import os, hashlib, urllib.request, time
40277671 2from . import profile
f3ad0817
FT
3pj = os.path.join
4
5class cache(object):
6 def __init__(self, dir):
7 self.dir = dir
8
9 def mangle(self, url):
3cc7937c
FT
10 n = hashlib.md5()
11 n.update(url.encode("ascii"))
f3ad0817
FT
12 return n.hexdigest()
13
d6c0e189 14 def miss(self, url):
531e4473
FT
15 req = urllib.request.Request(url, headers={"User-Agent": "automanga/1"})
16 with urllib.request.urlopen(req) as s:
75efe5be 17 if s.headers.get("content-encoding") == "gzip":
3cc7937c
FT
18 import gzip, io
19 return gzip.GzipFile(fileobj=io.BytesIO(s.read()), mode="r").read()
d6c0e189 20 return s.read()
d6c0e189 21
3cc7937c 22 def fetch(self, url, expire=3600):
f3ad0817
FT
23 path = pj(self.dir, self.mangle(url))
24 if os.path.exists(path):
25 if time.time() - os.stat(path).st_mtime < expire:
3cc7937c 26 with open(path, "rb") as f:
f3ad0817 27 return f.read()
d6c0e189 28 data = self.miss(url)
f3ad0817
FT
29 if not os.path.isdir(self.dir):
30 os.makedirs(self.dir)
3cc7937c 31 with open(path, "wb") as f:
f3ad0817
FT
32 f.write(data)
33 return data
34
40277671 35default = cache(pj(profile.confdir, "htcache"))
f3ad0817 36
3cc7937c 37def fetch(url, expire=3600):
f3ad0817 38 return default.fetch(url, expire)