3
3
from loguru import logger
4
4
5
5
class JellyseerrClient :
6
- def __init__ (self , server_url : str , api_key : str ):
6
+ def __init__ (self , server_url : str , api_key :str = None , email : str = None , password : str = None , user_type : str = "local" ):
7
7
# Fix common url issues
8
8
if server_url .endswith ("/" ):
9
9
server_url = server_url [:- 1 ] # Remove trailing slash
10
10
if not server_url .endswith ("/api/v1" ):
11
11
server_url += "/api/v1"
12
12
self .server_url = server_url
13
- self .api_key = api_key
13
+
14
+ if user_type not in ["local" , "plex" , "jellyfin" ]:
15
+ raise Exception ("Invalid user type. Must be one of: local, plex, jellyfin" )
14
16
15
17
# Check if server is reachable
16
18
try :
@@ -20,18 +22,34 @@ def __init__(self, server_url: str, api_key: str):
20
22
except requests .exceptions .ConnectionError :
21
23
raise Exception ("Jellyseerr Server is not reachable" )
22
24
23
- # Check if api key is valid
24
- r = requests .get (f"{ self .server_url } /auth/me" )
25
+ self .session = requests .Session ()
26
+ self .api_key = api_key
27
+ if api_key is not None :
28
+ r = self .session .headers .update ({
29
+ "X-Api-Key" : api_key
30
+ })
31
+ if r .status_code != 200 :
32
+ raise Exception ("Invalid jellyseerr API Key" )
33
+ if email is not None and password is not None :
34
+ r = self .session .post (f"{ self .server_url } /auth/{ user_type } " , json = {
35
+ "email" : email ,
36
+ "password" : password
37
+ })
38
+ if r .status_code != 200 :
39
+ raise Exception ("Invalid jellyseerr email or password" )
40
+
41
+ # Check if user is authenticated
42
+ r = self .session .get (f"{ self .server_url } /auth/me" )
43
+ if r .status_code != 200 :
44
+ raise Exception ("jellyseerr user is not authenticated" )
25
45
26
46
27
47
def make_request (self , item ):
28
48
'''Request item from jellyseerr'''
29
49
30
50
# Search for item
31
- r = requests .get (f"{ self .server_url } /search" , params = {
51
+ r = self . session .get (f"{ self .server_url } /search" , params = {
32
52
"query" : urllib .parse .quote_plus (item ["title" ])
33
- }, headers = {
34
- "X-Api-Key" : self .api_key
35
53
})
36
54
37
55
# Find matching item
@@ -57,11 +75,9 @@ def make_request(self, item):
57
75
if "mediaInfo" not in result or result ["mediaInfo" ]["jellyfinMediaId" ] is None :
58
76
# If it's not already in Jellyfin
59
77
# Request item
60
- r = requests .post (f"{ self .server_url } /request" , json = {
78
+ r = self . session .post (f"{ self .server_url } /request" , json = {
61
79
"mediaType" : result ["mediaType" ],
62
80
"mediaId" : mediaId ,
63
- }, headers = {
64
- "X-Api-Key" : self .api_key
65
81
})
66
82
logger .info (f"Requested { item ['title' ]} from Jellyseerr" )
67
83
0 commit comments