Change Plex notifications: allow authenticated library updates (port from mmccurdy07)

Change to allow authenticated access to Media Server.
Change Config/Notifications/Plex logo, description, and label texts.

Adapted port commit/955a48b577875ac8e94ea5efb445c28c57b7d9cb from
mmccurdy07/Sick-Beard/commits/development (by Supremicus).
This commit is contained in:
mmccurdy07 2014-12-03 21:12:13 +10:00 committed by JackDandy
parent e3688e0ab6
commit e28d4c18f7
4 changed files with 47 additions and 12 deletions

View file

@ -7,7 +7,9 @@
* Add TVRage network name standardization * Add TVRage network name standardization
* Change some provider images. Add a few new images * Change some provider images. Add a few new images
* Remove redundant Coming Eps template code used in the old UI * Remove redundant Coming Eps template code used in the old UI
* Change update plex notifier (port from SickBeard) * Change update Plex notifier (port from SickBeard)
* Change Plex notifications to allow authenticated library updates (port from mmccurdy07/Sick-Beard)
* Change Config/Notifications/Plex logo and description (adapted port from mmccurdy07/Sick-Beard)
[develop changelog] [develop changelog]

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

View file

@ -159,7 +159,7 @@
<div class="component-group-desc"> <div class="component-group-desc">
<img class="notifier-icon" src="$sbRoot/images/notifiers/plex.png" alt="" title="Plex Media Server" /> <img class="notifier-icon" src="$sbRoot/images/notifiers/plex.png" alt="" title="Plex Media Server" />
<h3><a href="<%= anon_url('http://www.plexapp.com/') %>" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;">Plex Media Server</a></h3> <h3><a href="<%= anon_url('http://www.plexapp.com/') %>" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;">Plex Media Server</a></h3>
<p>Experience your media on a visually stunning, easy to use interface on your Mac connected to your TV. Your media library has never looked this good!</p> <p>Plex organizes all of your personal media, wherever you keep it, so you can enjoy it on any device</p>
<p class="plexinfo hide">For sending notifications to Plex Home Theater (PHT) clients, use the XBMC notifier with port <b>3005</b>.</p> <p class="plexinfo hide">For sending notifications to Plex Home Theater (PHT) clients, use the XBMC notifier with port <b>3005</b>.</p>
</div> </div>
<fieldset class="component-group-list"> <fieldset class="component-group-list">
@ -222,12 +222,12 @@
</div> </div>
<div class="field-pair"> <div class="field-pair">
<label for="plex_host"> <label for="plex_host">
<span class="component-title">Plex Client IP:Port</span> <span class="component-title">Plex client IP:Port</span>
<input type="text" name="plex_host" id="plex_host" value="$sickbeard.PLEX_HOST" class="form-control input-sm input350" /> <input type="text" name="plex_host" id="plex_host" value="$sickbeard.PLEX_HOST" class="form-control input-sm input350" />
</label> </label>
<label> <label>
<span class="component-title">&nbsp;</span> <span class="component-title">&nbsp;</span>
<span class="component-desc">host running Plex Client (eg. 192.168.1.100:3000)</span> <span class="component-desc">host running Plex client (eg. 192.168.1.100:3000)</span>
</label> </label>
<label> <label>
<span class="component-title">&nbsp;</span> <span class="component-title">&nbsp;</span>
@ -236,22 +236,22 @@
</div> </div>
<div class="field-pair"> <div class="field-pair">
<label for="plex_username"> <label for="plex_username">
<span class="component-title">Plex Client username</span> <span class="component-title">Plex client username</span>
<input type="text" name="plex_username" id="plex_username" value="$sickbeard.PLEX_USERNAME" class="form-control input-sm input250" /> <input type="text" name="plex_username" id="plex_username" value="$sickbeard.PLEX_USERNAME" class="form-control input-sm input250" />
</label> </label>
<label> <label>
<span class="component-title">&nbsp;</span> <span class="component-title">&nbsp;</span>
<span class="component-desc">username for your Plex client API (blank for none)</span> <span class="component-desc">needed if your client / server requires authentication (blank for none)</span>
</label> </label>
</div> </div>
<div class="field-pair"> <div class="field-pair">
<label for="plex_password"> <label for="plex_password">
<span class="component-title">Plex Client password</span> <span class="component-title">Plex client password</span>
<input type="password" name="plex_password" id="plex_password" value="$sickbeard.PLEX_PASSWORD" class="form-control input-sm input250" /> <input type="password" name="plex_password" id="plex_password" value="$sickbeard.PLEX_PASSWORD" class="form-control input-sm input250" />
</label> </label>
<label> <label>
<span class="component-title">&nbsp;</span> <span class="component-title">&nbsp;</span>
<span class="component-desc">password for your Plex client API (blank for none)</span> <span class="component-desc">needed if your client / server requires authentication (blank for none)</span>
</label> </label>
</div> </div>
<div class="testNotification" id="testPLEX-result">Click below to test.</div> <div class="testNotification" id="testPLEX-result">Click below to test.</div>

View file

@ -156,7 +156,7 @@ class PLEXNotifier:
def test_notify(self, host, username, password): def test_notify(self, host, username, password):
return self._notify("This is a test notification from SickGear", "Test", host, username, password, force=True) return self._notify("This is a test notification from SickGear", "Test", host, username, password, force=True)
def update_library(self, ep_obj=None): def update_library(self, ep_obj=None, host=None, username=None, password=None):
"""Handles updating the Plex Media Server host via HTTP API """Handles updating the Plex Media Server host via HTTP API
Plex Media Server currently only supports updating the whole video library and not a specific path. Plex Media Server currently only supports updating the whole video library and not a specific path.
@ -166,14 +166,47 @@ class PLEXNotifier:
""" """
# fill in omitted parameters
if not host:
host = sickbeard.PLEX_SERVER_HOST
if not username:
username = sickbeard.PLEX_USERNAME
if not password:
password = sickbeard.PLEX_PASSWORD
if sickbeard.USE_PLEX and sickbeard.PLEX_UPDATE_LIBRARY: if sickbeard.USE_PLEX and sickbeard.PLEX_UPDATE_LIBRARY:
if not sickbeard.PLEX_SERVER_HOST: if not sickbeard.PLEX_SERVER_HOST:
logger.log(u"PLEX: No Plex Media Server host specified, check your settings", logger.DEBUG) logger.log(u"PLEX: No Plex Media Server host specified, check your settings", logger.DEBUG)
return False return False
logger.log(u"PLEX: Updating library for the Plex Media Server host: " + sickbeard.PLEX_SERVER_HOST, logger.MESSAGE) logger.log(u"PLEX: Updating library for the Plex Media Server host: " + host, logger.MESSAGE)
url = "http://%s/library/sections" % sickbeard.PLEX_SERVER_HOST # if username and password were provided, fetch the auth token from plex.tv
token_arg = ""
if username and password:
logger.log(u"PLEX: fetching credentials for Plex user: " + username, logger.DEBUG)
req = urllib2.Request("https://plex.tv/users/sign_in.xml", data="")
base64string = base64.encodestring('%s:%s' % (username, password))[:-1]
authheader = "Basic %s" % base64string
req.add_header("Authorization", authheader)
req.add_header("X-Plex-Client-Identifier", "Sick-Beard-Notifier")
try:
response = urllib2.urlopen(req)
except urllib2.URLError, e:
logger.log(u"PLEX: Error fetching credentials from from plex.tv for user %s: %s" % (username, ex(e)), logger.MESSAGE)
return False
try:
auth_tree = etree.parse(response)
token = auth_tree.findall(".//authentication-token")[0].text
token_arg = "?X-Plex-Token=" + token
except (ValueError, IndexError) as e:
logger.log(u"PLEX: Error parsing plex.tv response: " + ex(e), logger.MESSAGE)
return False
url = "http://%s/library/sections%s" % (sickbeard.PLEX_SERVER_HOST, token_arg)
try: try:
xml_tree = etree.parse(urllib.urlopen(url)) xml_tree = etree.parse(urllib.urlopen(url))
media_container = xml_tree.getroot() media_container = xml_tree.getroot()
@ -188,7 +221,7 @@ class PLEXNotifier:
for section in sections: for section in sections:
if section.attrib['type'] == "show": if section.attrib['type'] == "show":
url = "http://%s/library/sections/%s/refresh" % (sickbeard.PLEX_SERVER_HOST, section.attrib['key']) url = "http://%s/library/sections/%s/refresh%s" % (sickbeard.PLEX_SERVER_HOST, section.attrib['key'], token_arg)
try: try:
urllib.urlopen(url) urllib.urlopen(url)
except Exception, e: except Exception, e: