@@ -18,15 +18,20 @@ class PlexDownloader:
1818 servers = {}
1919
2020 def login (self ):
21- #login
22- payload = {
23- 'user[login]' : self .email ,
24- 'user[password]' : self .password
25- }
26-
27- r = requests .post ("https://plex.tv/users/sign_in.json" , headers = self .headers , data = payload )
21+ if self .token :
22+ self .user = {
23+ 'authToken' : self .token ,
24+ }
25+ else :
26+ #login
27+ payload = {
28+ 'user[login]' : self .email ,
29+ 'user[password]' : self .password
30+ }
2831
29- self .user = r .json ()['user' ]
32+ r = requests .post ("https://plex.tv/users/sign_in.json" , headers = self .headers , data = payload )
33+
34+ self .user = r .json ()['user' ]
3035
3136 return self .user
3237
@@ -38,7 +43,7 @@ def get_servers(self):
3843 }
3944
4045 r = requests .get ("https://plex.tv/pms/servers.xml" , headers = headers )
41-
46+
4247 tree = ElementTree .fromstring (r .text )
4348
4449 for xml_server in tree .findall ('Server' ):
@@ -60,31 +65,31 @@ def _generate_baseurl(self):
6065 ** self .headers ,
6166 'X-Plex-Token' : server ['access_token' ]
6267 }
63-
68+
6469
6570 host_port = server ['address' ]+ ":" + server ['port' ]
66-
71+
6772 try :
6873 # Try getting host name
6974 url = "https://" + host_port
7075 r = requests .get (url , headers = headers )
7176
7277 self .base_url = url
7378 print ("Found Plex.Direct URL %s" % self .base_url )
74-
79+
7580 return url
7681 except requests .exceptions .SSLError as e :
7782 string_error = str (e )
7883
7984 if ".plex.direct" in string_error :
8085 subdomain = str (e ).split ("doesn't match" )[1 ].lstrip ("'* " ).rstrip ("'\" )" )
81-
86+
8287 ip = server ['address' ].replace ('.' , '-' )
8388
8489 url = "https://" + ip + subdomain + ":" + server ['port' ]
8590
8691 r = requests .get (url , headers = headers )
87-
92+
8893 if r .status_code == 200 :
8994 self .base_url = url
9095 print ("Found Plex.Direct URL %s" % self .base_url )
@@ -95,7 +100,7 @@ def _generate_baseurl(self):
95100 else :
96101 print ("Custom cert is enabled, don't know what to do." )
97102 return False
98-
103+
99104 def _get_url (self , url ):
100105 headers = {
101106 ** self .headers ,
@@ -115,8 +120,8 @@ def _parse_show(self, rating_key):
115120 response = self ._get_url (url )
116121
117122 if response :
118- return self ._parse_episodes (response ['MediaContainer' ]['Metadata' ])
119-
123+ return self ._parse_episodes (response ['MediaContainer' ]['Metadata' ])
124+
120125 return False
121126
122127 def _parse_episodes (self , episodes ):
@@ -126,7 +131,7 @@ def _parse_episodes(self, episodes):
126131 if episode ['type' ] == "episode" :
127132 parsed_episode = self ._parse_episode (episode )
128133 parsed_episodes .append (parsed_episode )
129-
134+
130135 return parsed_episodes
131136
132137 def _parse_episode (self , episode ):
@@ -186,30 +191,34 @@ def _parse_metadata(self, data):
186191
187192 elif media ['type' ] == "episode" :
188193 parsed_media = [ self ._parse_episode (media ) ]
189-
194+
190195 elif media ['type' ] == "movie" :
191196 parsed_media = self ._parse_movie (media )
192197
193198 else :
194199 print ("Media type %s isn't supported yet" % media ['type' ])
195200 continue
196-
201+
197202 media_content = media_content + parsed_media
198203 return media_content
199-
204+
200205 def _get_metadata (self ):
201206 url = self .base_url + self .rating_key
202207
203208 response = self ._get_url (url )
204209
205210 if response :
206211 return self ._parse_metadata (response ['MediaContainer' ]['Metadata' ])
207-
212+
208213 return False
209214
210215 def download (self ):
211216 user = self .login ()
212- print ("Logged in as: %s" % user ['username' ])
217+
218+ if self .token :
219+ print ("Logged in with token" )
220+ else :
221+ print ("Logged in as: %s" % user ['username' ])
213222
214223 servers = self .get_servers ()
215224 server_count = len (servers )
@@ -237,9 +246,9 @@ def download(self):
237246 if not os .path .exists (content ['folder' ]):
238247 print ("Directories don't exists, creating folders" )
239248 os .makedirs (content ['folder' ])
240-
249+
241250 file_name = os .path .join (content ['folder' ], content ['filename' ].replace ("/" , "-" ))
242-
251+
243252 response = requests .get (content ['url' ], stream = True , headers = headers )
244253
245254 if response .status_code == 400 :
@@ -261,6 +270,7 @@ def parse_url(self, url):
261270 print ("No url provided" )
262271 return False
263272
273+ print (url )
264274 fragment = urlparse (url ).fragment .strip ('!' ).split ('/' )
265275 self .server_hash = fragment [2 ]
266276 self .rating_key = parse_qs (fragment [3 ].split ('?' )[1 ])['key' ][0 ]
@@ -270,16 +280,24 @@ def parse_url(self, url):
270280 def command_line (self ):
271281 ap = argparse .ArgumentParser ()
272282
273- ap .add_argument ("-u" , "--username" , required = True , help = "Plex.TV Email/Username" )
283+ ap .add_argument ("-u" , "--username" , required = False , help = "Plex.TV Email/Username" )
284+
285+ ap .add_argument ("-p" , "--password" , required = False , help = "Plex.TV Password" )
274286
275- ap .add_argument ("-p " , "--password " , required = True , help = "Plex.TV Password " )
287+ ap .add_argument ("-t " , "--token " , required = False , help = "Plex Token " )
276288
277289 ap .add_argument ("url" , help = "URL to Movie, Show, Season, Episode. TIP: Put url inside single quotes." )
278290
279291 args = ap .parse_args ()
280-
292+
281293 self .email = args .username
282294 self .password = args .password
295+ self .token = args .token
296+
297+ if ((self .email is None or self .password is None ) and self .token is None ):
298+ print ("Username and psasword or token is required" )
299+ quit (1 )
300+
283301 self .parse_url (args .url )
284302 self .download ()
285303
0 commit comments