suprimedev commited on
Commit
a3263de
·
verified ·
1 Parent(s): 88e3c8f

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +39 -65
app.py CHANGED
@@ -1,99 +1,73 @@
1
  import gradio as gr
2
  import yt_dlp
3
- import os
4
  import tempfile
 
5
  import shutil
6
- import uuid # برای نام منحصربه‌فرد فایل‌ها
7
 
8
- def convert_to_mp3(url):
9
  """
10
- دانلود صوت از لینک ویدیو و تبدیل به MP3.
11
- خروجی: path فایل MP3 و پیام (شامل راهنمایی لینک).
12
  """
13
- if not url:
14
- return None, "لطفاً لینک ویدیو را وارد کنید."
15
-
16
- # ایجاد پوشه موقت
17
- temp_dir = tempfile.mkdtemp()
18
- unique_id = str(uuid.uuid4()) # نام منحصربه‌فرد برای جلوگیری از تداخل
19
- output_template = f'{unique_id}_%(title)s.%(ext)s'
20
- output_path = os.path.join(temp_dir, output_template)
21
 
 
22
  ydl_opts = {
23
  'format': 'bestaudio/best', # بهترین کیفیت صوت
24
- 'extractaudio': True, # استخراج صوت
25
- 'audioformat': 'mp3', # تبدیل به MP3
26
- 'outtmpl': output_path, # نام فایل
27
- 'postprocessors': [{ # پردازش با FFmpeg
28
- 'key': 'FFmpegExtractAudio',
29
  'preferredcodec': 'mp3',
30
- 'preferredquality': '192', # 192kbps
31
  }],
32
- 'noplaylist': True, # فقط ویدیو اصلی
 
33
  }
34
 
35
  try:
36
  with yt_dlp.YoutubeDL(ydl_opts) as ydl:
37
- info = ydl.extract_info(url, download=False)
38
- title = info.get('title', 'audio').replace('/', '_').replace('\\', '_') # پاکسازی نام
39
- ydl.download([url])
40
 
41
- # پیدا کردن فایل MP3
42
- mp3_files = [f for f in os.listdir(temp_dir) if f.startswith(unique_id) and f.endswith('.mp3')]
43
- if not mp3_files:
44
- shutil.rmtree(temp_dir, ignore_errors=True)
45
- return None, "خطا در دانلود یا تبدیل فایل."
 
46
 
47
- mp3_filename = mp3_files[0]
48
- mp3_path = os.path.join(temp_dir, mp3_filename)
49
 
50
- # پیام Markdown با راهنمایی لینک (برای UI و API)
51
- message = f"""
52
- ### تبدیل موفق!
53
- - **فایل**: `{mp3_filename}`
54
 
55
- #### 🔗 لینک دانلود MP3
56
- - **در UI Gradio**: از دکمه دانلود در کامپوننت File استفاده کنید (URL موقت تولید می‌شود).
57
- - **در API**: خروجی `data[0]` یک URL مستقیم به MP3 است (مثل `https://your-space.hf.space/file={mp3_filename}`).
58
 
59
- **نکته مهم**: لینک‌ها موقت هستند (در Spaces، ۱-۲ ساعت اعتبار). برای API، به `/api/predict` POST کنید با `data: [{{"text": "لینک ویدیو"}}]`.
60
- """
61
-
62
- return mp3_path, message
63
 
64
  except Exception as e:
65
- shutil.rmtree(temp_dir, ignore_errors=True)
66
- return None, f"### ❌ خطا!\n{str(e)}\n\n**نکته**: مطمئن شوید لینک معتبر است (مثل یوتیوب). yt-dlp از بسیاری سایت‌ها پشتیبانی می‌کند."
67
 
68
- # اینترفیس Gradio
69
- demo = gr.Interface(
70
  fn=convert_to_mp3,
71
  inputs=gr.Textbox(
72
  label="لینک ویدیو (مثل یوتیوب)",
73
- placeholder="https://www.youtube.com/watch?v=...",
74
- lines=1
75
  ),
76
  outputs=[
77
- gr.File(
78
- label="فایل MP3 (دانلود)",
79
- visible=True # دکمه دانلود نمایش داده می‌شود
80
- ),
81
- gr.Markdown(label="پیام و لینک") # بدون lines – تصحیح شده
82
  ],
83
- title="تبدیل ویدیو به MP3 با لینک دانلود",
84
- description="""لینک ویدیو را وارد کنید. خروجی شامل فایل MP3 و لینک دانلود موقت است.
85
- در API، URL MP3 مستقیماً برمی‌گردد. از yt-dlp و FFmpeg استفاده می‌کند.
86
-
87
- **استفاده از API**:
88
- - POST به `https://your-space.hf.space/api/predict`
89
- - Body: `{"data": [{"text": "https://youtube-link..."}]}`
90
- - Response: `{"data": ["path/to/mp3.mp3", "message"]}` – `data[0]` URL پروکسی‌شده است.
91
- """,
92
  examples=[
93
- ["https://www.youtube.com/watch?v=dQw4w9WgXcQ"],
94
- ],
95
- theme=gr.themes.Soft()
96
  )
97
 
98
  if __name__ == "__main__":
99
- demo.launch(share=True)
 
1
  import gradio as gr
2
  import yt_dlp
 
3
  import tempfile
4
+ import os
5
  import shutil
 
6
 
7
+ def convert_to_mp3(video_url):
8
  """
9
+ دانلود ویدیو/صوت از لینک و تبدیل به MP3.
10
+ فایل موقت MP3 ایجاد می‌شود و لینک دانلود برمی‌گردد.
11
  """
12
+ if not video_url:
13
+ return None, "لینک ویدیو را وارد کنید."
 
 
 
 
 
 
14
 
15
+ # تنظیمات yt-dlp برای دانلود صوت و تبدیل مستقیم به MP3
16
  ydl_opts = {
17
  'format': 'bestaudio/best', # بهترین کیفیت صوت
18
+ 'postprocessors': [{
19
+ 'key': 'FFmpegExtractAudio', # استخراج صوت با FFmpeg
 
 
 
20
  'preferredcodec': 'mp3',
21
+ 'preferredquality': '192', # کیفیت 192kbps (قابل تنظیم)
22
  }],
23
+ 'outtmpl': 'temp.%(ext)s', # نام فایل موقت
24
+ 'quiet': True, # کاهش لاگ‌ها
25
  }
26
 
27
  try:
28
  with yt_dlp.YoutubeDL(ydl_opts) as ydl:
29
+ ydl.download([video_url])
 
 
30
 
31
+ # پیدا کردن فایل MP3 (پس از postprocessor)
32
+ mp3_file = None
33
+ for file in os.listdir('.'):
34
+ if file.startswith('temp.') and file.endswith('.mp3'):
35
+ mp3_file = file
36
+ break
37
 
38
+ if not mp3_file:
39
+ return None, "خطا در دانلود یا تبدیل. مطمئن شوید لینک معتبر است."
40
 
41
+ # کپی به فایل موقت برای Gradio (برای امنیت و تمیزکاری)
42
+ temp_mp3 = tempfile.NamedTemporaryFile(suffix='.mp3', delete=False)
43
+ temp_mp3.close() # بستن برای نوشتن
44
+ shutil.copy2(mp3_file, temp_mp3.name)
45
 
46
+ # تمیز کردن فایل اصلی
47
+ os.remove(mp3_file)
 
48
 
49
+ return temp_mp3.name, "فایل MP3 با موفقیت ایجاد شد. دانلود کنید."
 
 
 
50
 
51
  except Exception as e:
52
+ return None, f"خطا: {str(e)}"
 
53
 
54
+ # رابط Gradio
55
+ iface = gr.Interface(
56
  fn=convert_to_mp3,
57
  inputs=gr.Textbox(
58
  label="لینک ویدیو (مثل یوتیوب)",
59
+ placeholder="https://www.youtube.com/watch?v=..."
 
60
  ),
61
  outputs=[
62
+ gr.File(label="دانلود MP3"),
63
+ gr.Textbox(label="پیام وضعیت")
 
 
 
64
  ],
65
+ title="تبدیل ویدیو به MP3",
66
+ description="لینک ویدیو را وارد کنید تا صوت آن به MP3 تبدیل شود.",
 
 
 
 
 
 
 
67
  examples=[
68
+ ["https://www.youtube.com/watch?v=dQw4w9WgXcQ"]
69
+ ]
 
70
  )
71
 
72
  if __name__ == "__main__":
73
+ iface.launch()