72 lines
2.1 KiB
Python
Executable File
72 lines
2.1 KiB
Python
Executable File
import importlib
|
|
import inspect
|
|
import logging
|
|
import os
|
|
import sys
|
|
|
|
_dictionaries_ = []
|
|
|
|
|
|
def load_dicts(verbose):
|
|
# Empty dictionaries
|
|
global _dictionaries_
|
|
_dictionaries_ = []
|
|
# Find dictionary files
|
|
run_path = os.path.dirname(os.path.realpath(__file__))
|
|
dir = os.path.join(run_path, 'dictionaries')
|
|
dicts = [d for d in os.listdir(dir) if not d.startswith('__') and d.endswith('.py')]
|
|
for d in dicts:
|
|
# Test if valid dictionary
|
|
module = importlib.import_module(f'dictionaries.{d[:-3]}')
|
|
content = inspect.getmembers(sys.modules[module.__name__])
|
|
classes = [c[1] for c in content if str(type(c[1])) == "<class 'type'>" ]
|
|
for c in classes:
|
|
if not hasattr(c, 'run'): # assume it's not a dictionary
|
|
continue
|
|
# Add dictionary
|
|
_dictionaries_.append(c())
|
|
if verbose:
|
|
logging.info(f"{len(_dictionaries_)} loaded:")
|
|
print(_dictionaries_)
|
|
for d in _dictionaries_:
|
|
logging.info(f" - {d._name}")
|
|
|
|
|
|
def loop_exec(words):
|
|
for word in [w for w in words if w]:
|
|
word = word.strip()
|
|
hit = False
|
|
for dict in reversed(_dictionaries_):
|
|
try:
|
|
if dict.run(word):
|
|
hit = True
|
|
break
|
|
except:
|
|
pass # Try next dictionary
|
|
if not hit:
|
|
logging.error(f"No dictionaries found a result for {word}")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
import argparse
|
|
import sys
|
|
desc = "Download audio snippet for words from online dictionaries"
|
|
parser = argparse.ArgumentParser(description=desc)
|
|
|
|
parser.add_argument("words", nargs="*", help='Words to look up')
|
|
parser.add_argument("-v", action='store_true', help='Verbose')
|
|
argv = parser.parse_args()
|
|
|
|
# Set log level
|
|
if argv.v:
|
|
logging.getLogger().setLevel(logging.INFO)
|
|
|
|
# Load dictionaries
|
|
load_dicts(argv.v)
|
|
|
|
# Search dictionaries
|
|
if len(argv.words) > 0: # parse args
|
|
loop_exec(argv.words)
|
|
else: # parse pipe
|
|
loop_exec(sys.stdin)
|