LibreTranslate/libretranslate/init.py
Robert George 94f63cedda
Use package.version for model version comparison
Change `--install-models` to `--force-update-models`
2023-09-29 15:31:33 -07:00

75 lines
3.3 KiB
Python

from argostranslate import package, translate
from packaging import version
import libretranslate.language
def boot(load_only=None, update_models=False, install_models=False):
try:
if update_models:
check_and_install_models(load_only_lang_codes=load_only, update=update_models)
else:
check_and_install_models(force=install_models, load_only_lang_codes=load_only)
except Exception as e:
print("Cannot update models (normal if you're offline): %s" % str(e))
def check_and_install_models(force=False, load_only_lang_codes=None,update=False):
if len(package.get_installed_packages()) < 2 or force or update:
# Update package definitions from remote
print("Updating language models")
package.update_package_index()
# Load available packages from local package index
available_packages = package.get_available_packages()
installed_packages = package.get_installed_packages()
print("Found %s models" % len(available_packages))
if load_only_lang_codes is not None:
# load_only_lang_codes: List[str] (codes)
# Ensure the user does not use any unavailable language code.
unavailable_lang_codes = set(load_only_lang_codes)
for pack in available_packages:
unavailable_lang_codes -= {pack.from_code, pack.to_code}
if unavailable_lang_codes:
raise ValueError(
"Unavailable language codes: %s."
% ",".join(sorted(unavailable_lang_codes))
)
# Keep only the packages that have both from_code and to_code in our list.
available_packages = [
pack
for pack in available_packages
if pack.from_code in load_only_lang_codes and pack.to_code in load_only_lang_codes
]
if not available_packages:
raise ValueError("no available package")
print("Keep %s models" % len(available_packages))
# Download and install all available packages
for available_package in available_packages:
update = False
if not force:
for pack in installed_packages:
if (
pack.from_code == available_package.from_code
and pack.to_code == available_package.to_code
):
update = True
if version.parse(pack.package_version) < version.parse(available_package.package_version):
print(
f"Updating {available_package} ({pack.package_version}->{available_package.package_version}) ..."
)
pack.update()
if not update:
print(
f"Downloading {available_package} ({available_package.package_version}) ..."
)
available_package.install()
# reload installed languages
libretranslate.language.languages = translate.get_installed_languages()
print(
f"Loaded support for {len(translate.get_installed_languages())} languages ({len(available_packages)} models total)!"
)