music.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. from __future__ import unicode_literals
  2. from urllib.parse import urlparse
  3. import os
  4. import youtube_dl
  5. import aiohttp
  6. import aiofiles
  7. import os
  8. from random import randint
  9. from pyrogram import filters
  10. from wbb import app, SUDOERS, arq
  11. from wbb.utils.fetch import fetch
  12. from wbb.utils.errors import capture_err
  13. __MODULE__ = "Music"
  14. __HELP__ = """/ytmusic [link] To Download Music From Various Websites Including Youtube.
  15. /saavn [query] To Download Music From Saavn.
  16. /deezer [query] To Download Music From Deezer."""
  17. ydl_opts = {
  18. 'format': 'bestaudio/best',
  19. 'writethumbnail': True,
  20. 'postprocessors': [{
  21. 'key': 'FFmpegExtractAudio',
  22. 'preferredcodec': 'mp3',
  23. 'preferredquality': '192'
  24. }]
  25. }
  26. # Ytmusic
  27. @app.on_message(filters.command("ytmusic") & ~filters.edited & filters.user(SUDOERS))
  28. @capture_err
  29. async def music(_, message):
  30. if len(message.command) != 2:
  31. await message.reply_text("/ytmusic needs a link as argument")
  32. return
  33. link = message.text.split(None, 1)[1]
  34. m = await message.reply_text(f"Downloading {link}",
  35. disable_web_page_preview=True)
  36. try:
  37. with youtube_dl.YoutubeDL(ydl_opts) as ydl:
  38. info_dict = ydl.extract_info(link, download=False)
  39. audio_file = ydl.prepare_filename(info_dict)
  40. ydl.process_info(info_dict)
  41. # .webm -> .weba
  42. basename = audio_file.rsplit(".", 1)[-2]
  43. thumbnail_url = info_dict['thumbnail']
  44. thumbnail_file = basename + "." + get_file_extension_from_url(thumbnail_url)
  45. audio_file = basename + ".mp3"
  46. except Exception as e:
  47. await m.edit(str(e))
  48. return
  49. # info
  50. title = info_dict['title']
  51. performer = info_dict['uploader']
  52. duration = int(float(info_dict['duration']))
  53. await m.delete()
  54. await message.reply_chat_action("upload_document")
  55. await message.reply_audio(audio_file, duration=duration, performer=performer,
  56. title=title, thumb=thumbnail_file)
  57. os.remove(audio_file)
  58. os.remove(thumbnail_file)
  59. def get_file_extension_from_url(url):
  60. url_path = urlparse(url).path
  61. basename = os.path.basename(url_path)
  62. return basename.split(".")[-1]
  63. # Funtion To Download Song
  64. async def download_song(url):
  65. song_name = f"{randint(6969, 6999)}.mp3"
  66. async with aiohttp.ClientSession() as session:
  67. async with session.get(url) as resp:
  68. if resp.status == 200:
  69. f = await aiofiles.open(song_name, mode='wb')
  70. await f.write(await resp.read())
  71. await f.close()
  72. return song_name
  73. # Jiosaavn Music
  74. @app.on_message(filters.command("saavn"))
  75. @capture_err
  76. async def jssong(_, message):
  77. if len(message.command) < 2:
  78. await message.reply_text("/saavn requires an argument.")
  79. return
  80. text = message.text.split(None, 1)[1]
  81. query = text.replace(" ", "%20")
  82. m = await message.reply_text("Searching...")
  83. try:
  84. songs = await arq.saavn(query)
  85. sname = songs[0].song
  86. slink = songs[0].media_url
  87. ssingers = songs[0].singers
  88. await m.edit("Downloading")
  89. song = await download_song(slink)
  90. await m.edit("Uploading")
  91. await message.reply_audio(audio=song, title=sname,
  92. performer=ssingers)
  93. os.remove(song)
  94. await m.delete()
  95. except Exception as e:
  96. await m.edit(str(e))
  97. return
  98. # Deezer Music
  99. @app.on_message(filters.command("deezer"))
  100. @capture_err
  101. async def jssong(_, message):
  102. if len(message.command) < 2:
  103. await message.reply_text("/deezer requires an argument.")
  104. return
  105. text = message.text.split(None, 1)[1]
  106. query = text.replace(" ", "%20")
  107. m = await message.reply_text("Searching...")
  108. try:
  109. songs = await arq.deezer(query, 1)
  110. title = songs[0].title
  111. url = songs[0].url
  112. artist = songs[0].artist
  113. await m.edit("Downloading")
  114. song = await download_song(url)
  115. await m.edit("Uploading")
  116. await message.reply_audio(audio=song, title=title,
  117. performer=artist)
  118. os.remove(song)
  119. await m.delete()
  120. except Exception as e:
  121. await m.edit(str(e))
  122. return