Skip to content

Commit 12a7872

Browse files
author
Michael Pivonka
authored
Merge branch 'master' into dev
2 parents 2c336a5 + b249843 commit 12a7872

File tree

1 file changed

+44
-26
lines changed

1 file changed

+44
-26
lines changed

main.py

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

Comments
 (0)