Chitanda-Bot / cogs /functions.py
E5K7's picture
Initial commit: Discord bot with hybrid commands, Flask keep-alive, and Docker support
7cc32a6
import asyncio
from unittest import result
import yt_dlp
import os
from shazamio import Shazam
import aiohttp
import base64
from functools import partial
CLIENT_ID = "550edc8d6d294381a0f4dac9c8c9fea5"
CLIENT_SECRET = "fade5c01cc8b40acb79ad1f598074b4c"
async def music_recognition(filepath):
shazam = Shazam()
out = await shazam.recognize(filepath)
songname = out['track']['title']
artist = out["track"]["subtitle"]
ydl_opts = {
"quiet": True,
"skip_download": True,
}
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
info = ydl.extract_info(f"ytsearch1:{songname} {artist}", download=False)
video = info["entries"][0]
title = video["title"]
yturl = video["webpage_url"]
thumbnail = video["thumbnail"]
duration = video["duration"]
spotifyshit = await spotify_search(f"{songname} {artist}")
spotifylink = spotifyshit["tracks"]["items"][0]["external_urls"]["spotify"]
return {
"songname": songname,
"artist": artist,
"title": title,
"yturl": yturl,
"thumbnail": thumbnail,
"duration": duration,
"spotifylink": spotifylink
}
async def spotify_auth():
auth_url = "https://accounts.spotify.com/api/token"
auth_string = f"{CLIENT_ID}:{CLIENT_SECRET}"
auth_header = base64.b64encode(auth_string.encode()).decode()
headers = {
"Authorization": f"Basic {auth_header}",
"Content-Type": "application/x-www-form-urlencoded"
}
data = {
"grant_type": "client_credentials"
}
async with aiohttp.ClientSession() as session:
async with session.post(auth_url, headers=headers, data=data) as resp:
response = await resp.json()
return response["access_token"]
async def spotify_search(query: str, search_type="track"):
token = await spotify_auth()
url = "https://api.spotify.com/v1/search"
params = {
"q": query,
"type": search_type,
"limit": 1
}
headers = {
"Authorization": f"Bearer {token}"
}
async with aiohttp.ClientSession() as session:
async with session.get(url, headers=headers, params=params) as resp:
data = await resp.json()
return data
async def download_mp3(query: str):
def _download():
ydl_opts = {
"quiet": True,
"format": "bestaudio/best",
"outtmpl": "./assets/audio.%(ext)s",
"postprocessors": [{
"key": "FFmpegExtractAudio",
"preferredcodec": "mp3",
"preferredquality": "192",
}],
}
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
ydl.extract_info(f"ytsearch1:{query}", download=True)
return "./assets/audio.mp3"
return await asyncio.to_thread(_download)