Last active 1443733079

Gets plex streaming urls. Pipe into cast.py (https://gist.github.com/blha303/8b100c205b8c35b3c8ce) for best results. List episodes and movies from plex by omitting titles (i.e getplex.py -m "" or getplex.py -s "Bla")

getplex.py Raw
1#!/usr/bin/env python2.7
2# Now with Plex auth support! Check getplex.py -h
3from __future__ import print_function
4from plexapi.server import PlexServer
5from plexapi.myplex import MyPlexUser
6from plexapi.exceptions import NotFound
7
8from urlparse import urlparse
9from getpass import getpass
10from socket import gethostbyname
11
12import sys
13import argparse
14
15DEFAULT_URI = "http://192.168.1.50:32400"
16
17def fmtcols(l):
18 maxlen = max(len(i) for i in l)
19 if len(l) % 2 != 0:
20 l.append(" ")
21 split = len(l)/2
22 l1 = l[0:split]
23 l2 = l[split:]
24 o = []
25 for key, value in zip(l1,l2):
26 o.append(u"{0:<{2}s} {1}".format(key, value, maxlen))
27 return u"\n".join(o)
28
29def info(*objs):
30 print(*objs, file=sys.stderr)
31
32def prompt(*objs):
33 old_stdout = sys.stdout
34 try:
35 sys.stdout = sys.stderr
36 return raw_input(*objs)
37 finally:
38 sys.stdout = old_stdout
39
40def get_server(uri=DEFAULT_URI, username=None, password=None, servername=None):
41 try:
42 return PlexServer(uri)
43 except NotFound:
44 pass
45 if not username and not password:
46 info("Could not get server object, maybe you need to be authenticated?")
47 username = prompt("Username: ") if not username else username
48 password = getpass() if not password else password
49 user = MyPlexUser.signin(username, password)
50 if not servername:
51 info("Servers: " + ", ".join(a.name for a in user.resources()))
52 servername = prompt("Please enter server name. If you don't know it, press enter and I'll (very slowly!) search for the correct server: ") or None
53 if servername:
54 return user.getResource(servername).connect()
55 else:
56 info("OK, beginning the search process.")
57 # necessary to match correct server
58 if uri.count(":") >= 2:
59 ip = ":".join(urlparse(uri).netloc.split(":")[:-1])
60 else:
61 ip = urlparse(uri).netloc
62 info("Getting IP for {}".format(ip))
63 ip = gethostbyname(ip)
64 info("Got IP from hostname: {}".format(ip) if ip not in uri else "Searching for {}".format(ip))
65 for srv in user.resources():
66 try:
67 server = srv.connect()
68 if ip in server.baseuri:
69 info("Found server: {}".format(srv.name))
70 return server
71 except NotFound:
72 info("Couldn't connect to {}".format(srv.name))
73 info("Couldn't find server in your user's server list.")
74 return None
75
76def lookup_movie(server, movie):
77 return server.library.section("Movies").get(movie)
78
79def lookup_episode(server, show, episode):
80 return server.library.section("TV Shows").get(show).episode(episode)
81
82def main():
83 parser = argparse.ArgumentParser()
84 group = parser.add_mutually_exclusive_group()
85 group.add_argument("-m", "--movie", help="Specify movie. Must be exact title.")
86 group.add_argument("-s", "--show", help="Specify show. Must be exact title.")
87 parser.add_argument("-e", "--episode", help="Specify episode. Get list of episodes by specifying show")
88 parser.add_argument("-S", "--server", help="Specify server. Defaults to {}".format(DEFAULT_URI), default=DEFAULT_URI)
89 parser.add_argument("-u", "--username", help="Specify username. Used for Plex authentication")
90 parser.add_argument("-p", "--password", help="Specify password. Provided for convenience only, preferred method is to omit this and enter password at the prompt.")
91 parser.add_argument("--servername", help="Specify server name. Used with -u above, for Plex authentication.")
92 args = parser.parse_args()
93 server = get_server(args.server, username=args.username, password=args.password, servername=args.servername)
94 if not server:
95 info("Aborting.")
96 return
97 if args.movie is not None:
98 if args.movie is "":
99 print(fmtcols([u"{}".format(movie.title) for movie in server.library.section("Movies").all()]))
100 else:
101 print(lookup_movie(server, args.movie).getStreamUrl())
102 elif args.show is not None:
103 if args.show is "":
104 print(fmtcols([u"{}".format(show.title) for show in server.library.section("TV Shows").all()]))
105 else:
106 if args.episode:
107 print(lookup_episode(server, args.show, args.episode).getStreamUrl())
108 else:
109 print(fmtcols([u"S{}E{} {}".format(ep.parentIndex.zfill(2), ep.index.zfill(2), ep.title) for ep in server.library.section("TV Shows").get(args.show).episodes()]))
110
111if __name__ == "__main__":
112 main()