Source code for i3pystatus.plexstatus

import xml.etree.ElementTree as ET
from i3pystatus import IntervalModule
from urllib.request import urlopen


[docs]class Plexstatus(IntervalModule): """ Displays what is currently being streamed from your Plex Media Server. If you dont have an apikey you will need to follow this https://support.plex.tv/hc/en-us/articles/204059436-Finding-your-account-token-X-Plex-Token .. rubric:: Formatters * `{title}` - title currently being streamed * `{platform}` - plex recognised platform of the streamer * `{product}` - plex product name on the streamer (Plex Web, Plex Media Player) * `{address}` - address of the streamer * `{streamer_os}` - operating system on the streaming device """ settings = ( "format", "color", ("apikey", "Your Plex API authentication key"), ("address", "Hostname or IP address of the Plex Media Server"), ("port", "Port which Plex Media Server is running on"), ("interval", "Update interval"), ("stream_divider", "divider between stream info when multiple streams are active"), ("format_no_streams", "String that is shown if nothing is being streamed"), ) required = ("apikey", "address") color = "#00FF00" # green no_stream_color = "#FF0000" # red port = 32400 interval = 120 format_no_streams = None format = "{platform}: {title}" stream_divider = '-' def run(self): PMS_URL = '%s%s%s%s' % ('http://', self.address, ':', self.port) PMS_STATUS_URI = '/status/sessions/?X-Plex-Token=' PMS_STATUS_URL = PMS_URL + PMS_STATUS_URI + self.apikey response = urlopen(PMS_STATUS_URL) xml_response = response.read() tree = ET.fromstring(xml_response) streams = [] for vid in tree.iter('Video'): info = {'title': '', 'platform': '', 'product': '', 'address': '', 'streamer_os': ''} try: info['title'] = vid.attrib['title'] except AttributeError as e: self.logger.error(e) for play in vid.iter('Player'): try: info['platform'] = play.attrib['platform'] info['product'] = play.attrib['product'] info['address'] = play.attrib['address'] info['streamer_os'] = play.attrib['device'] except AttributeError as e: self.logger.error(e) streams.append(info) self.data = streams if len(streams) < 1: self.output = {} if not self.format_no_streams else { "full_text": self.format_no_streams, "color": self.no_stream_color } else: full_text = self.stream_divider.join(self.format.format(**s) for s in streams) self.output = { "full_text": full_text, "color": self.color }