Example #1
0
    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)
Example #2
0
    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)
Example #3
0
    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)
Example #4
0
    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)