Files
2026-05-16 00:20:45 +02:00

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)