2021-05-18 03:51:33 +00:00
|
|
|
|
|
|
|
from argostranslate import package, translate
|
2023-09-29 22:31:33 +00:00
|
|
|
from packaging import version
|
2021-05-18 03:51:33 +00:00
|
|
|
|
2022-12-29 23:44:53 +00:00
|
|
|
import libretranslate.language
|
2020-12-19 22:40:37 +00:00
|
|
|
|
2021-05-18 03:41:02 +00:00
|
|
|
|
2023-09-29 20:43:59 +00:00
|
|
|
def boot(load_only=None, update_models=False, install_models=False):
|
2021-05-16 14:42:58 +00:00
|
|
|
try:
|
2023-09-29 20:43:59 +00:00
|
|
|
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)
|
2021-05-16 14:42:58 +00:00
|
|
|
except Exception as e:
|
|
|
|
print("Cannot update models (normal if you're offline): %s" % str(e))
|
2020-12-19 22:40:37 +00:00
|
|
|
|
2021-05-18 03:41:02 +00:00
|
|
|
|
2023-09-29 20:43:59 +00:00
|
|
|
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:
|
2021-02-08 15:56:45 +00:00
|
|
|
# Update package definitions from remote
|
|
|
|
print("Updating language models")
|
|
|
|
package.update_package_index()
|
|
|
|
|
|
|
|
# Load available packages from local package index
|
2022-09-17 06:45:59 +00:00
|
|
|
available_packages = package.get_available_packages()
|
2023-09-29 20:43:59 +00:00
|
|
|
installed_packages = package.get_installed_packages()
|
2021-02-08 15:56:45 +00:00
|
|
|
print("Found %s models" % len(available_packages))
|
2021-03-28 14:19:19 +00:00
|
|
|
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:
|
2021-05-18 03:41:02 +00:00
|
|
|
raise ValueError(
|
|
|
|
"Unavailable language codes: %s."
|
|
|
|
% ",".join(sorted(unavailable_lang_codes))
|
|
|
|
)
|
2021-03-28 14:19:19 +00:00
|
|
|
# Keep only the packages that have both from_code and to_code in our list.
|
|
|
|
available_packages = [
|
|
|
|
pack
|
|
|
|
for pack in available_packages
|
2021-05-18 03:51:33 +00:00
|
|
|
if pack.from_code in load_only_lang_codes and pack.to_code in load_only_lang_codes
|
2021-03-28 14:19:19 +00:00
|
|
|
]
|
|
|
|
if not available_packages:
|
2021-05-18 03:41:02 +00:00
|
|
|
raise ValueError("no available package")
|
2021-03-28 14:19:19 +00:00
|
|
|
print("Keep %s models" % len(available_packages))
|
|
|
|
|
2021-02-08 15:56:45 +00:00
|
|
|
# Download and install all available packages
|
|
|
|
for available_package in available_packages:
|
2023-09-29 20:43:59 +00:00
|
|
|
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
|
2023-09-29 22:31:33 +00:00
|
|
|
if version.parse(pack.package_version) < version.parse(available_package.package_version):
|
2023-09-29 20:43:59 +00:00
|
|
|
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()
|
2021-02-08 15:56:45 +00:00
|
|
|
|
2021-03-11 13:38:55 +00:00
|
|
|
# reload installed languages
|
2023-01-03 12:40:05 +00:00
|
|
|
libretranslate.language.languages = translate.get_installed_languages()
|
2021-05-18 03:41:02 +00:00
|
|
|
print(
|
2023-07-10 06:11:51 +00:00
|
|
|
f"Loaded support for {len(translate.get_installed_languages())} languages ({len(available_packages)} models total)!"
|
2022-12-29 23:44:53 +00:00
|
|
|
)
|