def load_cookies(self): try: with open(DATA_PATH + self.cookies_filename) as f: data_str = f.read() self.cookies = json.loads(data_str) except Exception as e: LOG.error(str(e))
def keyboard_tap_callback(proxy, type_, event, refcon): from AppKit import NSKeyUp, NSEvent if type_ < 0 or type_ > 0x7fffffff: LOG.error('Unkown mac event') run_event_loop() LOG.error('restart mac key board event loop') return event try: key_event = NSEvent.eventWithCGEvent_(event) except: LOG.info("mac event cast error") return event if key_event.subtype() == 8: key_code = (key_event.data1() & 0xFFFF0000) >> 16 key_state = (key_event.data1() & 0xFF00) >> 8 if key_code in (16, 19, 20): # 16 for play-pause, 19 for next, 20 for previous if key_state == NSKeyUp: if key_code is 19: ControllerApi.player.play_next() elif key_code is 20: ControllerApi.player.play_last() elif key_code is 16: ControllerApi.player.play_or_pause() return None return event
def http_request(self, method, action, query=None, urlencoded=None, callback=None, timeout=1): try: res = None if method == "GET": res = requests.get(action, headers=self.headers, cookies=self.cookies, timeout=timeout) elif method == "POST": res = requests.post(action, query, headers=self.headers, cookies=self.cookies, timeout=timeout) elif method == "POST_UPDATE": res = requests.post(action, query, headers=self.headers, cookies=self.cookies, timeout=timeout) self.cookies.update(res.cookies.get_dict()) self.save_cookies() content = self.show_progress(res) content_str = content.decode('utf-8') content_dict = json.loads(content_str) return content_dict except Exception as e: LOG.error(str(e)) return {"code": 408}
def save_cookies(self): try: write_json_into_file(self.cookies, DATA_PATH + self.cookies_filename) LOG.info("Save cookies successfully") except Exception as e: LOG.error(str(e)) LOG.error("Save cookies failed")
def run_event_loop(): LOG.info("try to load mac hotkey event loop") import Quartz from AppKit import NSSystemDefined # Set up a tap, with type of tap, location, options and event mask tap = Quartz.CGEventTapCreate( Quartz.kCGSessionEventTap, # Session level is enough for our needs Quartz.kCGHeadInsertEventTap, # Insert wherever, we do not filter Quartz.kCGEventTapOptionDefault, # NSSystemDefined for media keys Quartz.CGEventMaskBit(NSSystemDefined), keyboard_tap_callback, None ) run_loop_source = Quartz.CFMachPortCreateRunLoopSource( None, tap, 0) Quartz.CFRunLoopAddSource( Quartz.CFRunLoopGetCurrent(), run_loop_source, Quartz.kCFRunLoopDefaultMode ) # Enable the tap Quartz.CGEventTapEnable(tap, True) # and run! This won't return until we exit or are terminated. Quartz.CFRunLoopRun() LOG.error('Mac hotkey event loop exit') return []
def http_request(self, method, action, query=None, urlencoded=None, callback=None, timeout=3): LOG.info('method=%s url=%s query=%s' % (method, action, query)) try: res = None if method == "GET": res = requests.get(action, headers=self.headers, cookies=self.cookies, timeout=timeout) elif method == "POST": res = requests.post(action, data=query, headers=self.headers, cookies=self.cookies, timeout=timeout) elif method == "POST_UPDATE": res = requests.post(action, data=query, headers=self.headers, cookies=self.cookies, timeout=timeout) self.cookies.update(res.cookies.get_dict()) content = show_requests_progress(res, self.signal_load_progress) content_str = content.decode('utf-8') content_dict = json.loads(content_str) return content_dict except Exception as e: LOG.error(str(e)) return {"code": 408}
def save_cookies(self): try: with open(DATA_PATH + "cookies.dat", "wb") as f: pickle.dump(self.cookies, f) return True except Exception as e: LOG.error(str(e)) return False
def load_cookies(self): try: with open(DATA_PATH + "cookies.data", "rb") as f: self.cookies = pickle.load(f) requests.session().cookies = self.cookies return True except Exception as e: LOG.error(str(e)) return False
def write_json_into_file(data_json, filepath): try: with open(filepath, "w") as f: data_str = json.dumps(data_json, indent=4) f.write(data_str) return True except Exception as e: LOG.error(str(e)) LOG.error("Write json into file failed") return False
def start(cls, port=12100): try: cls.sock.bind(('0.0.0.0', port)) cls.sock.listen(10) LOG.info("the cli server start at port %d" % port) cls.loop() except Exception as e: LOG.error(str(e)) port += 1 cls.start(port)
def post_and_updatecookies(self, url, data): try: res = requests.post(url, data=data, headers=self.headers, cookies=self.cookies) self.cookies.update(res.cookies.get_dict()) requests.session().cookies = self.cookies self.save_cookies() return res.json() except Exception as e: LOG.error(str(e)) return {"code": 408}
def post_and_updatecookies(self, url, data): try: res = requests.post(url, data=data, headers=self.headers, cookies=self.cookies) self.cookies.update(res.cookies.get_dict()) requests.session().cookies = self.cookies self.save_cookies() return res.json() except Exception as e: LOG.error(str(e)) return b'{"code": 408}'
def on_error_occured(self, error): self.pause() if error == 2 or error == 5: m = QMessageBox(QMessageBox.Warning, u"错误提示", "第一次运行出现该错误可能是由于缺少解码器,请参考项目主页\ https://github.com/cosven/FeelUOwn 安装依赖。\n 如果不是第一次运行,那就可能是网络已经断开,请检查您的网络连接", QMessageBox.Yes | QMessageBox.No) if m.exec() == QMessageBox.Yes: QApplication.quit() else: LOG.error(u'播放器出现error, 类型为' + str(error)) if error == 3 or error == 1: LOG.error(u'播放器出现错误。可能是网络连接失败,也有可能缺少解码器') return
def run_event_loop(player): LOG.info("try to load mac hotkey event loop") import Quartz from AppKit import NSKeyUp, NSSystemDefined, NSEvent def keyboard_tap_callback(proxy, type_, event, refcon): if type_ < 0 or type_ > 0x7fffffff: LOG.error('Unkown mac event') Quartz.CFRunLoopRun() return run_event_loop(ControllerApi.player) try: key_event = NSEvent.eventWithCGEvent_(event) except: LOG.info("mac event cast error") return event if key_event.subtype() == 8: key_code = (key_event.data1() & 0xFFFF0000) >> 16 key_state = (key_event.data1() & 0xFF00) >> 8 if key_code is 16 or key_code is 19 or key_code is 20: # 16 for play-pause, 19 for next, 20 for previous if key_state == NSKeyUp: if key_code is 19: player.play_next() elif key_code is 20: player.play_last() elif key_code is 16: player.play_or_pause() return None return event # Set up a tap, with type of tap, location, options and event mask tap = Quartz.CGEventTapCreate( Quartz.kCGSessionEventTap, # Session level is enough for our needs Quartz.kCGHeadInsertEventTap, # Insert wherever, we do not filter Quartz.kCGEventTapOptionDefault, # NSSystemDefined for media keys Quartz.CGEventMaskBit(NSSystemDefined), keyboard_tap_callback, None ) run_loop_source = Quartz.CFMachPortCreateRunLoopSource( Quartz.kCFAllocatorDefault, tap, 0) Quartz.CFRunLoopAddSource( Quartz.CFRunLoopGetCurrent(), run_loop_source, Quartz.kCFRunLoopDefaultMode ) # Enable the tap Quartz.CGEventTapEnable(tap, True) # and run! This won't return until we exit or are terminated. Quartz.CFRunLoopRun() LOG.error('Mac hotkey exit event ')
def get(self, url): """Load data from the server using a HTTP GET request. :param url: the URL to which the request is sent. :return content: return HTTPResponse Objects, generally speaking, we use READ method. """ request = urllib.request.Request(url, None, self.header) try: response = urllib.request.urlopen(request) return self.show_progress(response) except Exception as e: LOG.error(str(e)) return {'code': 408}
def validate(self): """ check dict keys and data type :return: """ for key in self._model: if key not in self.data: LOG.error(self.data) raise KeyError("data should have key: " + key) if not isinstance(self.data[key], self._model[key]): raise TypeError("Please check your object type: ", key) return True
def validate(self): """ check dict keys and data type :return: """ for key in self._model: if key not in self.data: LOG.error(self.data) raise KeyError('data should have key: ' + key) if not isinstance(self.data[key], self._model[key]): raise TypeError('Please check your object type: ', key) return True
def get(self, url): """Load data from the server using a HTTP GET request. :param url: the URL to which the request is sent. :return content: return HTTPResponse Objects, generally speaking, we use READ method. """ try: res = requests.get(url, headers=self.headers) content = self.show_progress(res) return content except Exception as e: LOG.error(str(e)) return b'{"code": 408}'
def on_error_occured(self, error): self.setMedia(QMediaContent()) self.pause() if error == QMediaPlayer.FormatError or error == QMediaPlayer.ServiceMissingError: m = QMessageBox( QMessageBox.Warning, u"错误提示", "第一次运行出现该错误可能是由于缺少解码器,请参考项目主页\ https://github.com/cosven/FeelUOwn 安装依赖。\n 如果不是第一次运行,那就可能是网络已经断开,请检查您的网络连接", QMessageBox.Yes | QMessageBox.No) if m.exec() == QMessageBox.Yes: QApplication.quit() else: LOG.error(u'播放器出现error, 类型为' + str(error)) if error == QMediaPlayer.NetworkError: if self._music_error_times >= self._MUSIC_ERROR_MAXIMUM or \ self._current_index < 0 or self._current_index >= len(self._music_list): self._music_error_times = 0 self._app_event_loop.call_later(self._RETRY_LATENCY, self.play_next) LOG.error(u'播放器出现错误:网络连接失败,{}秒后尝试播放下一首'.format( self._RETRY_LATENCY)) else: self._music_error_times += 1 self._app_event_loop.call_later( self._RETRY_LATENCY, self.play, self._music_list[self._current_index]) LOG.error(u'播放器出现错误:网络连接失败, {}秒后重试'.format( self._RETRY_LATENCY)) elif error == QMediaPlayer.ResourceError: LOG.error(u'播放器出现错误:缺少解码器') return
def on_error_occured(self, error): self.pause() if error == 2 or error == 5: m = QMessageBox( QMessageBox.Warning, u"错误提示", "可能缺少解码器,请参考项目主页\ https://git.oschina.net/zjuysw/NetEaseMusic 安装依赖", QMessageBox.Yes | QMessageBox.No) if m.exec() == QMessageBox.Yes: QApplication.quit() else: LOG.error(u'播放器出现error, 类型为' + str(error)) if error == 3 or error == 1: LOG.error(u'播放器出现错误。可能是网络连接失败,也有可能缺少解码器') return
def on_error_occured(self, error): self.pause() if error == 2 or error == 5: m = QMessageBox( QMessageBox.Warning, u"错误提示", "第一次运行出现该错误可能是由于缺少解码器,请参考项目主页\ https://github.com/cosven/FeelUOwn 安装依赖。\n 如果不是第一次运行,那就可能是网络已经断开,请检查您的网络连接", QMessageBox.Yes | QMessageBox.No) if m.exec() == QMessageBox.Yes: QApplication.quit() else: LOG.error(u'播放器出现error, 类型为' + str(error)) if error == 3 or error == 1: LOG.error(u'播放器出现错误。可能是网络连接失败,也有可能缺少解码器') return
def post(self, url, data): """Load data from the server using a HTTP POST request. :param string posturl: the URL to which the request is sent. :param dict dictdata: a dict object that is sent to the server with the request. """ try: res = requests.post(url, data=data, headers=self.headers, cookies=self.cookies) content = self.show_progress(res) return content except Exception as e: LOG.error(str(e)) return b'{"code": 408}'
def save_login_info(self, login_data): if login_data['is_remember']: try: f = open(DATA_PATH + self.pw_filename, 'w') if self.is_autofill is not True: # 如果不是自动填充,说明密码时已经没有加密过 password = login_data['password'].encode('utf-8') login_data['password'] = hashlib.md5(password).hexdigest() data_json = json.dumps(login_data) write_json_into_file(data_json, f) except Exception as e: LOG.error(str(e)) else: try: os.remove(DATA_PATH + self.pw_filename) except Exception as e: LOG.warning(str(e))
def save_login_info(self, login_data): if login_data['is_remember']: try: f = open(self.filename, 'w') if self.is_autofill is not True: # 如果不是自动填充,说明密码时已经没有加密过 password = login_data['password'].encode('utf-8') login_data['password'] = hashlib.md5(password).hexdigest() jsondata = json.dumps(login_data) f.write(jsondata) f.close() except Exception as e: LOG.error(str(e)) else: try: os.remove(self.filename) except Exception as e: LOG.warning(str(e))
def on_error_occured(self, error): self.pause() if error == 2 or error == 5: m = QMessageBox( QMessageBox.Warning, u"错误提示", "可能缺少解码器,请参考项目主页\ https://git.oschina.net/zjuysw/NetEaseMusic 安装依赖", QMessageBox.Yes | QMessageBox.No, ) if m.exec() == QMessageBox.Yes: QApplication.quit() else: LOG.error(u"播放器出现error, 类型为" + str(error)) if error == 3 or error == 1: LOG.error(u"播放器出现错误。可能是网络连接失败,也有可能缺少解码器") return
def post(self, posturl, dictdata): """Load data from the server using a HTTP POST request. :param string posturl: the URL to which the request is sent. :param dict dictdata: a dict object that is sent to the server with the request. """ postdata = urllib.parse.urlencode(dictdata) postdata = postdata.encode('utf-8') request = urllib.request.Request(posturl, postdata, self.header) try: response = urllib.request.urlopen(request) res = self.show_progress(response) return res except Exception as e: LOG.error(str(e)) return {'code': 408}
def fill_content(self): """ 判断之前是否保存了用户名和密码: 保存了就是直接加载 """ if self.has_saved_userinfo(): try: f = open(DATA_PATH + self.pw_filename, 'r') login_data = json.load(f) f.close() if 'is_remember' in login_data.keys() and login_data['is_remember']: self.username_widget.setText(str(login_data['username'])) self.password_widget.setText(str(login_data['password'])) self.is_remember_chb.setCheckState(2) self.is_autofill = True except Exception as e: LOG.error(str(e))
def save_login_info(self, login_data): if login_data["is_remember"]: try: f = open(self.filename, "w") if self.is_autofill is not True: # 如果不是自动填充,说明密码时已经没有加密过 password = login_data["password"].encode("utf-8") login_data["password"] = hashlib.md5(password).hexdigest() jsondata = json.dumps(login_data) f.write(jsondata) f.close() except Exception as e: LOG.error(str(e)) else: try: os.remove(self.filename) except Exception as e: LOG.warning(str(e))
def fill_content(self): """ 判断之前是否保存了用户名和密码: 保存了就是直接加载 """ if self.has_saved_userinfo(): try: f = open(self.filename, "r") login_data = dict() login_data = json.load(f) f.close() if "is_remember" in login_data.keys() and login_data["is_remember"]: self.username_widget.setText(login_data["username"]) self.password_widget.setText(login_data["password"]) self.is_remember_chb.setCheckState(True) self.is_autofill = True except Exception as e: LOG.error(str(e))
def http_request(self, method, action, query=None, urlencoded=None, callback=None, timeout=10): try: res = None if method == "GET": res = requests.get(action, headers=self.headers, cookies=self.cookies, timeout=timeout) elif method == "POST": res = requests.post(action, query, headers=self.headers, cookies=self.cookies, timeout=timeout) elif method == "POST_UPDATE": res = requests.post(action, query, headers=self.headers, cookies=self.cookies, timeout=timeout) self.cookies.update(res.cookies.get_dict()) self.save_cookies() content = self.show_progress(res) content_str = content.decode('utf-8') content_dict = json.loads(content_str) return content_dict except Exception as e: LOG.error(str(e)) return {"code": 408}
def check_release(cls): url = 'https://api.github.com/repos/cosven/FeelUOwn/releases' LOG.info('正在查找新版本...') try: loop = asyncio.get_event_loop() future = loop.run_in_executor(None, partial(requests.get, url, timeout=5)) res = yield from future if not res.status_code == 200: LOG.warning('connect to api.github.com timeout') return releases = res.json() for release in releases: if release['tag_name'] > cls.current_version: title = u'发现新版本 %s hoho' % release['tag_name'] LOG.info(title) content = release['name'] ControllerApi.notify_widget.show_message(title, content) ViewOp.ui.STATUS_BAR.showMessage(title, 5000) break except Exception as e: LOG.error(str(e))
def keyboard_tap_callback(proxy, type_, event, refcon): if type_ < 0 or type_ > 0x7fffffff: LOG.error('Unkown mac event') Quartz.CFRunLoopRun() return None try: key_event = NSEvent.eventWithCGEvent_(event) except: LOG.info("mac event cast error") return event if key_event.subtype() == 8: key_code = (key_event.data1() & 0xFFFF0000) >> 16 key_state = (key_event.data1() & 0xFF00) >> 8 if key_code is 16 or key_code is 19 or key_code is 20: # 16 for play-pause, 19 for next, 20 for previous if key_state == NSKeyUp: if key_code is 19: player.play_next() elif key_code is 20: player.play_last() elif key_code is 16: player.play_or_pause() return None return event
def keyboard_tap_callback(proxy, type_, event, refcon): if type_ < 0 or type_ > 0x7fffffff: LOG.error('Unkown mac event') Quartz.CFRunLoopRun() return run_event_loop(ControllerApi.player) try: key_event = NSEvent.eventWithCGEvent_(event) except: LOG.info("mac event cast error") return event if key_event.subtype() == 8: key_code = (key_event.data1() & 0xFFFF0000) >> 16 key_state = (key_event.data1() & 0xFF00) >> 8 if key_code is 16 or key_code is 19 or key_code is 20: # 16 for play-pause, 19 for next, 20 for previous if key_state == NSKeyUp: if key_code is 19: player.play_next() elif key_code is 20: player.play_last() elif key_code is 16: player.play_or_pause() return None return event
def on_error_occured(self, error): self.setMedia(QMediaContent()) self.pause() if error == QMediaPlayer.FormatError or error == QMediaPlayer.ServiceMissingError: m = QMessageBox(QMessageBox.Warning, u"错误提示", "第一次运行出现该错误可能是由于缺少解码器,请参考项目主页\ https://github.com/cosven/FeelUOwn 安装依赖。\n 如果不是第一次运行,那就可能是网络已经断开,请检查您的网络连接", QMessageBox.Yes | QMessageBox.No) if m.exec() == QMessageBox.Yes: QApplication.quit() else: LOG.error(u'播放器出现error, 类型为' + str(error)) if error == QMediaPlayer.NetworkError: if self._music_error_times >= self._MUSIC_ERROR_MAXIMUM or \ self._current_index < 0 or self._current_index >= len(self._music_list): self._music_error_times = 0 self._app_event_loop.call_later(self._RETRY_LATENCY, self.play_next) LOG.error(u'播放器出现错误:网络连接失败,{}秒后尝试播放下一首'.format(self._RETRY_LATENCY)) else: self._music_error_times += 1 self._app_event_loop.call_later(self._RETRY_LATENCY, self.play, self._music_list[self._current_index]) LOG.error(u'播放器出现错误:网络连接失败, {}秒后重试'.format(self._RETRY_LATENCY)) elif error == QMediaPlayer.ResourceError: LOG.error(u'播放器出现错误:缺少解码器') return
def run_func(func): data = dict() data['code'] = 404 try: result = eval(func) LOG.info("执行函数成功 %s " % func) data['code'] = 200 data['result'] = result except NameError: LOG.error("cli: %s command not found" % func) data['message'] = "command not found" except TypeError: LOG.error("cli: %s unknown arguement" % func) data['message'] = "arguments error" except Exception as e: LOG.error(str(e)) data['message'] = "unknown error" return data