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