164 lines
5.9 KiB
Python
164 lines
5.9 KiB
Python
import requests
|
|
import sqlite3
|
|
import discord
|
|
|
|
from global_variables import (
|
|
RADARR_HOST_URL,
|
|
RADARR_HEADERS,
|
|
ROOT_FOLDER_PATH,
|
|
QUALITY_PROFILE_ID,
|
|
)
|
|
|
|
"""
|
|
Add a specific movie to the Radarr library
|
|
"""
|
|
|
|
|
|
def get_movies(name: str):
|
|
# Remove leading/trailing whitespace and replace spaces with URL encoding
|
|
name = name.strip().replace(" ", "%20")
|
|
|
|
# Send a request to the Radarr API to search for the movie
|
|
response = requests.get(
|
|
f"{RADARR_HOST_URL}/api/v3/movie/lookup?term={name}", headers=RADARR_HEADERS
|
|
).json()
|
|
|
|
if len(response) == 0:
|
|
return "NO RESULTS"
|
|
# If the movie has alreadt been added, then the added date will be
|
|
# something other than 0001-01-01T05:51:00Z
|
|
if response[0]["added"] != "0001-01-01T05:51:00Z":
|
|
return "ALREADY ADDED"
|
|
|
|
# Add the top 5 movies and their years to a list of dictionaries and their respective tmdbIds
|
|
movies = [
|
|
{"title": response[i]["title"], "year": response[i]["year"]}
|
|
for i in range(min(5, len(response)))
|
|
]
|
|
tmdb_ids = {}
|
|
for i in range(min(5, len(response))):
|
|
tmdb_ids[response[i]["tmdbId"]] = {"description": response[i]["overview"]}
|
|
# Try to choose from one of the usual 2 poster images available,
|
|
# if not, then just set the "poster" to None
|
|
try:
|
|
try:
|
|
tmdb_ids[response[i]["tmdbId"]]["remotePoster"] = response[i]["images"][0]["remoteUrl"]
|
|
except IndexError:
|
|
tmdb_ids[response[i]["tmdbId"]]["remotePoster"] = response[i]["images"][1]["remoteUrl"]
|
|
except IndexError:
|
|
tmdb_ids[response[i]["tmdbId"]]["remotePoster"] = None
|
|
|
|
return movies, tmdb_ids
|
|
|
|
|
|
"""
|
|
Send a request to the Radarr API to add the movie
|
|
"""
|
|
|
|
|
|
def add_movie(tmdb_id: int):
|
|
# Get the necessary data for the movie
|
|
data = requests.get(
|
|
f"{RADARR_HOST_URL}/api/v3/movie/lookup/tmdb?tmdbId={tmdb_id}",
|
|
headers=RADARR_HEADERS,
|
|
).json()
|
|
|
|
movie_title = data["title"]
|
|
# Change the qualityProfileId, monitored, and rootFolderPath values
|
|
data["qualityProfileId"] = QUALITY_PROFILE_ID
|
|
data["monitored"] = True
|
|
data["rootFolderPath"] = ROOT_FOLDER_PATH
|
|
# Send the request to add the movie
|
|
response = requests.post(
|
|
f"{RADARR_HOST_URL}/api/v3/movie", headers=RADARR_HEADERS, json=data
|
|
).json()
|
|
movie_id = response["id"]
|
|
|
|
# Return the movie_title, movie_id
|
|
return movie_title, movie_id
|
|
|
|
|
|
class AddMovieView(discord.ui.View):
|
|
def __init__(self, movies: list, tmdb_ids: dict, *, timeout=180.0):
|
|
super().__init__(timeout=timeout)
|
|
self.add_item(AddMovieDropdown(movies, tmdb_ids))
|
|
|
|
|
|
class AddMovieDropdown(discord.ui.Select):
|
|
def __init__(self, movies: list, tmdb_ids: dict, *, timeout=180.0):
|
|
self.movies = movies
|
|
self.tmdb_ids = tmdb_ids
|
|
super().__init__(
|
|
placeholder="Select from the dropdown",
|
|
options=[
|
|
discord.SelectOption(label=f"{movie['title']} ({movie['year']})")
|
|
for movie in movies
|
|
],
|
|
)
|
|
|
|
async def callback(self, interaction: discord.Interaction):
|
|
# Convert the options to a list of strings and get the index of the selected option
|
|
string_options = [option.label for option in self.options]
|
|
index = string_options.index(interaction.data["values"][0])
|
|
# Convert the tmdbIds dictionary to a list and get the tmdbId of the selected movie
|
|
tmdb_id_list = list(self.tmdb_ids.keys())
|
|
tmdb_id = tmdb_id_list[index]
|
|
tmdbFull = self.tmdb_ids[tmdb_id]
|
|
|
|
embed = discord.Embed(
|
|
title="Is this the movie you want to add?",
|
|
description=f"**{self.movies[index]['title']}**\n\n{tmdbFull['description']}",
|
|
color=0xD01B86
|
|
)
|
|
embed.set_image(url=tmdbFull["remotePoster"])
|
|
view = RequestButtonView(tmdb_id)
|
|
await interaction.response.edit_message(embed=embed, view=view)
|
|
|
|
|
|
class RequestButtonView(discord.ui.View):
|
|
def __init__(self, tmdb_id: int, *, timeout=180.0):
|
|
super().__init__(timeout=timeout)
|
|
self.tmdb_id = tmdb_id
|
|
|
|
@discord.ui.button(label="Request", style=discord.ButtonStyle.success)
|
|
async def request_button(
|
|
self, interaction: discord.Interaction, button: discord.ui.Button
|
|
):
|
|
# Add the movie to the Radarr library
|
|
movie_title, movie_id = add_movie(self.tmdb_id)
|
|
|
|
# Alert the user that the movie has been added
|
|
embed = discord.Embed(
|
|
title="Movie Requested",
|
|
description=f"**{movie_title}** has been requested and will be added to the Radarr library. You can check the download status of your requested movies by running the `/status` command. Please wait ~5 minutes for Radarr to find a download for the movie.",
|
|
color=0xD01B86
|
|
)
|
|
await interaction.response.edit_message(embed=embed, view=None)
|
|
# # Add the movie to the Radarr library
|
|
# requests.post(
|
|
# f"{RADARR_HOST_URL}/api/v3/command",
|
|
# headers=RADARR_HEADERS,
|
|
# json={"name": "MoviesSearch", "movieIds": movie_id},
|
|
# )
|
|
|
|
# Keep track of the movie for the `/status` command
|
|
db = sqlite3.connect("cordarr.db")
|
|
cursor = db.cursor()
|
|
cursor.execute(
|
|
"INSERT INTO movies VALUES (?, ?, ?)",
|
|
(interaction.user.id, movie_id, movie_title),
|
|
)
|
|
db.commit()
|
|
db.close()
|
|
|
|
@discord.ui.button(label="Don't Request", style=discord.ButtonStyle.danger)
|
|
async def dont_request_button(
|
|
self, interaction: discord.Interaction, button: discord.ui.Button
|
|
):
|
|
embed = discord.Embed(
|
|
title="Request Cancelled",
|
|
description="Request has been cancelled. If you would like to request a different movie, run the `/request movie` command again.",
|
|
color=0xD01B86
|
|
)
|
|
await interaction.response.edit_message(embed=embed, view=None)
|