2011-03-06 20:45:35 +00:00
using System ;
using System.Collections.Generic ;
2011-03-06 21:36:09 +00:00
using System.IO ;
2011-03-06 20:45:35 +00:00
using System.Linq ;
using System.Net ;
using System.Text ;
2011-03-06 21:36:09 +00:00
using System.Xml.Linq ;
2011-03-06 20:45:35 +00:00
using NLog ;
2011-03-06 21:36:09 +00:00
using NzbDrone.Core.Helpers ;
2011-03-06 20:45:35 +00:00
namespace NzbDrone.Core.Providers
{
public class XbmcProvider : IXbmcProvider
{
private readonly IConfigProvider _configProvider ;
2011-03-07 06:33:59 +00:00
private readonly IHttpProvider _httpProvider ;
2011-03-06 20:45:35 +00:00
private WebClient _webClient ;
private static readonly Logger Logger = LogManager . GetCurrentClassLogger ( ) ;
2011-03-07 06:33:59 +00:00
public XbmcProvider ( IConfigProvider configProvider , IHttpProvider httpProvider )
2011-03-06 20:45:35 +00:00
{
_webClient = new WebClient ( ) ;
_configProvider = configProvider ;
2011-03-07 06:33:59 +00:00
_httpProvider = httpProvider ;
2011-03-06 20:45:35 +00:00
}
#region IXbmcProvider Members
public void Notify ( string header , string message )
{
//Get time in seconds and convert to ms
var time = Convert . ToInt32 ( _configProvider . GetValue ( "XbmcDisplayTime" , "3" , true ) ) * 1000 ;
var command = String . Format ( "ExecBuiltIn(Notification({0},{1},{2}))" , header , message , time ) ;
2011-03-06 21:36:09 +00:00
if ( Convert . ToBoolean ( _configProvider . GetValue ( "XbmcNotificationImage" , false , true ) ) )
2011-03-06 20:45:35 +00:00
{
2011-03-06 21:36:09 +00:00
//Todo: Get the actual port that NzbDrone is running on...
var serverInfo = String . Format ( "http://{0}:{1}" , ServerHelper . GetServerHostname ( ) , "8989" ) ;
2011-03-06 20:45:35 +00:00
2011-03-06 21:36:09 +00:00
var imageUrl = String . Format ( "{0}/Content/XbmcNotification.png" , serverInfo ) ;
command = String . Format ( "ExecBuiltIn(Notification({0},{1},{2}, {3}))" , header , message , time , imageUrl ) ;
2011-03-06 20:45:35 +00:00
}
2011-03-06 21:36:09 +00:00
foreach ( var host in _configProvider . GetValue ( "XbmcHosts" , "localhost:80" , true ) . Split ( ',' ) )
{
Logger . Trace ( "Sending Notifcation to XBMC Host: {0}" , host ) ;
SendCommand ( host , command ) ;
}
2011-03-06 20:45:35 +00:00
}
public void Update ( int seriesId )
{
2011-03-06 21:36:09 +00:00
foreach ( var host in _configProvider . GetValue ( "XbmcHosts" , "localhost:80" , true ) . Split ( ',' ) )
{
Logger . Trace ( "Sending Update DB Request to XBMC Host: {0}" , host ) ;
var xbmcSeriesPath = GetXbmcSeriesPath ( host , seriesId ) ;
//If the path is not found & the user wants to update the entire library, do it now.
if ( String . IsNullOrEmpty ( xbmcSeriesPath ) & & Convert . ToBoolean ( _configProvider . GetValue ( "XbmcFullUpdate" , false , true ) ) )
{
//Update the entire library
Logger . Trace ( "Series [{0}] doesn't exist on XBMC host: {1}, Updating Entire Library" , seriesId , host ) ;
SendCommand ( host , "ExecBuiltIn(UpdateLibrary(video))" ) ;
return ;
}
var command = String . Format ( "ExecBuiltIn(UpdateLibrary(video,{0}))" , xbmcSeriesPath ) ;
SendCommand ( host , command ) ;
}
2011-03-06 20:45:35 +00:00
}
public void Clean ( )
{
2011-03-06 21:36:09 +00:00
foreach ( var host in _configProvider . GetValue ( "XbmcHosts" , "localhost:80" , true ) . Split ( ',' ) )
{
Logger . Trace ( "Sending DB Clean Request to XBMC Host: {0}" , host ) ;
var command = String . Format ( "ExecBuiltIn(CleanLibrary(database) )" ) ;
SendCommand ( host , command ) ;
}
2011-03-06 20:45:35 +00:00
}
#endregion
private string SendCommand ( string host , string command )
{
var username = _configProvider . GetValue ( "XbmcUsername" , String . Empty , true ) ;
var password = _configProvider . GetValue ( "XbmcPassword" , String . Empty , true ) ;
var url = String . Format ( "http://{0}/xbmcCmds/xbmcHttp?command={1}" , host , command ) ;
2011-03-07 06:33:59 +00:00
if ( ! String . IsNullOrEmpty ( username ) )
2011-03-06 20:45:35 +00:00
{
2011-03-07 06:33:59 +00:00
return _httpProvider . DownloadString ( url , username , password ) ;
2011-03-06 20:45:35 +00:00
}
2011-03-07 06:33:59 +00:00
return _httpProvider . DownloadString ( url ) ;
2011-03-06 20:45:35 +00:00
}
2011-03-06 21:36:09 +00:00
private string GetXbmcSeriesPath ( string host , int seriesId )
{
var query = String . Format ( "select path.strPath from path, tvshow, tvshowlinkpath where tvshow.c12 = {0} and tvshowlinkpath.idShow = tvshow.idShow and tvshowlinkpath.idPath = path.idPath" , seriesId ) ;
var command = String . Format ( "QueryVideoDatabase({0})" , query ) ;
var setResponseCommand = "SetResponseFormat(webheader;false;webfooter;false;header;<xml>;footer;</xml>;opentag;<tag>;closetag;</tag>;closefinaltag;false)" ;
var resetResponseCommand = "SetResponseFormat()" ;
SendCommand ( host , setResponseCommand ) ;
var response = SendCommand ( host , command ) ;
SendCommand ( host , resetResponseCommand ) ;
if ( String . IsNullOrEmpty ( response ) )
return String . Empty ;
var xDoc = XDocument . Load ( new StringReader ( response ) ) ;
var xml = ( from x in xDoc . Descendants ( "xml" ) select x ) . FirstOrDefault ( ) ;
if ( xml = = null )
return String . Empty ;
var field = xml . Descendants ( "field" ) . FirstOrDefault ( ) ;
if ( field = = null )
return String . Empty ;
return field . Value ;
}
2011-03-06 20:45:35 +00:00
}
}