music.py 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. from __future__ import unicode_literals
  2. from urllib.parse import urlparse
  3. import os
  4. import youtube_dl
  5. import aiohttp
  6. import json
  7. import wget
  8. from pyrogram import filters
  9. from pyrogram.types import Message
  10. from wbb.utils import cust_filter
  11. from wbb import app, OWNER_ID, SUDO_USER_ID
  12. from wbb.utils.errors import capture_err
  13. SUDOERS = [OWNER_ID, SUDO_USER_ID]
  14. __MODULE__ = "Music"
  15. __HELP__ = "/music [link] To Download Music From Various Websites"
  16. ydl_opts = {
  17. 'format': 'bestaudio/best',
  18. 'writethumbnail': True,
  19. 'postprocessors': [{
  20. 'key': 'FFmpegExtractAudio',
  21. 'preferredcodec': 'mp3',
  22. 'preferredquality': '192'
  23. }]
  24. }
  25. @app.on_message(cust_filter.command(commands=("music")) & ~filters.edited & filters.user(SUDOERS))
  26. @capture_err
  27. async def music(_, message: Message):
  28. if len(message.command) != 2:
  29. await message.reply_text("`/music` needs a link as argument")
  30. return
  31. link = message.text.split(None, 1)[1]
  32. m = await message.reply_text(f"Downloading {link}",
  33. disable_web_page_preview=True)
  34. try:
  35. with youtube_dl.YoutubeDL(ydl_opts) as ydl:
  36. info_dict = ydl.extract_info(link, download=False)
  37. audio_file = ydl.prepare_filename(info_dict)
  38. ydl.process_info(info_dict)
  39. # .webm -> .weba
  40. basename = audio_file.rsplit(".", 1)[-2]
  41. thumbnail_url = info_dict['thumbnail']
  42. thumbnail_file = basename + "." + get_file_extension_from_url(thumbnail_url)
  43. audio_file = basename + ".mp3"
  44. except Exception as e:
  45. await m.edit(str(e))
  46. return
  47. # info
  48. title = info_dict['title']
  49. webpage_url = info_dict['webpage_url']
  50. performer = info_dict['uploader']
  51. duration = int(float(info_dict['duration']))
  52. caption = f"[{title}]({webpage_url})"
  53. await m.delete()
  54. await message.reply_chat_action("upload_document")
  55. await message.reply_audio(audio_file, caption=caption,
  56. duration=duration, performer=performer,
  57. title=title, thumb=thumbnail_file)
  58. os.remove(audio_file)
  59. os.remove(thumbnail_file)
  60. def get_file_extension_from_url(url):
  61. url_path = urlparse(url).path
  62. basename = os.path.basename(url_path)
  63. return basename.split(".")[-1]