1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
|
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)
|