Ruby-Cogs/lastfm/love.py
2025-03-26 10:59:44 -04:00

145 lines
5 KiB
Python

import discord
from redbot.core.utils.menus import DEFAULT_CONTROLS, menu
from .abc import MixinMeta
from .exceptions import *
from .fmmixin import FMMixin
command_fm = FMMixin.command_fm
command_fm_server = FMMixin.command_fm_server
class LoveMixin(MixinMeta):
"""Love Commands"""
async def love_or_unlove_song(self, track, artist, love, key):
params = {
"api_key": self.token,
"artist": artist,
"sk": key,
"track": track,
}
if love:
params["method"] = "track.love"
else:
params["method"] = "track.unlove"
data = await self.api_post(params=params)
return data
@command_fm.command(name="love", usage="<track name> | <artist name>")
async def command_love(self, ctx, *, track=None):
"""
Love a song on last.fm.
Usage:
[p]love
[p]love <track name> | <artist name>
"""
conf = await self.config.user(ctx.author).all()
self.check_if_logged_in_and_sk(conf)
if track:
try:
trackname, artistname = [x.strip() for x in track.split("|")]
if trackname == "" or artistname == "":
raise ValueError
except ValueError:
return await ctx.send("\N{WARNING SIGN} Incorrect format! use `track | artist`")
else:
trackname, artistname, albumname, imageurl = await self.get_current_track(
ctx, conf["lastfm_username"]
)
data = await self.api_request(
ctx,
{
"username": conf["lastfm_username"],
"method": "track.getInfo",
"track": trackname,
"artist": artistname,
},
)
if data["track"].get("userloved", "0") == "1":
return await ctx.send(
f"This song is already loved. Did you mean to run `{ctx.clean_prefix}fm unlove`?"
)
result = await self.love_or_unlove_song(
data["track"]["name"], data["track"]["artist"]["name"], True, conf["session_key"]
)
await self.maybe_send_403_msg(ctx, result)
await ctx.send(f"Loved **{trackname[:50]}** by **{artistname[:50]}**")
@command_fm.command(name="unlove", usage="<track name> | <artist name>")
async def command_unlove(self, ctx, *, track=None):
"""
Unlove a song on last.fm.
Usage:
[p]unlove
[p]unlove <track name> | <artist name>
"""
conf = await self.config.user(ctx.author).all()
self.check_if_logged_in_and_sk(conf)
if track:
try:
trackname, artistname = [x.strip() for x in track.split("|")]
if trackname == "" or artistname == "":
raise ValueError
except ValueError:
return await ctx.send("\N{WARNING SIGN} Incorrect format! use `track | artist`")
else:
trackname, artistname, albumname, imageurl = await self.get_current_track(
ctx, conf["lastfm_username"]
)
data = await self.api_request(
ctx,
{
"username": conf["lastfm_username"],
"method": "track.getInfo",
"track": trackname,
"artist": artistname,
},
)
if data["track"].get("userloved", "0") == "0":
return await ctx.send(
f"This song is not loved. Did you mean to run `{ctx.clean_prefix}fm love`?"
)
result = await self.love_or_unlove_song(
data["track"]["name"], data["track"]["artist"]["name"], False, conf["session_key"]
)
await self.maybe_send_403_msg(ctx, result)
await ctx.send(f"Unloved **{trackname[:50]}** by **{artistname[:50]}**")
@command_fm.command(name="loved")
async def command_loved(self, ctx, user: discord.User = None):
"""
Get a list of loved songs for a user.
Usage:
[p]loved
[p]loved <user>
"""
if not user:
user = ctx.author
conf = await self.config.user(user).all()
self.check_if_logged_in_and_sk(conf)
data = await self.api_request(
ctx, {"user": conf["lastfm_username"], "method": "user.getlovedtracks"}
)
tracks = data["lovedtracks"]["track"]
if not tracks:
return await ctx.send("You have not loved anything yet!")
tracks = [f"{x['name']} by {x['artist']['name']}\n" for x in tracks]
content = discord.Embed(color=await ctx.embed_color(), title=f"{user.name}'s loved tracks")
pages = await self.create_pages(content, tracks)
for i, page in enumerate(pages):
page.set_footer(text=f"Page {i + 1}/{len(pages)}")
if len(pages) > 1:
await menu(ctx, pages, DEFAULT_CONTROLS)
else:
await ctx.send(embed=pages[0])