taslim19 commited on
Commit
7041448
·
1 Parent(s): 1122d52

feat: patch /play to use Bitflow API for YouTube, configurable API key via env

Browse files
DragMusic/platforms/Youtube.py CHANGED
@@ -7,7 +7,9 @@ import yt_dlp
7
  from pyrogram.enums import MessageEntityType
8
  from pyrogram.types import Message
9
  from youtubesearchpython.__future__ import VideosSearch
10
-
 
 
11
  from DragMusic.utils.database import is_on_off
12
  from DragMusic.utils.formatters import time_to_seconds
13
 
@@ -350,4 +352,21 @@ class YouTubeAPI:
350
  else:
351
  direct = True
352
  downloaded_file = await loop.run_in_executor(None, audio_dl)
353
- return downloaded_file, direct
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7
  from pyrogram.enums import MessageEntityType
8
  from pyrogram.types import Message
9
  from youtubesearchpython.__future__ import VideosSearch
10
+ import httpx
11
+ import config
12
+ import httpx
13
  from DragMusic.utils.database import is_on_off
14
  from DragMusic.utils.formatters import time_to_seconds
15
 
 
352
  else:
353
  direct = True
354
  downloaded_file = await loop.run_in_executor(None, audio_dl)
355
+ return downloaded_file, direct
356
+
357
+ async def bitflow_video(self, query: str, api_key: str = None):
358
+ """
359
+ Fetch video info from Bitflow API.
360
+ Args:
361
+ query (str): The search query or YouTube URL.
362
+ api_key (str, optional): Bitflow API key. Defaults to config.BITFLOW_API_KEY.
363
+ Returns:
364
+ dict: The JSON result from the Bitflow API.
365
+ """
366
+ api_url = "https://bitflow.in/api/youtube"
367
+ if api_key is None:
368
+ api_key = config.BITFLOW_API_KEY
369
+ params = {"query": query, "format": "video", "api_key": api_key}
370
+ async with httpx.AsyncClient(timeout=150) as client:
371
+ response = await client.get(api_url, params=params)
372
+ return response.json()
DragMusic/plugins/play/play.py CHANGED
@@ -24,7 +24,7 @@ from DragMusic.utils.inline import (
24
  )
25
  from DragMusic.utils.logger import play_logs
26
  from DragMusic.utils.stream.stream import stream
27
- from config import BANNED_USERS, lyrical
28
 
29
 
30
  @app.on_message(
@@ -179,15 +179,32 @@ async def play_commnd(
179
  cap = _["play_9"]
180
  else:
181
  try:
182
- details, track_id = await YouTube.track(url)
183
- except:
184
- return await mystic.edit_text(_["play_3"])
185
- streamtype = "youtube"
186
- img = details["thumb"]
187
- cap = _["play_10"].format(
188
- details["title"],
189
- details["duration_min"],
190
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
191
  elif await Spotify.valid(url):
192
  spotify = True
193
  if not config.SPOTIFY_CLIENT_ID and not config.SPOTIFY_CLIENT_SECRET:
@@ -335,9 +352,23 @@ async def play_commnd(
335
  if "-v" in query:
336
  query = query.replace("-v", "")
337
  try:
338
- details, track_id = await YouTube.track(query)
339
- except:
340
- return await mystic.edit_text(_["play_3"])
 
 
 
 
 
 
 
 
 
 
 
 
 
 
341
  streamtype = "youtube"
342
  if str(playmode) == "Direct":
343
  if not plist_type:
 
24
  )
25
  from DragMusic.utils.logger import play_logs
26
  from DragMusic.utils.stream.stream import stream
27
+ from config import BANNED_USERS, lyrical, BITFLOW_API_KEY
28
 
29
 
30
  @app.on_message(
 
179
  cap = _["play_9"]
180
  else:
181
  try:
182
+ bitflow_result = await YouTube.bitflow_video(url, api_key=BITFLOW_API_KEY)
183
+ if bitflow_result and bitflow_result.get("status") == "success":
184
+ details = {
185
+ "title": bitflow_result.get("title"),
186
+ "duration_min": bitflow_result.get("duration"),
187
+ "thumb": bitflow_result.get("thumbnail"),
188
+ "link": bitflow_result.get("url"),
189
+ }
190
+ track_id = bitflow_result.get("id")
191
+ streamtype = "youtube"
192
+ img = details["thumb"]
193
+ cap = _["play_10"].format(details["title"], details["duration_min"])
194
+ else:
195
+ details, track_id = await YouTube.track(url)
196
+ streamtype = "youtube"
197
+ img = details["thumb"]
198
+ cap = _["play_10"].format(details["title"], details["duration_min"])
199
+ except Exception as e:
200
+ print(f"Bitflow API error: {e}")
201
+ try:
202
+ details, track_id = await YouTube.track(url)
203
+ streamtype = "youtube"
204
+ img = details["thumb"]
205
+ cap = _["play_10"].format(details["title"], details["duration_min"])
206
+ except:
207
+ return await mystic.edit_text(_["play_3"])
208
  elif await Spotify.valid(url):
209
  spotify = True
210
  if not config.SPOTIFY_CLIENT_ID and not config.SPOTIFY_CLIENT_SECRET:
 
352
  if "-v" in query:
353
  query = query.replace("-v", "")
354
  try:
355
+ bitflow_result = await YouTube.bitflow_video(query, api_key=BITFLOW_API_KEY)
356
+ if bitflow_result and bitflow_result.get("status") == "success":
357
+ details = {
358
+ "title": bitflow_result.get("title"),
359
+ "duration_min": bitflow_result.get("duration"),
360
+ "thumb": bitflow_result.get("thumbnail"),
361
+ "link": bitflow_result.get("url"),
362
+ }
363
+ track_id = bitflow_result.get("id")
364
+ else:
365
+ details, track_id = await YouTube.track(query)
366
+ except Exception as e:
367
+ print(f"Bitflow API error: {e}")
368
+ try:
369
+ details, track_id = await YouTube.track(query)
370
+ except:
371
+ return await mystic.edit_text(_["play_3"])
372
  streamtype = "youtube"
373
  if str(playmode) == "Direct":
374
  if not plist_type:
config.py CHANGED
@@ -31,6 +31,8 @@ LOGGER_ID = int(getenv("LOGGER_ID", ))
31
  # Get this value from @FallenxBot on Telegram by /id
32
  OWNER_ID = int(getenv("OWNER_ID", ))
33
 
 
 
34
  ## Fill these variables if you're deploying on heroku.
35
  # Your heroku app name
36
  HEROKU_APP_NAME = getenv("HEROKU_APP_NAME")
@@ -98,6 +100,9 @@ SPOTIFY_ALBUM_IMG_URL = "https://te.legra.ph/file/b35fd1dfca73b950b1b05.jpg"
98
  SPOTIFY_PLAYLIST_IMG_URL = "https://te.legra.ph/file/95b3ca7993bbfaf993dcb.jpg"
99
 
100
 
 
 
 
101
  def time_to_seconds(time):
102
  stringt = str(time)
103
  return sum(int(x) * 60**i for i, x in enumerate(reversed(stringt.split(":"))))
 
31
  # Get this value from @FallenxBot on Telegram by /id
32
  OWNER_ID = int(getenv("OWNER_ID", ))
33
 
34
+ BITFLOW_API_KEY = getenv("BITFLOW_API_KEY", None) # Bitflow API key for YouTube downloads
35
+
36
  ## Fill these variables if you're deploying on heroku.
37
  # Your heroku app name
38
  HEROKU_APP_NAME = getenv("HEROKU_APP_NAME")
 
100
  SPOTIFY_PLAYLIST_IMG_URL = "https://te.legra.ph/file/95b3ca7993bbfaf993dcb.jpg"
101
 
102
 
103
+
104
+
105
+
106
  def time_to_seconds(time):
107
  stringt = str(time)
108
  return sum(int(x) * 60**i for i, x in enumerate(reversed(stringt.split(":"))))