2012-02-22 02:10:42 +03:00
|
|
|
using System;
|
|
|
|
using System.Collections.Generic;
|
|
|
|
using System.Linq;
|
|
|
|
using System.Xml.Linq;
|
|
|
|
using NLog;
|
|
|
|
using NzbDrone.Common;
|
2013-02-24 09:48:52 +03:00
|
|
|
using NzbDrone.Core.Configuration;
|
2012-02-22 02:10:42 +03:00
|
|
|
|
2013-05-20 02:17:32 +03:00
|
|
|
namespace NzbDrone.Core.Notifications.Plex
|
2012-02-22 02:10:42 +03:00
|
|
|
{
|
|
|
|
public class PlexProvider
|
|
|
|
{
|
2013-04-11 02:41:45 +03:00
|
|
|
private readonly IHttpProvider _httpProvider;
|
2012-02-22 02:10:42 +03:00
|
|
|
private static readonly Logger logger = LogManager.GetCurrentClassLogger();
|
|
|
|
|
2013-05-20 02:17:32 +03:00
|
|
|
public PlexProvider(IHttpProvider httpProvider)
|
2012-02-22 02:10:42 +03:00
|
|
|
{
|
|
|
|
_httpProvider = httpProvider;
|
|
|
|
}
|
|
|
|
|
2013-05-20 02:17:32 +03:00
|
|
|
public virtual void Notify(PlexClientSettings settings, string header, string message)
|
2012-02-22 02:10:42 +03:00
|
|
|
{
|
2013-05-20 02:17:32 +03:00
|
|
|
try
|
|
|
|
{
|
|
|
|
var command = String.Format("ExecBuiltIn(Notification({0}, {1}))", header, message);
|
|
|
|
SendCommand(settings.Host, command, settings.Username, settings.Password);
|
|
|
|
}
|
|
|
|
catch(Exception ex)
|
2012-02-22 02:10:42 +03:00
|
|
|
{
|
2013-05-20 02:17:32 +03:00
|
|
|
logger.WarnException("Failed to send notification to Plex Client: " + settings.Host, ex);
|
2012-02-22 02:10:42 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-05-20 02:17:32 +03:00
|
|
|
public virtual void UpdateLibrary(string host)
|
2012-02-22 02:10:42 +03:00
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
2013-02-25 02:47:57 +03:00
|
|
|
logger.Trace("Sending Update Request to Plex Server");
|
2012-02-22 02:10:42 +03:00
|
|
|
var sections = GetSectionKeys(host);
|
|
|
|
sections.ForEach(s => UpdateSection(host, s));
|
|
|
|
}
|
|
|
|
|
|
|
|
catch(Exception ex)
|
|
|
|
{
|
|
|
|
logger.WarnException("Failed to Update Plex host: " + host, ex);
|
|
|
|
throw;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public List<int> GetSectionKeys(string host)
|
|
|
|
{
|
|
|
|
logger.Trace("Getting sections from Plex host: {0}", host);
|
|
|
|
var url = String.Format("http://{0}/library/sections", host);
|
|
|
|
var xmlStream = _httpProvider.DownloadStream(url, null);
|
|
|
|
var xDoc = XDocument.Load(xmlStream);
|
|
|
|
var mediaContainer = xDoc.Descendants("MediaContainer").FirstOrDefault();
|
|
|
|
var directories = mediaContainer.Descendants("Directory").Where(x => x.Attribute("type").Value == "show");
|
|
|
|
|
|
|
|
return directories.Select(d => Int32.Parse(d.Attribute("key").Value)).ToList();
|
|
|
|
}
|
|
|
|
|
|
|
|
public void UpdateSection(string host, int key)
|
|
|
|
{
|
|
|
|
logger.Trace("Updating Plex host: {0}, Section: {1}", host, key);
|
|
|
|
var url = String.Format("http://{0}/library/sections/{1}/refresh", host, key);
|
|
|
|
_httpProvider.DownloadString(url);
|
|
|
|
}
|
|
|
|
|
|
|
|
public virtual string SendCommand(string host, string command, string username, string password)
|
|
|
|
{
|
|
|
|
var url = String.Format("http://{0}/xbmcCmds/xbmcHttp?command={1}", host, command);
|
|
|
|
|
|
|
|
if (!String.IsNullOrEmpty(username))
|
|
|
|
{
|
|
|
|
return _httpProvider.DownloadString(url, username, password);
|
|
|
|
}
|
|
|
|
|
|
|
|
return _httpProvider.DownloadString(url);
|
|
|
|
}
|
2012-10-22 07:29:12 +03:00
|
|
|
|
2013-05-20 02:17:32 +03:00
|
|
|
public virtual void TestNotification(string host, string username, string password)
|
2012-10-22 07:29:12 +03:00
|
|
|
{
|
2013-05-20 02:17:32 +03:00
|
|
|
logger.Trace("Sending Test Notifcation to XBMC Host: {0}", host);
|
|
|
|
var command = String.Format("ExecBuiltIn(Notification({0}, {1}))", "Test Notification", "Success! Notifications are setup correctly");
|
|
|
|
SendCommand(host.Trim(), command, username, password);
|
2012-10-22 07:29:12 +03:00
|
|
|
}
|
2012-02-22 02:10:42 +03:00
|
|
|
}
|
|
|
|
}
|