Upload main.py
Browse files
main.py
CHANGED
@@ -133,49 +133,78 @@ class CivitAICrawler:
|
|
133 |
logger.error(f"[ERR] upload_folder: {e}")
|
134 |
|
135 |
def encrypt_and_upload_folder(self, local_folder: str) -> Optional[str]:
|
136 |
-
"""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
137 |
if not os.path.isdir(local_folder):
|
138 |
logger.error(f"[ERR] {local_folder} is not a directory.")
|
139 |
return None
|
140 |
|
141 |
-
|
142 |
-
|
|
|
|
|
143 |
|
144 |
-
|
145 |
-
|
146 |
-
|
147 |
-
logger.info(f"[CMD] {' '.join(cmd)}")
|
148 |
try:
|
149 |
-
subprocess.run(
|
150 |
-
logger.info(f"[OK] rclone
|
151 |
except subprocess.CalledProcessError as e:
|
152 |
-
logger.error(f"[ERR] rclone
|
153 |
return None
|
154 |
|
155 |
-
|
156 |
-
|
157 |
-
|
158 |
-
|
|
|
|
|
|
|
|
|
159 |
return None
|
160 |
-
|
161 |
-
|
162 |
-
|
163 |
-
|
164 |
-
|
165 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
166 |
return None
|
167 |
|
168 |
-
#
|
169 |
try:
|
170 |
-
self.upload_folder(
|
171 |
except Exception as e:
|
172 |
logger.error(f"[ERR] encrypt_and_upload_folder => upload_folder: {e}")
|
173 |
|
174 |
-
# cleanup
|
|
|
175 |
shutil.rmtree(local_folder, ignore_errors=True)
|
176 |
-
shutil.rmtree(
|
177 |
-
logger.info(f"[CLEANUP] removed {local_folder} & {
|
178 |
-
|
|
|
179 |
|
180 |
# ここで「download_and_process_versions」(=古いバージョン含めまとめてダウンロード) 定義
|
181 |
# => 今回は名前を合わせ「download_and_process_versions」に合わせる
|
|
|
133 |
logger.error(f"[ERR] upload_folder: {e}")
|
134 |
|
135 |
def encrypt_and_upload_folder(self, local_folder: str) -> Optional[str]:
|
136 |
+
"""
|
137 |
+
1) subfolder_label = モデルフォルダ名 (local_folderのベース名)
|
138 |
+
2) rclone mkdir cryptLocal:subfolder_label
|
139 |
+
3) rclone copy local_folder => cryptLocal:subfolder_label
|
140 |
+
4) rclone copy cryptLocal:subfolder_label => encrypted/subfolder_label (差分検知やめる)
|
141 |
+
5) upload_folder(encrypted/subfolder_label, path_in_repo=subfolder_label)
|
142 |
+
6) cleanup
|
143 |
+
"""
|
144 |
if not os.path.isdir(local_folder):
|
145 |
logger.error(f"[ERR] {local_folder} is not a directory.")
|
146 |
return None
|
147 |
|
148 |
+
subfolder_label = os.path.basename(local_folder) # ★ モデル名 or ファイル名を取得
|
149 |
+
if not subfolder_label:
|
150 |
+
logger.error(f"[ERR] local_folder has empty basename: {local_folder}")
|
151 |
+
return None
|
152 |
|
153 |
+
# === 1) rclone mkdir
|
154 |
+
mkdir_cmd = ["rclone", "mkdir", f"cryptLocal:{subfolder_label}"]
|
155 |
+
logger.info(f"[CMD] {' '.join(mkdir_cmd)}")
|
|
|
156 |
try:
|
157 |
+
subprocess.run(mkdir_cmd, check=True)
|
158 |
+
logger.info(f"[OK] rclone mkdir cryptLocal:{subfolder_label}")
|
159 |
except subprocess.CalledProcessError as e:
|
160 |
+
logger.error(f"[ERR] rclone mkdir => {e}")
|
161 |
return None
|
162 |
|
163 |
+
# === 2) rclone copy local_folder => cryptLocal:subfolder_label
|
164 |
+
copy_cmd = ["rclone", "copy", local_folder, f"cryptLocal:{subfolder_label}", "--create-empty-src-dirs"]
|
165 |
+
logger.info(f"[CMD] {' '.join(copy_cmd)}")
|
166 |
+
try:
|
167 |
+
subprocess.run(copy_cmd, check=True)
|
168 |
+
logger.info(f"[OK] rclone copy => cryptLocal:{subfolder_label}")
|
169 |
+
except subprocess.CalledProcessError as e:
|
170 |
+
logger.error(f"[ERR] rclone copy => {e}")
|
171 |
return None
|
172 |
+
|
173 |
+
# === 3) ローカル "encrypted/subfolder_label" に復号ファイル(?) を落とすかどうか
|
174 |
+
# → HFへのフォルダアップには「ローカルに暗号ファイル群」が必要
|
175 |
+
# → しかし "directory_name_encryption=true" ならリモート名だけで復号されず、ランダム名かも
|
176 |
+
# 今回は「物理的に local へ落として upload_folder()」する想定にする
|
177 |
+
encrypted_base = os.path.join(os.getcwd(), "encrypted")
|
178 |
+
os.makedirs(encrypted_base, exist_ok=True)
|
179 |
+
|
180 |
+
# remove old if exist
|
181 |
+
local_enc_path = os.path.join(encrypted_base, subfolder_label)
|
182 |
+
if os.path.exists(local_enc_path):
|
183 |
+
shutil.rmtree(local_enc_path)
|
184 |
+
|
185 |
+
# rclone copy cryptLocal:subfolder_label => encrypted/subfolder_label
|
186 |
+
pull_cmd = ["rclone", "copy", f"cryptLocal:{subfolder_label}", local_enc_path, "--create-empty-src-dirs"]
|
187 |
+
logger.info(f"[CMD] {' '.join(pull_cmd)}")
|
188 |
+
try:
|
189 |
+
subprocess.run(pull_cmd, check=True)
|
190 |
+
logger.info(f"[OK] rclone copy => {local_enc_path}")
|
191 |
+
except subprocess.CalledProcessError as e:
|
192 |
+
logger.error(f"[ERR] rclone copy back => {e}")
|
193 |
return None
|
194 |
|
195 |
+
# === 4) upload_folder(local_enc_path, path_in_repo=subfolder_label)
|
196 |
try:
|
197 |
+
self.upload_folder(local_enc_path, path_in_repo=subfolder_label)
|
198 |
except Exception as e:
|
199 |
logger.error(f"[ERR] encrypt_and_upload_folder => upload_folder: {e}")
|
200 |
|
201 |
+
# === 5) cleanup
|
202 |
+
# remove local_folder & local_enc_path
|
203 |
shutil.rmtree(local_folder, ignore_errors=True)
|
204 |
+
shutil.rmtree(local_enc_path, ignore_errors=True)
|
205 |
+
logger.info(f"[CLEANUP] removed {local_folder} & {local_enc_path}")
|
206 |
+
|
207 |
+
return subfolder_label
|
208 |
|
209 |
# ここで「download_and_process_versions」(=古いバージョン含めまとめてダウンロード) 定義
|
210 |
# => 今回は名前を合わせ「download_and_process_versions」に合わせる
|