from datetime import timedelta, datetime from couchpotato.core.helpers.variable import cleanHost from couchpotato import CPLog from urlparse import urlparse import traceback try: import xml.etree.cElementTree as etree except ImportError: import xml.etree.ElementTree as etree log = CPLog(__name__) class PlexServer(object): def __init__(self, plex): self.plex = plex self.clients = {} self.last_clients_update = None def staleClients(self): if not self.last_clients_update: return True return self.last_clients_update + timedelta(minutes=15) < datetime.now() def request(self, path, data_type='xml'): if not self.plex.conf('media_server'): log.warning("Plex media server hostname is required") return None if path.startswith('/'): path = path[1:] data = self.plex.urlopen('%s/%s' % ( self.createHost(self.plex.conf('media_server'), port = 32400), path )) if data_type == 'xml': return etree.fromstring(data) else: return data def updateClients(self, client_names): log.info('Searching for clients on Plex Media Server') self.clients = {} result = self.request('clients') if not result: return found_clients = [ c for c in result.findall('Server') if c.get('name') and c.get('name').lower() in client_names ] for client in found_clients: name = client.get('name').lower() self.clients[name] = { 'name': client.get('name'), 'address': client.get('address'), 'port': client.get('port'), 'protocol': client.get('protocol', 'xbmchttp') } client_names.remove(name) if len(client_names) > 0: log.debug('Unable to find clients: %s', ', '.join(client_names)) self.last_clients_update = datetime.now() def refresh(self, section_types=None): if not section_types: section_types = ['movie'] sections = self.request('library/sections') try: for section in sections.findall('Directory'): if section.get('type') not in section_types: continue self.request('library/sections/%s/refresh' % section.get('key'), 'text') except: log.error('Plex library update failed for %s, Media Server not running: %s', (self.plex.conf('media_server'), traceback.format_exc(1))) return False return True def createHost(self, host, port = None): h = cleanHost(host) p = urlparse(h) h = h.rstrip('/') if port and not p.port: h += ':%s' % port return h