Opera8 commited on
Commit
dd1bb8b
·
verified ·
1 Parent(s): 6ee2763

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +115 -7
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(["🔄 انتقال به گیت‌هاب", "📦 دانلود اسپیس (فایل ZIP)"])
 
 
 
 
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)