async def toptracks(self, ctx, *args): """Most listened tracks. Usage: >fm toptracks [timeframe] [amount] """ arguments = parse_arguments(args) if arguments['period'] == 'today': data = await custom_period(ctx.username, 'track') else: data = await api_request({ "user": ctx.username, "method": "user.gettoptracks", "period": arguments['period'], "limit": arguments['amount'] }) user_attr = data['toptracks']['@attr'] tracks = data['toptracks']['track'][:arguments['amount']] if not tracks: return await ctx.send("You have not listened to anything yet!") rows = [] for i, track in enumerate(tracks, start=1): name = util.escape_md(track['name']) artist_name = util.escape_md(track['artist']['name']) plays = track['playcount'] rows.append( f"`#{i:2}` **{plays}** {format_plays(plays)} : **{artist_name}** — ***{name}***" ) trackdata = await api_request({ "user": ctx.username, "method": "track.getInfo", "artist": tracks[0]['artist']['name'], "track": tracks[0]['name'] }) content = discord.Embed() try: image_url = trackdata['track']['album']['image'][-1]['#text'] image_url_small = trackdata['track']['album']['image'][1]['#text'] image_colour = await util.color_from_image_url(image_url_small) except KeyError: image_url = await scrape_artist_image(tracks[0]['artist']['name']) image_colour = await util.color_from_image_url(image_url) content.colour = int(image_colour, 16) content.set_thumbnail(url=image_url) content.set_footer(text=f"Total unique tracks: {user_attr['total']}") content.set_author( name= f"{user_attr['user']} — {humanized_period(arguments['period']).capitalize()} top tracks", icon_url=ctx.usertarget.avatar_url) await util.send_as_pages(ctx, content, rows, 15)
async def melon(self, ctx, timeframe=None): """Melon music charts. Usage: >melon [realtime | day | month | rising] """ if timeframe not in ["day", "month"]: if timeframe == "realtime": timeframe = "" elif timeframe == "rising": timeframe = "rise" else: return await util.send_command_help(ctx) url = f"https://www.melon.com/chart/{timeframe}/index.htm" async with aiohttp.ClientSession() as session: headers={ "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0" } async with session.get(url, headers=headers) as response: soup = BeautifulSoup(await response.text(), 'html.parser') song_titles = [util.escape_md(x.find('span').find('a').text) for x in soup.find_all('div', {'class': 'ellipsis rank01'})] artists = [util.escape_md(x.find('a').text) for x in soup.find_all('div', {'class': 'ellipsis rank02'})] albums = [util.escape_md(x.find('a').text) for x in soup.find_all('div', {'class': 'ellipsis rank03'})] image = soup.find('img', {'onerror': 'WEBPOCIMG.defaultAlbumImg(this);'}).get('src') content = discord.Embed(color=discord.Color.from_rgb(0, 205, 60)) content.set_author( name=f"Melon top {len(song_titles)}" + ("" if timeframe == '' else f" - {timeframe.capitalize()}"), url=url ) content.set_thumbnail(url=image) content.timestamp = ctx.message.created_at pages = [] for i, (song, album, artist) in enumerate(zip(song_titles, albums, artists)): if i != 0 and i % 10 == 0: pages.append(content) content = copy.deepcopy(content) content.clear_fields() content.add_field( name=f"`#{i+1}` {song}", value=f"*by* **{artist}** *on* **{album}**", inline=False ) if content._fields: pages.append(content) await util.page_switcher(ctx, pages)
async def recent(self, ctx, size="15"): """Recently listened tracks. Usage: >fm recent [amount] """ try: size = int(size) except ValueError: size = 15 data = await api_request({ "user": ctx.username, "method": "user.getrecenttracks", "limit": size }) user_attr = data['recenttracks']['@attr'] tracks = data['recenttracks']['track'] if not tracks: return await ctx.send("You have not listened to anything yet!") rows = [] for i, track in enumerate(tracks): if i >= size: break name = util.escape_md(track['name']) artist_name = util.escape_md(track['artist']['#text']) rows.append(f"**{artist_name}** — ***{name}***") image_url = tracks[0]['image'][-1]['#text'] image_url_small = tracks[0]['image'][1]['#text'] image_colour = await util.color_from_image_url(image_url_small) content = discord.Embed() content.colour = int(image_colour, 16) content.set_thumbnail(url=image_url) content.set_footer(text=f"Total scrobbles: {user_attr['total']}") content.set_author(name=f"{user_attr['user']} — Recent tracks", icon_url=ctx.usertarget.avatar_url) await util.send_as_pages(ctx, content, rows, 15)
async def topartists(self, ctx, *args): """Most listened artists. Usage: >fm topartists [timeframe] [amount] """ arguments = parse_arguments(args) if arguments['period'] == 'today': data = await custom_period(ctx.username, 'artist') else: data = await api_request({ "user": ctx.username, "method": "user.gettopartists", "period": arguments['period'], "limit": arguments['amount'] }) user_attr = data['topartists']['@attr'] artists = data['topartists']['artist'][:arguments['amount']] if not artists: return await ctx.send("You have not listened to any artists yet!") rows = [] for i, artist in enumerate(artists, start=1): name = util.escape_md(artist['name']) plays = artist['playcount'] rows.append( f"`#{i:2}` **{plays}** {format_plays(plays)} : **{name}**") image_url = await scrape_artist_image(artists[0]['name']) image_colour = await util.color_from_image_url(image_url) content = discord.Embed() content.colour = int(image_colour, 16) content.set_thumbnail(url=image_url) content.set_footer(text=f"Total unique artists: {user_attr['total']}") content.set_author( name= f"{user_attr['user']} — {humanized_period(arguments['period']).capitalize()} top artists", icon_url=ctx.usertarget.avatar_url) await util.send_as_pages(ctx, content, rows, 15)