diff --git a/lfy.in b/lfy.in index 085e17a..fead57a 100755 --- a/lfy.in +++ b/lfy.in @@ -84,28 +84,28 @@ def main(): """ set_internationalization() - parser = argparse.ArgumentParser(description="translate") + parser = argparse.ArgumentParser(description='命令行翻译或文本识别,如 lfy -t "who am i" -s bing -l 1 或 lfy -o "/tmp/xxx.png" -s baidu -l 1') - parser.add_argument('-l', type=str, help='待翻译文字或待OCR文件') - parser.add_argument('-s', type=str, help='所用服务', default="") - parser.add_argument('-t', type=int, help='翻译后面的文字') - parser.add_argument('-o', type=str, help='识别图片') + parser.add_argument('-t', type=str, help='翻译,后面接文字') + parser.add_argument('-o', type=str, help='识别图片,后面接文件路径') + parser.add_argument('-c', action='store_true', help='自动翻译剪贴板,暂时无效') + + parser.add_argument('-s', type=str, help='使用什么服务引擎,若未输入-s,将根据 -t 或 -o 提供帮助', default="", nargs='?') + parser.add_argument('-l', type=int, help='待翻译/识别的语言,若未输入-l,将根据 -s 的输入自动提供对应帮助', default=-1, nargs='?') args = parser.parse_args() + if args.c: + from lfy.code import req_clip + print(req_clip(args.s, args.l)) + return if args.t: - if len(args.s) > 0: - from lfy.code import req_text - print(req_text(args.l, args.s, args.t)) - return - print(get_help_server(False)) + from lfy.code import req_text + print(req_text(args.t, args.s, args.l)) return if args.o: - if len(args.s) > 0: - from lfy.code import ocr_img - print(req_ocr(args.l, args.s, args.o)) - return - print(get_help_server(True)) + from lfy.code import req_ocr + print(req_ocr(args.o, args.s, args.l)) return diff --git a/lfy/api/__init__.py b/lfy/api/__init__.py index 971fb23..e1ab932 100644 --- a/lfy/api/__init__.py +++ b/lfy/api/__init__.py @@ -192,3 +192,20 @@ def lang_n2j(i: int, n: int): if lang.n == n: return j return 0 + + +def lang_n2key(server: Server, n: int): + """不同server的langs真正唯一的是n,不同server的key不一样 + + Args: + server (Server): _description_ + n (int): _description_ + + Returns: + Lang: 语言类 + """ + + for lang in server.langs: + if lang.n == n: + return lang + return None diff --git a/lfy/api/constant.py b/lfy/api/constant.py index 36cb712..aee1f7f 100644 --- a/lfy/api/constant.py +++ b/lfy/api/constant.py @@ -30,6 +30,3 @@ NO_TRANSLATED_TXTS = [ "\"server-sk-", ] - -CODE_SERVER_N_HELP = -2 -CODE_SERVER_N_DEFAULT = -3 diff --git a/lfy/api/server/ocr/baidu.py b/lfy/api/server/ocr/baidu.py index 6674239..67f7e1a 100644 --- a/lfy/api/server/ocr/baidu.py +++ b/lfy/api/server/ocr/baidu.py @@ -76,9 +76,19 @@ class BaiduServer(Server): def __init__(self): # Development documentation - # https://fanyi-api.baidu.com/doc/21 - - super().__init__("baidu", _("baidu"), {}) + # https://ai.baidu.com/ai-doc/OCR/zk3h7xz52 + lang_key_ns = { + # 中英混合,默认 + "CHN_ENG": 1, + "ENG": 3, + "JAP": 4, + "KOR": 5, + "GER": 6, + "FRE": 7, + "ITA": 8 + } + + super().__init__("baidu", _("baidu"), lang_key_ns) self.can_ocr = True def get_api_key_s_ocr(self): diff --git a/lfy/code.py b/lfy/code.py index ec63921..b82ecb9 100644 --- a/lfy/code.py +++ b/lfy/code.py @@ -6,37 +6,63 @@ from gi.repository import Gdk from lfy.api import (create_server_o, create_server_t, get_servers_o, - get_servers_t, server_key2i) -from lfy.api.constant import CODE_SERVER_N_DEFAULT, CODE_SERVER_N_HELP + get_servers_t, lang_n2key) from lfy.api.server import Server +from lfy.api.utils import is_text from lfy.api.utils.debug import get_logger from lfy.settings import Settings +def req_clip(key_server, key_lang_n): + """读取剪贴板,此方法暂时无效 + + Args: + key_server (str): _description_ + key_lang (str): _description_ + """ + def on_active_copy(cb2, res): + return req_text(cb2.read_text_finish(res), key_server, key_lang_n) + + def save_img(cb2, res): + texture = cb2.read_texture_finish(res) + pixbuf = Gdk.pixbuf_get_from_texture(texture) + + path = "/tmp/lfy.png" + pixbuf.savev(path, "png", (), ()) + return req_ocr(path, key_server, key_lang_n) + + cb = Gdk.Display().get_default().get_clipboard() + cf = cb.get_formats() + if is_text(cf): + cb.read_text_async(None, on_active_copy) + elif cf.contain_mime_type('image/png'): + cb.read_texture_async(None, save_img) + return "no text or image" + def get_help_lang(server: Server): """某个服务的lang key Args: server (Server): _description_ - j (int, optional): _description_. Defaults to -1. Returns: _type_: _description_ """ # 每个翻译对应的key - return {lang.get_name(): j for j, lang in enumerate(server.langs)} + print('please add "-l number", number like:') + return {lang.get_name(): lang.n for lang in server.langs} def get_help_server(is_ocr=False): """某个服务的lang key Args: - server (Server): _description_ - j (int, optional): _description_. Defaults to -1. + is_ocr (bool): _description_ Returns: _type_: _description_ """ + print('please add "-s server", server like:') if is_ocr: return {s.name: s.key for s in get_servers_o()} return {s.name: s.key for s in get_servers_t()} @@ -55,26 +81,32 @@ def set_vpn(): os.environ['https_proxy'] = proxy_address -def req_text(s=None, key_server=None, lang_j=-1): +def req_text(s, key_server="", key_lang_n=-1): """子线程翻译 Args: s (str): _description_ - server (Server): _description_ + key_server (str): _description_ + key_lang_n (int): _description_ """ - print(s) - set_vpn() try: - if key_server is None: + if not key_server: return get_help_server(False) - server = create_server_t(key_server) - if lang_j < 0: + server: Server = create_server_t(key_server) + + lang_selected = lang_n2key(server, key_lang_n) + + if not lang_selected: return get_help_lang(server) + print("translate", server.name, lang_selected.get_name()) + + if not s: + return _("no text") + print(s) + set_vpn() - key_lang = server.get_lang(lang_j).key - print("tra", server.name, key_lang) - _ok, text = server.translate_text(s, key_lang) + _ok, text = server.translate_text(s, lang_selected.key) return text except Exception as e: # pylint: disable=W0718 @@ -84,22 +116,31 @@ def req_text(s=None, key_server=None, lang_j=-1): return f"{error_msg}{server.name}\n\n{error_msg2}" -def req_ocr(s=None, key_server=None, ocr_key=None): +def req_ocr(s=None, key_server=None, key_lang_n=-1): """子线程翻译 Args: s (str): _description_ - server (Server): _description_ + key_server (str): _description_ + key_lang_n (int): _description_ """ - set_vpn() try: - if key_server is None: + if not key_server: return get_help_server(True) - server = create_server_o(key_server) - print("ocr", server.name, ocr_key) - _ok, text = server.ocr_image(s, ocr_key) + + lang_selected = lang_n2key(server, key_lang_n) + + if not lang_selected: + return get_help_lang(server) + + if not s or not os.path.exists(s): + return _("the file does not exist") + "\n" + s + print("ocr", server.name, lang_selected.get_name()) + set_vpn() + + _ok, text = server.ocr_image(s, lang_selected.key) return text except Exception as e: # pylint: disable=W0718 @@ -107,15 +148,3 @@ def req_ocr(s=None, key_server=None, ocr_key=None): error_msg = _("something error:") error_msg2 = f"{str(e)}\n\n{traceback.format_exc()}" return f"{error_msg}{server.name}\n\n{error_msg2}" - - -def req_clip(): - """获取截剪贴板 - """ - print("req_clip") - - def on_active_copy(cb2, res): - req_text(cb2.read_text_finish(res)) - - cb = Gdk.Display().get_default().get_clipboard() - cb.read_text_async(None, on_active_copy)