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

Upload main.py

Browse files
Files changed (1) hide show
  1. main.py +46 -38
main.py CHANGED
@@ -165,15 +165,12 @@ class CivitAICrawler:
165
  """画像を images フォルダにまとめてダウンロードする."""
166
  images_folder = os.path.join(folder, "images")
167
  os.makedirs(images_folder, exist_ok=True)
168
-
169
  images = []
170
  for version in model_versions:
171
  for img in version.get("images", []):
172
- image_url = img["url"]
173
- images.append(image_url)
174
-
175
  for image_url in images:
176
- image_name = os.path.basename(image_url) # ファイル名部分
177
  local_path = os.path.join(images_folder, image_name)
178
  try:
179
  resp = requests.get(image_url, stream=True)
@@ -208,17 +205,17 @@ class CivitAICrawler:
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}")
@@ -227,41 +224,54 @@ class CivitAICrawler:
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:
@@ -413,14 +423,12 @@ class CivitAICrawler:
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:
 
165
  """画像を images フォルダにまとめてダウンロードする."""
166
  images_folder = os.path.join(folder, "images")
167
  os.makedirs(images_folder, exist_ok=True)
 
168
  images = []
169
  for version in model_versions:
170
  for img in version.get("images", []):
171
+ images.append(img["url"])
 
 
172
  for image_url in images:
173
+ image_name = os.path.basename(image_url)
174
  local_path = os.path.join(images_folder, image_name)
175
  try:
176
  resp = requests.get(image_url, stream=True)
 
205
  logger.error(f"Failed to save model info JSON: {e}")
206
 
207
 
208
+ # =====================================================
209
+ # 必ずサブフォルダを作り、古いファイルやフォルダは削除してからコピー
210
+ # =====================================================
211
  def encrypt_and_upload_folder(self, local_folder: str) -> Optional[str]:
212
  """
213
+ 1. /home/user/app/encrypted 配下の古いファイルやフォルダを消去(オプション)
214
+ 2. rclone copy local_folder => cryptLocal:subfolder_label
215
+ /home/user/app/encrypted/subfolder_label/ が必ずフォルダとして作られる
216
+ 3. そのフォルダを upload_folder()
217
+ 4. ローカル平文フォルダ & 暗号フォルダを削除
218
+ 5. 最後に subfolder_label を return
219
  """
220
  if not os.path.exists(local_folder):
221
  logger.error(f"encrypt_and_upload_folder: folder not found: {local_folder}")
 
224
  encrypted_base_dir = os.path.join(os.getcwd(), "encrypted")
225
  os.makedirs(encrypted_base_dir, exist_ok=True)
226
 
227
+ # --- 古い暗号ファイルやフォルダを消す例 ---
228
+ # これにより "/home/user/app/encrypted" 配下を毎回スッキリさせる
229
+ for item in os.listdir(encrypted_base_dir):
230
+ item_path = os.path.join(encrypted_base_dir, item)
231
+ try:
232
+ if os.path.isfile(item_path) or os.path.islink(item_path):
233
+ os.remove(item_path)
234
+ else:
235
+ shutil.rmtree(item_path)
236
+ logger.info(f"[CLEANUP] Removed old encrypted item: {item_path}")
237
+ except Exception as e:
238
+ logger.warning(f"[CLEANUP] Failed to remove {item_path}: {e}")
239
+ # --------------------------------------
240
+
241
+ # 今回は "enc_{UUID}" のようなサブフォルダ名を決める
242
+ subfolder_label = "enc_" + str(uuid.uuid4())[:8]
243
 
244
+ # rclone で確実に "enc_XXXX" フォルダが生成される
245
  try:
246
+ subprocess.run(
247
+ ["rclone", "copy", local_folder, f"cryptLocal:{subfolder_label}"],
248
+ check=True
249
+ )
250
  except subprocess.CalledProcessError as e:
251
  logger.error(f"rclone copy failed: {e}")
252
  return None
253
 
254
+ enc_folder_path = os.path.join(encrypted_base_dir, subfolder_label)
255
+ if not os.path.isdir(enc_folder_path):
256
+ logger.error(f"[ERROR] {enc_folder_path} is not a directory. Rclone must have produced a file instead.")
 
257
  return None
258
 
259
+ # フォルダをアップロード
 
 
 
 
260
  try:
261
+ self.upload_folder(enc_folder_path, path_in_repo=subfolder_label)
262
+ logger.info(f"Uploaded encrypted folder: {enc_folder_path}")
263
  except Exception as e:
264
  logger.error(f"Failed to upload encrypted folder {enc_folder_path}: {e}")
265
 
266
+ # ローカル平文フォルダと暗号フォルダを削除
267
  try:
268
  shutil.rmtree(local_folder)
269
  shutil.rmtree(enc_folder_path)
270
+ logger.info(f"Removed local folder: {local_folder} and {enc_folder_path}")
271
  except Exception as e:
272
  logger.error(f"Failed to remove local folders: {e}")
273
 
274
+ return subfolder_label
275
 
276
  def upload_file(self, file_path: str, repo_id: Optional[str] = None, path_in_repo: Optional[str] = None):
277
  if repo_id is None:
 
423
  # model_info.json保存
424
  self.save_model_info_json(model_info, folder_name)
425
 
426
+ # === フォルダごと暗号化 & アップロード
427
+ enc_subfolder = self.encrypt_and_upload_folder(folder_name)
428
+ if enc_subfolder is None:
429
+ enc_subfolder = "[ENCRYPT_FAILED]"
 
430
 
431
+ hf_enc_url = f"https://huggingface.co/{self.repo_ids['current']}/tree/main/{enc_subfolder}"
 
432
 
433
  # model_list.logに追記 (実際の暗号フォルダ名をそのまま書き込む)
434
  with open(self.config.LIST_FILE, "a", encoding="utf-8") as f: