ttttdiva commited on
Commit
615fa2b
·
verified ·
1 Parent(s): a1f2a21

Upload main.py

Browse files
Files changed (1) hide show
  1. main.py +36 -44
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
- def encrypt_and_upload_folder(self, local_folder: str):
 
 
 
 
212
  """
213
- 1. rcloneでフォルダ全体を暗号化 (フォルダ名含む)
214
- 2. 暗号化されたフォルダをHugging Faceにアップロード
215
- 3. ローカル削除
 
 
 
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. Something went wrong.")
252
- return
253
 
254
- # 通常は1個のはずだが、複数あるなら先頭だけ使う
255
- enc_folder_name = list(new_folders)[0]
256
  enc_folder_path = os.path.join(encrypted_base_dir, enc_folder_name)
257
 
258
- # Hugging Face上で、この暗号化フォルダをそのままアップロード
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 folder: {local_folder} and encrypted folder: {enc_folder_path}")
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に追記 (暗号化フォルダを直接参照するURLは分からないため、
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
- f.write(f"{model_info.get('name', 'UnnamedModel')} (ID:{model_id}): {hf_url_placeholder}\n")
 
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}")