@@ -517,7 +517,7 @@ async def fetch_latest_version(aivm_info: AivmInfo) -> None:
517
517
except Exception as ex :
518
518
# エラーが発生しても起動に影響を与えないよう、ログ出力のみ行う
519
519
# - httpx.RequestError: ネットワークエラーなど
520
- # - KeyError: レスポンスのJSONに必要なキーが存在しない
520
+ # - KeyError: レスポンスの JSON に必要なキーが存在しない
521
521
# - StopIteration: model_files に AIVMX が存在しない
522
522
# - ValueError: Version.parse() が失敗
523
523
logger .warning (
@@ -626,9 +626,27 @@ def install_aivm(self, file: BinaryIO) -> None:
626
626
## 通常は重複防止のため "(音声合成モデルの UUID).aivmx" のフォーマットのファイル名でインストールされるが、
627
627
## 手動で .aivmx ファイルをインストール先ディレクトリにコピーしても一通り動作するように考慮している
628
628
logger .info (f"Installing AIVMX file to { aivm_file_path } ..." )
629
- with open (aivm_file_path , mode = "wb" ) as f :
630
- f .write (file .read ())
631
- logger .info (f"Installed AIVMX file to { aivm_file_path } ." )
629
+ try :
630
+ with open (aivm_file_path , mode = "wb" ) as f :
631
+ f .write (file .read ())
632
+ logger .info (f"Installed AIVMX file to { aivm_file_path } ." )
633
+ except OSError as ex :
634
+ logger .error (
635
+ f"Failed to write AIVMX file to { aivm_file_path } :" , exc_info = ex
636
+ )
637
+ error_message = str (ex ).lower ()
638
+ if "no space" in error_message :
639
+ detail = f"AIVMX ファイルの書き込みに失敗しました。ストレージ容量が不足しています。({ ex } )"
640
+ elif "permission denied" in error_message :
641
+ detail = f"AIVMX ファイルの書き込みに失敗しました。インストール先フォルダへのアクセス権限が不足しています。({ ex } )"
642
+ elif "read-only" in error_message :
643
+ detail = f"AIVMX ファイルの書き込みに失敗しました。インストール先フォルダが読み取り専用権限になっています。({ ex } )"
644
+ else :
645
+ detail = f"AIVMX ファイルの書き込みに失敗しました。({ ex } )"
646
+ raise HTTPException (
647
+ status_code = 500 ,
648
+ detail = detail ,
649
+ )
632
650
633
651
# すべてのインストール済み音声合成モデルの情報のキャッシュを再生成
634
652
## インストール完了後にエディタから送られる /aivm_models API へのリクエストで確実に更新情報も返せるように、
0 commit comments