Revision: 32312
Initial Code
Initial URL
Initial Description
Initial Title
Initial Tags
Initial Language
at September 22, 2010 08:23 by ElStevo
Initial Code
from __future__ import division
from __future__ import print_function
import os
import subprocess
import urllib2
import time
import re
import tarfile
from PIL import Image
# Note: don't put trailing slashes on any filepaths or URLs
# Where all the files and maps are saved
MAP_DIRECTORY = "C:/Cartograph"
# The filepath to Cartograph
APP_PATH = "F:/Programs/Minecraft/Alpha/Cartograph"
APP_NAME = "Cartograph.exe"
# The arguments to pass to Cartograph. Check the Cartograph help for more info
APP_ARGUMENTS_1 = "normal 0 0 0 0"
APP_ARGUMENTS_2 = "obliqueangle 0 0 0 0 0"
# The map name(s)
MAP_NAME_1 = "top_down"
MAP_NAME_2 = "oblique_angled"
# Delete the archive after extracting?
DELETE_ARCHIVE = True
# Where the backups are downloaded from. Leave this as it is
BASEURL = "http://rps.fragwith.us/backups"
_CHUNK_SIZE = 1024 * 8
_MB = 1024 * 1024
def main():
curTime = time.time()
print("Finding most recent backup...")
for i in range(-1, 5):
date = _subtractDays(curTime, i)
try:
html = urllib2.urlopen(BASEURL + '/' + date + '/')
except urllib2.HTTPError:
continue
archivename = re.findall('<a href="world\..*\.tar\.gz">',
html.read())[-1].split('"')[1]
print("Most recent backup is {0}.".format(archivename))
datetimestring = archivename.split('.')[1]
datetime = time.strptime(datetimestring, '%d-%m-%Y_%H%M%S')
filepath = "{0}/{1}/".format(MAP_DIRECTORY,
time.strftime('%Y-%m-%d_%H-%M-%S', datetime))
if not os.path.exists(filepath):
os.mkdir(filepath)
print("Downloading {0} to {1}".format(archivename, filepath))
startTime = time.time()
download(BASEURL + '/' + date + '/' + archivename, filepath +
archivename)
print("Downloaded in {0}.".format(_timeTaken(startTime, time.time())))
print("Extracting contents from archive...")
startTime = time.time()
extract(filepath, archivename)
print("Extracted in {0}.".format(_timeTaken(startTime, time.time())))
if DELETE_ARCHIVE:
print("Deleting archive...")
os.remove(filepath + archivename)
print("Archive deleted.")
map(filepath)
break
def download(url, filepath):
bytesSoFar = 0
percent = -1
partfile = filepath + '.part'
opener = urllib2.build_opener()
response = opener.open(url)
totalSize = response.info().getheader("Content-Length")
if totalSize is not None:
totalSize = int(totalSize.strip())
if not os.path.exists(filepath):
fp = open(partfile, 'wb')
chunk = True
while chunk:
chunk = response.read(_CHUNK_SIZE)
bytesSoFar += len(chunk)
fp.write(chunk)
percent = _percentageDone(bytesSoFar, totalSize, percent)
print("")
fp.close()
response.close()
os.rename(partfile, filepath)
else:
print("{0} already exists".format(filepath))
def extract(filepath, filename):
tar = tarfile.open(filepath + filename, 'r')
tar.extractall(filepath)
def map(path):
os.chdir(APP_PATH)
inputPath = path + "world"
print("Generating map 1...")
outputPath = path + MAP_NAME_1 + ".png"
startTime = time.time()
app = subprocess.Popen('{0} 6 {1} "{2}" "{3}"'.format(APP_NAME,
APP_ARGUMENTS_1, outputPath, inputPath))
app.wait()
print("Map generated in {0}.".format(_timeTaken(startTime, time.time())))
print("Map 1 generated.")
# Rotate the image so that north is actually north. Obviously this won't
# work on oblique maps.
print("Rotating...")
_rotateImage(outputPath)
print("Map 1 finished.")
# Map 2 generation commented out because oblique mode crashes on my system
# for very large maps. YMMV.
# print("Generating map 2...")
# outputPath = path + '/' + MAP_NAME_2 + ".png"
# app = subprocess.Popen('{0} 6 {1} "{2}" "{3}"'.format(APP_NAME,
# APP_ARGUMENTS_2, outputPath, inputPath))
# app.wait()
# print("Map 2 generated.")
# print("Map 2 finished.")
def _rotateImage(file):
im = Image.open(file)
im = im.rotate(-90)
im.save(file)
def _percentageDone(bytesSoFar, totalSize, curPercent):
if totalSize == 0 or totalSize is None:
return -1
percent = (bytesSoFar / totalSize) * 100
if int(percent) > int(curPercent):
print("\n {0:3}% downloaded ({1:6.2f}MB of {2:6.2f}MB)".format(
int(percent), bytesSoFar/_MB, totalSize/_MB), end='')
if int(percent * 10) > int(curPercent * 10) and int(percent) < 100:
print('.', end='')
return percent
def _subtractDays(t, n):
t -= (n * 86400)
date = time.strftime("%d-%m-%Y", time.localtime(t))
return date
def _timeTaken(start, finish):
timeTaken = int(finish - start)
numHours = timeTaken // 3600
timeTaken %= 3600
numMins = timeTaken // 60
timeTaken %= 60
numSecs = timeTaken
ret = ""
if numHours == 1:
ret += "{0} hour, ".format(numHours)
elif numHours > 1:
ret += "{0} hours, ".format(numHours)
if numMins == 1:
ret += "{0} minute and ".format(numMins)
elif numMins > 1 or numHours > 0:
ret += "{0} minutes and ".format(numMins)
if numSecs == 1:
ret += "{0} second".format(numSecs)
else:
ret += "{0} seconds".format(numSecs)
return ret
if __name__ == "__main__":
main()
Initial URL
Initial Description
Downloads the latest backup of the Unofficial RPS Minecraft server and generates a map using Cartograph. You will need to modify MAP DIRECTORY and APP PATH to point to the relevant places on your machine.
Initial Title
Unofficial RPS Minecraft server automapper
Initial Tags
Initial Language
Python