music.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  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. SUDOERS = [OWNER_ID, SUDO_USER_ID]
  13. __MODULE__ = "Music"
  14. __HELP__ = "/music [link] To Download Music From Various Websites"
  15. ydl_opts = {
  16. 'format': 'bestaudio/best',
  17. 'writethumbnail': True,
  18. 'postprocessors': [{
  19. 'key': 'FFmpegExtractAudio',
  20. 'preferredcodec': 'mp3',
  21. 'preferredquality': '192'
  22. }]
  23. }
  24. @app.on_message(cust_filter.command(commands=("music")) & ~filters.edited & filters.user(SUDOERS))
  25. async def music(_, message: Message):
  26. if len(message.command) != 2:
  27. await message.reply_text("`/music` needs a link as argument")
  28. return
  29. link = message.text.split(None, 1)[1]
  30. m = await message.reply_text(f"Downloading {link}",
  31. disable_web_page_preview=True)
  32. try:
  33. with youtube_dl.YoutubeDL(ydl_opts) as ydl:
  34. info_dict = ydl.extract_info(link, download=False)
  35. audio_file = ydl.prepare_filename(info_dict)
  36. ydl.process_info(info_dict)
  37. # .webm -> .weba
  38. basename = audio_file.rsplit(".", 1)[-2]
  39. thumbnail_url = info_dict['thumbnail']
  40. thumbnail_file = basename + "." + get_file_extension_from_url(thumbnail_url)
  41. audio_file = basename + ".mp3"
  42. except Exception as e:
  43. await m.edit(str(e))
  44. return
  45. # info
  46. title = info_dict['title']
  47. webpage_url = info_dict['webpage_url']
  48. performer = info_dict['uploader']
  49. duration = int(float(info_dict['duration']))
  50. caption = f"[{title}]({webpage_url})"
  51. await m.delete()
  52. await message.reply_chat_action("upload_document")
  53. await message.reply_audio(audio_file, caption=caption,
  54. duration=duration, performer=performer,
  55. title=title, thumb=thumbnail_file)
  56. os.remove(audio_file)
  57. os.remove(thumbnail_file)
  58. # Convert seconds to mm:ss
  59. def convert_seconds(seconds):
  60. seconds = seconds % (24 * 3600)
  61. seconds %= 3600
  62. minutes = seconds // 60
  63. seconds %= 60
  64. return "%02d:%02d" % (minutes, seconds)
  65. @app.on_message(filters.command("deezer"))
  66. async def deezer(_, message):
  67. if len(message.command) < 2:
  68. await message.reply_text("/deezer [song_name]")
  69. name = message.text.split(None, 1)[1]
  70. m = await message.reply_text(f"Searching `{name}` On Deezer.")
  71. try:
  72. async with aiohttp.ClientSession() as session:
  73. async with session.get(
  74. f"http://52.0.6.104:8000/deezer/{name}/1"
  75. ) as resp:
  76. r = json.loads(await resp.text())
  77. title = r[0]["title"]
  78. artist = r[0]["artist"]
  79. url = r[0]["url"]
  80. await m.edit("Downloading")
  81. song = wget.download(url)
  82. await m.edit("Uploading")
  83. await message.reply_audio(audio=song, title=title,
  84. performer=artist)
  85. await m.delete()
  86. except Exception as e:
  87. print(str(e))
  88. await m.edit(
  89. "Found Literally Nothing, You Should Work On Your English!"
  90. )
  91. return
  92. def get_file_extension_from_url(url):
  93. url_path = urlparse(url).path
  94. basename = os.path.basename(url_path)
  95. return basename.split(".")[-1]