pythonで連番ファイルダウンローダ

つくったので公開。CUIアプリ。本体は81行くらい。実はGUIバージョンもあって、そっちはTkinterとthreadモジュールを使っているものなんだけど、219行もあるのでそのうち。はてなダイアリーにファイル添付機能があるとプログラムの公開が楽にできるのになあ、、、

#! /usr/bin/python

import os, sys, time, urllib

class getter(urllib.URLopener):
    """
    usage ex)
    url : http://www.whateverYouWant.co.jp
    fileprefix : image
    start : 0
    end : 10
    place : 3
    extensions : [".jpg", ".bmp"]
    
    /------------  url  ------------\/fileprefix\/start~end with place\/extensions\
    http://www.WhateverYouWant.co.jp/image       001 ~ 010             .jpg

    this class's method 'go', in this example, first try to get
    "image001.jpg". if fail, it will try to get "image001.bmp"
    """
    def __init__(self):
        urllib.URLopener.__init__(self)
        self.url = ""            
        self.fileprefix = ""     
        self.extensions = [""]
        self.start = 0
        self.end = 0
	self.place = 0
        self.waittime = 3
	self.savedir = "."
	
    def wait(self):
        for n in range(self.waittime):
            print ".",
            time.sleep(1)
        print ""  # newline
	
    def putplace(self, num):
	"""
	ex) if self.place == 3, putplace(23) => "023"
	                  == 4, putplace(23) => "0023"
	"""
	s = str(num)
	while len(s) < self.place:
	    s = "0" + s
	return s

    def error_fix(self):
	if self.url[-1] != "/":
	    self.url += "/"
	if self.savedir[-1] != "/":
	    self.savedir += "/"
	if self.place < 0:
	    self.place = 0
	if not os.path.exists(self.savedir):
	    print "create directory %s" % self.savedir
	    os.mkdir(self.savedir)
	    
    def get(self, directory):
	self.savedir = directory
	self.error_fix()
	for i in range(self.start, self.end + 1):
	    for ext in self.extensions:
		src = "%s%s%s%s" % (self.url, self.fileprefix, self.putplace(i), ext)
		dst = "%s%s%s%s" % (self.savedir, self.fileprefix, self.putplace(i), ext)
		print "%s ..." % src,
		try:
		    self.retrieve(src, dst)
		    print "get",
		    self.wait()
		    break
		except IOError:
		    print "fail",
		    self.wait()
		    continue
    def status(self):
	return {"url":self.url, "fileprefix":self.fileprefix, "extensions":self.extensions,
		"start":self.start, "end":self.end, "place":self.place, "waittime":self.waittime,
		"savedir":self.savedir}


def vip2dget(dir, start, end):
    vip2d = getter()
    vip2d.url = "http://up2.viploader.net/pic2d/src/"
    vip2d.fileprefix = "viploader2d"
    vip2d.extensions = [".jpg", ".gif", ".bmp", ".png"]
    vip2d.start = start
    vip2d.end = end
    vip2d.place = 6
    vip2d.get(dir)

def vipget(dir, start, end):
    vip = getter()
    vip.url = "http://up2.viploader.net/pic/src/"
    vip.fileprefix = "viploader"
    vip.extensions = [".jpg", ".gif", ".bmp", ".png"]
    vip.start = start
    vip.end = end
    vip.place = 6
    vip.get(dir)

def vipkbget(dir, start, end):
    vipkb = getter()
    vipkb.url = "http://up2.viploader.net/bg/src/"
    vipkb.fileprefix = "vlbg"
    vipkb.extensions = [".jpg", ".gif", ".bmp", ".png"]
    vipkb.start = start
    vipkb.end = end
    vipkb.place = 6
    vipkb.get(dir)

    
if __name__ == '__main__':
    import os, sys

    if len(sys.argv) != 5:
	print "usage %s alt start end dir" % sys.argv[0].split("\\")[-1]
	print "alt: vip, vip2d, vipkb"
	sys.exit(0)
    
    func_obj = lambda : None
    if sys.argv[1] == "vip":
	func_obj = vipget
    elif sys.argv[1] == "vip2d":
	func_obj = vip2dget
    elif sys.argv[1] == "vipkb":
	func_obj = vipkbget

    s = int(sys.argv[2])
    e = int(sys.argv[3])
    d = sys.argv[4]

    func_obj(d, s, e)