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 a9837b674ac2756eab83a5485e0afd6625b6080f

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