-
Notifications
You must be signed in to change notification settings - Fork 203
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
最新バージョン取得API #476
Comments
issue作成ありがとうございます! |
@sevenc-nanashi |
「GET /update_infos を受け取ったら自己のアプデが可能かを取得してして返す」、ですね。エンジンが自動でアプデチェックとかではないです。 |
回答ありがとうございます!
|
ですです! |
理解しました、ありがとうございます!
👍 |
アップデート情報ですが、エディタ側はエディターのアップデート情報を通知するようになりました! |
実験的実装実験的な実装をおこないました。
"""ENGINE 更新情報の確認"""
from dataclasses import dataclass
from typing import Any
import urllib.request
import json
# Mock
@dataclass
class VersionMockHook:
version: str
version_mock_hook = VersionMockHook("0.17.0")
def get_current_version() -> str:
"""mock"""
return version_mock_hook.version
# /Mock
@dataclass
class UpdateInfo:
"""ENGINE 更新情報"""
exist: bool # 起動中 ENGINE のアップデート版が存在するか否か
version: str | None # アップデート版のバージョン(None: アップデート先無し)
info_url: str | None # アップデート版詳細にアクセスできる URL(None: アップデート先無し)
def get_update_info() -> UpdateInfo:
current_version = get_current_version()
with urllib.request.urlopen("https://api.github.com/repos/VOICEVOX/voicevox_engine/releases/latest") as res:
latest: dict[str, Any] = json.load(res)
latest_version = latest["tag_name"]
if current_version != latest_version:
return UpdateInfo(exist=True, version=latest_version, info_url=latest["html_url"])
else:
return UpdateInfo(exist=False, version=None, info_url=None)
if __name__ == "__main__":
version_mock_hook.version = "0.17.0"
update_info = get_update_info()
print(update_info)
version_mock_hook.version = "0.18.0"
update_info = get_update_info()
print(update_info) これにより、ENGINE 自体のアップデート情報を取得できます: > python get_update_info.py
UpdateInfo(exist=True, version='0.18.0', info_url='https://github.com/VOICEVOX/voicevox_engine/releases/tag/0.18.0')
UpdateInfo(exist=False, version=None, info_url=None) 採用可否マルチエンジンの観点から VVAPI として本機能は有用であり、上記実装例からわかるように各エンジンでの実装も容易です。 @Hiroshiba |
良い感じですね!!
Go寄りの気持ちです! 将来追加したくなる情報とコンフリクトしないか将来的に追加したくなる情報を考えておいて、その邪魔にならないか考慮しておくと安心できるかもと思いました。 考えた感じ、多分直接ダウンロードするバイナリーの URL やそのチェックsum値を配置したくなりそう。 ちなみにelectron-builderのUdateInfoがそんな感じでした。 existキーどうするか設計としてUpdateInfoの中にexistを持たせる以外にもいくつか方法ありそうかもです。 {
exist: False,
} | {
exist: True,
update_info: UpdateInfo
} このどちらかの方法であれば |
ちょっと将来のことも含めて、API 実装に問題がないかという視点で考えてみました。結論は問題なさそうかなと!
API が増えるということなので、いっぱい先のことを考えると安心できそう。 |
👍️
👍️ @dataclass
class UpdateInfo:
"""ENGINE 更新情報"""
exist: bool # 起動中 ENGINE のアップデート版が存在するか否か
version: str | None # アップデート版のバージョン(None: アップデート先無し)
info_url: str | None # アップデート版詳細にアクセスできる URL(None: アップデート先無し)
file_url: str | None # アップデート版をダウンロードできる URL(None: アップデート先無し)
file_checksum: str | None # file_url からダウンロードされるべきファイルのチェックサム値(None: アップデート先無し)
TypeScript だとこうするんですが、Python の型表現力だとこれ難しい気がします。 @dataclass
class A:
hello: bool
world: True と書くと world が何故か |
認識ずれてるかも・・・?(ずれてないかも・・・?) @app.post("/update_info")
def update_info():
info: UpdateInfo | None = get_info() # 適当
if info is None:
return {"exist": False}
return {"exist": True, "info": info} (追記)とはいえ |
API 返り値の型を以下のようにつけたいが Python 型システムの限界で実現できない、という認識でした。 class ExistUpdateInfo:
exist: True
info: Object
class NonExistUpdateInfo:
exist: False
@app.post("/update_info")
def update_info() -> ExistUpdateInfo | NonExistUpdateInfo:
info: ExistUpdateInfo | NonExistUpdateInfo = get_info()
return info 示して頂いた感じで |
遅くなりました...! API設計の観点からは、特にこのAPIをこのまま実装しても問題ないと思います。 型についてですが、現状APIエンドポイントに関してPython側で型推論システムを使うことはおそらくないはずなので、Pythonでの恩恵はあまり考えなくても良いかもしれません。 |
@y-chan の知り合いなのですが、こちらのPythonの型部分について調べてみました。 @tarepan さんのコメントではmypy上での型推論が壊れるとのことでしたが、そもそもpydanticでは以下のように class ExistUpdateInfo(BaseModel):
exist: Literal[True]
info: str
class NonExistUpdateInfo(BaseModel):
exist: Literal[False]
@app.get("/update_info", tags=["その他"])
async def update_info(arg: int) -> ExistUpdateInfo | NonExistUpdateInfo:
if arg > 1:
return {
"exist": True,
"info": "aaaa"
}
return { "exist": False } また、このコードをVOICEVOXに組み込んでOpenAPI定義を出力したところ以下のようなSchemaが吐き出されており、True/Falseによる分岐自体は解釈できそうに見えました。 しかし、エディタのREADMEに従ってTypeScriptの型を生成して使用を試みたところ、下のような明らかに間違った型が生成されました。おそらく、OpenAPI Generatorの修正が必要かと思われます。 以上失礼しました。 |
@sushi-chaaaan 詳しくありがとうございます!! generator側は失念していました! 結論としては、まあ直和型は避けたほうが良さそうですね!!! |
内容
エディタの更新情報に乗せるため、
GET /update_info
のようなエンドポイントを実装した方が便利だと思いました。Pros 良くなる点
エディタの更新情報にエンジン毎で乗せられる。
Cons 悪くなる点
(なし)
実現方法
VOICEVOXのバージョン
0.?.0
OSの種類/ディストリ/バージョン
その他
(なし)
The text was updated successfully, but these errors were encountered: