Skip to content

Commit b249843

Browse files
author
Michael Pivonka
authored
Merge pull request #1 from alex-phillips/token-support
added support for token-based auth
2 parents 6e08900 + ebd0477 commit b249843

File tree

1 file changed

+46
-28
lines changed

1 file changed

+46
-28
lines changed

main.py

Lines changed: 46 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)