Upload main.py
Browse files
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 |
-
|
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 |
-
#
|
213 |
-
#
|
214 |
def encrypt_and_upload_folder(self, local_folder: str) -> Optional[str]:
|
215 |
"""
|
216 |
-
1.
|
217 |
-
|
218 |
-
|
219 |
-
3.
|
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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
231 |
|
232 |
-
#
|
233 |
try:
|
234 |
-
subprocess.run(
|
|
|
|
|
|
|
235 |
except subprocess.CalledProcessError as e:
|
236 |
logger.error(f"rclone copy failed: {e}")
|
237 |
return None
|
238 |
|
239 |
-
|
240 |
-
|
241 |
-
|
242 |
-
logger.error("No new encrypted folder found. Possibly an error.")
|
243 |
return None
|
244 |
|
245 |
-
#
|
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=
|
252 |
-
logger.info(f"Uploaded encrypted folder
|
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
|
261 |
except Exception as e:
|
262 |
logger.error(f"Failed to remove local folders: {e}")
|
263 |
|
264 |
-
return
|
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 |
-
#
|
417 |
-
|
418 |
-
if
|
419 |
-
|
420 |
-
enc_folder_name = "[ENCRYPT_FAILED]"
|
421 |
|
422 |
-
|
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:
|