def abort(self): dprint('enter') msg = self.reply.errorString() if self.reply else '' self._removeTmpFile() self.stop() self.q.aborted.emit() growl.warn("[download] %s: %s" % (my.tr("error"), msg or my.tr("unknown error"))) growl.warn("[download] %s" % my.tr("abort")) dprint('leave:', msg)
def _retry(self): if not self._quited: if self._cvid: self._retryCount += 1 if self._retryCount > _MAX_RETRIES: growl.error("[main] %s (%i/%i)" % (my.tr("too many retries"), _MAX_RETRIES, _MAX_RETRIES)) self._failedVids.append(self._cvid) else: growl.warn("[main] %s (%i/%i)" % (my.tr("retry"), self._retryCount, _MAX_RETRIES)) self.vids.insert(0, self._cvid) self._next()
def _save(self, url, name): """ @param url QString @param name QString """ if url in self._visitedUrls: growl.warn(("[main] %s: %s" % (my.tr("pass"), url))) else: self._visitedUrls.add(url) growl.notify("[main] %s: %s" % (my.tr("download"), name)) growl.notify("[main] %s: %s" % (my.tr("url"), url)) self._cpath = os.path.join(self.location, name) self.downloader.get(url, self._cpath)
def _progress(self, availableBytes, totalBytes): """ @param availableBytes long @param totalBytes long """ if totalBytes: now = skdatetime.current_unixtime() if availableBytes == totalBytes or now > self._progressTime + _PROGRESS_INTERVAL: percent = '{0:.1f}%'.format(100 * availableBytes / float(totalBytes)) eta = '' if self._progressTime and now != self._progressTime: kbps = (availableBytes - self._progressBytes) / ( 1024.0 * (now - self._progressTime)) # KBps speed = ' {0:.1f}KBps'.format(kbps) # leading space if kbps: seconds = (totalBytes - availableBytes) / (kbps * 1024.0) if seconds < 90: eta = ' ETA {0:.1f}sec'.format( seconds) # leading space else: minutes = seconds / 60.0 eta = ' ETA {0:.1f}min'.format( minutes) # leading space else: speed = "" msg = "%s %i/%i%s%s" % (percent, availableBytes, totalBytes, speed, eta) dprint(msg) growl.msg("[download] %s: %s" % (my.tr("progress"), msg)) self.q.progress.emit(availableBytes, totalBytes) self._progressTime = now self._progressBytes = availableBytes
def finish(self): dprint('enter') self.writeFile() # write for the last chunk self.stop() growl.notify("[download] %s" % my.tr("clean up")) self.q.finished.emit() dprint('leave')
def openFile(self, path): """ @param path unicode @return bool """ dprint('enter:', path) growl.msg("[download] %s: %s" % (my.tr("create file"), path)) self.path = path try: self.file = open(self.tmpPath, 'wb') ok = True except IOError, e: growl.error("[download] %s: %s" % (my.tr("failed to create file"), path)) dwarn(e) ok = False
def textEdit(self): ret = QtWidgets.QPlainTextEdit() ret.setToolTip(my.tr("Messages")) #ret.setAcceptRichText(True) ret.setReadOnly(True) skqss.class_(ret, 'texture') return ret
def _finish(self): if self._failedVids: growl.pageBreak() growl.error("[main] %s: %s" % (my.tr("failed videos"), ", ".join(self._failedVids))) else: skos.open_location(self.location) self.quit()
def _continue(self): if self._cvid and self._cpath and not _is_good_video(self._cpath): if os.path.exists(self._cpath): growl.warn("[main] %s: %s" % (my.tr("remove failed file"), self._cpath)) skfileio.removefile(self._cpath) self._retry() else: self._next()
def addressEdit(self): t = my.tr("Connecting to {0}").format('www.clipconverter.com') ret = QtWidgets.QLineEdit(t) #skqss.class_(ret, 'texture text-info') skqss.class_(ret, 'texture') ret.setPlaceholderText(t) ret.setReadOnly(True) return ret
def confirmQuit(): """ @return bool """ from PySide.QtCore import QCoreApplication appName = QCoreApplication.instance().applicationName() return Yes == QMessageBox.question(_parent(), appName, my.tr("Quit {0}?").format(appName), Yes | No, No)
def __init__(self, argv): super(Application, self).__init__(argv) self.setApplicationName(my.tr("YouTube Downloader")) #self.setApplicationVersion(str(config.VERSION_TIMESTAMP)) #self.setOrganizationName(config.VERSION_ORGANIZATION) #self.setOrganizationDomain(config.VERSION_DOMAIN) dprint("pass")
def start(self): self.reply = self.nam.get(self.request) self.reply.error.connect(self.abort) self.reply.readyRead.connect(self.writeFile) self.reply.finished.connect(self.finish) self.reply.downloadProgress.connect( self._progress) # FIXME: cannot directly connect to q growl.notify("[download] %s" % my.tr("start")) self.q.started.emit() dprint('pass') return True
def closeFile(self): """ @return bool """ dprint('enter') ok = False if self.file: growl.msg("[download] %s" % my.tr("closing file")) try: self.file.close() if self.path and os.path.exists(self.path): growl.notify("[download] %s: %s" % (my.tr("remove existing file"), self.path)) dprint("remove existing file:", self.path) skfileio.trashfile(self.path) ok = skfileio.rename(self.tmpPath, self.path) except IOError, e: dwarn(e) self.file = None if not ok: growl.msg("[download] %s: %s" % (my.tr("failed to close file"), self.path))
def _next(self): """Download first vids""" dprint("enter: vids count = %i" % len(self.vids)) if self.vids: growl.pageBreak() self._cvid = self.vids.pop(0) index = self._vidCount - len(self.vids) growl.notify("[main] %s (%i/%i): %s" % (my.tr("processing"), index, self._vidCount, self._cvid)) self.solver.solve(self._cvid) else: self._finish() dprint("leave")
def _onLoadFinished(self, ok): """ @param ok bool """ #js = "document.getElementById('converter').submit()" # Do not work well if not ok: dwarn("load failure") growl.warn("[solve] %s" % my.tr("waiting for the video page to be ready")) #self.q.aborted.emit() else: title = self.webView.title() if not title: dprint('ignore titleless empty page') else: dprint(title) growl.msg("[solve] %s: %s" % (my.tr("loading"), title.replace(' - ClipConverter.cc', ''))) if title.startswith("Conversion:"): dprint("conversion") elif title == 'YouTube Video Converter and Download - ClipConverter.cc': js = "$('#0').attr('checked', true);$('#converter').submit(); null" self.evaljs(js) elif title.endswith(' - ClipConverter.cc'): name = title.replace(' - ClipConverter.cc', '') js = "$('#downloadbutton').attr('href')" url = self.evaljs(js) if url and isinstance(url, unicode) and url.startswith("http://"): dprint("solved:", url) self.q.urlSolved.emit(url, name) else: growl.warn("[solve] %s" % my.tr("failed to convert video format, abort")) growl.error("[solve] %s" % my.tr("abort")) self.q.aborted.emit() # (14%) Waiting_ [Comfort Women Song] 韓国人慰安婦の歌.mp4 #elif title.startswith('('): else: dprint('ignored')
def debugButton(self): ret = QtWidgets.QPushButton(my.tr("Debug")) ret.setToolTip(my.tr("Show debugging window")) skqss.class_(ret, 'btn btn-inverse') return ret
def start(self): """Start downloading vids """ growl.msg("[main] %s: %s" % (my.tr("directory to save"), self.location)) growl.msg("[main] %s (%s): %s" % (my.tr("vids to download"), len(self.vids), ", ".join(self.vids))) self._next()