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