Upload main.py
Browse files
main.py
CHANGED
@@ -201,19 +201,22 @@ class CivitAICrawler:
|
|
201 |
|
202 |
def encrypt_and_upload_folder(self, local_folder: str) -> Optional[str]:
|
203 |
"""
|
204 |
-
1. rclone
|
205 |
-
2.
|
206 |
-
3.
|
|
|
|
|
207 |
"""
|
208 |
if not os.path.isdir(local_folder):
|
209 |
-
logger.error(f"encrypt_and_upload_folder: {local_folder}
|
210 |
return None
|
211 |
|
212 |
encrypted_base_dir = os.path.join(os.getcwd(), "encrypted")
|
213 |
os.makedirs(encrypted_base_dir, exist_ok=True)
|
214 |
|
215 |
-
#
|
216 |
-
|
|
|
217 |
item_path = os.path.join(encrypted_base_dir, item)
|
218 |
try:
|
219 |
if os.path.isfile(item_path):
|
@@ -224,52 +227,43 @@ class CivitAICrawler:
|
|
224 |
except Exception as e:
|
225 |
logger.warning(f"[CLEANUP] Failed to remove {item_path}: {e}")
|
226 |
|
227 |
-
|
228 |
-
|
229 |
-
# mkdir
|
230 |
-
try:
|
231 |
-
subprocess.run(["rclone", "mkdir", f"cryptLocal:{subfolder_label}"], check=True)
|
232 |
-
logger.info(f"[OK] rclone mkdir cryptLocal:{subfolder_label}")
|
233 |
-
except subprocess.CalledProcessError as e:
|
234 |
-
logger.error(f"rclone mkdir failed: {e}")
|
235 |
-
return None
|
236 |
-
|
237 |
-
# copy
|
238 |
try:
|
239 |
subprocess.run(
|
240 |
-
[
|
241 |
-
"rclone", "copy",
|
242 |
-
local_folder,
|
243 |
-
f"cryptLocal:{subfolder_label}",
|
244 |
-
"--create-empty-src-dirs"
|
245 |
-
],
|
246 |
check=True
|
247 |
)
|
248 |
-
logger.info(f"[OK] rclone copy {local_folder} => cryptLocal:
|
249 |
except subprocess.CalledProcessError as e:
|
250 |
logger.error(f"rclone copy failed: {e}")
|
251 |
return None
|
252 |
|
253 |
-
#
|
254 |
-
|
255 |
-
|
256 |
-
|
|
|
257 |
return None
|
258 |
-
|
|
|
|
|
|
|
259 |
enc_folder_path = os.path.join(encrypted_base_dir, enc_folder_name)
|
260 |
|
261 |
if not os.path.isdir(enc_folder_path):
|
262 |
logger.error(f"[ERROR] {enc_folder_path} is not a directory.")
|
263 |
return None
|
264 |
|
265 |
-
#
|
|
|
266 |
try:
|
267 |
-
self.upload_folder(enc_folder_path, path_in_repo=
|
268 |
logger.info(f"[OK] Uploaded encrypted folder: {enc_folder_path}")
|
269 |
except Exception as e:
|
270 |
logger.error(f"Failed to upload encrypted folder {enc_folder_path}: {e}")
|
271 |
|
272 |
-
# ローカル削除
|
273 |
try:
|
274 |
shutil.rmtree(local_folder)
|
275 |
shutil.rmtree(enc_folder_path)
|
@@ -277,7 +271,8 @@ class CivitAICrawler:
|
|
277 |
except Exception as e:
|
278 |
logger.warning(f"[CLEANUP] Could not remove local folders: {e}")
|
279 |
|
280 |
-
|
|
|
281 |
|
282 |
def upload_file(self, file_path: str, repo_id: Optional[str] = None, path_in_repo: Optional[str] = None):
|
283 |
if repo_id is None:
|
|
|
201 |
|
202 |
def encrypt_and_upload_folder(self, local_folder: str) -> Optional[str]:
|
203 |
"""
|
204 |
+
1. rclone copy local_folder => cryptLocal: (フォルダ名はrcloneが勝手に暗号化生成)
|
205 |
+
2. 差分検知で "./encrypted" に作られた暗号フォルダ名を取得
|
206 |
+
3. そのフォルダ名を path_in_repo として Hugging Face にアップロード
|
207 |
+
4. ローカル(平文+暗号)フォルダ削除
|
208 |
+
5. 戻り値は "実際に作られた暗号フォルダ名"
|
209 |
"""
|
210 |
if not os.path.isdir(local_folder):
|
211 |
+
logger.error(f"[encrypt_and_upload_folder] Not a directory: {local_folder}")
|
212 |
return None
|
213 |
|
214 |
encrypted_base_dir = os.path.join(os.getcwd(), "encrypted")
|
215 |
os.makedirs(encrypted_base_dir, exist_ok=True)
|
216 |
|
217 |
+
# 既存の暗号フォルダを削除
|
218 |
+
before_set = set(os.listdir(encrypted_base_dir))
|
219 |
+
for item in before_set:
|
220 |
item_path = os.path.join(encrypted_base_dir, item)
|
221 |
try:
|
222 |
if os.path.isfile(item_path):
|
|
|
227 |
except Exception as e:
|
228 |
logger.warning(f"[CLEANUP] Failed to remove {item_path}: {e}")
|
229 |
|
230 |
+
# === (1) rclone copy local_folder => cryptLocal: ===
|
231 |
+
# これにより /home/user/app/encrypted/<ランダム暗号フォルダ> が作成される
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
232 |
try:
|
233 |
subprocess.run(
|
234 |
+
["rclone", "copy", local_folder, "cryptLocal:", "--create-empty-src-dirs"],
|
|
|
|
|
|
|
|
|
|
|
235 |
check=True
|
236 |
)
|
237 |
+
logger.info(f"[OK] rclone copy {local_folder} => cryptLocal:")
|
238 |
except subprocess.CalledProcessError as e:
|
239 |
logger.error(f"rclone copy failed: {e}")
|
240 |
return None
|
241 |
|
242 |
+
# === (2) 差分検知: 新しく生成された暗号フォルダ名を取得 ===
|
243 |
+
after_set = set(os.listdir(encrypted_base_dir))
|
244 |
+
diff = after_set - before_set
|
245 |
+
if not diff:
|
246 |
+
logger.error("[ERROR] No new directory appeared in ./encrypted after rclone copy.")
|
247 |
return None
|
248 |
+
if len(diff) > 1:
|
249 |
+
logger.warning(f"[WARN] Multiple new directories created: {diff}")
|
250 |
+
|
251 |
+
enc_folder_name = diff.pop() # 1個だけ取り出す
|
252 |
enc_folder_path = os.path.join(encrypted_base_dir, enc_folder_name)
|
253 |
|
254 |
if not os.path.isdir(enc_folder_path):
|
255 |
logger.error(f"[ERROR] {enc_folder_path} is not a directory.")
|
256 |
return None
|
257 |
|
258 |
+
# === (3) Hugging Face にアップロード ===
|
259 |
+
# path_in_repo も "enc_folder_name" をそのまま使う
|
260 |
try:
|
261 |
+
self.upload_folder(enc_folder_path, path_in_repo=enc_folder_name)
|
262 |
logger.info(f"[OK] 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 |
+
# === (4) ローカル削除 (平文フォルダ + 暗号化フォルダ)
|
267 |
try:
|
268 |
shutil.rmtree(local_folder)
|
269 |
shutil.rmtree(enc_folder_path)
|
|
|
271 |
except Exception as e:
|
272 |
logger.warning(f"[CLEANUP] Could not remove local folders: {e}")
|
273 |
|
274 |
+
# === (5) 実際の暗号フォルダ名を返す
|
275 |
+
return enc_folder_name
|
276 |
|
277 |
def upload_file(self, file_path: str, repo_id: Optional[str] = None, path_in_repo: Optional[str] = None):
|
278 |
if repo_id is None:
|