@@ -21,15 +21,20 @@ class PlexDownloader:
2121 error_reg = re .compile (r"hostname '[^']+' doesn't match '\*([^']+)'" )
2222
2323 def login (self ):
24- #login
25- payload = {
26- 'user[login]' : self .email ,
27- 'user[password]' : self .password
28- }
29-
30- r = requests .post ("https://plex.tv/users/sign_in.json" , headers = self .headers , data = payload )
24+ if self .token :
25+ self .user = {
26+ 'authToken' : self .token ,
27+ }
28+ else :
29+ #login
30+ payload = {
31+ 'user[login]' : self .email ,
32+ 'user[password]' : self .password
33+ }
34+
35+ r = requests .post ("https://plex.tv/users/sign_in.json" , headers = self .headers , data = payload )
3136
32- self .user = r .json ()['user' ]
37+ self .user = r .json ()['user' ]
3338
3439 return self .user
3540
@@ -41,7 +46,7 @@ def get_servers(self):
4146 }
4247
4348 r = requests .get ("https://plex.tv/pms/servers.xml" , headers = headers )
44-
49+
4550 tree = ElementTree .fromstring (r .text )
4651
4752 for xml_server in tree .findall ('Server' ):
@@ -63,18 +68,18 @@ def _generate_baseurl(self):
6368 ** self .headers ,
6469 'X-Plex-Token' : server ['access_token' ]
6570 }
66-
71+
6772
6873 host_port = server ['address' ]+ ":" + server ['port' ]
69-
74+
7075 try :
7176 # Try getting host name
7277 url = "https://" + host_port
7378 r = requests .get (url , headers = headers )
7479
7580 self .base_url = url
7681 print ("Found Plex.Direct URL %s" % self .base_url )
77-
82+
7883 return url
7984 except requests .exceptions .SSLError as e :
8085 string_error = str (e )
@@ -100,7 +105,7 @@ def _generate_baseurl(self):
100105 else :
101106 print ("Custom cert is enabled, don't know what to do." )
102107 return False
103-
108+
104109 def _get_url (self , url ):
105110 headers = {
106111 ** self .headers ,
@@ -120,8 +125,8 @@ def _parse_show(self, rating_key):
120125 response = self ._get_url (url )
121126
122127 if response :
123- return self ._parse_episodes (response ['MediaContainer' ]['Metadata' ])
124-
128+ return self ._parse_episodes (response ['MediaContainer' ]['Metadata' ])
129+
125130 return False
126131
127132 def _parse_episodes (self , episodes ):
@@ -131,7 +136,7 @@ def _parse_episodes(self, episodes):
131136 if episode ['type' ] == "episode" :
132137 parsed_episode = self ._parse_episode (episode )
133138 parsed_episodes .append (parsed_episode )
134-
139+
135140 return parsed_episodes
136141
137142 def _parse_episode (self , episode ):
@@ -191,30 +196,34 @@ def _parse_metadata(self, data):
191196
192197 elif media ['type' ] == "episode" :
193198 parsed_media = [ self ._parse_episode (media ) ]
194-
199+
195200 elif media ['type' ] == "movie" :
196201 parsed_media = self ._parse_movie (media )
197202
198203 else :
199204 print ("Media type %s isn't supported yet" % media ['type' ])
200205 continue
201-
206+
202207 media_content = media_content + parsed_media
203208 return media_content
204-
209+
205210 def _get_metadata (self ):
206211 url = self .base_url + self .rating_key
207212
208213 response = self ._get_url (url )
209214
210215 if response :
211216 return self ._parse_metadata (response ['MediaContainer' ]['Metadata' ])
212-
217+
213218 return False
214219
215220 def download (self ):
216221 user = self .login ()
217- print ("Logged in as: %s" % user ['username' ])
222+
223+ if self .token :
224+ print ("Logged in with token" )
225+ else :
226+ print ("Logged in as: %s" % user ['username' ])
218227
219228 servers = self .get_servers ()
220229 server_count = len (servers )
@@ -241,9 +250,9 @@ def download(self):
241250 if not os .path .exists (content ['folder' ]):
242251 print ("Directories don't exists, creating folders" )
243252 os .makedirs (content ['folder' ])
244-
253+
245254 file_name = os .path .join (content ['folder' ], content ['filename' ].replace ("/" , "-" ))
246-
255+
247256 response = requests .get (content ['url' ], stream = True , headers = headers )
248257
249258 if response .status_code == 400 :
@@ -265,6 +274,7 @@ def parse_url(self, url):
265274 print ("No url provided" )
266275 return False
267276
277+ print (url )
268278 fragment = urlparse (url ).fragment .strip ('!' ).split ('/' )
269279 self .server_hash = fragment [2 ]
270280 self .rating_key = parse_qs (fragment [3 ].split ('?' )[1 ])['key' ][0 ]
@@ -274,16 +284,24 @@ def parse_url(self, url):
274284 def command_line (self ):
275285 ap = argparse .ArgumentParser ()
276286
277- ap .add_argument ("-u" , "--username" , required = True , help = "Plex.TV Email/Username" )
287+ ap .add_argument ("-u" , "--username" , required = False , help = "Plex.TV Email/Username" )
278288
279- ap .add_argument ("-p" , "--password" , required = True , help = "Plex.TV Password" )
289+ ap .add_argument ("-p" , "--password" , required = False , help = "Plex.TV Password" )
290+
291+ ap .add_argument ("-t" , "--token" , required = False , help = "Plex Token" )
280292
281293 ap .add_argument ("url" , help = "URL to Movie, Show, Season, Episode. TIP: Put url inside single quotes." )
282294
283295 args = ap .parse_args ()
284-
296+
285297 self .email = args .username
286298 self .password = args .password
299+ self .token = args .token
300+
301+ if ((self .email is None or self .password is None ) and self .token is None ):
302+ print ("Username and psasword or token is required" )
303+ quit (1 )
304+
287305 self .parse_url (args .url )
288306 self .download ()
289307
0 commit comments