diff options
author | Parker <contact@pkrm.dev> | 2025-01-19 23:41:53 -0600 |
---|---|---|
committer | Parker <contact@pkrm.dev> | 2025-01-19 23:41:53 -0600 |
commit | b5bd2e36b6597303985eb9dc897e04d452950372 (patch) | |
tree | 697e269911c752ce8c196c7be486df5b5871b85a /code/func | |
parent | 86b12da175593f91cb5e3266826a60d1b26f6144 (diff) |
Overhaul + Sonarr support!
Diffstat (limited to 'code/func')
-rw-r--r-- | code/func/jellyfin.py | 91 | ||||
-rw-r--r-- | code/func/radarr.py | 165 |
2 files changed, 0 insertions, 256 deletions
diff --git a/code/func/jellyfin.py b/code/func/jellyfin.py deleted file mode 100644 index f31ec04..0000000 --- a/code/func/jellyfin.py +++ /dev/null @@ -1,91 +0,0 @@ -import datetime -import requests -import random -import string -import sqlite3 -from wonderwords import RandomWord - -from global_variables import JELLYFIN_URL, JELLYFIN_HEADERS, ACCOUNT_TIME, SIMPLE_PASSWORDS - -""" -Create a new Jellyfin account for the user and return the username and password -""" - - -def create_jellyfin_account(user_id): - username = RandomWord().word(word_min_length=5, word_max_length=5) - if SIMPLE_PASSWORDS: - password = RandomWord().word(word_min_length=5, word_max_length=10) - else: - password = "".join(random.choices(string.ascii_lowercase + string.digits, k=15)) - - deletion_time = datetime.datetime.now() + datetime.timedelta(hours=ACCOUNT_TIME) - # Create the new Jellyfin account - request_1 = requests.post( - f"{JELLYFIN_URL}/Users/New", - headers=JELLYFIN_HEADERS, - json={"Name": username, "Password": password}, - ) - if request_1.status_code != 200: - return False - - # Get the user ID of the new account - jellyfin_user_id = request_1.json()["Id"] - # Get the account policy and make edits - request_2 = requests.get( - f"{JELLYFIN_URL}/Users/{jellyfin_user_id}", headers=JELLYFIN_HEADERS - ) - if request_2.status_code != 200: - return False - - account_policy = request_2.json() - account_policy["Policy"]["SyncPlayAccess"] = "JoinGroups" - account_policy["Policy"]["EnableContentDownloading"] = False - account_policy["Policy"]["InvalidLoginAttemptCount"] = 3 - account_policy["Policy"]["MaxActiveSessions"] = 1 - # Update the user with the newly edited policy - request_3 = requests.post( - f"{JELLYFIN_URL}/Users?userId={jellyfin_user_id}", - headers=JELLYFIN_HEADERS, - json=account_policy, - ) - if request_3.status_code != 204: - return False - - # Add the information to the database - db = sqlite3.connect("cordarr.db") - cursor = db.cursor() - cursor.execute( - "INSERT INTO jellyfin_accounts (user_id, jellyfin_user_id, deletion_time) VALUES (?, ?, ?)", - (user_id, jellyfin_user_id, deletion_time), - ) - db.commit() - db.close() - - return username, password - - -""" -Delete a specific Jellyfin account and return True/False -""" - - -def delete_jellyfin_account(jellyfin_user_id): - request = requests.delete( - f"{JELLYFIN_URL}/Users/{jellyfin_user_id}", - headers=JELLYFIN_HEADERS, - ) - # If 204 - account deleted - # If 404 - account not found - # Either way, remove account from database - if request.status_code in (404, 204): - db = sqlite3.connect("cordarr.db") - cursor = db.cursor() - cursor.execute( - "DELETE FROM jellyfin_accounts WHERE jellyfin_user_id = ?", - (jellyfin_user_id,), - ) - db.commit() - db.close() - return True - return False
\ No newline at end of file diff --git a/code/func/radarr.py b/code/func/radarr.py deleted file mode 100644 index cc45586..0000000 --- a/code/func/radarr.py +++ /dev/null @@ -1,165 +0,0 @@ -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" - - movie_data = [] - for i in range(min(5, len(response))): - movie_data.append( - { - "title": response[i]["title"], - "year": response[i]["year"], - "tmdbId": response[i]["tmdbId"], - "description": response[i]["overview"], - } - ) - - try: - try: - movie_data[i]["remotePoster"] = response[i]["images"][0]["remoteUrl"] - except IndexError: - movie_data[i]["remotePoster"] = response[i]["images"][1]["remoteUrl"] - except IndexError: - movie_data[i]["remotePoster"] = None - - return movie_data - - -""" -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, movie_data: list, *, timeout=180.0): - super().__init__(timeout=timeout) - self.add_item(AddMovieDropdown(movie_data)) - - -class AddMovieDropdown(discord.ui.Select): - def __init__(self, movie_data: list, *, timeout=180.0): - self.movie_data = movie_data - # Create the options list to show the movie title, year, and tmdbId - options = [] - for i in range(len(movie_data)): - options.append( - discord.SelectOption( - label=f"{movie_data[i]['title']} ({movie_data[i]['year']})", - description=f"TMDB ID: {movie_data[i]['tmdbId']}", - value=i, - ) - ) - - super().__init__( - placeholder="Select from the dropdown", - options=options, - ) - - async def callback(self, interaction: discord.Interaction): - index = int(self.values[0]) - - embed = discord.Embed( - title="Is this the movie you want to add?", - description=f"**{self.movie_data[index]['title']}**\n\n{self.movie_data[index]['description']}", - color=0xD01B86, - ) - embed.set_image(url=self.movie_data[index]["remotePoster"]) - view = RequestButtonView(self.movie_data[index]["tmdbId"]) - 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) - # Force Radarr to search for the movie - 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) |