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 _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")
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")
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!"))
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"))
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)
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
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
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
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])
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
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()
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)
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"))
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, )))
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
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
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
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
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"))
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)
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 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
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
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)
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
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
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
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 _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')