Пример #1
0
 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)
Пример #2
0
 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()
Пример #3
0
 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)
Пример #4
0
 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
Пример #5
0
 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')
Пример #6
0
 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
Пример #7
0
 def textEdit(self):
     ret = QtWidgets.QPlainTextEdit()
     ret.setToolTip(my.tr("Messages"))
     #ret.setAcceptRichText(True)
     ret.setReadOnly(True)
     skqss.class_(ret, 'texture')
     return ret
Пример #8
0
 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()
Пример #9
0
 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()
Пример #10
0
 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
Пример #11
0
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)
Пример #12
0
  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")
Пример #13
0
 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
Пример #14
0
 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))
Пример #15
0
 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")
Пример #16
0
 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')
Пример #17
0
 def debugButton(self):
     ret = QtWidgets.QPushButton(my.tr("Debug"))
     ret.setToolTip(my.tr("Show debugging window"))
     skqss.class_(ret, 'btn btn-inverse')
     return ret
Пример #18
0
 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()