Last active 1644869771

a script to get direct download urls from a plex host. pass numbers as arguments to preselect choices instead of entering when prompted

Revision f6166b48e8796e125de20430e157bce4679da761

plexbrowse.py Raw
1#!/usr/bin/env python3
2import requests
3from sys import stderr, stdout, argv
4from os import environ
5
6host = environ.get("PLEX_HOST", "localhost")
7token = environ.get("PLEX_TOKEN", "")
8
9args = argv[1:]
10
11def prompt(text, prelude=None):
12 global args
13 if not args:
14 if prelude:
15 print(prelude, file=stderr)
16 print(text, file=stderr, end="")
17 else:
18 picked = args.pop(0)
19 return picked
20 return input()
21
22def get(endpoint):
23 url = host + ("/" if endpoint[0] != "/" else "") + endpoint
24 r = requests.get(url, params={"X-Plex-Token": token}, headers={"Accept": "application/json"})
25 return r.json()
26
27def main():
28 libraries = [d for d in get("/library/sections")["MediaContainer"]["Directory"]]
29 _ = []
30 for n,l in enumerate(libraries):
31 _.append(f"[{l['key']}] {l['title']}\n")
32 choice = prompt("Pick library: ", prelude="\n".join(_))
33 library = [l for l in libraries if l["key"] == choice][0]
34 lib_list = [i for i in get(f"/library/sections/{library['key']}/all")["MediaContainer"]["Metadata"]]
35 _ = []
36 for n,i in enumerate(lib_list):
37 _.append(f"[{n}] {i['title']}")
38 picked = lib_list[int(prompt("Pick item: ", prelude="\n".join(_)))]
39
40 if picked["type"] == "artist":
41 tracks = [t for t in get(picked["key"].replace("children", "allLeaves"))["MediaContainer"]["Metadata"]]
42 _ = []
43 for n,t in enumerate(tracks):
44 _.append(f"[{n}] {t['title']}")
45 picked = tracks[int(prompt("Pick track: ", prelude="\n".join(_)))]
46 elif picked["type"] == "show":
47 episodes = [e for e in get(picked["key"].replace("children", "allLeaves"))["MediaContainer"]["Metadata"]]
48 _ = []
49 for n,e in enumerate(episodes):
50 _.append(f"[{n}] S{e['parentIndex']:02d}E{e['index']:02d} {e['title']}")
51 picked = episodes[int(prompt("Pick episode: ", prelude="\n".join(_)))]
52
53 if len(picked["Media"]) > 1:
54 files = [f for f in picked["Media"]]
55 _ = []
56 for n,f in enumerate(files):
57 _.append(f"[{n}] {f['title']}")
58 picked = files[int(prompt("Pick file: ", prelude="\n".join(_)))]
59 else:
60 picked = picked["Media"][0]
61 print(f"{host}{picked['Part'][0]['key']}?X-Plex-Token={token}")
62 return 0
63
64if __name__ == "__main__":
65 from sys import exit
66 exit(main())