Fixed: Kodi(XBMC) notifications don't update correct Library (#158)

* Fixed: Kodi(XBMC) notifications don't update correct Library

* fixup! MbId and Artist Names in Test
pull/170/head
Qstick 7 years ago committed by GitHub
parent d08d89929a
commit e780555d28
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -1,4 +1,4 @@
using System.Linq; using System.Linq;
using FluentAssertions; using FluentAssertions;
using NUnit.Framework; using NUnit.Framework;
using NzbDrone.Common.Http; using NzbDrone.Common.Http;
@ -23,7 +23,7 @@ namespace NzbDrone.Core.Test.NotificationTests.Xbmc.Http
private void WithVideoPlayerActive() private void WithVideoPlayerActive()
{ {
var activePlayers = @"<html><li>Filename:C:\Test\TV\2 Broke Girls\Season 01\2 Broke Girls - S01E01 - Pilot [SDTV].avi" + var activePlayers = @"<html><li>Filename:C:\Test\TV\2 Broke Girls\Season 01\2 Broke Girls - S01E01 - Pilot [SDTV].avi" +
"<li>PlayStatus:Playing<li>VideoNo:0<li>Type:Video<li>Thumb:special://masterprofile/Thumbnails/Video/a/auto-a664d5a2.tbn" + "<li>PlayStatus:Playing<li>VideoNo:0<li>Type:Audio<li>Thumb:special://masterprofile/Thumbnails/Video/a/auto-a664d5a2.tbn" +
"<li>Time:00:06<li>Duration:21:35<li>Percentage:0<li>File size:183182590<li>Changed:True</html>"; "<li>Time:00:06<li>Duration:21:35<li>Percentage:0<li>File size:183182590<li>Changed:True</html>";
Mocker.GetMock<IHttpProvider>() Mocker.GetMock<IHttpProvider>()
@ -57,14 +57,14 @@ namespace NzbDrone.Core.Test.NotificationTests.Xbmc.Http
} }
[Test] [Test]
public void should_have_active_video_player() public void should_have_active_audio_player()
{ {
WithVideoPlayerActive(); WithVideoPlayerActive();
var result = Subject.GetActivePlayers(_settings); var result = Subject.GetActivePlayers(_settings);
result.Should().HaveCount(1); result.Should().HaveCount(1);
result.First().Type.Should().Be("video"); result.First().Type.Should().Be("audio");
} }
} }
} }

@ -8,7 +8,7 @@ using NzbDrone.Core.Music;
namespace NzbDrone.Core.Test.NotificationTests.Xbmc.Http namespace NzbDrone.Core.Test.NotificationTests.Xbmc.Http
{ {
[TestFixture] [TestFixture]
public class GetSeriesPathFixture : CoreTest<HttpApiProvider> public class GetArtistPathFixture : CoreTest<HttpApiProvider>
{ {
private XbmcSettings _settings; private XbmcSettings _settings;
private Artist _artist; private Artist _artist;
@ -29,8 +29,8 @@ namespace NzbDrone.Core.Test.NotificationTests.Xbmc.Http
_artist = new Artist _artist = new Artist
{ {
ForeignArtistId = "123d45d-d154f5d-1f5d1-5df18d5", ForeignArtistId = "9f4e41c3-2648-428e-b8c7-dc10465b49ac",
Name = "30 Rock" Name = "Shawn Desman"
}; };
const string setResponseUrl = "http://localhost:8080/xbmcCmds/xbmcHttp?command=SetResponseFormat(webheader;false;webfooter;false;header;<xml>;footer;</xml>;opentag;<tag>;closetag;</tag>;closefinaltag;false)"; const string setResponseUrl = "http://localhost:8080/xbmcCmds/xbmcHttp?command=SetResponseFormat(webheader;false;webfooter;false;header;<xml>;footer;</xml>;opentag;<tag>;closetag;</tag>;closefinaltag;false)";
@ -48,47 +48,47 @@ namespace NzbDrone.Core.Test.NotificationTests.Xbmc.Http
} }
[Test] [Test]
public void should_get_series_path() public void should_get_artist_path()
{ {
const string queryResult = @"<xml><record><field>smb://xbmc:xbmc@HOMESERVER/TV/30 Rock/</field></record></xml>"; const string queryResult = @"<xml><record><field>smb://xbmc:xbmc@HOMESERVER/Music/Shawn Desman/</field></record></xml>";
var query = string.Format("http://localhost:8080/xbmcCmds/xbmcHttp?command=QueryVideoDatabase(select path.strPath from path, tvshow, tvshowlinkpath where tvshow.c12 = 79488 and tvshowlinkpath.idShow = tvshow.idShow and tvshowlinkpath.idPath = path.idPath)"); var query = string.Format("http://localhost:8080/xbmcCmds/xbmcHttp?command=QueryMusicDatabase(select path.strPath from path, artist, artistlinkpath where artist.c12 = 9f4e41c3-2648-428e-b8c7-dc10465b49ac and artistlinkpath.idArtist = artist.idArtist and artistlinkpath.idPath = path.idPath)");
Mocker.GetMock<IHttpProvider>() Mocker.GetMock<IHttpProvider>()
.Setup(s => s.DownloadString(query, _settings.Username, _settings.Password)) .Setup(s => s.DownloadString(query, _settings.Username, _settings.Password))
.Returns(queryResult); .Returns(queryResult);
Subject.GetSeriesPath(_settings, _artist) Subject.GetArtistPath(_settings, _artist)
.Should().Be("smb://xbmc:xbmc@HOMESERVER/TV/30 Rock/"); .Should().Be("smb://xbmc:xbmc@HOMESERVER/Music/Shawn Desman/");
} }
[Test] [Test]
public void should_get_null_for_series_path() public void should_get_null_for_artist_path()
{ {
const string queryResult = @"<xml></xml>"; const string queryResult = @"<xml></xml>";
var query = string.Format("http://localhost:8080/xbmcCmds/xbmcHttp?command=QueryVideoDatabase(select path.strPath from path, tvshow, tvshowlinkpath where tvshow.c12 = 79488 and tvshowlinkpath.idShow = tvshow.idShow and tvshowlinkpath.idPath = path.idPath)"); var query = string.Format("http://localhost:8080/xbmcCmds/xbmcHttp?command=QueryMusicDatabase(select path.strPath from path, artist, artistlinkpath where artist.c12 = 9f4e41c3-2648-428e-b8c7-dc10465b49ac and artistlinkpath.idArtist = artist.idArtist and artistlinkpath.idPath = path.idPath)");
Mocker.GetMock<IHttpProvider>() Mocker.GetMock<IHttpProvider>()
.Setup(s => s.DownloadString(query, _settings.Username, _settings.Password)) .Setup(s => s.DownloadString(query, _settings.Username, _settings.Password))
.Returns(queryResult); .Returns(queryResult);
Subject.GetSeriesPath(_settings, _artist) Subject.GetArtistPath(_settings, _artist)
.Should().BeNull(); .Should().BeNull();
} }
[Test] [Test]
public void should_get_series_path_with_special_characters_in_it() public void should_get_artist_path_with_special_characters_in_it()
{ {
const string queryResult = @"<xml><record><field>smb://xbmc:xbmc@HOMESERVER/TV/Law & Order- Special Victims Unit/</field></record></xml>"; const string queryResult = @"<xml><record><field>smb://xbmc:xbmc@HOMESERVER/Music/-wumpscut-/</field></record></xml>";
var query = string.Format("http://localhost:8080/xbmcCmds/xbmcHttp?command=QueryVideoDatabase(select path.strPath from path, tvshow, tvshowlinkpath where tvshow.c12 = 79488 and tvshowlinkpath.idShow = tvshow.idShow and tvshowlinkpath.idPath = path.idPath)"); var query = string.Format("http://localhost:8080/xbmcCmds/xbmcHttp?command=QueryMusicDatabase(select path.strPath from path, artist, artistlinkpath where artist.c12 = 9f4e41c3-2648-428e-b8c7-dc10465b49ac and artistlinkpath.idArtist = artist.idArtist and artistlinkpath.idPath = path.idPath)");
Mocker.GetMock<IHttpProvider>() Mocker.GetMock<IHttpProvider>()
.Setup(s => s.DownloadString(query, _settings.Username, _settings.Password)) .Setup(s => s.DownloadString(query, _settings.Username, _settings.Password))
.Returns(queryResult); .Returns(queryResult);
Subject.GetSeriesPath(_settings, _artist) Subject.GetArtistPath(_settings, _artist)
.Should().Be("smb://xbmc:xbmc@HOMESERVER/TV/Law & Order- Special Victims Unit/"); .Should().Be("smb://xbmc:xbmc@HOMESERVER/Music/-wumpscut-/");
} }
} }
} }

@ -11,8 +11,8 @@ namespace NzbDrone.Core.Test.NotificationTests.Xbmc.Http
public class UpdateFixture : CoreTest<HttpApiProvider> public class UpdateFixture : CoreTest<HttpApiProvider>
{ {
private XbmcSettings _settings; private XbmcSettings _settings;
private string _seriesQueryUrl = "http://localhost:8080/xbmcCmds/xbmcHttp?command=QueryVideoDatabase(select path.strPath from path, tvshow, tvshowlinkpath where tvshow.c12 = 79488 and tvshowlinkpath.idShow = tvshow.idShow and tvshowlinkpath.idPath = path.idPath)"; private string _artistQueryUrl = "http://localhost:8080/xbmcCmds/xbmcHttp?command=QueryMusicDatabase(select path.strPath from path, artist, artistlinkpath where artist.c12 = 9f4e41c3-2648-428e-b8c7-dc10465b49ac and artistlinkpath.idArtist = artist.idArtist and artistlinkpath.idPath = path.idPath)";
private Artist _fakeSeries; private Artist _fakeArtist;
[SetUp] [SetUp]
public void Setup() public void Setup()
@ -28,47 +28,47 @@ namespace NzbDrone.Core.Test.NotificationTests.Xbmc.Http
UpdateLibrary = true UpdateLibrary = true
}; };
_fakeSeries = Builder<Artist>.CreateNew() _fakeArtist = Builder<Artist>.CreateNew()
.With(s => s.ForeignArtistId = "79488") .With(s => s.ForeignArtistId = "9f4e41c3-2648-428e-b8c7-dc10465b49ac")
.With(s => s.Name = "30 Rock") .With(s => s.Name = "Shawn Desman")
.Build(); .Build();
} }
private void WithSeriesPath() private void WithArtistPath()
{ {
Mocker.GetMock<IHttpProvider>() Mocker.GetMock<IHttpProvider>()
.Setup(s => s.DownloadString(_seriesQueryUrl, _settings.Username, _settings.Password)) .Setup(s => s.DownloadString(_artistQueryUrl, _settings.Username, _settings.Password))
.Returns("<xml><record><field>smb://xbmc:xbmc@HOMESERVER/TV/30 Rock/</field></record></xml>"); .Returns("<xml><record><field>smb://xbmc:xbmc@HOMESERVER/Music/Shawn Desman/</field></record></xml>");
} }
private void WithoutSeriesPath() private void WithoutArtistPath()
{ {
Mocker.GetMock<IHttpProvider>() Mocker.GetMock<IHttpProvider>()
.Setup(s => s.DownloadString(_seriesQueryUrl, _settings.Username, _settings.Password)) .Setup(s => s.DownloadString(_artistQueryUrl, _settings.Username, _settings.Password))
.Returns("<xml></xml>"); .Returns("<xml></xml>");
} }
[Test] [Test]
public void should_update_using_series_path() public void should_update_using_artist_path()
{ {
WithSeriesPath(); WithArtistPath();
const string url = "http://localhost:8080/xbmcCmds/xbmcHttp?command=ExecBuiltIn(UpdateLibrary(video,smb://xbmc:xbmc@HOMESERVER/TV/30 Rock/))"; const string url = "http://localhost:8080/xbmcCmds/xbmcHttp?command=ExecBuiltIn(UpdateLibrary(music,smb://xbmc:xbmc@HOMESERVER/Music/Shawn Desman/))";
Mocker.GetMock<IHttpProvider>().Setup(s => s.DownloadString(url, _settings.Username, _settings.Password)); Mocker.GetMock<IHttpProvider>().Setup(s => s.DownloadString(url, _settings.Username, _settings.Password));
Subject.Update(_settings, _fakeSeries); Subject.Update(_settings, _fakeArtist);
Mocker.VerifyAllMocks(); Mocker.VerifyAllMocks();
} }
[Test] [Test]
public void should_update_all_paths_when_series_path_not_found() public void should_update_all_paths_when_artist_path_not_found()
{ {
WithoutSeriesPath(); WithoutArtistPath();
const string url = "http://localhost:8080/xbmcCmds/xbmcHttp?command=ExecBuiltIn(UpdateLibrary(video))"; const string url = "http://localhost:8080/xbmcCmds/xbmcHttp?command=ExecBuiltIn(UpdateLibrary(music))";
Mocker.GetMock<IHttpProvider>().Setup(s => s.DownloadString(url, _settings.Username, _settings.Password)); Mocker.GetMock<IHttpProvider>().Setup(s => s.DownloadString(url, _settings.Username, _settings.Password));
Subject.Update(_settings, _fakeSeries); Subject.Update(_settings, _fakeArtist);
Mocker.VerifyAllMocks(); Mocker.VerifyAllMocks();
} }
} }

@ -11,12 +11,12 @@ using NzbDrone.Core.Music;
namespace NzbDrone.Core.Test.NotificationTests.Xbmc.Json namespace NzbDrone.Core.Test.NotificationTests.Xbmc.Json
{ {
[TestFixture] [TestFixture]
public class GetSeriesPathFixture : CoreTest<JsonApiProvider> public class GetArtistPathFixture : CoreTest<JsonApiProvider>
{ {
private const string MB_ID = "5"; private const string MB_ID = "9f4e41c3-2648-428e-b8c7-dc10465b49ac";
private XbmcSettings _settings; private XbmcSettings _settings;
private Artist _artist; private Music.Artist _artist;
private List<TvShow> _xbmcSeries; private List<KodiArtist> _xbmcArtist;
[SetUp] [SetUp]
public void Setup() public void Setup()
@ -24,25 +24,25 @@ namespace NzbDrone.Core.Test.NotificationTests.Xbmc.Json
_settings = Builder<XbmcSettings>.CreateNew() _settings = Builder<XbmcSettings>.CreateNew()
.Build(); .Build();
_xbmcSeries = Builder<TvShow>.CreateListOfSize(3) _xbmcArtist = Builder<KodiArtist>.CreateListOfSize(3)
.All() .All()
.With(s => s.ImdbNumber = "0") .With(s => s.MusicbrainzArtistId = new List<string>{"0"})
.TheFirst(1) .TheFirst(1)
.With(s => s.ImdbNumber = MB_ID.ToString()) .With(s => s.MusicbrainzArtistId = new List<string> {MB_ID.ToString()})
.Build() .Build()
.ToList(); .ToList();
Mocker.GetMock<IXbmcJsonApiProxy>() Mocker.GetMock<IXbmcJsonApiProxy>()
.Setup(s => s.GetArtist(_settings)) .Setup(s => s.GetArtist(_settings))
.Returns(_xbmcSeries); .Returns(_xbmcArtist);
} }
private void GivenMatchingTvdbId() private void GivenMatchingMusicbrainzId()
{ {
_artist = new Artist _artist = new Artist
{ {
ForeignArtistId = MB_ID, ForeignArtistId = MB_ID,
Name = "TV Show" Name = "Artist"
}; };
} }
@ -51,11 +51,11 @@ namespace NzbDrone.Core.Test.NotificationTests.Xbmc.Json
_artist = new Artist _artist = new Artist
{ {
ForeignArtistId = "1000", ForeignArtistId = "1000",
Name = _xbmcSeries.First().Label Name = _xbmcArtist.First().Label
}; };
} }
private void GivenMatchingSeries() private void GivenMatchingArtist()
{ {
_artist = new Artist _artist = new Artist
{ {
@ -65,19 +65,19 @@ namespace NzbDrone.Core.Test.NotificationTests.Xbmc.Json
} }
[Test] [Test]
public void should_return_null_when_series_is_not_found() public void should_return_null_when_artist_is_not_found()
{ {
GivenMatchingSeries(); GivenMatchingArtist();
Subject.GetSeriesPath(_settings, _artist).Should().BeNull(); Subject.GetArtistPath(_settings, _artist).Should().BeNull();
} }
[Test] [Test]
public void should_return_path_when_tvdbId_matches() public void should_return_path_when_musicbrainzId_matches()
{ {
GivenMatchingTvdbId(); GivenMatchingMusicbrainzId();
Subject.GetSeriesPath(_settings, _artist).Should().Be(_xbmcSeries.First().File); Subject.GetArtistPath(_settings, _artist).Should().Be(_xbmcArtist.First().File);
} }
[Test] [Test]
@ -85,22 +85,7 @@ namespace NzbDrone.Core.Test.NotificationTests.Xbmc.Json
{ {
GivenMatchingTitle(); GivenMatchingTitle();
Subject.GetSeriesPath(_settings, _artist).Should().Be(_xbmcSeries.First().File); Subject.GetArtistPath(_settings, _artist).Should().Be(_xbmcArtist.First().File);
}
[Test]
public void should_not_throw_when_imdb_number_is_not_a_number()
{
GivenMatchingTvdbId();
_xbmcSeries.ForEach(s => s.ImdbNumber = "tt12345");
_xbmcSeries.Last().ImdbNumber = MB_ID.ToString();
Mocker.GetMock<IXbmcJsonApiProxy>()
.Setup(s => s.GetArtist(_settings))
.Returns(_xbmcSeries);
Subject.GetSeriesPath(_settings, _artist).Should().NotBeNull();
} }
} }
} }

@ -13,9 +13,9 @@ namespace NzbDrone.Core.Test.NotificationTests.Xbmc.Json
[TestFixture] [TestFixture]
public class UpdateFixture : CoreTest<JsonApiProvider> public class UpdateFixture : CoreTest<JsonApiProvider>
{ {
private const string MB_ID = "5"; private const string MB_ID = "9f4e41c3-2648-428e-b8c7-dc10465b49ac";
private XbmcSettings _settings; private XbmcSettings _settings;
private List<TvShow> _xbmcArtist; private List<KodiArtist> _xbmcArtist;
[SetUp] [SetUp]
public void Setup() public void Setup()
@ -23,9 +23,9 @@ namespace NzbDrone.Core.Test.NotificationTests.Xbmc.Json
_settings = Builder<XbmcSettings>.CreateNew() _settings = Builder<XbmcSettings>.CreateNew()
.Build(); .Build();
_xbmcArtist = Builder<TvShow>.CreateListOfSize(3) _xbmcArtist = Builder<KodiArtist>.CreateListOfSize(3)
.TheFirst(1) .TheFirst(1)
.With(s => s.ImdbNumber = MB_ID.ToString()) .With(s => s.MusicbrainzArtistId = new List<string> { MB_ID.ToString()})
.Build() .Build()
.ToList(); .ToList();
@ -39,27 +39,27 @@ namespace NzbDrone.Core.Test.NotificationTests.Xbmc.Json
} }
[Test] [Test]
public void should_update_using_series_path() public void should_update_using_artist_path()
{ {
var series = Builder<Artist>.CreateNew() var artist = Builder<Music.Artist>.CreateNew()
.With(s => s.ForeignArtistId = MB_ID) .With(s => s.ForeignArtistId = MB_ID)
.Build(); .Build();
Subject.Update(_settings, series); Subject.Update(_settings, artist);
Mocker.GetMock<IXbmcJsonApiProxy>() Mocker.GetMock<IXbmcJsonApiProxy>()
.Verify(v => v.UpdateLibrary(_settings, It.IsAny<string>()), Times.Once()); .Verify(v => v.UpdateLibrary(_settings, It.IsAny<string>()), Times.Once());
} }
[Test] [Test]
public void should_update_all_paths_when_series_path_not_found() public void should_update_all_paths_when_artist_path_not_found()
{ {
var fakeSeries = Builder<Artist>.CreateNew() var fakeArtist = Builder<Artist>.CreateNew()
.With(s => s.ForeignArtistId = "1000") .With(s => s.ForeignArtistId = "9f4e41c3-2648-428e-b8c7-dc10465b49ad")
.With(s => s.Name = "Not 30 Rock") .With(s => s.Name = "Not Shawn Desman")
.Build(); .Build();
Subject.Update(_settings, fakeSeries); Subject.Update(_settings, fakeArtist);
Mocker.GetMock<IXbmcJsonApiProxy>() Mocker.GetMock<IXbmcJsonApiProxy>()
.Verify(v => v.UpdateLibrary(_settings, null), Times.Once()); .Verify(v => v.UpdateLibrary(_settings, null), Times.Once());

@ -305,9 +305,9 @@
<Compile Include="NotificationTests\ProwlProviderTest.cs" /> <Compile Include="NotificationTests\ProwlProviderTest.cs" />
<Compile Include="NotificationTests\Xbmc\Http\ActivePlayersFixture.cs" /> <Compile Include="NotificationTests\Xbmc\Http\ActivePlayersFixture.cs" />
<Compile Include="NotificationTests\Xbmc\Http\CheckForErrorFixture.cs" /> <Compile Include="NotificationTests\Xbmc\Http\CheckForErrorFixture.cs" />
<Compile Include="NotificationTests\Xbmc\Http\GetSeriesPathFixture.cs" /> <Compile Include="NotificationTests\Xbmc\Http\GetArtistPathFixture.cs" />
<Compile Include="NotificationTests\Xbmc\Http\UpdateFixture.cs" /> <Compile Include="NotificationTests\Xbmc\Http\UpdateFixture.cs" />
<Compile Include="NotificationTests\Xbmc\Json\GetSeriesPathFixture.cs" /> <Compile Include="NotificationTests\Xbmc\Json\GetArtistPathFixture.cs" />
<Compile Include="NotificationTests\Xbmc\Json\UpdateFixture.cs" /> <Compile Include="NotificationTests\Xbmc\Json\UpdateFixture.cs" />
<Compile Include="NotificationTests\Xbmc\OnDownloadFixture.cs" /> <Compile Include="NotificationTests\Xbmc\OnDownloadFixture.cs" />
<Compile Include="OrganizerTests\BuildFilePathFixture.cs" /> <Compile Include="OrganizerTests\BuildFilePathFixture.cs" />

@ -41,9 +41,9 @@ namespace NzbDrone.Core.Notifications.Xbmc
_logger.Debug("Determining if there are any active players on XBMC host: {0}", settings.Address); _logger.Debug("Determining if there are any active players on XBMC host: {0}", settings.Address);
var activePlayers = GetActivePlayers(settings); var activePlayers = GetActivePlayers(settings);
if (activePlayers.Any(a => a.Type.Equals("video"))) if (activePlayers.Any(a => a.Type.Equals("audio")))
{ {
_logger.Debug("Video is currently playing, skipping library update"); _logger.Debug("Audio is currently playing, skipping library update");
return; return;
} }
} }
@ -53,8 +53,8 @@ namespace NzbDrone.Core.Notifications.Xbmc
public void Clean(XbmcSettings settings) public void Clean(XbmcSettings settings)
{ {
const string cleanVideoLibrary = "CleanLibrary(video)"; const string cleanMusicLibrary = "CleanLibrary(music)";
var command = BuildExecBuiltInCommand(cleanVideoLibrary); var command = BuildExecBuiltInCommand(cleanMusicLibrary);
SendCommand(settings, command); SendCommand(settings, command);
} }
@ -67,7 +67,7 @@ namespace NzbDrone.Core.Notifications.Xbmc
var response = SendCommand(settings, "getcurrentlyplaying"); var response = SendCommand(settings, "getcurrentlyplaying");
if (response.Contains("<li>Filename:[Nothing Playing]")) return new List<ActivePlayer>(); if (response.Contains("<li>Filename:[Nothing Playing]")) return new List<ActivePlayer>();
if (response.Contains("<li>Type:Video")) result.Add(new ActivePlayer(1, "video")); if (response.Contains("<li>Type:Audio")) result.Add(new ActivePlayer(1, "audio"));
return result; return result;
} }
@ -80,13 +80,13 @@ namespace NzbDrone.Core.Notifications.Xbmc
return new List<ActivePlayer>(); return new List<ActivePlayer>();
} }
internal string GetSeriesPath(XbmcSettings settings, Artist artist) internal string GetArtistPath(XbmcSettings settings, Artist artist)
{ {
var query = var query =
string.Format( string.Format(
"select path.strPath from path, tvshow, tvshowlinkpath where tvshow.c12 = {0} and tvshowlinkpath.idShow = tvshow.idShow and tvshowlinkpath.idPath = path.idPath", "select path.strPath from path, artist, artistlinkpath where artist.c12 = {0} and artistlinkpath.idArtist = artist.idArtist and artistlinkpath.idPath = path.idPath",
artist.ForeignArtistId); artist.ForeignArtistId);
var command = string.Format("QueryVideoDatabase({0})", query); var command = string.Format("QueryMusicDatabase({0})", query);
const string setResponseCommand = const string setResponseCommand =
"SetResponseFormat(webheader;false;webfooter;false;header;<xml>;footer;</xml>;opentag;<tag>;closetag;</tag>;closefinaltag;false)"; "SetResponseFormat(webheader;false;webfooter;false;header;<xml>;footer;</xml>;opentag;<tag>;closetag;</tag>;closefinaltag;false)";
@ -142,13 +142,13 @@ namespace NzbDrone.Core.Notifications.Xbmc
try try
{ {
_logger.Debug("Sending Update DB Request to XBMC Host: {0}", settings.Address); _logger.Debug("Sending Update DB Request to XBMC Host: {0}", settings.Address);
var xbmcSeriesPath = GetSeriesPath(settings, artist); var xbmcArtistPath = GetArtistPath(settings, artist);
//If the path is found update it, else update the whole library //If the path is found update it, else update the whole library
if (!string.IsNullOrEmpty(xbmcSeriesPath)) if (!string.IsNullOrEmpty(xbmcArtistPath))
{ {
_logger.Debug("Updating artist [{0}] on XBMC host: {1}", artist, settings.Address); _logger.Debug("Updating artist [{0}] on XBMC host: {1}", artist, settings.Address);
var command = BuildExecBuiltInCommand(string.Format("UpdateLibrary(video,{0})", xbmcSeriesPath)); var command = BuildExecBuiltInCommand(string.Format("UpdateLibrary(music,{0})", xbmcArtistPath));
SendCommand(settings, command); SendCommand(settings, command);
} }
@ -156,7 +156,7 @@ namespace NzbDrone.Core.Notifications.Xbmc
{ {
//Update the entire library //Update the entire library
_logger.Debug("Artist [{0}] doesn't exist on XBMC host: {1}, Updating Entire Library", artist, settings.Address); _logger.Debug("Artist [{0}] doesn't exist on XBMC host: {1}, Updating Entire Library", artist, settings.Address);
var command = BuildExecBuiltInCommand("UpdateLibrary(video)"); var command = BuildExecBuiltInCommand("UpdateLibrary(music)");
SendCommand(settings, command); SendCommand(settings, command);
} }
} }

@ -35,9 +35,9 @@ namespace NzbDrone.Core.Notifications.Xbmc
_logger.Debug("Determining if there are any active players on XBMC host: {0}", settings.Address); _logger.Debug("Determining if there are any active players on XBMC host: {0}", settings.Address);
var activePlayers = _proxy.GetActivePlayers(settings); var activePlayers = _proxy.GetActivePlayers(settings);
if (activePlayers.Any(a => a.Type.Equals("video"))) if (activePlayers.Any(a => a.Type.Equals("audio")))
{ {
_logger.Debug("Video is currently playing, skipping library update"); _logger.Debug("Audio is currently playing, skipping library update");
return; return;
} }
} }
@ -55,38 +55,35 @@ namespace NzbDrone.Core.Notifications.Xbmc
return _proxy.GetActivePlayers(settings); return _proxy.GetActivePlayers(settings);
} }
public string GetSeriesPath(XbmcSettings settings, Artist artist) public string GetArtistPath(XbmcSettings settings, Artist artist)
{ {
var allSeries = _proxy.GetArtist(settings); var allArtists = _proxy.GetArtist(settings);
if (!allSeries.Any()) if (!allArtists.Any())
{ {
_logger.Debug("No Artists returned from XBMC"); _logger.Debug("No Artists returned from XBMC");
return null; return null;
} }
var matchingSeries = allSeries.FirstOrDefault(s => var matchingArtist = allArtists.FirstOrDefault(s =>
{ {
var tvdbId = "0"; var musicBrainzId = s.MusicbrainzArtistId.FirstOrDefault();
//int.TryParse(s.ImdbNumber, out tvdbId);
return tvdbId == artist.ForeignArtistId || s.Label == artist.Name; return musicBrainzId == artist.ForeignArtistId || s.Label == artist.Name;
}); });
if (matchingSeries != null) return matchingSeries.File; return matchingArtist?.File;
return null;
} }
private void UpdateLibrary(XbmcSettings settings, Artist artist) private void UpdateLibrary(XbmcSettings settings, Artist artist)
{ {
try try
{ {
var seriesPath = GetSeriesPath(settings, artist); var artistPath = GetArtistPath(settings, artist);
if (seriesPath != null) if (artistPath != null)
{ {
_logger.Debug("Updating artist {0} (Path: {1}) on XBMC host: {2}", artist, seriesPath, settings.Address); _logger.Debug("Updating artist {0} (Path: {1}) on XBMC host: {2}", artist, artistPath, settings.Address);
} }
else else
@ -95,7 +92,7 @@ namespace NzbDrone.Core.Notifications.Xbmc
settings.Address); settings.Address);
} }
var response = _proxy.UpdateLibrary(settings, seriesPath); var response = _proxy.UpdateLibrary(settings, artistPath);
if (!response.Equals("OK", StringComparison.InvariantCultureIgnoreCase)) if (!response.Equals("OK", StringComparison.InvariantCultureIgnoreCase))
{ {

@ -0,0 +1,9 @@
namespace NzbDrone.Core.Notifications.Xbmc.Model
{
public class ArtistResponse
{
public string Id { get; set; }
public string JsonRpc { get; set; }
public ArtistResult Result { get; set; }
}
}

@ -0,0 +1,15 @@
using System.Collections.Generic;
namespace NzbDrone.Core.Notifications.Xbmc.Model
{
public class ArtistResult
{
public Dictionary<string, int> Limits { get; set; }
public List<KodiArtist> Artists;
public ArtistResult()
{
Artists = new List<KodiArtist>();
}
}
}

@ -0,0 +1,12 @@
using System.Collections.Generic;
namespace NzbDrone.Core.Notifications.Xbmc.Model
{
public class KodiArtist
{
public int ArtistId { get; set; }
public string Label { get; set; }
public List<string> MusicbrainzArtistId { get; set; }
public string File { get; set; }
}
}

@ -1,10 +0,0 @@
namespace NzbDrone.Core.Notifications.Xbmc.Model
{
public class TvShow
{
public int TvShowId { get; set; }
public string Label { get; set; }
public string ImdbNumber { get; set; }
public string File { get; set; }
}
}

@ -1,9 +0,0 @@
namespace NzbDrone.Core.Notifications.Xbmc.Model
{
public class TvShowResponse
{
public string Id { get; set; }
public string JsonRpc { get; set; }
public TvShowResult Result { get; set; }
}
}

@ -1,15 +0,0 @@
using System.Collections.Generic;
namespace NzbDrone.Core.Notifications.Xbmc.Model
{
public class TvShowResult
{
public Dictionary<string, int> Limits { get; set; }
public List<TvShow> TvShows;
public TvShowResult()
{
TvShows = new List<TvShow>();
}
}
}

@ -16,7 +16,7 @@ namespace NzbDrone.Core.Notifications.Xbmc
string UpdateLibrary(XbmcSettings settings, string path); string UpdateLibrary(XbmcSettings settings, string path);
void CleanLibrary(XbmcSettings settings); void CleanLibrary(XbmcSettings settings);
List<ActivePlayer> GetActivePlayers(XbmcSettings settings); List<ActivePlayer> GetActivePlayers(XbmcSettings settings);
List<TvShow> GetArtist(XbmcSettings settings); List<KodiArtist> GetArtist(XbmcSettings settings);
} }
public class XbmcJsonApiProxy : IXbmcJsonApiProxy public class XbmcJsonApiProxy : IXbmcJsonApiProxy
@ -58,7 +58,7 @@ namespace NzbDrone.Core.Notifications.Xbmc
parameters = null; parameters = null;
} }
var response = ProcessRequest(request, settings, "VideoLibrary.Scan", parameters); var response = ProcessRequest(request, settings, "AudioLibrary.Scan", parameters);
return Json.Deserialize<XbmcJsonResult<string>>(response).Result; return Json.Deserialize<XbmcJsonResult<string>>(response).Result;
} }
@ -67,7 +67,7 @@ namespace NzbDrone.Core.Notifications.Xbmc
{ {
var request = new RestRequest(); var request = new RestRequest();
ProcessRequest(request, settings, "VideoLibrary.Clean"); ProcessRequest(request, settings, "AudioLibrary.Clean");
} }
public List<ActivePlayer> GetActivePlayers(XbmcSettings settings) public List<ActivePlayer> GetActivePlayers(XbmcSettings settings)
@ -79,15 +79,15 @@ namespace NzbDrone.Core.Notifications.Xbmc
return Json.Deserialize<ActivePlayersEdenResult>(response).Result; return Json.Deserialize<ActivePlayersEdenResult>(response).Result;
} }
public List<TvShow> GetArtist(XbmcSettings settings) public List<KodiArtist> GetArtist(XbmcSettings settings)
{ {
var request = new RestRequest(); var request = new RestRequest();
var parameters = new Dictionary<string, object>(); var parameters = new Dictionary<string, object>();
parameters.Add("properties", new[] { "file", "imdbnumber" }); parameters.Add("properties", new[] { "musicbrainzartistid" }); //TODO: Figure out why AudioLibrary doesnt list file location like videoLibray
var response = ProcessRequest(request, settings, "VideoLibrary.GetTvShows", parameters); var response = ProcessRequest(request, settings, "AudioLibrary.GetArtists", parameters);
return Json.Deserialize<TvShowResponse>(response).Result.TvShows; return Json.Deserialize<ArtistResponse>(response).Result.Artists;
} }
private string ProcessRequest(IRestRequest request, XbmcSettings settings, string method, Dictionary<string, object> parameters = null) private string ProcessRequest(IRestRequest request, XbmcSettings settings, string method, Dictionary<string, object> parameters = null)

@ -1,4 +1,4 @@
using System.ComponentModel; using System.ComponentModel;
using FluentValidation; using FluentValidation;
using Newtonsoft.Json; using Newtonsoft.Json;
using NzbDrone.Core.Annotations; using NzbDrone.Core.Annotations;
@ -51,7 +51,7 @@ namespace NzbDrone.Core.Notifications.Xbmc
[FieldDefinition(7, Label = "Clean Library", HelpText = "Clean Library after update?", Type = FieldType.Checkbox)] [FieldDefinition(7, Label = "Clean Library", HelpText = "Clean Library after update?", Type = FieldType.Checkbox)]
public bool CleanLibrary { get; set; } public bool CleanLibrary { get; set; }
[FieldDefinition(8, Label = "Always Update", HelpText = "Update Library even when a video is playing?", Type = FieldType.Checkbox)] [FieldDefinition(8, Label = "Always Update", HelpText = "Update Library even when a file is playing?", Type = FieldType.Checkbox)]
public bool AlwaysUpdate { get; set; } public bool AlwaysUpdate { get; set; }
[JsonIgnore] [JsonIgnore]

@ -968,9 +968,9 @@
<Compile Include="Notifications\Xbmc\Model\ActivePlayersDharmaResult.cs" /> <Compile Include="Notifications\Xbmc\Model\ActivePlayersDharmaResult.cs" />
<Compile Include="Notifications\Xbmc\Model\ActivePlayersEdenResult.cs" /> <Compile Include="Notifications\Xbmc\Model\ActivePlayersEdenResult.cs" />
<Compile Include="Notifications\Xbmc\Model\ErrorResult.cs" /> <Compile Include="Notifications\Xbmc\Model\ErrorResult.cs" />
<Compile Include="Notifications\Xbmc\Model\TvShow.cs" /> <Compile Include="Notifications\Xbmc\Model\KodiArtist.cs" />
<Compile Include="Notifications\Xbmc\Model\TvShowResponse.cs" /> <Compile Include="Notifications\Xbmc\Model\ArtistResponse.cs" />
<Compile Include="Notifications\Xbmc\Model\TvShowResult.cs" /> <Compile Include="Notifications\Xbmc\Model\ArtistResult.cs" />
<Compile Include="Notifications\Xbmc\Model\VersionResult.cs" /> <Compile Include="Notifications\Xbmc\Model\VersionResult.cs" />
<Compile Include="Notifications\Xbmc\Model\XbmcJsonResult.cs" /> <Compile Include="Notifications\Xbmc\Model\XbmcJsonResult.cs" />
<Compile Include="Notifications\Xbmc\Model\XbmcVersion.cs" /> <Compile Include="Notifications\Xbmc\Model\XbmcVersion.cs" />

Loading…
Cancel
Save