Upload main.py
Browse files
main.py
CHANGED
@@ -69,7 +69,6 @@ class CivitAICrawler:
|
|
69 |
logger.info(f"[INFO] Created rclone.conf at {conf_path}")
|
70 |
else:
|
71 |
logger.warning("[WARN] RCLONE_CONF_BASE64 not found; rclone may fail.")
|
72 |
-
# ==========================
|
73 |
|
74 |
self.config = config
|
75 |
self.api = HfApi()
|
@@ -208,75 +207,63 @@ class CivitAICrawler:
|
|
208 |
except Exception as e:
|
209 |
logger.error(f"Failed to save model info JSON: {e}")
|
210 |
|
211 |
-
|
|
|
|
|
|
|
|
|
212 |
"""
|
213 |
-
1. rclone
|
214 |
-
|
215 |
-
|
|
|
|
|
|
|
216 |
"""
|
217 |
if not os.path.exists(local_folder):
|
218 |
logger.error(f"encrypt_and_upload_folder: folder not found: {local_folder}")
|
219 |
-
return
|
220 |
|
221 |
-
# 暗号化後のフォルダが生成されるベースパス (例: /app/encrypted)
|
222 |
encrypted_base_dir = os.path.join(os.getcwd(), "encrypted")
|
223 |
os.makedirs(encrypted_base_dir, exist_ok=True)
|
224 |
|
225 |
-
# rclone実行前の /app/encrypted の状態を取得 (新規フォルダ検出用)
|
226 |
before_set = set(os.listdir(encrypted_base_dir))
|
227 |
|
228 |
-
# rclone
|
229 |
-
# ここで "cryptLocal:" は .rclone.conf 側で
|
230 |
-
# [cryptLocal]
|
231 |
-
# type = crypt
|
232 |
-
# remote = /app/encrypted
|
233 |
-
# filename_encryption = standard
|
234 |
-
# directory_name_encryption = true
|
235 |
-
# password = ****
|
236 |
-
# 等が設定されている想定
|
237 |
try:
|
238 |
-
subprocess.run(
|
239 |
-
["rclone", "copy", local_folder, "cryptLocal:"],
|
240 |
-
check=True
|
241 |
-
)
|
242 |
except subprocess.CalledProcessError as e:
|
243 |
logger.error(f"rclone copy failed: {e}")
|
244 |
-
return
|
245 |
|
246 |
-
# rclone実行後の /app/encrypted の状態
|
247 |
after_set = set(os.listdir(encrypted_base_dir))
|
248 |
-
|
249 |
-
new_folders = after_set - before_set
|
250 |
if not new_folders:
|
251 |
-
logger.error("No new encrypted folder found.
|
252 |
-
return
|
253 |
|
254 |
-
#
|
255 |
-
enc_folder_name =
|
256 |
enc_folder_path = os.path.join(encrypted_base_dir, enc_folder_name)
|
257 |
|
258 |
-
#
|
259 |
-
# => HF側もフォルダ名が暗号化された状態で表示されます
|
260 |
try:
|
261 |
-
# path_in_repo も同じ暗号化名を指定
|
262 |
self.upload_folder(enc_folder_path, path_in_repo=enc_folder_name)
|
263 |
logger.info(f"Uploaded encrypted folder to HF: {enc_folder_path}")
|
264 |
except Exception as e:
|
265 |
logger.error(f"Failed to upload encrypted folder {enc_folder_path}: {e}")
|
266 |
|
267 |
-
#
|
268 |
try:
|
269 |
shutil.rmtree(local_folder)
|
270 |
shutil.rmtree(enc_folder_path)
|
271 |
-
logger.info(f"Removed local
|
272 |
except Exception as e:
|
273 |
logger.error(f"Failed to remove local folders: {e}")
|
274 |
|
|
|
|
|
275 |
def upload_file(self, file_path: str, repo_id: Optional[str] = None, path_in_repo: Optional[str] = None):
|
276 |
-
"""
|
277 |
-
単一ファイルをアップロードするための関数
|
278 |
-
(今回はフォルダ丸ごとアップロードがメインだが、ログファイルなどは個別アップロード)
|
279 |
-
"""
|
280 |
if repo_id is None:
|
281 |
repo_id = self.repo_ids['current']
|
282 |
if path_in_repo is None:
|
@@ -426,14 +413,19 @@ class CivitAICrawler:
|
|
426 |
# model_info.json保存
|
427 |
self.save_model_info_json(model_info, folder_name)
|
428 |
|
429 |
-
#
|
430 |
-
self.encrypt_and_upload_folder(folder_name)
|
|
|
|
|
|
|
|
|
|
|
|
|
431 |
|
432 |
-
# model_list.logに追記 (
|
433 |
-
# とりあえず元の modelPage名 とかモデルIDのメモを書くだけに留める)
|
434 |
-
hf_url_placeholder = f"https://huggingface.co/{self.repo_ids['current']}/tree/main/[ENCRYPTED_FOLDER]"
|
435 |
with open(self.config.LIST_FILE, "a", encoding="utf-8") as f:
|
436 |
-
|
|
|
437 |
|
438 |
except Exception as e:
|
439 |
logger.error(f"Error in process_model ({model_url}): {e}")
|
|
|
69 |
logger.info(f"[INFO] Created rclone.conf at {conf_path}")
|
70 |
else:
|
71 |
logger.warning("[WARN] RCLONE_CONF_BASE64 not found; rclone may fail.")
|
|
|
72 |
|
73 |
self.config = config
|
74 |
self.api = HfApi()
|
|
|
207 |
except Exception as e:
|
208 |
logger.error(f"Failed to save model info JSON: {e}")
|
209 |
|
210 |
+
|
211 |
+
# ======================================================
|
212 |
+
# 修正: rclone が生成した暗号フォルダ名をそのまま使う
|
213 |
+
# ======================================================
|
214 |
+
def encrypt_and_upload_folder(self, local_folder: str) -> Optional[str]:
|
215 |
"""
|
216 |
+
1. rclone copy local_folder cryptLocal:
|
217 |
+
=> /home/user/app/encrypted/xxxx というランダム暗号フォルダが生成される
|
218 |
+
2. 生成されたフォルダ名を特定 (new_folders)
|
219 |
+
3. それを upload_folder() でアップロード
|
220 |
+
4. 平文フォルダ & 暗号フォルダをローカル削除
|
221 |
+
5. 暗号フォルダ名を返す
|
222 |
"""
|
223 |
if not os.path.exists(local_folder):
|
224 |
logger.error(f"encrypt_and_upload_folder: folder not found: {local_folder}")
|
225 |
+
return None
|
226 |
|
|
|
227 |
encrypted_base_dir = os.path.join(os.getcwd(), "encrypted")
|
228 |
os.makedirs(encrypted_base_dir, exist_ok=True)
|
229 |
|
|
|
230 |
before_set = set(os.listdir(encrypted_base_dir))
|
231 |
|
232 |
+
# サブフォルダ名を指定しない => rclone が自動的に暗号フォルダを生成
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
233 |
try:
|
234 |
+
subprocess.run(["rclone", "copy", local_folder, "cryptLocal:"], check=True)
|
|
|
|
|
|
|
235 |
except subprocess.CalledProcessError as e:
|
236 |
logger.error(f"rclone copy failed: {e}")
|
237 |
+
return None
|
238 |
|
|
|
239 |
after_set = set(os.listdir(encrypted_base_dir))
|
240 |
+
new_folders = list(after_set - before_set)
|
|
|
241 |
if not new_folders:
|
242 |
+
logger.error("No new encrypted folder found. Possibly an error.")
|
243 |
+
return None
|
244 |
|
245 |
+
# 通常1個だけだが、複数できたら先頭を採用
|
246 |
+
enc_folder_name = new_folders[0]
|
247 |
enc_folder_path = os.path.join(encrypted_base_dir, enc_folder_name)
|
248 |
|
249 |
+
# アップロード (暗号化済フォルダをそのまま)
|
|
|
250 |
try:
|
|
|
251 |
self.upload_folder(enc_folder_path, path_in_repo=enc_folder_name)
|
252 |
logger.info(f"Uploaded encrypted folder to HF: {enc_folder_path}")
|
253 |
except Exception as e:
|
254 |
logger.error(f"Failed to upload encrypted folder {enc_folder_path}: {e}")
|
255 |
|
256 |
+
# ローカル削除 (平文 & 暗号後)
|
257 |
try:
|
258 |
shutil.rmtree(local_folder)
|
259 |
shutil.rmtree(enc_folder_path)
|
260 |
+
logger.info(f"Removed local: {local_folder} and encrypted: {enc_folder_path}")
|
261 |
except Exception as e:
|
262 |
logger.error(f"Failed to remove local folders: {e}")
|
263 |
|
264 |
+
return enc_folder_name
|
265 |
+
|
266 |
def upload_file(self, file_path: str, repo_id: Optional[str] = None, path_in_repo: Optional[str] = None):
|
|
|
|
|
|
|
|
|
267 |
if repo_id is None:
|
268 |
repo_id = self.repo_ids['current']
|
269 |
if path_in_repo is None:
|
|
|
413 |
# model_info.json保存
|
414 |
self.save_model_info_json(model_info, folder_name)
|
415 |
|
416 |
+
# 暗号化→アップロード。rcloneが生成したフォルダ名を返す
|
417 |
+
enc_folder_name = self.encrypt_and_upload_folder(folder_name)
|
418 |
+
if enc_folder_name is None:
|
419 |
+
# 失敗時のフォルダ名
|
420 |
+
enc_folder_name = "[ENCRYPT_FAILED]"
|
421 |
+
|
422 |
+
# 暗号後フォルダをHTTPS URLに組み立て
|
423 |
+
hf_enc_url = f"https://huggingface.co/{self.repo_ids['current']}/tree/main/{enc_folder_name}"
|
424 |
|
425 |
+
# model_list.logに追記 (実際の暗号フォルダ名をそのまま書き込む)
|
|
|
|
|
426 |
with open(self.config.LIST_FILE, "a", encoding="utf-8") as f:
|
427 |
+
# 例: "Pudu chileno (ID:12345): https://huggingface.co/xxx/tree/main/<暗号フォルダ>"
|
428 |
+
f.write(f"{model_info.get('name', 'UnnamedModel')} (ID:{model_id}): {hf_enc_url}\n")
|
429 |
|
430 |
except Exception as e:
|
431 |
logger.error(f"Error in process_model ({model_url}): {e}")
|