def download(self): try: self.running = True dllist = [] # DL対象 self.checkdiscontinue() """ mail チェック *ライブラリ登録 """ try: myformat = self.various.geturl(INFO.gmail_id, INFO.gmail_pw) except: self.log.write(u'Gmailにログインできませんでした。') self.stop = True try: self.checkdiscontinue() except: return False if myformat: FORMATS.append(myformat) if myformat.type == 'MYLIST': self.various.reloadmylistdata(myformat) elif myformat.type == 'MOVIE': self.various.reloadmoviedata(myformat) EVT_HITMOVIEobj.MovieMyformat = myformat wx.PostEvent(self.parent, EVT_HITMOVIEobj) else: self.log.write(u'新規データはありませんでした。') self.checkdiscontinue() api = nicoAPI.Nicovideo() login = api.logintest(ID=INFO.nico_id, PW=INFO.nico_pw) if not login: self.log.write(u'ニコニコ動画にログインできませんでした。') self.stop = True self.checkdiscontinue() """ RSSチェック *ライブラリ登録 """ for mylist_obj in FORMATS.getAllMylistMyformat(): if mylist_obj.rss: self.log.write(u'RSS: %s' % mylist_obj.ID) try: appended = self.various.rsscheck(mylist_obj) if type(appended) != bool: for item in appended: EVT_HITMOVIEobj.MovieMyformat = item wx.PostEvent(self.parent, EVT_HITMOVIEobj) except EOFError: pass self.checkdiscontinue() continue """ *DL対象を決定 """ for item in FORMATS.getAllMovieMyformat(): if item.state == False: dllist.append(item) else: continue dllist.sort(cmp=self.movieIDcmp) self.checkdiscontinue() """DL""" for movieobj in dllist: api = nicoAPI.Nicovideo(movie_id=movieobj.ID, mylist_id=movieobj.mylist_id) """情報登録""" # タイトル title = api.get_movie_title() self.log.write_1(movieobj.ID, title) self.st_title.SetLabel(title) FORMATS.rewrite(myformat=movieobj, factor='title', value=title) self.checkdiscontinue() # """保存""" # 保存場所決定 subfolder = os.path.join(_CDIR, _SUBFOLDER) if not os.path.exists(subfolder): os.mkdir(subfolder) savedir = INFO.savedir if movieobj.mylist_id: # マイリストが登録されていたら mylisttitle = self.various.filenamecheck(FORMATS.getMylistMyformat(movieobj.mylist_id).title) try: savedir = os.path.join(savedir, mylisttitle) except TypeError: # マイリス名がう上手く保存されていなかった self.various.reloadmylistdata(FORMATS.getMylistMyformat(movieobj.mylist_id)) try: savedir = os.path.join(savedir, mylisttitle) except TypeError: # やり直してもだめだったら savedir = INFO.savedir if not os.path.exists(savedir): # フォルダを作成 os.makedirs(savedir) """それぞれ一時フォルダに保存""" # 動画 strage = api.get_storageURL(nicovideo_id=INFO.nico_id, nicovideo_pw=INFO.nico_pw) # ログイン opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookielib.CookieJar())) req = urllib2.Request("https://secure.nicovideo.jp/secure/login") req.add_data(urllib.urlencode({"mail":INFO.nico_id, "password":INFO.nico_pw})) opener.open(req) opener.open("http://www.nicovideo.jp/watch/"+movieobj.ID) res = opener.open(strage) moviename = self.various.filenamecheck(movieobj.title+'.'+res.info().getsubtype()) moviepath = os.path.join(subfolder, moviename) self.checkdiscontinue() ## # 動画サイズ取得 if strage.find('low') == -1: # 画質high size = api.get_movie_size_high() elif strage.find('low') > -1: # 画質low size = api.get_movie_size_low() starttime = int(time.clock()) spead = ptime = 0 ff = open(moviepath, 'wb') try: layout = False while int(ff.tell()) < size: self.checkdiscontinue() ## ff.write(res.read(_BUFFERSIZE)) par = (float(ff.tell())/float(size))*100 runningtime = int(time.clock())- starttime if runningtime > 0: spead = int(ff.tell())/runningtime ptime = (size-int(ff.tell()))/spead/60.0 else: ptime = 0.00 if ptime >= 1: self.st_time.SetLabel(u'残り%.2f分' % ptime) elif 0 <= ptime < 1: ptime *= 60.0 self.st_time.SetLabel(u'残り%.0f秒' % ptime) self.frame.SetStatusText(u'%s/%s %.2f%%'%(ff.tell(), size, par)) if not layout: self.Layout() layout = True del runningtime, spead, ptime self.st_time.SetLabel(u'') finally: ff.close() # サムネ thumbnailpath = api.save_thumbnail(subfolder, self.various.filenamecheck(movieobj.title)) self.checkdiscontinue() ## # コメント commentpath = api.save_comment(INFO.nico_id, INFO.nico_pw, subfolder, self.various.filenamecheck(movieobj.title), fig=1000) self.checkdiscontinue() ## # 説明 description = api.get_movie_description() self.checkdiscontinue() ## """保存フォルダに移動""" pathes = [moviepath, thumbnailpath, commentpath] count = 0 for old in pathes: _, name = os.path.split(old) new = os.path.join(savedir, name) if os.path.exists(new): # 同名ファイルがあったら削除 os.remove(new) os.rename(old, new) pathes[count] = new #self.log.write(u'移動(%s\n-> %s)' % (str(old), str(new)) count += 1 moviepath, thumbnailpath, commentpath = pathes """情報の書き換え""" FORMATS.rewrite(myformat=movieobj, factor='path', value=moviepath) FORMATS.rewrite(myformat=movieobj, factor='thumbnail', value=thumbnailpath) FORMATS.rewrite(myformat=movieobj, factor='size', value=size) FORMATS.rewrite(myformat=movieobj, factor='description', value=description) FORMATS.rewrite(myformat=movieobj, factor='state', value=True) EVT_FINISHDLobj.movie_id = movieobj.ID EVT_FINISHDLobj.mylist_id = movieobj.mylist_id EVT_FINISHDLobj.path = movieobj.path EVT_FINISHDLobj.thumbnail = movieobj.thumbnail EVT_FINISHDLobj.size = movieobj.size EVT_FINISHDLobj.description = movieobj.description EVT_FINISHDLobj.state = movieobj.state wx.PostEvent(self.parent, EVT_FINISHDLobj) ## #wx.PostEvent(self.parent, EVT_RELOADobj) ## self.checkdiscontinue() ## """メール送信""" if self.cb.GetValue(): self.sendmail = Sendmail.nicodl_sendmail(INFO.gmail_id, INFO.gmail_pw, INFO.toaddr) self.sendmail.main("".join([title, "\n\n", description]), movieobj.ID) time.sleep(_WAITTIME) wx.PostEvent(self.parent, EVT_RELOADobj) # self.running = False self.call() except DownloadDiscontinueException: return False except urllib2.URLError: self.log.write(u'エラーが発生しました。初めからやり直します。') self.running = False self.call()
def download(self): u""" *ダウンロードの全体を統括する関数. *一通り終わったら、ループせずにself.running=Falseにする """ self.DLstart() nicodl = DL.nicoDL_DL(self.infofile_dir) various = Various.nicoDL_Various(self.libfile_dir) while True: try: print u'Gmailにアクセスしています...' myformat = nicodl.geturl() # Gmailチェック self.SetStatusText(u'Gmailにログイン') break except: self.SetStatusText(u'Gmailにログインできませんでした...') myformat = False break #print "myformat:", myformat if myformat == False: pass # Gamilが空 else: # library_ALL.ndl に追加 various.write_library(myformat) while True: if self.checkdir(self.savedir): self.savedir = self.checkdir(self.savedir) break else: # 空き容量不足でループをリセット print u"空き容量不足:\n ->%s" % self.savedir time.sleep(3) self.DLstop() if not self.running: return continue print self.savedir, u"に保存" if not self.running: return # RSS print u"RSSチェック中..." self.SetStatusText(u"RSSチェック中...") various.rsscheck() self.SetStatusText(u"RSSチェック完了") print u"RSSチェック完了!" """DL部分""" # 動画IDが保存されていない if various.getmovieIDs() == []: self.DLstop() wx.PostEvent(self, self.startevt) return # DL対象を決定 movies = [] for item in various.getmovieIDs(): if not (various.pickup(movie_id=item, choice='state')): movies.append(item) for movie in movies: if not self.running: return movie_obj = various.pickup(movie_id=movie) # obj if movie_obj.mylist_id != False: # マイリスから mylistflag = movie_obj.mylist_id nico = Nicovideo.Nicovideo(movie_id=movie_obj.movie_id, mylist_id=movie_obj.mylist_id) else: # マイリスからじゃない mylistflag = False nico = Nicovideo.Nicovideo(movie_id=movie_obj.movie_id) # 情報取得 if movie_obj.movie_name: title = movie_obj.movie_name else: title = nico.get_movie_title() self.movie_name_st.SetLabel(title) # 動画名セット description = nico.get_movie_description() # self.myprint(movie_obj.movie_id, title) # 終了時間計算 length = nico.get_movie_length() minute = int(length.split(':')[0]) second = int(length.split(':')[1]) now = datetime.datetime.now() end = now + datetime.timedelta(minutes=minute, seconds=second) end = end.strftime(u'%m/%d %H:%M') self.myprint(movie_obj.movie_id, "".join([end, u"頃終了します."])) # サムネ保存 self.myprint(movie_obj.movie_id, u" サムネイル取得中...") self.SetStatusText(u'サムネイル取得中...') thumbnail = nico.save_thumbnail(os.path.join(self.cwd, "data\\thumbnail")) # 動画保存 self.myprint(movie_obj.movie_id, u" 動画取得中...") self.SetStatusText(u'動画取得中...') self.SetTitle(u'%s - %s - %s' % (self.windowtitle, movie_obj.movie_id, end)) try: movie_path = self.movie_dl(myformat=movie_obj, mylist_id=mylistflag) except DownloadInterraptionException: print 'download() raise DLExcept' self.DLstop() return self.myprint(movie_obj.movie_id, "".join([u" 動画取得完了!"]))#, "\n =>", movie_path])) # コメント保存 self.myprint(movie_obj.movie_id, u" コメント取得中...") self.SetStatusText(u'コメント取得中...') ff = open(os.path.splitext(movie_path)[0] + '.xml', 'w') ff.write(nico.get_comment(self.nico_id, self.nico_pw, 1000)) ff.close() # 情報書き換え self.myprint(movie_obj.movie_id, u"情報を更新します...") various.rewrite_library(factor="thumbnail", value=thumbnail, movie_id=movie_obj.movie_id) various.rewrite_library(factor="state", value=True, movie_id=movie_obj.movie_id) various.rewrite_library(factor="movie_path", value=movie_path, movie_id=movie_obj.movie_id) # マイリスが登録されていたらそのマイリスのDL済みに追加 if movie_obj.mylist_id != False: ed = various.pickup(mylist_id=movie_obj.mylist_id, choice='downloaded') if not(movie_obj.movie_id in ed): # 入ってないとき various.rewrite_library(factor="downloaded", value=movie_obj.movie_id, mylist_id=movie_obj.mylist_id) # メール送信 if self.mailcheck: self.myprint(movie_obj.movie_id, u" 完了メール送信") mail = SendMail.nicodl_sendmail(self.gmail_id, self.gmail_pw, self.toaddr) mail.main("".join([title, "\n\n", description]), movie_obj.movie_id) #nicodl.extention() # 拡張 #break print u"次..." time.sleep(3) self.DLstop() print u'1セット終了' for i in xrange(300, 0): self.SetStatusText(u'待機中...残り%i秒' % i) time.sleep(1) wx.PostEvent(self, self.finishevt) wx.PostEvent(self, self.startevt)