better file handling

Don't download again if the final saved file exists (the preview)

Don't modify files in-place.
This commit is contained in:
user 2015-09-21 19:15:01 +00:00
parent 953ad970c9
commit 2b7610a60f
1 changed files with 58 additions and 28 deletions

View File

@ -2,16 +2,36 @@
from http.client import HTTPConnection from http.client import HTTPConnection
import json import json
import base64 import base64
import sys
def die(message,code=23):
print(message,file=sys.stderr)
raise SystemExit(code)
server = "minetest.fensta.bplaced.net" server = "minetest.fensta.bplaced.net"
skinsdir = "u_skins/textures/" skinsdir = "u_skins/textures/"
metadir = "u_skins/meta/" metadir = "u_skins/meta/"
i = 1 curskin = 0
pages = 1 pages = None
def replace(path,encoding=None):
mode = "wt" if encoding else "wb"
# an unpredictable temp name only needed for a+rwxt directories
tmp = '.'+path+'-tmp'
def deco(handle):
with open(tmp,mode,encoding=encoding) as out:
yield out
os.rename(tmp,path)
return deco
def maybeReplace(path,encoding=None):
def deco(handle):
if os.path.exists(path): return
return replace(path,encoding)(handle)
c = HTTPConnection(server) c = HTTPConnection(server)
def addpage(page): def addpage(page):
global i, pages global curskin, pages
print("Page: " + str(page)) print("Page: " + str(page))
r = 0 r = 0
try: try:
@ -20,42 +40,52 @@ def addpage(page):
except Exception: except Exception:
if r != 0: if r != 0:
if r.status != 200: if r.status != 200:
print("Error", r.status) die("Error", r.status)
exit(r.status)
return return
data = r.read().decode() data = r.read().decode()
l = json.loads(data) l = json.loads(data)
if not l["success"]: if not l["success"]:
print("Success != True") die("Success != True")
exit(1)
r = 0 r = 0
pages = int(l["pages"]) pages = int(l["pages"])
foundOne = False
for s in l["skins"]: for s in l["skins"]:
f = open(skinsdir + "character_" + str(i) + ".png", "wb") # make sure to increment this, even if the preview exists!
f.write(base64.b64decode(bytes(s["img"], 'utf-8'))) curskin = curskin + 1
f.close() preview = skinsdir + "character_" + str(curskin) + "_preview.png"
f = open(metadir + "character_" + str(i) + ".txt", "w") if os.path.exists(preview): continue
f.write(str(s["name"]) + '\n') foundOne = True
f.write(str(s["author"]) + '\n') tmp = dest+'-tmp'
f.write(str(s["license"])) @maybeReplace(skinsdir + "character_" + str(curskin) + ".png")
f.close() def go(f):
f.write(base64.b64decode(bytes(s["img"], 'utf-8')))
f.close()
@maybeReplace(metadir + "character_" + str(curskin) + ".txt",
encoding='utf-8')
def go(f):
f.write(str(s["name"]) + '\n')
f.write(str(s["author"]) + '\n')
f.write(str(s["license"]))
try: try:
c.request("GET", "/skins/1/" + str(s["id"]) + ".png") c.request("GET", "/skins/1/" + str(s["id"]) + ".png")
r = c.getresponse() r = c.getresponse()
except Exception: except HTTPException as e:
if r != 0: print(type(e),dir(e))
if r.status != 200: raise(e)
print("Error", r.status) if r.status != 200:
print("Error", r.status)
continue continue
@replace(preview)
data = r.read() def go(f):
f = open(skinsdir + "character_" + str(i) + "_preview.png", "wb") shutil.copyfileobj(r,f)
f.write(data) if not foundOne:
f.close() print("No skins updated on this page. Seems we're done?")
i = i + 1 raise SystemExit
addpage(1) addpage(1)
if pages > 1: curpage = 1
for p in range(pages-1): while pages > curpage:
addpage(p+2) curpage = curpage + 1
addpage(curpage)
print("Skins have been updated!") print("Skins have been updated!")