ytdl.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. import traceback
  2. from asyncio import gather
  3. from os import remove
  4. from random import randint
  5. from pykeyboard import InlineKeyboard
  6. from pyrogram import filters
  7. from pyrogram.types import InlineKeyboardButton
  8. from wbb import app, arq
  9. from wbb.core.decorators.errors import capture_err
  10. from wbb.utils.formatter import convert_seconds_to_minutes as timeFormat
  11. from wbb.utils.functions import downloader
  12. __MODULE__ = "YoutubeDL"
  13. __HELP__ = "/ytdl [VIDEO_LINK] - Download a youtube video."
  14. VIDEO_DATA = {}
  15. @app.on_message(filters.command("ytdl"))
  16. @capture_err
  17. async def ytdl_func(_, message):
  18. if len(message.command) != 2:
  19. return await message.reply_text("**Usage:**/ytdl [VIDEO_LINK]")
  20. m = await message.reply_text("Processing")
  21. url = message.text.split(None, 1)[1]
  22. results = await arq.ytdl(url)
  23. if not results.ok:
  24. return await m.edit(results.result)
  25. result = results.result
  26. title = result.title
  27. thumbnail = result.thumbnail
  28. duration = result.duration
  29. video = result.video
  30. buttons = InlineKeyboard(row_width=3)
  31. keyboard = []
  32. for media in video:
  33. quality = media.quality
  34. size = media.size
  35. url = media.url
  36. format = media.format
  37. data = str(randint(999, 9999999))
  38. VIDEO_DATA[data] = {
  39. "url": url,
  40. "title": title,
  41. "size": size,
  42. "quality": quality,
  43. "duration": duration,
  44. "format": format,
  45. "thumbnail": thumbnail,
  46. "cc": message.from_user.mention if message.from_user else "Anon",
  47. }
  48. keyboard.append(
  49. InlineKeyboardButton(
  50. text=f"{quality} | {size}", callback_data=f"ytdl {data}"
  51. )
  52. )
  53. buttons.add(*keyboard)
  54. caption = f"""
  55. **Title:** {title}
  56. **Duration:** {await timeFormat(duration)}
  57. """
  58. await message.reply_photo(thumbnail, caption=caption, reply_markup=buttons)
  59. await m.delete()
  60. @app.on_callback_query(filters.regex(r"^ytdl"))
  61. async def ytdlCallback(_, cq):
  62. await cq.message.edit("Downloading")
  63. data_ = cq.data.split()[1]
  64. try:
  65. data = VIDEO_DATA[data_]
  66. url = data["url"]
  67. title = data["title"]
  68. duration = data["duration"]
  69. format = data["format"]
  70. size = data["size"]
  71. thumbnail = data["thumbnail"]
  72. cc = data["cc"]
  73. caption = f"""
  74. **Title:** {title}
  75. **Size:** {size}
  76. **Format:** {format}
  77. **Duration:** {await timeFormat(duration)}
  78. **CC:** {cc}
  79. """
  80. media, thumb = await gather(
  81. downloader.download(url), downloader.download(thumbnail)
  82. )
  83. await cq.message.edit("Uploading")
  84. if format == "mp3":
  85. await cq.message.reply_audio(
  86. media,
  87. quote=False,
  88. caption=caption,
  89. duration=duration,
  90. thumb=thumb,
  91. title=title,
  92. )
  93. else:
  94. await cq.message.reply_video(
  95. media,
  96. caption=caption,
  97. quote=False,
  98. duration=duration,
  99. supports_streaming=True,
  100. )
  101. del VIDEO_DATA[data_]
  102. remove(thumb)
  103. remove(media)
  104. await cq.message.delete()
  105. except Exception as e:
  106. e = traceback.format_exc()
  107. print(e)
  108. del VIDEO_DATA[data_]
  109. await cq.message.delete()