Skip to content

Commit

Permalink
new update method
Browse files Browse the repository at this point in the history
  • Loading branch information
trim21 committed Mar 31, 2023
1 parent f9a6d74 commit a1ff72a
Show file tree
Hide file tree
Showing 5 changed files with 52 additions and 20 deletions.
2 changes: 1 addition & 1 deletion bgmi/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@
__author__ = "RicterZ"
__email__ = "ricterzheng@gmail.com"
__version__ = version(__package__)
__admin_version__ = "2.x.x"
__admin_version__ = [">=2.0.0", "<3.0.0"]
2 changes: 1 addition & 1 deletion bgmi/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ def main(argv: Optional[List[str]] = None) -> None:
elif ret.action == "upgrade":
create_dir()
update_database()
check_update(mark=False)
check_update()
else:
check_update()
controllers(ret)
Expand Down
53 changes: 36 additions & 17 deletions bgmi/utils/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,10 @@
from multiprocessing.pool import ThreadPool
from pathlib import Path
from shutil import move, rmtree
from typing import Any, Callable, List, Optional, Tuple, TypeVar
from typing import Any, Callable, Dict, List, Optional, Tuple, TypeVar

import requests
import semver
from anime_episode_parser import parse_episode as _parse_episode

from bgmi import __admin_version__, __version__
Expand Down Expand Up @@ -85,9 +86,6 @@ def echo_func(*func_args, **func_kwargs): # type: ignore
"print_error": "[x] ",
}

FRONTEND_NPM_URL = "https://registry.npmjs.com/bgmi-frontend/"
PACKAGE_JSON_URL = f"https://registry.npmjs.com/bgmi-frontend/{__admin_version__}"


def _indicator(f): # type: ignore
@functools.wraps(f)
Expand Down Expand Up @@ -228,6 +226,29 @@ def get_terminal_col() -> int: # pragma: no cover
return _DEFAULT_TERMINAL_WIDTH


FRONTEND_NPM_URL = "https://registry.npmjs.com/bgmi-frontend/"


@functools.lru_cache
def npm_package_manifest() -> Dict[str, Any]:
r = requests.get(FRONTEND_NPM_URL, timeout=60)
r.raise_for_status()
return r.json()


@functools.lru_cache
def latest_npm_package_version() -> semver.VersionInfo:
r = npm_package_manifest()
versions = sorted([semver.VersionInfo.parse(x) for x in r["versions"]])

available_versions = [v for v in versions if all(v.match(r) for r in __admin_version__)]

if not available_versions:
print_error("failed to find available web-ui versions")

return max(available_versions)


@log_utils_function
def check_update(mark: bool = True) -> None:
def update() -> None:
Expand All @@ -247,12 +268,13 @@ def update() -> None:
else:
print_success("Your BGmi is the latest version.")

package_json = requests.get(PACKAGE_JSON_URL, timeout=60).json()
admin_version = package_json["version"]
if glob.glob(os.path.join(cfg.front_static_path, "package.json")):
if cfg.front_static_path.joinpath("package.json").exists():
admin_version = latest_npm_package_version()

with open(os.path.join(cfg.front_static_path, "package.json"), encoding="utf8") as f:
local_version = json.loads(f.read())["version"]
if [int(x) for x in admin_version.split(".")] > [int(x) for x in local_version.split(".")]:
local_version = semver.VersionInfo.parse(json.loads(f.read())["version"])

if admin_version > local_version:
get_web_admin(method="update")
else:
print_info("Use 'bgmi install' to install BGmi frontend / download delegate")
Expand Down Expand Up @@ -322,15 +344,12 @@ def bangumi_save_path(bangumi_name: str) -> Path:

def get_web_admin(method: str) -> None:
print_info(f"{method[0].upper() + method[1:]}ing BGmi frontend")
admin_version = latest_npm_package_version()

try:
r = requests.get(FRONTEND_NPM_URL, timeout=60).json()
version = requests.get(PACKAGE_JSON_URL, timeout=60).json()
if "error" in version: # pragma: no cover
print(json.dumps(version, indent=2, ensure_ascii=False))
print_error("unexpected npm error")
return
tar_url = r["versions"][version["version"]]["dist"]["tarball"]
r = npm_package_manifest()
tar_url = r["versions"][str(admin_version)]["dist"]["tarball"]
version = requests.get(f"{FRONTEND_NPM_URL}{admin_version}").json()
r = requests.get(tar_url, timeout=60)
except requests.exceptions.ConnectionError:
print_warning("failed to download web admin")
Expand All @@ -354,7 +373,7 @@ def get_web_admin(method: str) -> None:
os.path.join(cfg.front_static_path, file),
)
with open(os.path.join(cfg.front_static_path, "package.json"), "w+", encoding="utf8") as pkg:
pkg.write(json.dumps(version))
pkg.write(json.dumps(version, ensure_ascii=False, indent=2))
print_success("Web admin page {} successfully. version: {}".format(method, version["version"]))


Expand Down
14 changes: 13 additions & 1 deletion poetry.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ tomli = "2.0.1"
tomli-w = "1.0.0"
strenum = "0.4.10"
anime-episode-parser = "^0.0.8"
semver = "^2.13.0"

[tool.poetry.dev-dependencies]
# tests
Expand Down

0 comments on commit a1ff72a

Please sign in to comment.