Пример #1
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
Пример #2
0
  def _save(self):
    if self.isComplete():
      hcode = self.currentHookCode()
      th = texthook.global_()
      old_hcode = th.currentHookCode()
      if hcode == old_hcode:
        growl.msg(my.tr("Hook code is not changed"))
        self._saveButton.setEnabled(False)
        skqss.class_(self._hookEdit, 'normal')
      else:
        self._addHookToHistory(hcode)
        if old_hcode:
          growl.notify(my.tr("Override previous hook code") + "<br/>" + old_hcode)
        if th.setHookCode(hcode):
          #self.q.hide()
          growl.msg(my.tr("Hook code saved"))
          self._saveButton.setEnabled(False)
          skqss.class_(self._hookEdit, 'normal')
          self.q.hookCodeEntered.emit(hcode)
        else:
          growl.error(my.tr("Hook code does not work with the current game"))
          self._saveButton.setEnabled(False)
          skqss.class_(self._hookEdit, 'error')

    hooked = bool(texthook.global_().currentHookCode())
    self._deleteButton.setEnabled(hooked)
    dprint("pass")
Пример #3
0
    def _save(self):
        if not self._canSave():
            return
        q = self.q

        tm = textman.manager()

        agent = gameagent.global_()
        engine = agent.engine()
        engineName = defs.to_ith_engine_name(engine)

        scenesig = self._scenarioSignature()
        namesig = self._nameSignature()
        enc = self._encoding()
        lang = self._language()
        #threads = tm.threadsBySignature()
        changed = False
        if scenesig:
            if lang != tm.gameLanguage():
                dprint("language changed")
                changed = True
                skevents.runlater(partial(q.languageChanged.emit, lang))
            if scenesig != self._lastScenarioSignature or enc != self._lastEncoding:
                dprint("scenario thread changed")
                changed = True
                self._lastScenarioSignature = scenesig
                self._lastEncoding = enc
                agent.setEncoding(enc)
                agent.setScenarioSignature(scenesig)
                #name = threads[sig].name
                skevents.runlater(
                    partial(q.scenarioThreadChanged.emit, scenesig, engineName,
                            enc))

        if namesig != self._lastNameSignature:
            dprint("name thread changed")
            changed = True
            self._lastNameSignature = namesig
            agent.setNameSignature(namesig)
            if not namesig:
                skevents.runlater(q.nameThreadDisabled.emit)
            else:
                #name = threads[namesig].name
                skevents.runlater(
                    partial(q.nameThreadChanged.emit, namesig, engineName))

        #sig_set = set(self._otherSignatures())
        #if sig_set != tm.otherSignatures():
        #  dprint("other threads changed")
        #  changed = True
        #  skevents.runlater(partial(
        #      q.otherThreadsChanged.emit,
        #      {sig:threads[sig].name for sig in sig_set}))

        msg = (my.tr("Text settings are saved")
               if changed else my.tr("Text settings are not changed"))
        q.message.emit(msg)
        growl.msg(msg)

        dprint("pass")
Пример #4
0
 def _delete(self):
   #self._hookEdit.clear()
   self._hookEdit.clearEditText()
   self._refresh()
   texthook.global_().clearHookCode()
   self.q.hookCodeDeleted.emit()
   growl.msg(my.tr("User-defined hook removed!"))
Пример #5
0
    def _save(self):
        post = {}
        post['content'] = self.postContent = self._getContent()
        post['lang'] = self.postLanguage = self._getLanguage()

        #import dataman
        #user = dataman.manager().user()
        #post['login'] = user.name
        #post['pasword'] = user.password

        if post['content']:
            imageData = ''
            if self.imagePath:
                imageTitle = self._getImageTitle()
                if imageTitle:
                    image = {
                        'filename': self.imagePath,
                        'title': imageTitle,
                        'size': skfileio.filesize(self.imagePath),
                    }
                    imageData = json.dumps(image)

            if self.topicId:
                post['topic'] = self.topicId
            if self.replyId:
                post['reply'] = self.replyId
            post['type'] = self.postType
            postData = json.dumps(post)
            self.q.postReceived.emit(postData, imageData)
            #self.postContent = '' # clear content but leave language

            growl.msg(my.tr("Edit submitted"))
Пример #6
0
def open_url(url):
    """
  @param  url  str or QUrl
  @return  if succeed

  See: http://pythonconquerstheuniverse.wordpress.com/2010/10/16/how-to-open-a-web-browser-from-python/
  """
    # jichi 9/26/2013 FIXME: Neither QDesktopServices nor webbrowser work on wine
    # More than that, they will hang VNR ><
    #dprint("url = %s" % url)
    dprint(url)
    if isinstance(url, QtCore.QUrl):
        t = url.toString()
        _clip(t)
    else:
        t = url
        _clip(t)
    if proxy.manager().isBlockedUrl(t):
        growl.msg(
            my.tr("Open in VNR's browser for sites that might be blocked"))
        from scripts import browser
        browser.open(t)
    elif features.WINE:
        dwarn("disabled under wine")  # this will hang several seconds on wine
        #if isinstance(url, QtCore.QUrl):
        #  url = url.toString()
        #os.startfile(url)
    else:
        growl.msg(mytr_("Open in external browser"))
        QDesktopServices.openUrl(url)
Пример #7
0
 def yukariEngine(self):
   if not self._yukariEngine:
     ss = settings.global_()
     eng = self._yukariEngine = _ttsman.YukariEngine(path=ss.yukariLocation())
     ss.yukariLocationChanged.connect(eng.setPath)
     growl.msg(' '.join((
       my.tr("Load TTS"),
       eng.name,
     )))
   return self._yukariEngine
Пример #8
0
    def thread(cls):  # -> OnlineThread not None
        if not cls._thread:
            t = cls._thread = OnlineThread()
            t.start()

            from PySide.QtCore import QCoreApplication
            qApp = QCoreApplication.instance()
            qApp.aboutToQuit.connect(t.destroy)

            growl.msg(my.tr("Load {0} for TTS").format("Windows Media Player"))
        return cls._thread
Пример #9
0
 def _onAgentPing(self, socket, pid):
     """
 @param  socket  QTcpSocket
 @param  pid  long
 """
     growl.msg(my.tr("Window text translator is loaded"))
     if self.agentSocket:
         self.server.closeSocket(self.agentSocket)
     self.agentPid = pid
     self.agentSocket = socket
     self.q.agentConnected.emit(pid)  # SIGNAL TO BE CHANGED
Пример #10
0
 def get(self, vid):
     """
 @param  vid  str  youtube id
 """
     dprint(vid)
     import prompt
     if prompt.confirmDownloadGameVideo():
         #growl.msg("%s YouTube(%s) ..." % (my.tr("Downloading to Desktop"), vid))
         growl.msg(my.tr("Downloading YouTube video to Desktop") + " ...")
         import procutil
         procutil.getyoutube([vid])
Пример #11
0
 def zunkoEngine(self):
     if not self._zunkoEngine:
         ss = settings.reader()
         eng = self._zunkoEngine = _ttsman.ZunkoEngine(
             path=ss.zunkoLocation())
         ss.zunkoLocationChanged.connect(eng.setPath)
         growl.msg(' '.join((
             i18n.tr("Load TTS"),
             eng.name,
         )))
     return self._zunkoEngine
Пример #12
0
 def _save(self):
     vids = list(self._iterVids())
     if not vids:
         growl.warn(my.tr("Not found YouTube videos"))
     else:
         growl.msg(my.tr("Found {0} YouTube videos").format(len(vids)))
         path = skpaths.DESKTOP
         if len(vids) > 1:
             path = os.path.join(path, 'YouTube')
         procutil.getyoutube(vids, path=path)
         self.q.hide()
Пример #13
0
    def saveVideos(self):  # prompt and save all youtube videos to the desktop
        if not self.info or not self.info.hasVideos():
            growl.warn(my.tr("Please try updating game database first"))
        elif prompt.confirmDownloadGameVideos():
            growl.msg(my.tr("Downloading YouTube videos") + " ...")
            from sakurakit import skfileio, skpaths
            name = u"%s (動画)" % skfileio.escape(self.info.title)
            path = os.path.join(skpaths.DESKTOP, name)
            videos = list(self.info.iterVideoIds())

            import procutil
            procutil.getyoutube(videos, path=path)
Пример #14
0
 def setEnabled(self, t):
   d = self.__d
   if d.enabled != t:
     d.enabled = t
     dprint(t)
     d.mouseSelector.setEnabled(t)
     d.updateOcrWindowTimer()
     #d.keyboardSignal.setEnabled(t)
     if t:
       growl.msg(my.tr("Start OCR screen reader"))
     else:
       growl.msg(my.tr("Stop OCR screen reader"))
Пример #15
0
 def run(self):
     e = self.engine
     if e:
         growl.msg(' '.join((
             my.tr("Activate Voiceroid+"),
             self.name,
         )))
         e.run()
     else:
         growl.warn(' '.join((
             my.tr("Cannot find Voiceroid+"),
             self.name,
         )))
Пример #16
0
 def zhtenEngine(self):
     from kingsoft import fastait
     ret = fastait.create_engine(fr='zht', to='en')
     ok = ret.load()
     #import atexit
     #atexit.register(ret.destroy)
     if ok:
         growl.msg(i18n.tr("FastAIT Chinese-English translator is loaded"))
     else:
         growl.error(
             i18n.
             tr("Cannot load {0} for machine translation. Please check Preferences/Location"
                ).format(mytr_("FastAIT")))
     return ret
Пример #17
0
 def ecEngine(self):
     from dreye import dreyemt
     ret = dreyemt.create_engine('en')
     ok = ret.load()
     #import atexit
     #atexit.register(ret.destroy)
     if ok:
         growl.msg(i18n.tr("Dr.eye English-Chinese translator is loaded"))
     else:
         growl.error(
             i18n.
             tr("Cannot load {0} for machine translation. Please check Preferences/Location"
                ).format(i18n.tr("Dr.eye")))
     return ret
Пример #18
0
 def createengine():
     from lec import powertrans
     ret = powertrans.create_engine()
     ok = ret.load()
     #import atexit
     #atexit.register(ret.destroy)
     if ok:
         growl.msg(i18n.tr("LEC translator is loaded"))
     else:
         growl.error(
             i18n.
             tr("Cannot load {0} for machine translation. Please check Preferences/Location"
                ).format(i18n.tr("LEC")))
     return ret
Пример #19
0
 def createengine():
     from eztrans import eztrans
     ret = eztrans.create_engine()
     ok = ret.load()
     #import atexit
     #atexit.register(ret.destroy) # not needed by eztrans
     if ok:
         growl.msg(i18n.tr("ezTrans XP is loaded"))
     else:
         growl.error(
             i18n.
             tr("Cannot load {0} for machine translation. Please check Preferences/Location"
                ).format(i18n.tr("ezTrans XP")))
     return ret
Пример #20
0
    def _save(self):
        if not self.subjectId or not self.subjectType:
            return
        topic = {}
        topic['title'] = self.topicContent = self._getTitle()
        topic['content'] = self.topicContent = self._getContent()
        topic['lang'] = self.topicLanguage = self._getLanguage()

        if self.topicType == 'review':
            topic['type'] = self.topicType
        else:
            topic['type'] = self._getType()

        #import dataman
        #user = dataman.manager().user()
        #topic['login'] = user.name
        #topic['pasword'] = user.password

        if topic['content'] and topic['title']:
            imageData = ''
            if self.imagePath:
                imageTitle = self._getImageTitle()
                if imageTitle:
                    image = {
                        'filename': self.imagePath,
                        'title': imageTitle,
                        'size': skfileio.filesize(self.imagePath),
                    }
                    imageData = json.dumps(image)

            topic['subjectId'] = self.subjectId
            topic['subjectType'] = self.subjectType

            topicData = json.dumps(topic)

            ticketData = ''
            if self.topicType == 'review':
                tickets = {}
                for k, v in self.scoreEdits.iteritems():
                    score = v.value()
                    if score:
                        tickets[k] = score
                if tickets:
                    ticketData = json.dumps(tickets)
            self.q.topicReceived.emit(topicData, imageData, ticketData)
            #self.topicContent = '' # clear content but leave language

            growl.msg(my.tr("Edit submitted"))
Пример #21
0
 def saveImages(self):  # prompt and save all images to the desktop
     if not self.info:
         growl.warn(my.tr("Please try updating game database first"))
     elif prompt.confirmDownloadGameImages():
         growl.msg(my.tr("Saving game images") + " ...")
         from sakurakit import skfileio, skpaths
         name = u"%s (画像)" % skfileio.escape(self.info.title)
         path = os.path.join(skpaths.DESKTOP, name)
         try:
             skfileio.makedirs(path)
             images = [(url, os.path.join(path, name + '.jpg'))
                       for url, name in self.info.iterImageUrlsWithName()]
             skthreads.runasync(partial(_getimages, images, path=path))
         except Exception, e:
             growl.warn(my.tr("Failed to save all images"))
             dwarn(e)
Пример #22
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
Пример #23
0
    def createengine(cls, volume):
        #import settings
        #from sakurakit import skpaths
        #skpaths.prepend_path(settings.global_().zunkoLocation())

        from voiceroid.zunko import ZunkoTalk
        #AUDIO_BUFFER_SIZE = 0x1000000 # 1MB, default is 0x158880 == 159k
        #AUDIO_BUFFER_SIZE = 0x500000 # 0.5MB
        AUDIO_BUFFER_SIZE = 0x300000  # 0.3MB
        ret = ZunkoTalk(volume=volume, audioBufferSize=AUDIO_BUFFER_SIZE)
        ok = ret.load()
        if ok:
            growl.msg(my.tr("Load {0}").format(cls.name))
        else:
            growl.error(
                my.tr("Failed to load {0}. Please check Preferences/Location").
                format(cls.name))
        return ret
Пример #24
0
    def createengine():
        from jbeijing import jbeijing
        ret = jbeijing.create_engine()
        ok = ret.load()
        #import atexit
        #atexit.register(ret.destroy)
        if ok:
            growl.msg(i18n.tr("JBeijing translator is loaded"))

            def _filter(path):
                return bool(path) and os.path.exists(path + '.dic')

            paths = jbeijing.userdic()
            paths.extend(config.JCUSERDIC_LOCATIONS)
            paths = filter(_filter, paths)
            paths = paths[:3]  # at most 3 dictionaries

            ok = ret.setUserDic(paths)

            def _tidy(path):
                path = os.path.dirname(path)
                d = os.path.basename(path)
                path = os.path.dirname(path)
                dd = os.path.basename(path)
                path = os.path.dirname(path)
                ddd = os.path.basename(path)
                return "* " + '/'.join((ddd, dd))

            if ok:
                dics = '<br/>'.join(imap(_tidy, paths))
                #dics = dics.replace('@Goodboyye','@goodboyye').replace('@Hdgdyl','@好大個的鴨梨').replace('@Zhugeqiu', '@諸葛秋')
                growl.msg('<br/>'.join(
                    (i18n.tr("Load user-defined dictionaries") + ":", dics)))
            else:
                dics = '<br/>'.join(imap(_tidy, jbeijing.userdic()))
                growl.error('<br/>'.join(
                    (i18n.tr("Failed to load user-defined dictionaries") + ":",
                     dics)))
        else:
            growl.error(
                i18n.
                tr("Cannot load {0} for machine translation. Please check Preferences/Location"
                   ).format(i18n.tr("JBeijing")))
        return ret
Пример #25
0
    def _onCall(self, socket, cmd, *params):  # on serverMessageReceived
        """
    @param  socket  QTcpSocket
    @param  cmd  str
    @param  params  [unicode]
    """
        dprint(cmd)
        if cmd == 'app.activate':
            self.q.activated.emit()

        elif cmd == 'growl.msg':
            if params:
                growl.msg(params[0])
        elif cmd == 'growl.warn':
            if params:
                growl.warn(params[0])
        elif cmd == 'growl.error':
            if params:
                growl.error(params[0])
        elif cmd == 'growl.notify':
            if params:
                growl.notify(params[0])

        elif cmd == 'agent.ping':
            if params:
                pid = _unmarshalInteger(params[0])
                if pid:
                    self._onAgentPing(socket, pid)
        elif cmd == 'agent.window.text':
            if params:
                self._onWindowTexts(params[0])
        elif cmd == 'agent.engine.name':
            if params:
                self.q.engineReceived.emit(params[0])
        elif cmd == 'agent.engine.text':
            if len(params) == 5:
                self._onEngineText(*params)
            else:
                dwarn("invalid parameter count:", params)

        else:
            dwarn("unknown command: %s" % cmd)
Пример #26
0
 def getSapiEngine(self, key):
     ret = self._sapiEngines.get(key)
     if not ret:
         ret = _ttsman.SapiEngine(
             key=key,
             speed=self.getSpeed(key),
             pitch=self.getPitch(key),
         )
         if ret.isValid():
             growl.msg(' '.join((
                 i18n.tr("Load TTS"),
                 ret.name,
             )))
             self._sapiEngines[key] = ret
         else:
             growl.warn(' '.join((
                 i18n.tr("Failed to load TTS"),
                 key,
             )))
             ret = None
     return ret
Пример #27
0
 def getOnlineEngine(self, key):
   ret = self._onlineEngines.get(key)
   if not ret and key in _ttsman.ONLINE_ENGINES:
     ret = _ttsman.OnlineEngine.create(key)
     if ret:
       ret.speed = self.getSpeed(key)
       ret.pitch = self.getPitch(key)
       ret.volume = self.getVolume(key)
       ret.gender = self.getGender(key)
     if ret and ret.isValid():
       self._onlineEngines[key] = ret
       growl.msg(' '.join((
         my.tr("Load TTS"),
         ret.name,
       )))
     else:
       ret = None
       growl.warn(' '.join((
         my.tr("Failed to load TTS"),
         key,
       )))
   return ret
Пример #28
0
 def getSapiEngine(self, key):
   ret = self._sapiEngines.get(key)
   if not ret:
     ret = _ttsman.SapiEngine(key=key,
       speed=self.getSpeed(key),
       pitch=self.getPitch(key),
       volume=self.getVolume(key),
       #gender=self.getGender(key),
     )
     if ret.isValid():
       self._sapiEngines[key] = ret
       growl.msg(' '.join((
         my.tr("Load TTS"),
         ret.name,
       )))
     else:
       ret = None
       growl.warn(' '.join((
         my.tr("Failed to load TTS"),
         key,
       )))
   return ret
Пример #29
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))
Пример #30
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')