Files
Membarr/app/bot/helper/jellyfinhelper.py
Yoruio 11b42cff53 feat: Adds jellyfin external URL and timeout gh-13
- Adds Jellyfin external URL config option - URL to send to users if
 different from server URL.
 - Adds Jellyfin server setup timeout after 5 seconds, and response
 delaying so discord bot doesn't timeout

task: gh-13
2022-07-16 14:28:56 -06:00

175 lines
6.1 KiB
Python

import requests
import random
import string
def add_user(jellyfin_url, jellyfin_api_key, username, password, jellyfin_libs):
try:
url = f"{jellyfin_url}/Users/New"
querystring = {"api_key":jellyfin_api_key}
payload = {
"Name": username,
"Password": password
}
headers = {"Content-Type": "application/json"}
response = requests.request("POST", url, json=payload, headers=headers, params=querystring)
userId = response.json()["Id"]
if response.status_code != 200:
print(f"Error creating new Jellyfin user: {response.text}")
return False
# Grant access to User
url = f"{jellyfin_url}/Users/{userId}/Policy"
querystring = {"api_key":jellyfin_api_key}
enabled_folders = []
server_libs = get_libraries(jellyfin_url, jellyfin_api_key)
if jellyfin_libs[0] != "all":
for lib in jellyfin_libs:
found = False
for server_lib in server_libs:
if lib == server_lib['Name']:
enabled_folders.append(server_lib['ItemId'])
found = True
if not found:
print(f"Couldn't find Jellyfin Library: {lib}")
payload = {
"IsAdministrator": False,
"IsHidden": True,
"IsDisabled": False,
"BlockedTags": [],
"EnableUserPreferenceAccess": True,
"AccessSchedules": [],
"BlockUnratedItems": [],
"EnableRemoteControlOfOtherUsers": False,
"EnableSharedDeviceControl": True,
"EnableRemoteAccess": True,
"EnableLiveTvManagement": True,
"EnableLiveTvAccess": True,
"EnableMediaPlayback": True,
"EnableAudioPlaybackTranscoding": True,
"EnableVideoPlaybackTranscoding": True,
"EnablePlaybackRemuxing": True,
"ForceRemoteSourceTranscoding": False,
"EnableContentDeletion": False,
"EnableContentDeletionFromFolders": [],
"EnableContentDownloading": True,
"EnableSyncTranscoding": True,
"EnableMediaConversion": True,
"EnabledDevices": [],
"EnableAllDevices": True,
"EnabledChannels": [],
"EnableAllChannels": False,
"EnabledFolders": enabled_folders,
"EnableAllFolders": jellyfin_libs[0] == "all",
"InvalidLoginAttemptCount": 0,
"LoginAttemptsBeforeLockout": -1,
"MaxActiveSessions": 0,
"EnablePublicSharing": True,
"BlockedMediaFolders": [],
"BlockedChannels": [],
"RemoteClientBitrateLimit": 0,
"AuthenticationProviderId": "Jellyfin.Server.Implementations.Users.DefaultAuthenticationProvider",
"PasswordResetProviderId": "Jellyfin.Server.Implementations.Users.DefaultPasswordResetProvider",
"SyncPlayAccess": "CreateAndJoinGroups"
}
headers = {"content-type": "application/json"}
response = requests.request("POST", url, json=payload, headers=headers, params=querystring)
if response.status_code == 200 or response.status_code == 204:
return True
else:
print(f"Error setting user permissions: {response.text}")
except Exception as e:
print(e)
return False
def get_libraries(jellyfin_url, jellyfin_api_key):
url = f"{jellyfin_url}/Library/VirtualFolders"
querystring = {"api_key":jellyfin_api_key}
response = requests.request("GET", url, params=querystring)
return response.json()
def verify_username(jellyfin_url, jellyfin_api_key, username):
users = get_users(jellyfin_url, jellyfin_api_key)
valid = True
for user in users:
if user['Name'] == username:
valid = False
break
return valid
def remove_user(jellyfin_url, jellyfin_api_key, jellyfin_username):
try:
# Get User ID
users = get_users(jellyfin_url, jellyfin_api_key)
userId = None
for user in users:
if user['Name'].lower() == jellyfin_username.lower():
userId = user['Id']
if userId is None:
# User not found
print(f"Error removing user {jellyfin_username} from Jellyfin: Could not find user.")
return False
# Delete User
url = f"{jellyfin_url}/Users/{userId}"
querystring = {"api_key":jellyfin_api_key}
response = requests.request("DELETE", url, params=querystring)
if response.status_code == 204 or response.status_code == 200:
return True
else:
print(f"Error deleting Jellyfin user: {response.text}")
except Exception as e:
print(e)
return False
def get_users(jellyfin_url, jellyfin_api_key):
url = f"{jellyfin_url}/Users"
querystring = {"api_key":jellyfin_api_key}
response = requests.request("GET", url, params=querystring)
return response.json()
def generate_password(length, lower=True, upper=True, numbers=True, symbols=True):
character_list = []
if not (lower or upper or numbers or symbols):
raise ValueError("At least one character type must be provided")
if lower:
character_list += string.ascii_lowercase
if upper:
character_list += string.ascii_uppercase
if numbers:
character_list += string.digits
if symbols:
character_list += string.punctuation
return "".join(random.choice(character_list) for i in range(length))
def get_config(jellyfin_url, jellyfin_api_key):
url = f"{jellyfin_url}/System/Configuration"
querystring = {"api_key":jellyfin_api_key}
response = requests.request("GET", url, params=querystring, timeout=5)
return response.json()
def get_status(jellyfin_url, jellyfin_api_key):
url = f"{jellyfin_url}/System/Configuration"
querystring = {"api_key":jellyfin_api_key}
response = requests.request("GET", url, params=querystring, timeout=5)
return response.status_code