cordarr/code/cogs/status.py
2024-05-18 20:06:51 -05:00

112 lines
5.0 KiB
Python

import discord
from discord import app_commands
from discord.ext import commands
import requests
import sqlite3
import datetime
import humanize
from global_variables import RADARR_HOST_URL, RADARR_HEADERS
class Status(commands.Cog):
def __init__(self, bot):
self.bot = bot
@app_commands.command()
async def status(self, interaction: discord.Interaction):
"Get the status of the movies you have requested"
# Get all the movie_ids that were requested by the user
db = sqlite3.connect("cordarr.db")
cursor = db.cursor()
cursor.execute(
"SELECT movie_id, movie_title FROM movies WHERE user_id = ?",
(interaction.user.id,),
)
requested_movies = cursor.fetchall()
users_movies = {} # Dictionary to store the movies that the user has requested
for movie_id, movie_title in requested_movies:
users_movies[movie_id] = movie_title
# If theres no movies, return a message saying so
if not users_movies:
embed = discord.Embed(
title="No Movies Requested",
description="You have no movies being downloaded at the moment. If you previously added a movie, it is likely that it has finished downloading. If you believe this is an error, please contact an administrator.",
color=0xD01B86
)
return await interaction.response.send_message(embed=embed, ephemeral=True)
# Otherwise, create the default embed to display the movies being downloaded
embed = discord.Embed(
title="Movies Requested",
description="Here are the movies you have requested that are currently being downloaded:\n",
color=0xD01B86
)
# Now, we get the download status of all movies from the Radarr queue
response = requests.get(
f"{RADARR_HOST_URL}/api/v3/queue/", headers=RADARR_HEADERS
).json()
count = 0
added_movie_ids = []
for movie in response["records"]:
movie_id = movie["movieId"]
# If the movie is user requested and is being downloaded
if movie_id in users_movies.keys():
count += 1
added_movie_ids.append(movie_id)
if movie["status"] == "downloading":
# Humanize the download time left, or result to 'Unknown
try:
time_left = humanize.precisedelta(
datetime.datetime.strptime(movie["timeleft"], "%H:%M:%S")
- datetime.datetime.strptime("00:00:00", "%H:%M:%S"),
minimum_unit="seconds",
)
except ValueError:
# Sometimes movies will download extremely show and therefore might
# show 'days' in the time left, so strptime appropriately
time_left = humanize.precisedelta(
datetime.datetime.strptime(movie["timeleft"], "%d.%H:%M:%S")
- datetime.datetime.strptime("00:00:00", "%H:%M:%S"),
minimum_unit="seconds",
)
except KeyError or ValueError:
time_left = "Unknown"
# Add all the information
embed.description += f"\n{count}. **{users_movies[movie_id]}** - Time Left: ` {time_left} `"
else:
embed.description += f"\n{count}. **{users_movies[movie_id]}** - Status: `{str(movie['status']).upper()}`"
# If a movie wasn't found in the Radarr queue, then it has either finished downloading
# or the movie was never found for download
if len(added_movie_ids) != len(users_movies.keys()):
# Grab all of the "missing" movies to see if a movie is missing or finished downloading
response = requests.get(
f"{RADARR_HOST_URL}/api/v3/wanted/missing", headers=RADARR_HEADERS
).json()
for movie in response["records"]:
movie_id = movie["id"]
if movie_id in users_movies.keys() and movie_id not in added_movie_ids:
count += 1
added_movie_ids.append(movie_id)
embed.description += f"\n{count}. **{users_movies[movie_id]}** - Status: ` NOT FOUND `"
# If there are still movies that haven't been added to the embed, then they
# have finished downloading and can be removed from the database
for movie_id in users_movies.keys():
if movie_id not in added_movie_ids:
cursor.execute(
"DELETE FROM movies WHERE user_id = ? AND movie_id = ?",
(interaction.user.id, movie_id),
)
db.commit()
db.close()
await interaction.response.send_message(embed=embed, ephemeral=True)
async def setup(bot):
await bot.add_cog(Status(bot))