Beispiel #1
0
    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()
Beispiel #2
0
    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)