#! /usr/bin/env python # -*- coding: utf-8 -*- """ 【Version】 0.10 2010/06/22 iTunesプレビューダウンロード 【Note】 """ #import----------------------------------------------------------------------- import sys, os, time import re import urllib, urllib2 #define----------------------------------------------------------------------- app_name = 'iTunes-Download-Helper' app_ver = '0.10' #DLフォルダ dl_forder = u'D:\\itunes\\' #function--------------------------------------------------------------------- #UTF-8からUnicodeへ変換 def uni_conv(s): try: u_text = unicode(s, 'utf-8') except: u_text = s return u_text #ファイル名に使えない文字列書き換え def conv_filename(filename): filename = filename.replace('\\', ' ') filename = filename.replace('<', ' ') filename = filename.replace('>', ' ') filename = filename.replace(':', ' ') filename = filename.replace('"', ' ') filename = filename.replace('/', ' ') filename = filename.replace('|', ' ') filename = filename.replace('?', ' ') filename = filename.replace('*', ' ') return filename #正規表現をあらかじめコンパイルしておく関数 def create_re_obj(): precompile = {} precompile['music'] = re.compile(u'\saudio-preview-url="(?P.*?)" preview-album="(?P.*?)".*?$\s*\s*(?P.*?)<\/span>', re.MULTILINE) return precompile #ダウンロードの進捗表示 def reporthook(count, b_size, t_size): progress = 100.0 * count * b_size / t_size if progress > 10: now_time = int(time.mktime(time.localtime())) passed_time = now_time - start_time if passed_time != 0: bps = t_size * 8 / passed_time / 1024.00 / 1024.00 print "%.2f %% %.2f Mbps (%d KB) \r" % (progress, bps, t_size / 1024), else: print "%.2f %% (%d KB)\r" % (progress, t_size / 1024), #ダウンロード処理 def get_yt_video_file(dl_url, filename): global start_time start_time = int(time.mktime(time.localtime())) try: urllib.urlretrieve(dl_url, dl_forder + filename, reporthook) except: print u'###### ダウンロード中断 ######' #ダウンロード事前処理 def dl_file(dl_list): for (preview_url, preview_album, preview_title) in dl_list: try: #ファイル情報取得 fp = urllib2.urlopen(preview_url) header = fp.info() #real_url = fp.geturl() #転送された場合のURL表示 fp.close() content_length = int(header.getheader("content-length")) file_size = content_length / 1048576.00 filename = u'%s %s.m4a' % (uni_conv(preview_album), uni_conv(preview_title)) #ファイル名に使えない文字列書き換え filename = conv_filename(filename) #情報表示 print u'######' print u'タイトル : ' + uni_conv(preview_title) print u'再生URL : ' + preview_url print u'file : ' + filename print u'size : %.2f MB' % file_size print u'###### ダウンロード処理開始 ######' get_yt_video_file(preview_url, filename) print u'###### ダウンロード処理終了 ######\a' except: print u'###### ダウンロード処理失敗 ######' def create_dl_list(p_obj, itunes_url): fp = urllib2.urlopen(itunes_url) html = fp.read() fp.close() try: music_all = p_obj['music'].findall(html) except: print u'###### dl list 取得に失敗 ######' return music_all #main関数 def main(): print app_name + ' - ' + app_ver print u'Ctrl + C で強制終了!' #正規表現のプリコンパイル p_obj = create_re_obj() #引数取得(URL) try: itunes_url = unicode(sys.argv[1], 'sjis', "ignore") except: print u'Usage : getunes.py iTunesURL' raw_input(u'Press Enter Key') exit() #ダウンロードリストを作成 dl_list = create_dl_list(p_obj, itunes_url) #ダウンロード処理 dl_file(dl_list) #test------------------------------------------------------------------------- if __name__ == '__main__': main()