Пример #1
0
        internal string GetSeriesPath(XbmcSettings settings, Series series)
        {
            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",
                    series.TvdbId);
            var command = string.Format("QueryVideoDatabase({0})", query);

            const string setResponseCommand =
                "SetResponseFormat(webheader;false;webfooter;false;header;<xml>;footer;</xml>;opentag;<tag>;closetag;</tag>;closefinaltag;false)";
            const string resetResponseCommand = "SetResponseFormat()";

            SendCommand(settings, setResponseCommand);
            var response = SendCommand(settings, command);
            SendCommand(settings, resetResponseCommand);

            if (string.IsNullOrEmpty(response))
                return string.Empty;

            var xDoc = XDocument.Load(new StringReader(response.Replace("&", "&amp;")));
            var xml = xDoc.Descendants("xml").Select(x => x).FirstOrDefault();

            if (xml == null)
                return null;

            var field = xml.Descendants("field").FirstOrDefault();

            if (field == null)
                return null;

            return field.Value;
        }
Пример #2
0
        private void UpdateLibrary(XbmcSettings settings, Series series)
        {
            try
            {
                var seriesPath = GetSeriesPath(settings, series);

                if (seriesPath != null)
                {
                    _logger.Debug("Updating series {0} (Path: {1}) on XBMC host: {2}", series, seriesPath, settings.Address);
                }

                else
                {
                    _logger.Debug("Series {0} doesn't exist on XBMC host: {1}, Updating Entire Library", series,
                                 settings.Address);
                }

                var response = _proxy.UpdateLibrary(settings, seriesPath);

                if (!response.Equals("OK", StringComparison.InvariantCultureIgnoreCase))
                {
                    _logger.Debug("Failed to update library for: {0}", settings.Address);
                }
            }

            catch (Exception ex)
            {
                _logger.DebugException(ex.Message, ex);
            }
        }
Пример #3
0
        public void Notify(XbmcSettings settings, string title, string message)
        {
            var notification = string.Format("Notification({0},{1},{2},{3})", title, message, settings.DisplayTime * 1000, "https://raw.github.com/Sonarr/Sonarr/develop/Logo/64.png");
            var command = BuildExecBuiltInCommand(notification);

            SendCommand(settings, command);
        }
Пример #4
0
        public void Clean(XbmcSettings settings)
        {
            const string cleanVideoLibrary = "CleanLibrary(video)";
            var command = BuildExecBuiltInCommand(cleanVideoLibrary);

            SendCommand(settings, command);
        }
Пример #5
0
        public XbmcVersion GetJsonVersion(XbmcSettings settings)
        {
            try
            {
                var postJson = new JObject();
                postJson.Add(new JProperty("jsonrpc", "2.0"));
                postJson.Add(new JProperty("method", "JSONRPC.Version"));
                postJson.Add(new JProperty("id", 1));

                var response = _httpProvider.PostCommand(settings.Address, settings.Username, settings.Password, postJson.ToString());

                _logger.Debug("Getting version from response: " + response);
                var result = Json.Deserialize<XbmcJsonResult<JObject>>(response);

                var versionObject = result.Result.Property("version");

                if (versionObject.Value.Type == JTokenType.Integer)
                    return new XbmcVersion((int)versionObject.Value);

                if (versionObject.Value.Type == JTokenType.Object)
                    return Json.Deserialize<XbmcVersion>(versionObject.Value.ToString());

                throw new InvalidCastException("Unknown Version structure!: " + versionObject);
            }

            catch (Exception ex)
            {
                _logger.DebugException(ex.Message, ex);
            }

            return new XbmcVersion();
        }
Пример #6
0
        public ValidationFailure Test(XbmcSettings settings, string message)
        {
            _xbmcVersionCache.Clear();

            try
            {
                _logger.Debug("Determining version of Host: {0}", settings.Address);
                var version = GetJsonVersion(settings);
                _logger.Debug("Version is: {0}", version);

                if (version == new XbmcVersion(0))
                {
                    throw new InvalidXbmcVersionException("Version received from XBMC is invalid, please correct your settings.");
                }

                Notify(settings, "Test Notification", message);
            }
            catch (Exception ex)
            {
                _logger.Error(ex, "Unable to send test message: " + ex.Message);
                return new ValidationFailure("Host", "Unable to send test message");
            }

            return null;
        }
Пример #7
0
        public List<ActivePlayer> GetActivePlayers(XbmcSettings settings)
        {
            try
            {
                var postJson = new JObject();
                postJson.Add(new JProperty("jsonrpc", "2.0"));
                postJson.Add(new JProperty("method", "Player.GetActivePlayers"));
                postJson.Add(new JProperty("id", 10));

                var response = _httpProvider.PostCommand(settings.Address, settings.Username, settings.Password, postJson.ToString());

                if (CheckForError(response))
                    return new List<ActivePlayer>();

                var result = Json.Deserialize<ActivePlayersEdenResult>(response);

                return result.Result;
            }

            catch (Exception ex)
            {
                _logger.DebugException(ex.Message, ex);
            }

            return new List<ActivePlayer>();
        }
Пример #8
0
        public List<ActivePlayer> GetActivePlayers(XbmcSettings settings)
        {
            var request = new RestRequest();

            var response = ProcessRequest(request, settings, "Player.GetActivePlayers");

            return Json.Deserialize<ActivePlayersEdenResult>(response).Result;
        }
Пример #9
0
        public List<TvShow> GetSeries(XbmcSettings settings)
        {
            var request = new RestRequest();
            var parameters = new Dictionary<string, object>();
            parameters.Add("properties", new[] { "file", "imdbnumber" });

            var response = ProcessRequest(request, settings, "VideoLibrary.GetTvShows", parameters);

            return Json.Deserialize<TvShowResponse>(response).Result.TvShows;
        }
Пример #10
0
        public void Notify(XbmcSettings settings, string title, string message)
        {
            var request = new RestRequest();

            var parameters = new Dictionary<string, object>();
            parameters.Add("title", title);
            parameters.Add("message", message);
            parameters.Add("image", "https://raw.github.com/Sonarr/Sonarr/develop/Logo/64.png");
            parameters.Add("displaytime", settings.DisplayTime * 1000);

            ProcessRequest(request, settings, "GUI.ShowNotification", parameters);
        }
Пример #11
0
        public void Notify(XbmcSettings settings, string title, string message)
        {
            var parameters = new JObject(
                                        new JProperty("title", title),
                                        new JProperty("message", message),
                                        new JProperty("image", "https://raw.github.com/NzbDrone/NzbDrone/master/Logo/64.png"),
                                        new JProperty("displaytime", settings.DisplayTime * 1000));

            var postJson = BuildJsonRequest("GUI.ShowNotification", parameters);

            _httpProvider.PostCommand(settings.Address, settings.Username, settings.Password, postJson.ToString());
        }
Пример #12
0
 public void Setup()
 {
     _settings = new XbmcSettings
     {
         Host          = "localhost",
         Port          = 8080,
         Username      = "******",
         Password      = "******",
         AlwaysUpdate  = false,
         CleanLibrary  = false,
         UpdateLibrary = true
     };
 }
Пример #13
0
        private IApiProvider GetApiProvider(XbmcSettings settings)
        {
            var version = GetJsonVersion(settings);
            var apiProvider = _apiProviders.SingleOrDefault(a => a.CanHandle(version));

            if (apiProvider == null)
            {
                var message = string.Format("Invalid API Version: {0} for {1}", version, settings.Address);
                throw new InvalidXbmcVersionException(message);
            }

            return apiProvider;
        }
Пример #14
0
        public void Setup()
        {
            _settings = Builder <XbmcSettings> .CreateNew()
                        .Build();

            _xbmcSeries = Builder <TvShow> .CreateListOfSize(3)
                          .Build()
                          .ToList();

            Mocker.GetMock <IXbmcJsonApiProxy>()
            .Setup(s => s.GetSeries(_settings))
            .Returns(_xbmcSeries);
        }
Пример #15
0
        public void Setup()
        {
            _settings = new XbmcSettings
            {
                Host          = "localhost",
                Port          = 8080,
                Username      = "******",
                Password      = "******",
                AlwaysUpdate  = false,
                CleanLibrary  = false,
                UpdateLibrary = true
            };

            _expectedUrl = string.Format("http://{0}/xbmcCmds/xbmcHttp?command={1}", _settings.Address, "getcurrentlyplaying");
        }
Пример #16
0
 private void Notify(XbmcSettings settings, string header, string message)
 {
     try
     {
         if (Settings.Notify)
         {
             _xbmcService.Notify(Settings, header, message);
         }
     }
     catch (SocketException ex)
     {
         var logMessage = $"Unable to connect to PHT Host: {Settings.Host}:{Settings.Port}";
         _logger.Debug(ex, logMessage);
     }
 }
Пример #17
0
 private void Notify(XbmcSettings settings, string header, string message)
 {
     try
     {
         if (Settings.Notify)
         {
             _xbmcService.Notify(Settings, header, message);
         }
     }
     catch (SocketException ex)
     {
         var logMessage = string.Format("Unable to connect to PHT Host: {0}:{1}", Settings.Host, Settings.Port);
         _logger.DebugException(logMessage, ex);
     }
 }
Пример #18
0
        public string UpdateLibrary(XbmcSettings settings, string path)
        {
            var request = new RestRequest();
            var parameters = new Dictionary<string, object>();
            parameters.Add("directory", path);

            if (path.IsNullOrWhiteSpace())
            {
                parameters = null;
            }

            var response = ProcessRequest(request, settings, "VideoLibrary.Scan", parameters);

            return Json.Deserialize<XbmcJsonResult<string>>(response).Result;
        }
Пример #19
0
        public void Update(XbmcSettings settings, Series series)
        {
            if (!settings.AlwaysUpdate)
            {
                _logger.Debug("Determining if there are any active players on XBMC host: {0}", settings.Address);
                var activePlayers = GetActivePlayers(settings);

                if (activePlayers.Any(a => a.Type.Equals("video")))
                {
                    _logger.Debug("Video is currently playing, skipping library update");
                    return;
                }
            }

            UpdateLibrary(settings, series);
        }
Пример #20
0
        public void Setup()
        {
            _settings = Builder <XbmcSettings> .CreateNew()
                        .Build();

            _xbmcSeries = Builder <TvShow> .CreateListOfSize(3)
                          .All()
                          .With(s => s.ImdbNumber = "0")
                          .TheFirst(1)
                          .With(s => s.ImdbNumber = TVDB_ID.ToString())
                          .Build()
                          .ToList();

            Mocker.GetMock <IXbmcJsonApiProxy>()
            .Setup(s => s.GetSeries(_settings))
            .Returns(_xbmcSeries);
        }
Пример #21
0
        public void Setup()
        {
            _settings = Builder <XbmcSettings> .CreateNew()
                        .Build();

            _xbmcMovies = Builder <XbmcMovie> .CreateListOfSize(3)
                          .All()
                          .With(s => s.ImdbNumber = "tt00000")
                          .TheFirst(1)
                          .With(s => s.ImdbNumber = IMDB_ID)
                          .Build()
                          .ToList();

            Mocker.GetMock <IXbmcJsonApiProxy>()
            .Setup(s => s.GetMovies(_settings))
            .Returns(_xbmcMovies);
        }
Пример #22
0
        public void Setup()
        {
            _settings = new XbmcSettings
            {
                Host          = "localhost",
                Port          = 8080,
                Username      = "******",
                Password      = "******",
                AlwaysUpdate  = false,
                CleanLibrary  = false,
                UpdateLibrary = true
            };

            Mocker.GetMock <IHttpProvider>()
            .Setup(s => s.PostCommand(_settings.Address, _settings.Username, _settings.Password,
                                      It.Is <string>(e => e.Replace(" ", "").Replace("\r\n", "").Replace("\t", "").Contains(_expectedJson.Replace(" ", "")))))
            .Returns(_tvshowsResponse);
        }
Пример #23
0
        public void Setup()
        {
            _settings = new XbmcSettings
            {
                Host          = "localhost",
                Port          = 8080,
                Username      = "******",
                Password      = "******",
                AlwaysUpdate  = false,
                CleanLibrary  = false,
                UpdateLibrary = true
            };

            _fakeSeries = Builder <Series> .CreateNew()
                          .With(s => s.TvdbId = 79488)
                          .With(s => s.Title  = "30 Rock")
                          .Build();
        }
Пример #24
0
        public void Setup()
        {
            _settings = new XbmcSettings
            {
                Host          = "localhost",
                Port          = 8080,
                Username      = "******",
                Password      = "******",
                AlwaysUpdate  = false,
                CleanLibrary  = false,
                UpdateLibrary = true
            };

            _fakeArtist = Builder <Artist> .CreateNew()
                          .With(s => s.ForeignArtistId = "9f4e41c3-2648-428e-b8c7-dc10465b49ac")
                          .With(s => s.Name            = "Shawn Desman")
                          .Build();
        }
Пример #25
0
        internal List<ActivePlayer> GetActivePlayers(XbmcSettings settings)
        {
            try
            {
                var result = new List<ActivePlayer>();
                var response = SendCommand(settings, "getcurrentlyplaying");

                if (response.Contains("<li>Filename:[Nothing Playing]")) return new List<ActivePlayer>();
                if (response.Contains("<li>Type:Video")) result.Add(new ActivePlayer(1, "video"));

                return result;
            }

            catch (Exception ex)
            {
                _logger.DebugException(ex.Message, ex);
            }

            return new List<ActivePlayer>();
        }
Пример #26
0
        public void Setup()
        {
            _settings = Builder <XbmcSettings> .CreateNew()
                        .Build();

            _xbmcArtist = Builder <KodiArtist> .CreateListOfSize(3)
                          .All()
                          .With(s => s.MusicbrainzArtistId = new List <string> {
                "0"
            })
                          .TheFirst(1)
                          .With(s => s.MusicbrainzArtistId = new List <string> {
                MB_ID.ToString()
            })
                          .Build()
                          .ToList();

            Mocker.GetMock <IXbmcJsonApiProxy>()
            .Setup(s => s.GetArtist(_settings))
            .Returns(_xbmcArtist);
        }
Пример #27
0
        public String GetSeriesPath(XbmcSettings settings, Series series)
        {
            var allSeries = _proxy.GetSeries(settings);

            if (!allSeries.Any())
            {
                _logger.Debug("No TV shows returned from XBMC");
                return null;
            }

            var matchingSeries = allSeries.FirstOrDefault(s =>
            {
                var tvdbId = 0;
                Int32.TryParse(s.ImdbNumber, out tvdbId);

                return tvdbId == series.TvdbId || s.Label == series.Title;
            });

            if (matchingSeries != null) return matchingSeries.File;

            return null;
        }
Пример #28
0
        private XbmcVersion GetJsonVersion(XbmcSettings settings)
        {
            return _xbmcVersionCache.Get(settings.Address, () =>
            {
                var response = _proxy.GetJsonVersion(settings);

                _logger.Debug("Getting version from response: " + response);
                var result = Json.Deserialize<XbmcJsonResult<JObject>>(response);

                var versionObject = result.Result.Property("version");

                if (versionObject.Value.Type == JTokenType.Integer)
                {
                    return new XbmcVersion((int)versionObject.Value);
                }

                if (versionObject.Value.Type == JTokenType.Object)
                {
                    return Json.Deserialize<XbmcVersion>(versionObject.Value.ToString());
                }

                throw new InvalidCastException("Unknown Version structure!: " + versionObject);
            }, TimeSpan.FromHours(12));
        }
Пример #29
0
 public List<ActivePlayer> GetActivePlayers(XbmcSettings settings)
 {
     return _proxy.GetActivePlayers(settings);
 }
Пример #30
0
        private IRestClient BuildClient(XbmcSettings settings)
        {
            var url = string.Format(@"http://{0}/jsonrpc", settings.Address);
            var client = RestClientFactory.BuildClient(url);

            if (!settings.Username.IsNullOrWhiteSpace())
            {
                client.Authenticator = new HttpBasicAuthenticator(settings.Username, settings.Password);
            }

            return client;
        }
Пример #31
0
 public string GetJsonVersion(XbmcSettings settings)
 {
     var request = new RestRequest();
     return ProcessRequest(request, settings, "JSONRPC.Version");
 }
Пример #32
0
        public void CleanLibrary(XbmcSettings settings)
        {
            var request = new RestRequest();

            ProcessRequest(request, settings, "VideoLibrary.Clean");
        }
Пример #33
0
        private string ProcessRequest(IRestRequest request, XbmcSettings settings, string method, Dictionary<string, object> parameters = null)
        {
            var client = BuildClient(settings);

            request.Method = Method.POST;
            request.RequestFormat = DataFormat.Json;
            request.JsonSerializer = new JsonNetSerializer();
            request.AddBody(new { jsonrpc = "2.0", method = method, id = 10, @params = parameters });

            var response = client.ExecuteAndValidate(request);
            _logger.Trace("Response: {0}", response.Content);

            CheckForError(response);

            return response.Content;
        }
Пример #34
0
        private string SendCommand(XbmcSettings settings, string command)
        {
            var url = string.Format("http://{0}/xbmcCmds/xbmcHttp?command={1}", settings.Address, command);

            if (!string.IsNullOrEmpty(settings.Username))
            {
                return _httpProvider.DownloadString(url, settings.Username, settings.Password);
            }

            return _httpProvider.DownloadString(url);
        }
Пример #35
0
        private void UpdateLibrary(XbmcSettings settings, Series series)
        {
            try
            {
                _logger.Debug("Sending Update DB Request to XBMC Host: {0}", settings.Address);
                var xbmcSeriesPath = GetSeriesPath(settings, series);

                //If the path is found update it, else update the whole library
                if (!string.IsNullOrEmpty(xbmcSeriesPath))
                {
                    _logger.Debug("Updating series [{0}] on XBMC host: {1}", series, settings.Address);
                    var command = BuildExecBuiltInCommand(string.Format("UpdateLibrary(video,{0})", xbmcSeriesPath));
                    SendCommand(settings, command);
                }

                else
                {
                    //Update the entire library
                    _logger.Debug("Series [{0}] doesn't exist on XBMC host: {1}, Updating Entire Library", series, settings.Address);
                    var command = BuildExecBuiltInCommand("UpdateLibrary(video)");
                    SendCommand(settings, command);
                }
            }

            catch (Exception ex)
            {
                _logger.DebugException(ex.Message, ex);
            }
        }
Пример #36
0
 public void Setup()
 {
     _settings = Builder <XbmcSettings> .CreateNew()
                 .Build();
 }
Пример #37
0
 public void Clean(XbmcSettings settings)
 {
     _proxy.CleanLibrary(settings);
 }
Пример #38
0
        public string GetSeriesPath(XbmcSettings settings, Series series)
        {
            var allSeries = GetSeries(settings);

            if (!allSeries.Any())
            {
                _logger.Debug("No TV shows returned from XBMC");
                return null;
            }

            var matchingSeries = allSeries.FirstOrDefault(s => s.ImdbNumber == series.TvdbId || s.Label == series.Title);

            if (matchingSeries != null) return matchingSeries.File;

            return null;
        }
Пример #39
0
 public void Notify(XbmcSettings settings, string title, string message)
 {
     _proxy.Notify(settings, title, message);
 }
Пример #40
0
        public void Clean(XbmcSettings settings)
        {
            var postJson = BuildJsonRequest("VideoLibrary.Clean");

            _httpProvider.PostCommand(settings.Address, settings.Username, settings.Password, postJson.ToString());
        }
Пример #41
0
        private void UpdateLibrary(XbmcSettings settings, Series series)
        {
            try
            {
                var seriesPath = GetSeriesPath(settings, series);

                JObject postJson;

                if (seriesPath != null)
                {
                    _logger.Debug("Updating series {0} (Path: {1}) on XBMC host: {2}", series, seriesPath, settings.Address);

                    var parameters = new JObject(new JObject(new JProperty("directory", seriesPath)));
                    postJson = BuildJsonRequest("VideoLibrary.Scan", parameters);
                }

                else
                {
                    _logger.Debug("Series {0} doesn't exist on XBMC host: {1}, Updating Entire Library", series,
                                 settings.Address);

                    postJson = BuildJsonRequest("VideoLibrary.Scan");
                }

                var response = _httpProvider.PostCommand(settings.Address, settings.Username, settings.Password, postJson.ToString());

                if (CheckForError(response)) return;

                _logger.Debug(" from response");
                var result = Json.Deserialize<XbmcJsonResult<String>>(response);

                if (!result.Result.Equals("OK", StringComparison.InvariantCultureIgnoreCase))
                {
                    _logger.Debug("Failed to update library for: {0}", settings.Address);
                }
            }

            catch (Exception ex)
            {
                _logger.DebugException(ex.Message, ex);
            }
        }
Пример #42
0
        private List<TvShow> GetSeries(XbmcSettings settings)
        {
            try
            {
                var properties = new JObject { new JProperty("properties", new[] { "file", "imdbnumber" }) };
                var postJson = BuildJsonRequest("VideoLibrary.GetTvShows", properties);

                var response = _httpProvider.PostCommand(settings.Address, settings.Username, settings.Password, postJson.ToString());

                if (CheckForError(response))
                    return new List<TvShow>();

                var result = Json.Deserialize<TvShowResponse>(response);
                var shows = result.Result.TvShows;

                return shows;
            }
            catch (Exception ex)
            {
                _logger.DebugException(ex.Message, ex);
            }

            return new List<TvShow>();
        }