getplex.py
· 4.4 KiB · Python
Raw
#!/usr/bin/env python2.7
# Now with Plex auth support! Check getplex.py -h
from __future__ import print_function
from plexapi.server import PlexServer
from plexapi.myplex import MyPlexUser
from plexapi.exceptions import NotFound
from urlparse import urlparse
from getpass import getpass
from socket import gethostbyname
import sys
import argparse
DEFAULT_URI = "http://192.168.1.50:32400"
def fmtcols(l):
maxlen = max(len(i) for i in l)
if len(l) % 2 != 0:
l.append(" ")
split = len(l)/2
l1 = l[0:split]
l2 = l[split:]
o = []
for key, value in zip(l1,l2):
o.append(u"{0:<{2}s} {1}".format(key, value, maxlen))
return u"\n".join(o)
def info(*objs):
print(*objs, file=sys.stderr)
def prompt(*objs):
old_stdout = sys.stdout
try:
sys.stdout = sys.stderr
return raw_input(*objs)
finally:
sys.stdout = old_stdout
def get_server(uri=DEFAULT_URI, username=None, password=None, servername=None):
try:
return PlexServer(uri)
except NotFound:
pass
if not username and not password:
info("Could not get server object, maybe you need to be authenticated?")
username = prompt("Username: ") if not username else username
password = getpass() if not password else password
user = MyPlexUser.signin(username, password)
if not servername:
info("Servers: " + ", ".join(a.name for a in user.resources()))
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
if servername:
return user.getResource(servername).connect()
else:
info("OK, beginning the search process.")
# necessary to match correct server
if uri.count(":") >= 2:
ip = ":".join(urlparse(uri).netloc.split(":")[:-1])
else:
ip = urlparse(uri).netloc
info("Getting IP for {}".format(ip))
ip = gethostbyname(ip)
info("Got IP from hostname: {}".format(ip) if ip not in uri else "Searching for {}".format(ip))
for srv in user.resources():
try:
server = srv.connect()
if ip in server.baseuri:
info("Found server: {}".format(srv.name))
return server
except NotFound:
info("Couldn't connect to {}".format(srv.name))
info("Couldn't find server in your user's server list.")
return None
def lookup_movie(server, movie):
return server.library.section("Movies").get(movie)
def lookup_episode(server, show, episode):
return server.library.section("TV Shows").get(show).episode(episode)
def main():
parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument("-m", "--movie", help="Specify movie. Must be exact title.")
group.add_argument("-s", "--show", help="Specify show. Must be exact title.")
parser.add_argument("-e", "--episode", help="Specify episode. Get list of episodes by specifying show")
parser.add_argument("-S", "--server", help="Specify server. Defaults to {}".format(DEFAULT_URI), default=DEFAULT_URI)
parser.add_argument("-u", "--username", help="Specify username. Used for Plex authentication")
parser.add_argument("-p", "--password", help="Specify password. Provided for convenience only, preferred method is to omit this and enter password at the prompt.")
parser.add_argument("--servername", help="Specify server name. Used with -u above, for Plex authentication.")
args = parser.parse_args()
server = get_server(args.server, username=args.username, password=args.password, servername=args.servername)
if not server:
info("Aborting.")
return
if args.movie is not None:
if args.movie is "":
print(fmtcols([u"{}".format(movie.title) for movie in server.library.section("Movies").all()]))
else:
print(lookup_movie(server, args.movie).getStreamUrl())
elif args.show is not None:
if args.show is "":
print(fmtcols([u"{}".format(show.title) for show in server.library.section("TV Shows").all()]))
else:
if args.episode:
print(lookup_episode(server, args.show, args.episode).getStreamUrl())
else:
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()]))
if __name__ == "__main__":
main()
| 1 | #!/usr/bin/env python2.7 |
| 2 | # Now with Plex auth support! Check getplex.py -h |
| 3 | from __future__ import print_function |
| 4 | from plexapi.server import PlexServer |
| 5 | from plexapi.myplex import MyPlexUser |
| 6 | from plexapi.exceptions import NotFound |
| 7 | |
| 8 | from urlparse import urlparse |
| 9 | from getpass import getpass |
| 10 | from socket import gethostbyname |
| 11 | |
| 12 | import sys |
| 13 | import argparse |
| 14 | |
| 15 | DEFAULT_URI = "http://192.168.1.50:32400" |
| 16 | |
| 17 | def 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 | |
| 29 | def info(*objs): |
| 30 | print(*objs, file=sys.stderr) |
| 31 | |
| 32 | def 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 | |
| 40 | def 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 | |
| 76 | def lookup_movie(server, movie): |
| 77 | return server.library.section("Movies").get(movie) |
| 78 | |
| 79 | def lookup_episode(server, show, episode): |
| 80 | return server.library.section("TV Shows").get(show).episode(episode) |
| 81 | |
| 82 | def 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 | |
| 111 | if __name__ == "__main__": |
| 112 | main() |