Update app.py
Browse files
app.py
CHANGED
|
@@ -35,8 +35,12 @@ st.set_page_config(page_title="Hugging Face Space Tools", page_icon="🛠️")
|
|
| 35 |
|
| 36 |
st.title("🛠️ ابزارهای مدیریت اسپیس هاگینگفیس")
|
| 37 |
|
| 38 |
-
# ایجاد د
|
| 39 |
-
tab1, tab2 = st.tabs([
|
|
|
|
|
|
|
|
|
|
|
|
|
| 40 |
|
| 41 |
# ---------------------------------------------------------
|
| 42 |
# تب اول: انتقال به گیتهاب (پشتیبانی از لینک و فایل زیپ + حل مشکل پوشه اضافه)
|
|
@@ -98,17 +102,14 @@ with tab1:
|
|
| 98 |
zip_ref.extractall(temp_dir)
|
| 99 |
|
| 100 |
# بررسی و رفع مشکل پوشه اضافه (انتقال محتویات به روت اصلی)
|
| 101 |
-
# پوشههای سیستمی مک را نادیده میگیریم تا اختلال ایجاد نکنند
|
| 102 |
extracted_items = [item for item in os.listdir(temp_dir) if item != '__MACOSX']
|
| 103 |
|
| 104 |
# اگر فقط یک پوشه در مسیر وجود داشت
|
| 105 |
if len(extracted_items) == 1:
|
| 106 |
single_folder_path = os.path.join(temp_dir, extracted_items[0])
|
| 107 |
if os.path.isdir(single_folder_path):
|
| 108 |
-
# تمام فایلهای داخل آن پوشه را یک سطح بالاتر (به روت) منتقل میکنیم
|
| 109 |
for item in os.listdir(single_folder_path):
|
| 110 |
shutil.move(os.path.join(single_folder_path, item), temp_dir)
|
| 111 |
-
# پوشه خالی باقیمانده را حذف میکنیم
|
| 112 |
os.rmdir(single_folder_path)
|
| 113 |
|
| 114 |
# مرحله 2: عملیات گیت و پوش
|
|
@@ -149,9 +150,116 @@ with tab1:
|
|
| 149 |
shutil.rmtree(temp_dir, ignore_errors=True)
|
| 150 |
|
| 151 |
# ---------------------------------------------------------
|
| 152 |
-
# تب دوم:
|
| 153 |
# ---------------------------------------------------------
|
| 154 |
with tab2:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 155 |
st.info("با استفاده از این بخش میتوانید کل فایلهای یک اسپیس عمومی را به صورت ZIP دانلود کنید.")
|
| 156 |
|
| 157 |
hf_url_zip = st.text_input("لینک صفحه اسپیس هاگینگ فیس",
|
|
@@ -202,4 +310,4 @@ with tab2:
|
|
| 202 |
st.error(f"خطای سیستمی: {e}")
|
| 203 |
finally:
|
| 204 |
if os.path.exists(temp_dir_zip):
|
| 205 |
-
shutil.rmtree(temp_dir_zip, ignore_errors=True)
|
|
|
|
| 35 |
|
| 36 |
st.title("🛠️ ابزارهای مدیریت اسپیس هاگینگفیس")
|
| 37 |
|
| 38 |
+
# ایجاد سه تب (اضافه شدن تب انتقال به هاگینگفیس)
|
| 39 |
+
tab1, tab2, tab3 = st.tabs([
|
| 40 |
+
"🔄 انتقال به گیتهاب",
|
| 41 |
+
"📤 انتقال به هاگینگفیس",
|
| 42 |
+
"📦 دانلود اسپیس (فایل ZIP)"
|
| 43 |
+
])
|
| 44 |
|
| 45 |
# ---------------------------------------------------------
|
| 46 |
# تب اول: انتقال به گیتهاب (پشتیبانی از لینک و فایل زیپ + حل مشکل پوشه اضافه)
|
|
|
|
| 102 |
zip_ref.extractall(temp_dir)
|
| 103 |
|
| 104 |
# بررسی و رفع مشکل پوشه اضافه (انتقال محتویات به روت اصلی)
|
|
|
|
| 105 |
extracted_items = [item for item in os.listdir(temp_dir) if item != '__MACOSX']
|
| 106 |
|
| 107 |
# اگر فقط یک پوشه در مسیر وجود داشت
|
| 108 |
if len(extracted_items) == 1:
|
| 109 |
single_folder_path = os.path.join(temp_dir, extracted_items[0])
|
| 110 |
if os.path.isdir(single_folder_path):
|
|
|
|
| 111 |
for item in os.listdir(single_folder_path):
|
| 112 |
shutil.move(os.path.join(single_folder_path, item), temp_dir)
|
|
|
|
| 113 |
os.rmdir(single_folder_path)
|
| 114 |
|
| 115 |
# مرحله 2: عملیات گیت و پوش
|
|
|
|
| 150 |
shutil.rmtree(temp_dir, ignore_errors=True)
|
| 151 |
|
| 152 |
# ---------------------------------------------------------
|
| 153 |
+
# تب دوم: انتقال به هاگینگفیس (پشتیبانی از لینک ریپازیتوری و فایل ZIP)
|
| 154 |
# ---------------------------------------------------------
|
| 155 |
with tab2:
|
| 156 |
+
st.info("منبع خود را برای انتقال به اسپیس هاگینگفیس انتخاب کنید:")
|
| 157 |
+
|
| 158 |
+
# انتخاب نوع منبع خارج از فرم برای رندر داینامیک
|
| 159 |
+
source_type_hf = st.radio("نوع منبع (برای هاگینگفیس):", ["لینک ریپازیتوری (گیتهاب و غیره)", "آپلود فایل ZIP"], key="src_type_hf")
|
| 160 |
+
|
| 161 |
+
with st.form("transfer_hf_form"):
|
| 162 |
+
src_url_hf = ""
|
| 163 |
+
uploaded_zip_hf = None
|
| 164 |
+
|
| 165 |
+
if source_type_hf == "لینک ریپازیتوری (گیتهاب و غیره)":
|
| 166 |
+
src_url_hf = st.text_input("لینک ریپازیتوری منبع (مثلاً گیتهاب)",
|
| 167 |
+
placeholder="https://github.com/user/repo.git", key="src_url_hf_input")
|
| 168 |
+
else:
|
| 169 |
+
uploaded_zip_hf = st.file_uploader("آپلود فایل ZIP (منبع)", type=["zip"], key="zip_hf_input")
|
| 170 |
+
|
| 171 |
+
st.markdown("---")
|
| 172 |
+
hf_target_url = st.text_input("لینک کامل اسپیس هاگینگفیس (مقصد)",
|
| 173 |
+
placeholder="https://huggingface.co/spaces/user/space-name", key="target_hf_url")
|
| 174 |
+
|
| 175 |
+
hf_token = st.text_input("توکن هاگینگفیس (با دسترسی Write)", type="password", key="hf_token_input")
|
| 176 |
+
|
| 177 |
+
submitted_hf = st.form_submit_button("شروع عملیات انتقال به هاگینگفیس 🚀")
|
| 178 |
+
|
| 179 |
+
if submitted_hf:
|
| 180 |
+
if not hf_target_url or not hf_token:
|
| 181 |
+
st.error("لطفاً لینک اسپیس مقصد و توکن هاگینگفیس را وارد کنید.")
|
| 182 |
+
elif source_type_hf == "لینک ریپازیتوری (گیتهاب و غیره)" and not src_url_hf:
|
| 183 |
+
st.error("لطفاً لینک ریپازیتوری منبع را وارد کنید.")
|
| 184 |
+
elif source_type_hf == "آپلود فایل ZIP" and not uploaded_zip_hf:
|
| 185 |
+
st.error("لطفاً فایل ZIP را آپلود کنید.")
|
| 186 |
+
elif "huggingface.co/spaces/" not in hf_target_url:
|
| 187 |
+
st.error("❌ لینک اسپیس مقصد اشتباه است! لینک باید با ساختار huggingface.co/spaces/... باشد.")
|
| 188 |
+
else:
|
| 189 |
+
status_area_hf = st.empty()
|
| 190 |
+
temp_dir_hf = "temp_repo_hf"
|
| 191 |
+
|
| 192 |
+
if os.path.exists(temp_dir_hf):
|
| 193 |
+
shutil.rmtree(temp_dir_hf, ignore_errors=True)
|
| 194 |
+
|
| 195 |
+
try:
|
| 196 |
+
# فرمت مناسب لینک برای احراز هویت توکن هاگینگفیس
|
| 197 |
+
auth_hf_url = hf_target_url.replace("https://", f"https://__token__:{hf_token}@")
|
| 198 |
+
|
| 199 |
+
# مرحله 1: آمادهسازی فایلها (دانلود یا استخراج زیپ)
|
| 200 |
+
if source_type_hf == "لینک ریپازیتوری (گیتهاب و غیره)":
|
| 201 |
+
status_area_hf.info("📥 در حال دانلود (کلون) ریپازیتوری منبع...")
|
| 202 |
+
success, msg = run_command(f"git clone {src_url_hf} {temp_dir_hf}")
|
| 203 |
+
if not success:
|
| 204 |
+
st.error(f"خطا در کلون کردن ریپازیتوری منبع: {msg}")
|
| 205 |
+
st.stop()
|
| 206 |
+
else:
|
| 207 |
+
status_area_hf.info("📥 در حال استخراج فایل ZIP...")
|
| 208 |
+
os.makedirs(temp_dir_hf, exist_ok=True)
|
| 209 |
+
with zipfile.ZipFile(uploaded_zip_hf, 'r') as zip_ref:
|
| 210 |
+
zip_ref.extractall(temp_dir_hf)
|
| 211 |
+
|
| 212 |
+
# رفع مشکل پوشه اضافه درون فایل ZIP
|
| 213 |
+
extracted_items = [item for item in os.listdir(temp_dir_hf) if item != '__MACOSX']
|
| 214 |
+
if len(extracted_items) == 1:
|
| 215 |
+
single_folder_path = os.path.join(temp_dir_hf, extracted_items[0])
|
| 216 |
+
if os.path.isdir(single_folder_path):
|
| 217 |
+
for item in os.listdir(single_folder_path):
|
| 218 |
+
shutil.move(os.path.join(single_folder_path, item), temp_dir_hf)
|
| 219 |
+
os.rmdir(single_folder_path)
|
| 220 |
+
|
| 221 |
+
# مرحله 2: ساخت مخزن تمیز گیت و پوش به هاگینگفیس
|
| 222 |
+
os.chdir(temp_dir_hf)
|
| 223 |
+
status_area_hf.info("⚙️ در حال تنظیمات گیت...")
|
| 224 |
+
|
| 225 |
+
if os.path.exists(".git"):
|
| 226 |
+
shutil.rmtree(".git", ignore_errors=True)
|
| 227 |
+
|
| 228 |
+
run_command("git init")
|
| 229 |
+
run_command("git add .")
|
| 230 |
+
run_command('git config user.email "bot@transfer.com"')
|
| 231 |
+
run_command('git config user.name "Transfer Bot"')
|
| 232 |
+
run_command('git commit -m "Moved to Hugging Face automatically"')
|
| 233 |
+
run_command("git branch -M main")
|
| 234 |
+
|
| 235 |
+
status_area_hf.info("📤 در حال آپلود فایلها به اسپیس هاگینگفیس...")
|
| 236 |
+
push_success, push_msg = run_command(f"git push -f {auth_hf_url} main")
|
| 237 |
+
|
| 238 |
+
if push_success:
|
| 239 |
+
st.success("✅ انتقال موفقیتآمیز بود! فرآیند بیلد (Build) اسپیس شما در هاگینگفیس آغاز شد.")
|
| 240 |
+
st.balloons()
|
| 241 |
+
else:
|
| 242 |
+
# مخفیسازی توکن جهت مسائل امنیتی در لاگ خطا
|
| 243 |
+
clean_error = push_msg.replace(hf_token, "***")
|
| 244 |
+
st.error(f"خطا در آپلود به هاگینگفیس: {clean_error}")
|
| 245 |
+
|
| 246 |
+
os.chdir("..")
|
| 247 |
+
|
| 248 |
+
except Exception as e:
|
| 249 |
+
st.error(f"خطای سیستمی: {e}")
|
| 250 |
+
finally:
|
| 251 |
+
try:
|
| 252 |
+
if os.getcwd().endswith(temp_dir_hf):
|
| 253 |
+
os.chdir("..")
|
| 254 |
+
except:
|
| 255 |
+
pass
|
| 256 |
+
if os.path.exists(temp_dir_hf):
|
| 257 |
+
shutil.rmtree(temp_dir_hf, ignore_errors=True)
|
| 258 |
+
|
| 259 |
+
# ---------------------------------------------------------
|
| 260 |
+
# تب سوم: دانلود فایلها به صورت زیپ
|
| 261 |
+
# ---------------------------------------------------------
|
| 262 |
+
with tab3:
|
| 263 |
st.info("با استفاده از این بخش میتوانید کل فایلهای یک اسپیس عمومی را به صورت ZIP دانلود کنید.")
|
| 264 |
|
| 265 |
hf_url_zip = st.text_input("لینک صفحه اسپیس هاگینگ فیس",
|
|
|
|
| 310 |
st.error(f"خطای سیستمی: {e}")
|
| 311 |
finally:
|
| 312 |
if os.path.exists(temp_dir_zip):
|
| 313 |
+
shutil.rmtree(temp_dir_zip, ignore_errors=True)
|