Initial Notification Support, XBMC and PLEX still need work.

pull/94/head
Qstick 7 years ago
parent 56e8f5c730
commit 864549b1f3

@ -1,10 +1,10 @@
using System; using System;
using FluentAssertions; using FluentAssertions;
using FluentValidation.Results; using FluentValidation.Results;
using NUnit.Framework; using NUnit.Framework;
using NzbDrone.Core.Notifications; using NzbDrone.Core.Notifications;
using NzbDrone.Core.ThingiProvider; using NzbDrone.Core.ThingiProvider;
using NzbDrone.Core.Tv; using NzbDrone.Core.Music;
using NzbDrone.Core.Validation; using NzbDrone.Core.Validation;
using NzbDrone.Test.Common; using NzbDrone.Test.Common;
@ -60,7 +60,7 @@ namespace NzbDrone.Core.Test.NotificationTests
TestLogger.Info("OnDownload was called"); TestLogger.Info("OnDownload was called");
} }
public override void OnRename(Series series) public override void OnRename(Artist artist)
{ {
TestLogger.Info("OnRename was called"); TestLogger.Info("OnRename was called");
} }

@ -1,11 +1,11 @@
using System.Collections.Generic; using System.Collections.Generic;
using Moq; using Moq;
using NUnit.Framework; using NUnit.Framework;
using NzbDrone.Core.MediaFiles; using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.Notifications; using NzbDrone.Core.Notifications;
using NzbDrone.Core.Notifications.Synology; using NzbDrone.Core.Notifications.Synology;
using NzbDrone.Core.Test.Framework; using NzbDrone.Core.Test.Framework;
using NzbDrone.Core.Tv; using NzbDrone.Core.Music;
using NzbDrone.Test.Common; using NzbDrone.Test.Common;
namespace NzbDrone.Core.Test.NotificationTests namespace NzbDrone.Core.Test.NotificationTests
@ -13,33 +13,33 @@ namespace NzbDrone.Core.Test.NotificationTests
[TestFixture] [TestFixture]
public class SynologyIndexerFixture : CoreTest<SynologyIndexer> public class SynologyIndexerFixture : CoreTest<SynologyIndexer>
{ {
private Series _series; private Artist _artist;
private DownloadMessage _upgrade; private DownloadMessage _upgrade;
[SetUp] [SetUp]
public void SetUp() public void SetUp()
{ {
_series = new Series() _artist = new Artist()
{ {
Path = @"C:\Test\".AsOsAgnostic() Path = @"C:\Test\".AsOsAgnostic()
}; };
_upgrade = new DownloadMessage() _upgrade = new DownloadMessage()
{ {
Series = _series, Artist = _artist,
EpisodeFile = new EpisodeFile TrackFile = new TrackFile
{ {
RelativePath = "file1.S01E01E02.mkv" RelativePath = "file1.S01E01E02.mkv"
}, },
OldFiles = new List<EpisodeFile> OldFiles = new List<TrackFile>
{ {
new EpisodeFile new TrackFile
{ {
RelativePath = "file1.S01E01.mkv" RelativePath = "file1.S01E01.mkv"
}, },
new EpisodeFile new TrackFile
{ {
RelativePath = "file1.S01E02.mkv" RelativePath = "file1.S01E02.mkv"
} }
@ -60,10 +60,10 @@ namespace NzbDrone.Core.Test.NotificationTests
{ {
(Subject.Definition.Settings as SynologyIndexerSettings).UpdateLibrary = false; (Subject.Definition.Settings as SynologyIndexerSettings).UpdateLibrary = false;
Subject.OnRename(_series); Subject.OnRename(_artist);
Mocker.GetMock<ISynologyIndexerProxy>() Mocker.GetMock<ISynologyIndexerProxy>()
.Verify(v => v.UpdateFolder(_series.Path), Times.Never()); .Verify(v => v.UpdateFolder(_artist.Path), Times.Never());
} }
[Test] [Test]
@ -90,7 +90,7 @@ namespace NzbDrone.Core.Test.NotificationTests
[Test] [Test]
public void should_update_entire_series_folder_on_rename() public void should_update_entire_series_folder_on_rename()
{ {
Subject.OnRename(_series); Subject.OnRename(_artist);
Mocker.GetMock<ISynologyIndexerProxy>() Mocker.GetMock<ISynologyIndexerProxy>()
.Verify(v => v.UpdateFolder(@"C:\Test\".AsOsAgnostic()), Times.Once()); .Verify(v => v.UpdateFolder(@"C:\Test\".AsOsAgnostic()), Times.Once());

@ -1,9 +1,9 @@
using FluentAssertions; using FluentAssertions;
using NUnit.Framework; using NUnit.Framework;
using NzbDrone.Common.Http; using NzbDrone.Common.Http;
using NzbDrone.Core.Notifications.Xbmc; using NzbDrone.Core.Notifications.Xbmc;
using NzbDrone.Core.Test.Framework; using NzbDrone.Core.Test.Framework;
using NzbDrone.Core.Tv; using NzbDrone.Core.Music;
namespace NzbDrone.Core.Test.NotificationTests.Xbmc.Http namespace NzbDrone.Core.Test.NotificationTests.Xbmc.Http
{ {
@ -11,7 +11,7 @@ namespace NzbDrone.Core.Test.NotificationTests.Xbmc.Http
public class GetSeriesPathFixture : CoreTest<HttpApiProvider> public class GetSeriesPathFixture : CoreTest<HttpApiProvider>
{ {
private XbmcSettings _settings; private XbmcSettings _settings;
private Series _series; private Artist _artist;
[SetUp] [SetUp]
public void Setup() public void Setup()
@ -27,10 +27,10 @@ namespace NzbDrone.Core.Test.NotificationTests.Xbmc.Http
UpdateLibrary = true UpdateLibrary = true
}; };
_series = new Series _artist = new Artist
{ {
TvdbId = 79488, ForeignArtistId = "123d45d-d154f5d-1f5d1-5df18d5",
Title = "30 Rock" Name = "30 Rock"
}; };
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)";
@ -57,7 +57,7 @@ namespace NzbDrone.Core.Test.NotificationTests.Xbmc.Http
.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, _series) Subject.GetSeriesPath(_settings, _artist)
.Should().Be("smb://xbmc:xbmc@HOMESERVER/TV/30 Rock/"); .Should().Be("smb://xbmc:xbmc@HOMESERVER/TV/30 Rock/");
} }
@ -72,7 +72,7 @@ namespace NzbDrone.Core.Test.NotificationTests.Xbmc.Http
.Returns(queryResult); .Returns(queryResult);
Subject.GetSeriesPath(_settings, _series) Subject.GetSeriesPath(_settings, _artist)
.Should().BeNull(); .Should().BeNull();
} }
@ -87,7 +87,7 @@ namespace NzbDrone.Core.Test.NotificationTests.Xbmc.Http
.Returns(queryResult); .Returns(queryResult);
Subject.GetSeriesPath(_settings, _series) Subject.GetSeriesPath(_settings, _artist)
.Should().Be("smb://xbmc:xbmc@HOMESERVER/TV/Law & Order- Special Victims Unit/"); .Should().Be("smb://xbmc:xbmc@HOMESERVER/TV/Law & Order- Special Victims Unit/");
} }
} }

@ -1,9 +1,9 @@
using FizzWare.NBuilder; using FizzWare.NBuilder;
using NUnit.Framework; using NUnit.Framework;
using NzbDrone.Common.Http; using NzbDrone.Common.Http;
using NzbDrone.Core.Notifications.Xbmc; using NzbDrone.Core.Notifications.Xbmc;
using NzbDrone.Core.Test.Framework; using NzbDrone.Core.Test.Framework;
using NzbDrone.Core.Tv; using NzbDrone.Core.Music;
namespace NzbDrone.Core.Test.NotificationTests.Xbmc.Http namespace NzbDrone.Core.Test.NotificationTests.Xbmc.Http
{ {
@ -12,7 +12,7 @@ namespace NzbDrone.Core.Test.NotificationTests.Xbmc.Http
{ {
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 _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 Series _fakeSeries; private Artist _fakeSeries;
[SetUp] [SetUp]
public void Setup() public void Setup()
@ -28,9 +28,9 @@ namespace NzbDrone.Core.Test.NotificationTests.Xbmc.Http
UpdateLibrary = true UpdateLibrary = true
}; };
_fakeSeries = Builder<Series>.CreateNew() _fakeSeries = Builder<Artist>.CreateNew()
.With(s => s.TvdbId = 79488) .With(s => s.ForeignArtistId = "79488")
.With(s => s.Title = "30 Rock") .With(s => s.Name = "30 Rock")
.Build(); .Build();
} }

@ -1,4 +1,4 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using FizzWare.NBuilder; using FizzWare.NBuilder;
using FluentAssertions; using FluentAssertions;
@ -6,16 +6,16 @@ using NUnit.Framework;
using NzbDrone.Core.Notifications.Xbmc; using NzbDrone.Core.Notifications.Xbmc;
using NzbDrone.Core.Notifications.Xbmc.Model; using NzbDrone.Core.Notifications.Xbmc.Model;
using NzbDrone.Core.Test.Framework; using NzbDrone.Core.Test.Framework;
using NzbDrone.Core.Tv; 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 GetSeriesPathFixture : CoreTest<JsonApiProvider>
{ {
private const int TVDB_ID = 5; private const string MB_ID = "5";
private XbmcSettings _settings; private XbmcSettings _settings;
private Series _series; private Artist _artist;
private List<TvShow> _xbmcSeries; private List<TvShow> _xbmcSeries;
[SetUp] [SetUp]
@ -28,39 +28,39 @@ namespace NzbDrone.Core.Test.NotificationTests.Xbmc.Json
.All() .All()
.With(s => s.ImdbNumber = "0") .With(s => s.ImdbNumber = "0")
.TheFirst(1) .TheFirst(1)
.With(s => s.ImdbNumber = TVDB_ID.ToString()) .With(s => s.ImdbNumber = MB_ID.ToString())
.Build() .Build()
.ToList(); .ToList();
Mocker.GetMock<IXbmcJsonApiProxy>() Mocker.GetMock<IXbmcJsonApiProxy>()
.Setup(s => s.GetSeries(_settings)) .Setup(s => s.GetArtist(_settings))
.Returns(_xbmcSeries); .Returns(_xbmcSeries);
} }
private void GivenMatchingTvdbId() private void GivenMatchingTvdbId()
{ {
_series = new Series _artist = new Artist
{ {
TvdbId = TVDB_ID, ForeignArtistId = MB_ID,
Title = "TV Show" Name = "TV Show"
}; };
} }
private void GivenMatchingTitle() private void GivenMatchingTitle()
{ {
_series = new Series _artist = new Artist
{ {
TvdbId = 1000, ForeignArtistId = "1000",
Title = _xbmcSeries.First().Label Name = _xbmcSeries.First().Label
}; };
} }
private void GivenMatchingSeries() private void GivenMatchingSeries()
{ {
_series = new Series _artist = new Artist
{ {
TvdbId = 1000, ForeignArtistId = "1000",
Title = "Does not exist" Name = "Does not exist"
}; };
} }
@ -69,7 +69,7 @@ namespace NzbDrone.Core.Test.NotificationTests.Xbmc.Json
{ {
GivenMatchingSeries(); GivenMatchingSeries();
Subject.GetSeriesPath(_settings, _series).Should().BeNull(); Subject.GetSeriesPath(_settings, _artist).Should().BeNull();
} }
[Test] [Test]
@ -77,7 +77,7 @@ namespace NzbDrone.Core.Test.NotificationTests.Xbmc.Json
{ {
GivenMatchingTvdbId(); GivenMatchingTvdbId();
Subject.GetSeriesPath(_settings, _series).Should().Be(_xbmcSeries.First().File); Subject.GetSeriesPath(_settings, _artist).Should().Be(_xbmcSeries.First().File);
} }
[Test] [Test]
@ -85,7 +85,7 @@ namespace NzbDrone.Core.Test.NotificationTests.Xbmc.Json
{ {
GivenMatchingTitle(); GivenMatchingTitle();
Subject.GetSeriesPath(_settings, _series).Should().Be(_xbmcSeries.First().File); Subject.GetSeriesPath(_settings, _artist).Should().Be(_xbmcSeries.First().File);
} }
[Test] [Test]
@ -94,13 +94,13 @@ namespace NzbDrone.Core.Test.NotificationTests.Xbmc.Json
GivenMatchingTvdbId(); GivenMatchingTvdbId();
_xbmcSeries.ForEach(s => s.ImdbNumber = "tt12345"); _xbmcSeries.ForEach(s => s.ImdbNumber = "tt12345");
_xbmcSeries.Last().ImdbNumber = TVDB_ID.ToString(); _xbmcSeries.Last().ImdbNumber = MB_ID.ToString();
Mocker.GetMock<IXbmcJsonApiProxy>() Mocker.GetMock<IXbmcJsonApiProxy>()
.Setup(s => s.GetSeries(_settings)) .Setup(s => s.GetArtist(_settings))
.Returns(_xbmcSeries); .Returns(_xbmcSeries);
Subject.GetSeriesPath(_settings, _series).Should().NotBeNull(); Subject.GetSeriesPath(_settings, _artist).Should().NotBeNull();
} }
} }
} }

@ -1,4 +1,4 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using FizzWare.NBuilder; using FizzWare.NBuilder;
using Moq; using Moq;
@ -6,16 +6,16 @@ using NUnit.Framework;
using NzbDrone.Core.Notifications.Xbmc; using NzbDrone.Core.Notifications.Xbmc;
using NzbDrone.Core.Notifications.Xbmc.Model; using NzbDrone.Core.Notifications.Xbmc.Model;
using NzbDrone.Core.Test.Framework; using NzbDrone.Core.Test.Framework;
using NzbDrone.Core.Tv; using NzbDrone.Core.Music;
namespace NzbDrone.Core.Test.NotificationTests.Xbmc.Json namespace NzbDrone.Core.Test.NotificationTests.Xbmc.Json
{ {
[TestFixture] [TestFixture]
public class UpdateFixture : CoreTest<JsonApiProvider> public class UpdateFixture : CoreTest<JsonApiProvider>
{ {
private const int TVDB_ID = 5; private const string MB_ID = "5";
private XbmcSettings _settings; private XbmcSettings _settings;
private List<TvShow> _xbmcSeries; private List<TvShow> _xbmcArtist;
[SetUp] [SetUp]
public void Setup() public void Setup()
@ -23,15 +23,15 @@ namespace NzbDrone.Core.Test.NotificationTests.Xbmc.Json
_settings = Builder<XbmcSettings>.CreateNew() _settings = Builder<XbmcSettings>.CreateNew()
.Build(); .Build();
_xbmcSeries = Builder<TvShow>.CreateListOfSize(3) _xbmcArtist = Builder<TvShow>.CreateListOfSize(3)
.TheFirst(1) .TheFirst(1)
.With(s => s.ImdbNumber = TVDB_ID.ToString()) .With(s => s.ImdbNumber = MB_ID.ToString())
.Build() .Build()
.ToList(); .ToList();
Mocker.GetMock<IXbmcJsonApiProxy>() Mocker.GetMock<IXbmcJsonApiProxy>()
.Setup(s => s.GetSeries(_settings)) .Setup(s => s.GetArtist(_settings))
.Returns(_xbmcSeries); .Returns(_xbmcArtist);
Mocker.GetMock<IXbmcJsonApiProxy>() Mocker.GetMock<IXbmcJsonApiProxy>()
.Setup(s => s.GetActivePlayers(_settings)) .Setup(s => s.GetActivePlayers(_settings))
@ -41,8 +41,8 @@ namespace NzbDrone.Core.Test.NotificationTests.Xbmc.Json
[Test] [Test]
public void should_update_using_series_path() public void should_update_using_series_path()
{ {
var series = Builder<Series>.CreateNew() var series = Builder<Artist>.CreateNew()
.With(s => s.TvdbId = TVDB_ID) .With(s => s.ForeignArtistId = MB_ID)
.Build(); .Build();
Subject.Update(_settings, series); Subject.Update(_settings, series);
@ -54,9 +54,9 @@ namespace NzbDrone.Core.Test.NotificationTests.Xbmc.Json
[Test] [Test]
public void should_update_all_paths_when_series_path_not_found() public void should_update_all_paths_when_series_path_not_found()
{ {
var fakeSeries = Builder<Series>.CreateNew() var fakeSeries = Builder<Artist>.CreateNew()
.With(s => s.TvdbId = 1000) .With(s => s.ForeignArtistId = "1000")
.With(s => s.Title = "Not 30 Rock") .With(s => s.Name = "Not 30 Rock")
.Build(); .Build();
Subject.Update(_settings, fakeSeries); Subject.Update(_settings, fakeSeries);

@ -1,4 +1,4 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using FizzWare.NBuilder; using FizzWare.NBuilder;
using Moq; using Moq;
@ -7,7 +7,7 @@ using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.Notifications; using NzbDrone.Core.Notifications;
using NzbDrone.Core.Notifications.Xbmc; using NzbDrone.Core.Notifications.Xbmc;
using NzbDrone.Core.Test.Framework; using NzbDrone.Core.Test.Framework;
using NzbDrone.Core.Tv; using NzbDrone.Core.Music;
namespace NzbDrone.Core.Test.NotificationTests.Xbmc namespace NzbDrone.Core.Test.NotificationTests.Xbmc
{ {
@ -19,16 +19,16 @@ namespace NzbDrone.Core.Test.NotificationTests.Xbmc
[SetUp] [SetUp]
public void Setup() public void Setup()
{ {
var series = Builder<Series>.CreateNew() var artist = Builder<Artist>.CreateNew()
.Build(); .Build();
var episodeFile = Builder<EpisodeFile>.CreateNew() var trackFile = Builder<TrackFile>.CreateNew()
.Build(); .Build();
_downloadMessage = Builder<DownloadMessage>.CreateNew() _downloadMessage = Builder<DownloadMessage>.CreateNew()
.With(d => d.Series = series) .With(d => d.Artist = artist)
.With(d => d.EpisodeFile = episodeFile) .With(d => d.TrackFile = trackFile)
.With(d => d.OldFiles = new List<EpisodeFile>()) .With(d => d.OldFiles = new List<TrackFile>())
.Build(); .Build();
Subject.Definition = new NotificationDefinition(); Subject.Definition = new NotificationDefinition();
@ -40,7 +40,7 @@ namespace NzbDrone.Core.Test.NotificationTests.Xbmc
private void GivenOldFiles() private void GivenOldFiles()
{ {
_downloadMessage.OldFiles = Builder<EpisodeFile>.CreateListOfSize(1) _downloadMessage.OldFiles = Builder<TrackFile>.CreateListOfSize(1)
.Build() .Build()
.ToList(); .ToList();

@ -18,12 +18,12 @@ namespace NzbDrone.Core.Notifications.Boxcar
public override void OnGrab(GrabMessage grabMessage) public override void OnGrab(GrabMessage grabMessage)
{ {
_proxy.SendNotification(EPISODE_GRABBED_TITLE, grabMessage.Message, Settings); _proxy.SendNotification(ALBUM_GRABBED_TITLE, grabMessage.Message, Settings);
} }
public override void OnDownload(DownloadMessage message) public override void OnDownload(DownloadMessage message)
{ {
_proxy.SendNotification(EPISODE_DOWNLOADED_TITLE , message.Message, Settings); _proxy.SendNotification(TRACK_DOWNLOADED_TITLE , message.Message, Settings);
} }
public override ValidationResult Test() public override ValidationResult Test()

@ -6,7 +6,7 @@ using FluentValidation.Results;
using NLog; using NLog;
using NzbDrone.Common.Disk; using NzbDrone.Common.Disk;
using NzbDrone.Common.Processes; using NzbDrone.Common.Processes;
using NzbDrone.Core.Tv; using NzbDrone.Core.Music;
using NzbDrone.Core.Validation; using NzbDrone.Core.Validation;
namespace NzbDrone.Core.Notifications.CustomScript namespace NzbDrone.Core.Notifications.CustomScript
@ -30,27 +30,24 @@ namespace NzbDrone.Core.Notifications.CustomScript
public override void OnGrab(GrabMessage message) public override void OnGrab(GrabMessage message)
{ {
var series = message.Series; var artist = message.Artist;
var remoteEpisode = message.Episode; var remoteAlbum = message.Album;
var releaseGroup = remoteEpisode.ParsedEpisodeInfo.ReleaseGroup; var releaseGroup = remoteAlbum.ParsedAlbumInfo.ReleaseGroup;
var environmentVariables = new StringDictionary(); var environmentVariables = new StringDictionary();
environmentVariables.Add("Lidarr_EventType", "Grab"); environmentVariables.Add("Lidarr_EventType", "Grab");
environmentVariables.Add("Lidarr_Series_Id", series.Id.ToString()); environmentVariables.Add("Lidarr_Artist_Id", artist.Id.ToString());
environmentVariables.Add("Lidarr_Series_Title", series.Title); environmentVariables.Add("Lidarr_Artist_Name", artist.Name);
environmentVariables.Add("Lidarr_Series_TvdbId", series.TvdbId.ToString()); environmentVariables.Add("Lidarr_Artist_MBId", artist.ForeignArtistId.ToString());
environmentVariables.Add("Lidarr_Series_Type", series.SeriesType.ToString()); //environmentVariables.Add("Lidarr_Artist_Type", artist.SeriesType.ToString());
environmentVariables.Add("Lidarr_Release_EpisodeCount", remoteEpisode.Episodes.Count.ToString()); environmentVariables.Add("Lidarr_Release_AlbumCount", remoteAlbum.Albums.Count.ToString());
environmentVariables.Add("Lidarr_Release_SeasonNumber", remoteEpisode.ParsedEpisodeInfo.SeasonNumber.ToString()); environmentVariables.Add("Lidarr_Release_AlbumReleaseDates", string.Join(",", remoteAlbum.Albums.Select(e => e.ReleaseDate)));
environmentVariables.Add("Lidarr_Release_EpisodeNumbers", string.Join(",", remoteEpisode.Episodes.Select(e => e.EpisodeNumber))); environmentVariables.Add("Lidarr_Release_AlbumTitles", string.Join("|", remoteAlbum.Albums.Select(e => e.Title)));
environmentVariables.Add("Lidarr_Release_EpisodeAirDates", string.Join(",", remoteEpisode.Episodes.Select(e => e.AirDate))); environmentVariables.Add("Lidarr_Release_Title", remoteAlbum.Release.Title);
environmentVariables.Add("Lidarr_Release_EpisodeAirDatesUtc", string.Join(",", remoteEpisode.Episodes.Select(e => e.AirDateUtc))); environmentVariables.Add("Lidarr_Release_Indexer", remoteAlbum.Release.Indexer);
environmentVariables.Add("Lidarr_Release_EpisodeTitles", string.Join("|", remoteEpisode.Episodes.Select(e => e.Title))); environmentVariables.Add("Lidarr_Release_Size", remoteAlbum.Release.Size.ToString());
environmentVariables.Add("Lidarr_Release_Title", remoteEpisode.Release.Title); environmentVariables.Add("Lidarr_Release_Quality", remoteAlbum.ParsedAlbumInfo.Quality.Quality.Name);
environmentVariables.Add("Lidarr_Release_Indexer", remoteEpisode.Release.Indexer); environmentVariables.Add("Lidarr_Release_QualityVersion", remoteAlbum.ParsedAlbumInfo.Quality.Revision.Version.ToString());
environmentVariables.Add("Lidarr_Release_Size", remoteEpisode.Release.Size.ToString());
environmentVariables.Add("Lidarr_Release_Quality", remoteEpisode.ParsedEpisodeInfo.Quality.Quality.Name);
environmentVariables.Add("Lidarr_Release_QualityVersion", remoteEpisode.ParsedEpisodeInfo.Quality.Revision.Version.ToString());
environmentVariables.Add("Lidarr_Release_ReleaseGroup", releaseGroup); environmentVariables.Add("Lidarr_Release_ReleaseGroup", releaseGroup);
ExecuteScript(environmentVariables); ExecuteScript(environmentVariables);
@ -58,53 +55,51 @@ namespace NzbDrone.Core.Notifications.CustomScript
public override void OnDownload(DownloadMessage message) public override void OnDownload(DownloadMessage message)
{ {
var series = message.Series; var artist = message.Artist;
var episodeFile = message.EpisodeFile; var trackFile = message.TrackFile;
var sourcePath = message.SourcePath; var sourcePath = message.SourcePath;
var environmentVariables = new StringDictionary(); var environmentVariables = new StringDictionary();
environmentVariables.Add("Lidarr_EventType", "Download"); environmentVariables.Add("Lidarr_EventType", "Download");
environmentVariables.Add("LIdarr_IsUpgrade", message.OldFiles.Any().ToString()); environmentVariables.Add("LIdarr_IsUpgrade", message.OldFiles.Any().ToString());
environmentVariables.Add("Lidarr_Series_Id", series.Id.ToString()); environmentVariables.Add("Lidarr_Artist_Id", artist.Id.ToString());
environmentVariables.Add("Lidarr_Series_Title", series.Title); environmentVariables.Add("Lidarr_Artist_Name", artist.Name);
environmentVariables.Add("Lidarr_Series_Path", series.Path); environmentVariables.Add("Lidarr_Artist_Path", artist.Path);
environmentVariables.Add("Lidarr_Series_TvdbId", series.TvdbId.ToString()); environmentVariables.Add("Lidarr_Artist_MBId", artist.ForeignArtistId.ToString());
environmentVariables.Add("Lidarr_Series_Type", series.SeriesType.ToString()); //environmentVariables.Add("Lidarr_Artist_Type", artist.SeriesType.ToString());
environmentVariables.Add("Lidarr_EpisodeFile_Id", episodeFile.Id.ToString()); environmentVariables.Add("Lidarr_TrackFile_Id", trackFile.Id.ToString());
environmentVariables.Add("Lidarr_EpisodeFile_EpisodeCount", episodeFile.Episodes.Value.Count.ToString()); environmentVariables.Add("Lidarr_TrackFile_EpisodeCount", trackFile.Tracks.Value.Count.ToString());
environmentVariables.Add("Lidarr_EpisodeFile_RelativePath", episodeFile.RelativePath); environmentVariables.Add("Lidarr_TrackFile_RelativePath", trackFile.RelativePath);
environmentVariables.Add("Lidarr_EpisodeFile_Path", Path.Combine(series.Path, episodeFile.RelativePath)); environmentVariables.Add("Lidarr_TrackFile_Path", Path.Combine(artist.Path, trackFile.RelativePath));
environmentVariables.Add("Lidarr_EpisodeFile_SeasonNumber", episodeFile.SeasonNumber.ToString()); environmentVariables.Add("Lidarr_TrackFile_TrackNumbers", string.Join(",", trackFile.Tracks.Value.Select(e => e.TrackNumber)));
environmentVariables.Add("Lidarr_EpisodeFile_EpisodeNumbers", string.Join(",", episodeFile.Episodes.Value.Select(e => e.EpisodeNumber))); environmentVariables.Add("Lidarr_TrackFile_TrackReleaseDates", string.Join(",", trackFile.Tracks.Value.Select(e => e.Album.ReleaseDate)));
environmentVariables.Add("Lidarr_EpisodeFile_EpisodeAirDates", string.Join(",", episodeFile.Episodes.Value.Select(e => e.AirDate))); environmentVariables.Add("Lidarr_TrackFile_TrackTitles", string.Join("|", trackFile.Tracks.Value.Select(e => e.Title)));
environmentVariables.Add("Lidarr_EpisodeFile_EpisodeAirDatesUtc", string.Join(",", episodeFile.Episodes.Value.Select(e => e.AirDateUtc))); environmentVariables.Add("Lidarr_TrackFile_Quality", trackFile.Quality.Quality.Name);
environmentVariables.Add("Lidarr_EpisodeFile_EpisodeTitles", string.Join("|", episodeFile.Episodes.Value.Select(e => e.Title))); environmentVariables.Add("Lidarr_TrackFile_QualityVersion", trackFile.Quality.Revision.Version.ToString());
environmentVariables.Add("Lidarr_EpisodeFile_Quality", episodeFile.Quality.Quality.Name); environmentVariables.Add("Lidarr_TrackFile_ReleaseGroup", trackFile.ReleaseGroup ?? string.Empty);
environmentVariables.Add("Lidarr_EpisodeFile_QualityVersion", episodeFile.Quality.Revision.Version.ToString()); environmentVariables.Add("Lidarr_TrackFile_SceneName", trackFile.SceneName ?? string.Empty);
environmentVariables.Add("Lidarr_EpisodeFile_ReleaseGroup", episodeFile.ReleaseGroup ?? string.Empty); environmentVariables.Add("Lidarr_TrackFile_SourcePath", sourcePath);
environmentVariables.Add("Lidarr_EpisodeFile_SceneName", episodeFile.SceneName ?? string.Empty); environmentVariables.Add("Lidarr_TrackFile_SourceFolder", Path.GetDirectoryName(sourcePath));
environmentVariables.Add("Lidarr_EpisodeFile_SourcePath", sourcePath);
environmentVariables.Add("Lidarr_EpisodeFile_SourceFolder", Path.GetDirectoryName(sourcePath));
if (message.OldFiles.Any()) if (message.OldFiles.Any())
{ {
environmentVariables.Add("Lidarr_DeletedRelativePaths", string.Join("|", message.OldFiles.Select(e => e.RelativePath))); environmentVariables.Add("Lidarr_DeletedRelativePaths", string.Join("|", message.OldFiles.Select(e => e.RelativePath)));
environmentVariables.Add("Lidarr_DeletedPaths", string.Join("|", message.OldFiles.Select(e => Path.Combine(series.Path, e.RelativePath)))); environmentVariables.Add("Lidarr_DeletedPaths", string.Join("|", message.OldFiles.Select(e => Path.Combine(artist.Path, e.RelativePath))));
} }
ExecuteScript(environmentVariables); ExecuteScript(environmentVariables);
} }
public override void OnRename(Series series) public override void OnRename(Artist artist)
{ {
var environmentVariables = new StringDictionary(); var environmentVariables = new StringDictionary();
environmentVariables.Add("Lidarr_EventType", "Rename"); environmentVariables.Add("Lidarr_EventType", "Rename");
environmentVariables.Add("Lidarr_Series_Id", series.Id.ToString()); environmentVariables.Add("Lidarr_Artist_Id", artist.Id.ToString());
environmentVariables.Add("Lidarr_Series_Title", series.Title); environmentVariables.Add("Lidarr_Artist_Title", artist.Name);
environmentVariables.Add("Lidarr_Series_Path", series.Path); environmentVariables.Add("Lidarr_Artist_Path", artist.Path);
environmentVariables.Add("Lidarr_Series_TvdbId", series.TvdbId.ToString()); environmentVariables.Add("Lidarr_Artist_TvdbId", artist.ForeignArtistId.ToString());
environmentVariables.Add("Lidarr_Series_Type", series.SeriesType.ToString()); //environmentVariables.Add("Lidarr_Artist_Type", artist.SeriesType.ToString());
ExecuteScript(environmentVariables); ExecuteScript(environmentVariables);
} }

@ -1,15 +1,15 @@
using System.Collections.Generic; using System.Collections.Generic;
using NzbDrone.Core.MediaFiles; using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.Tv; using NzbDrone.Core.Music;
namespace NzbDrone.Core.Notifications namespace NzbDrone.Core.Notifications
{ {
public class DownloadMessage public class DownloadMessage
{ {
public string Message { get; set; } public string Message { get; set; }
public Series Series { get; set; } public Artist Artist { get; set; }
public EpisodeFile EpisodeFile { get; set; } public TrackFile TrackFile { get; set; }
public List<EpisodeFile> OldFiles { get; set; } public List<TrackFile> OldFiles { get; set; }
public string SourcePath { get; set; } public string SourcePath { get; set; }
public override string ToString() public override string ToString()

@ -23,14 +23,14 @@ namespace NzbDrone.Core.Notifications.Email
{ {
var body = $"{grabMessage.Message} sent to queue."; var body = $"{grabMessage.Message} sent to queue.";
_emailService.SendEmail(Settings, EPISODE_GRABBED_TITLE_BRANDED, body); _emailService.SendEmail(Settings, ALBUM_GRABBED_TITLE_BRANDED, body);
} }
public override void OnDownload(DownloadMessage message) public override void OnDownload(DownloadMessage message)
{ {
var body = $"{message.Message} Downloaded and sorted."; var body = $"{message.Message} Downloaded and sorted.";
_emailService.SendEmail(Settings, EPISODE_DOWNLOADED_TITLE_BRANDED, body); _emailService.SendEmail(Settings, TRACK_DOWNLOADED_TITLE_BRANDED, body);
} }

@ -1,14 +1,14 @@
using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Parser.Model;
using NzbDrone.Core.Qualities; using NzbDrone.Core.Qualities;
using NzbDrone.Core.Tv; using NzbDrone.Core.Music;
namespace NzbDrone.Core.Notifications namespace NzbDrone.Core.Notifications
{ {
public class GrabMessage public class GrabMessage
{ {
public string Message { get; set; } public string Message { get; set; }
public Series Series { get; set; } public Artist Artist { get; set; }
public RemoteEpisode Episode { get; set; } public RemoteAlbum Album { get; set; }
public QualityModel Quality { get; set; } public QualityModel Quality { get; set; }
public override string ToString() public override string ToString()

@ -21,12 +21,12 @@ namespace NzbDrone.Core.Notifications.Growl
public override void OnGrab(GrabMessage grabMessage) public override void OnGrab(GrabMessage grabMessage)
{ {
_growlService.SendNotification(EPISODE_GRABBED_TITLE, grabMessage.Message, "GRAB", Settings.Host, Settings.Port, Settings.Password); _growlService.SendNotification(ALBUM_GRABBED_TITLE, grabMessage.Message, "GRAB", Settings.Host, Settings.Port, Settings.Password);
} }
public override void OnDownload(DownloadMessage message) public override void OnDownload(DownloadMessage message)
{ {
_growlService.SendNotification(EPISODE_DOWNLOADED_TITLE, message.Message, "DOWNLOAD", Settings.Host, Settings.Port, Settings.Password); _growlService.SendNotification(TRACK_DOWNLOADED_TITLE, message.Message, "DOWNLOAD", Settings.Host, Settings.Port, Settings.Password);
} }

@ -1,5 +1,5 @@
using NzbDrone.Core.ThingiProvider; using NzbDrone.Core.ThingiProvider;
using NzbDrone.Core.Tv; using NzbDrone.Core.Music;
namespace NzbDrone.Core.Notifications namespace NzbDrone.Core.Notifications
{ {
@ -9,7 +9,7 @@ namespace NzbDrone.Core.Notifications
void OnGrab(GrabMessage grabMessage); void OnGrab(GrabMessage grabMessage);
void OnDownload(DownloadMessage message); void OnDownload(DownloadMessage message);
void OnRename(Series series); void OnRename(Artist artist);
bool SupportsOnGrab { get; } bool SupportsOnGrab { get; }
bool SupportsOnDownload { get; } bool SupportsOnDownload { get; }
bool SupportsOnUpgrade { get; } bool SupportsOnUpgrade { get; }

@ -19,12 +19,12 @@ namespace NzbDrone.Core.Notifications.Join
public override void OnGrab(GrabMessage message) public override void OnGrab(GrabMessage message)
{ {
_proxy.SendNotification(EPISODE_GRABBED_TITLE_BRANDED, message.Message, Settings); _proxy.SendNotification(ALBUM_GRABBED_TITLE_BRANDED, message.Message, Settings);
} }
public override void OnDownload(DownloadMessage message) public override void OnDownload(DownloadMessage message)
{ {
_proxy.SendNotification(EPISODE_DOWNLOADED_TITLE_BRANDED, message.Message, Settings); _proxy.SendNotification(TRACK_DOWNLOADED_TITLE_BRANDED, message.Message, Settings);
} }
public override ValidationResult Test() public override ValidationResult Test()

@ -1,7 +1,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using FluentValidation.Results; using FluentValidation.Results;
using NzbDrone.Common.Extensions; using NzbDrone.Common.Extensions;
using NzbDrone.Core.Tv; using NzbDrone.Core.Music;
namespace NzbDrone.Core.Notifications.Emby namespace NzbDrone.Core.Notifications.Emby
{ {
@ -22,7 +22,7 @@ namespace NzbDrone.Core.Notifications.Emby
{ {
if (Settings.Notify) if (Settings.Notify)
{ {
_mediaBrowserService.Notify(Settings, EPISODE_GRABBED_TITLE_BRANDED, grabMessage.Message); _mediaBrowserService.Notify(Settings, ALBUM_GRABBED_TITLE_BRANDED, grabMessage.Message);
} }
} }
@ -30,20 +30,20 @@ namespace NzbDrone.Core.Notifications.Emby
{ {
if (Settings.Notify) if (Settings.Notify)
{ {
_mediaBrowserService.Notify(Settings, EPISODE_DOWNLOADED_TITLE_BRANDED, message.Message); _mediaBrowserService.Notify(Settings, TRACK_DOWNLOADED_TITLE_BRANDED, message.Message);
} }
if (Settings.UpdateLibrary) if (Settings.UpdateLibrary)
{ {
_mediaBrowserService.Update(Settings, message.Series); _mediaBrowserService.Update(Settings, message.Artist);
} }
} }
public override void OnRename(Series series) public override void OnRename(Artist artist)
{ {
if (Settings.UpdateLibrary) if (Settings.UpdateLibrary)
{ {
_mediaBrowserService.Update(Settings, series); _mediaBrowserService.Update(Settings, artist);
} }
} }

@ -1,4 +1,4 @@
using NLog; using NLog;
using NzbDrone.Common.Http; using NzbDrone.Common.Http;
using NzbDrone.Common.Serializer; using NzbDrone.Common.Serializer;
@ -31,9 +31,9 @@ namespace NzbDrone.Core.Notifications.Emby
ProcessRequest(request, settings); ProcessRequest(request, settings);
} }
public void Update(MediaBrowserSettings settings, int tvdbId) public void Update(MediaBrowserSettings settings, string mbId)
{ {
var path = string.Format("/Library/Series/Updated?tvdbid={0}", tvdbId); var path = string.Format("/Library/Artist/Updated?tvdbid={0}", mbId); //TODO: Get Emby to add a new Library Route
var request = BuildRequest(path, settings); var request = BuildRequest(path, settings);
request.Headers.Add("Content-Length", "0"); request.Headers.Add("Content-Length", "0");

@ -1,16 +1,16 @@
using System; using System;
using System.Net; using System.Net;
using FluentValidation.Results; using FluentValidation.Results;
using NLog; using NLog;
using NzbDrone.Core.Rest; using NzbDrone.Core.Rest;
using NzbDrone.Core.Tv; using NzbDrone.Core.Music;
namespace NzbDrone.Core.Notifications.Emby namespace NzbDrone.Core.Notifications.Emby
{ {
public interface IMediaBrowserService public interface IMediaBrowserService
{ {
void Notify(MediaBrowserSettings settings, string title, string message); void Notify(MediaBrowserSettings settings, string title, string message);
void Update(MediaBrowserSettings settings, Series series); void Update(MediaBrowserSettings settings, Artist artist);
ValidationFailure Test(MediaBrowserSettings settings); ValidationFailure Test(MediaBrowserSettings settings);
} }
@ -30,9 +30,9 @@ namespace NzbDrone.Core.Notifications.Emby
_proxy.Notify(settings, title, message); _proxy.Notify(settings, title, message);
} }
public void Update(MediaBrowserSettings settings, Series series) public void Update(MediaBrowserSettings settings, Artist artist)
{ {
_proxy.Update(settings, series.TvdbId); _proxy.Update(settings, artist.ForeignArtistId);
} }
public ValidationFailure Test(MediaBrowserSettings settings) public ValidationFailure Test(MediaBrowserSettings settings)

@ -1,18 +1,18 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using FluentValidation.Results; using FluentValidation.Results;
using NzbDrone.Core.ThingiProvider; using NzbDrone.Core.ThingiProvider;
using NzbDrone.Core.Tv; using NzbDrone.Core.Music;
namespace NzbDrone.Core.Notifications namespace NzbDrone.Core.Notifications
{ {
public abstract class NotificationBase<TSettings> : INotification where TSettings : IProviderConfig, new() public abstract class NotificationBase<TSettings> : INotification where TSettings : IProviderConfig, new()
{ {
protected const string EPISODE_GRABBED_TITLE = "Episode Grabbed"; protected const string ALBUM_GRABBED_TITLE = "Album Grabbed";
protected const string EPISODE_DOWNLOADED_TITLE = "Episode Downloaded"; protected const string TRACK_DOWNLOADED_TITLE = "Track Downloaded";
protected const string EPISODE_GRABBED_TITLE_BRANDED = "Lidarr - " + EPISODE_GRABBED_TITLE; protected const string ALBUM_GRABBED_TITLE_BRANDED = "Lidarr - " + ALBUM_GRABBED_TITLE;
protected const string EPISODE_DOWNLOADED_TITLE_BRANDED = "Lidarr - " + EPISODE_DOWNLOADED_TITLE; protected const string TRACK_DOWNLOADED_TITLE_BRANDED = "Lidarr - " + TRACK_DOWNLOADED_TITLE;
public abstract string Name { get; } public abstract string Name { get; }
@ -37,7 +37,7 @@ namespace NzbDrone.Core.Notifications
} }
public virtual void OnRename(Series series) public virtual void OnRename(Artist series)
{ {
} }

@ -8,14 +8,14 @@ using NzbDrone.Core.MediaFiles.Events;
using NzbDrone.Core.Messaging.Events; using NzbDrone.Core.Messaging.Events;
using NzbDrone.Core.Qualities; using NzbDrone.Core.Qualities;
using NzbDrone.Core.ThingiProvider; using NzbDrone.Core.ThingiProvider;
using NzbDrone.Core.Tv; using NzbDrone.Core.Music;
namespace NzbDrone.Core.Notifications namespace NzbDrone.Core.Notifications
{ {
public class NotificationService public class NotificationService
: IHandle<EpisodeGrabbedEvent>, : IHandle<AlbumGrabbedEvent>,
IHandle<EpisodeDownloadedEvent>, IHandle<TrackDownloadedEvent>,
IHandle<SeriesRenamedEvent> IHandle<ArtistRenamedEvent>
{ {
private readonly INotificationFactory _notificationFactory; private readonly INotificationFactory _notificationFactory;
private readonly Logger _logger; private readonly Logger _logger;
@ -26,48 +26,43 @@ namespace NzbDrone.Core.Notifications
_logger = logger; _logger = logger;
} }
private string GetMessage(Series series, List<Episode> episodes, QualityModel quality) private string GetMessage(Artist artist, List<Album> albums, QualityModel quality)
{ {
var qualityString = quality.Quality.ToString(); var qualityString = quality.Quality.ToString();
if (quality.Revision.Version > 1) if (quality.Revision.Version > 1)
{ {
if (series.SeriesType == SeriesTypes.Anime) qualityString += " Proper";
{
qualityString += " v" + quality.Revision.Version;
}
else
{
qualityString += " Proper";
}
} }
if (series.SeriesType == SeriesTypes.Daily)
{
var episode = episodes.First();
return string.Format("{0} - {1} - {2} [{3}]", var albumTitles = string.Join(" + ", albums.Select(e => e.Title));
series.Title,
episode.AirDate, return string.Format("{0} - {1} - [{4}]",
episode.Title, artist.Name,
qualityString); albumTitles,
qualityString);
}
private string GetTrackMessage(Artist artist, List<Track> tracks, QualityModel quality)
{
var qualityString = quality.Quality.ToString();
if (quality.Revision.Version > 1)
{
qualityString += " Proper";
} }
var episodeNumbers = string.Concat(episodes.Select(e => e.EpisodeNumber)
.Select(i => string.Format("x{0:00}", i)));
var episodeTitles = string.Join(" + ", episodes.Select(e => e.Title)); var trackTitles = string.Join(" + ", tracks.Select(e => e.Title));
return string.Format("{0} - {1}{2} - {3} [{4}]", return string.Format("{0} - {1} - [{4}]",
series.Title, artist.Name,
episodes.First().SeasonNumber, trackTitles,
episodeNumbers,
episodeTitles,
qualityString); qualityString);
} }
private bool ShouldHandleSeries(ProviderDefinition definition, Series series) private bool ShouldHandleArtist(ProviderDefinition definition, Artist artist)
{ {
if (definition.Tags.Empty()) if (definition.Tags.Empty())
{ {
@ -75,32 +70,32 @@ namespace NzbDrone.Core.Notifications
return true; return true;
} }
if (definition.Tags.Intersect(series.Tags).Any()) if (definition.Tags.Intersect(artist.Tags).Any())
{ {
_logger.Debug("Notification and series have one or more intersecting tags."); _logger.Debug("Notification and series have one or more intersecting tags.");
return true; return true;
} }
//TODO: this message could be more clear //TODO: this message could be more clear
_logger.Debug("{0} does not have any intersecting tags with {1}. Notification will not be sent.", definition.Name, series.Title); _logger.Debug("{0} does not have any intersecting tags with {1}. Notification will not be sent.", definition.Name, artist.Name);
return false; return false;
} }
public void Handle(EpisodeGrabbedEvent message) public void Handle(AlbumGrabbedEvent message)
{ {
var grabMessage = new GrabMessage var grabMessage = new GrabMessage
{ {
Message = GetMessage(message.Episode.Series, message.Episode.Episodes, message.Episode.ParsedEpisodeInfo.Quality), Message = GetMessage(message.Album.Artist, message.Album.Albums, message.Album.ParsedAlbumInfo.Quality),
Series = message.Episode.Series, Artist = message.Album.Artist,
Quality = message.Episode.ParsedEpisodeInfo.Quality, Quality = message.Album.ParsedAlbumInfo.Quality,
Episode = message.Episode Album = message.Album
}; };
foreach (var notification in _notificationFactory.OnGrabEnabled()) foreach (var notification in _notificationFactory.OnGrabEnabled())
{ {
try try
{ {
if (!ShouldHandleSeries(notification.Definition, message.Episode.Series)) continue; if (!ShouldHandleArtist(notification.Definition, message.Album.Artist)) continue;
notification.OnGrab(grabMessage); notification.OnGrab(grabMessage);
} }
@ -111,20 +106,20 @@ namespace NzbDrone.Core.Notifications
} }
} }
public void Handle(EpisodeDownloadedEvent message) public void Handle(TrackDownloadedEvent message)
{ {
var downloadMessage = new DownloadMessage(); var downloadMessage = new DownloadMessage();
downloadMessage.Message = GetMessage(message.Episode.Series, message.Episode.Episodes, message.Episode.Quality); downloadMessage.Message = GetTrackMessage(message.Track.Artist, message.Track.Tracks, message.Track.Quality);
downloadMessage.Series = message.Episode.Series; downloadMessage.Artist = message.Track.Artist;
downloadMessage.EpisodeFile = message.EpisodeFile; downloadMessage.TrackFile = message.TrackFile;
downloadMessage.OldFiles = message.OldFiles; downloadMessage.OldFiles = message.OldFiles;
downloadMessage.SourcePath = message.Episode.Path; downloadMessage.SourcePath = message.Track.Path;
foreach (var notification in _notificationFactory.OnDownloadEnabled()) foreach (var notification in _notificationFactory.OnDownloadEnabled())
{ {
try try
{ {
if (ShouldHandleSeries(notification.Definition, message.Episode.Series)) if (ShouldHandleArtist(notification.Definition, message.Track.Artist))
{ {
if (downloadMessage.OldFiles.Empty() || ((NotificationDefinition)notification.Definition).OnUpgrade) if (downloadMessage.OldFiles.Empty() || ((NotificationDefinition)notification.Definition).OnUpgrade)
{ {
@ -140,15 +135,15 @@ namespace NzbDrone.Core.Notifications
} }
} }
public void Handle(SeriesRenamedEvent message) public void Handle(ArtistRenamedEvent message)
{ {
foreach (var notification in _notificationFactory.OnRenameEnabled()) foreach (var notification in _notificationFactory.OnRenameEnabled())
{ {
try try
{ {
if (ShouldHandleSeries(notification.Definition, message.Series)) if (ShouldHandleArtist(notification.Definition, message.Artist))
{ {
notification.OnRename(message.Series); notification.OnRename(message.Artist);
} }
} }

@ -18,12 +18,12 @@ namespace NzbDrone.Core.Notifications.NotifyMyAndroid
public override void OnGrab(GrabMessage grabMessage) public override void OnGrab(GrabMessage grabMessage)
{ {
_proxy.SendNotification(EPISODE_GRABBED_TITLE, grabMessage.Message, Settings.ApiKey, (NotifyMyAndroidPriority)Settings.Priority); _proxy.SendNotification(ALBUM_GRABBED_TITLE, grabMessage.Message, Settings.ApiKey, (NotifyMyAndroidPriority)Settings.Priority);
} }
public override void OnDownload(DownloadMessage message) public override void OnDownload(DownloadMessage message)
{ {
_proxy.SendNotification(EPISODE_DOWNLOADED_TITLE, message.Message, Settings.ApiKey, (NotifyMyAndroidPriority)Settings.Priority); _proxy.SendNotification(TRACK_DOWNLOADED_TITLE, message.Message, Settings.ApiKey, (NotifyMyAndroidPriority)Settings.Priority);
} }
public override ValidationResult Test() public override ValidationResult Test()

@ -19,12 +19,12 @@ namespace NzbDrone.Core.Notifications.Plex
public override void OnGrab(GrabMessage grabMessage) public override void OnGrab(GrabMessage grabMessage)
{ {
_plexClientService.Notify(Settings, EPISODE_GRABBED_TITLE_BRANDED, grabMessage.Message); _plexClientService.Notify(Settings, ALBUM_GRABBED_TITLE_BRANDED, grabMessage.Message);
} }
public override void OnDownload(DownloadMessage message) public override void OnDownload(DownloadMessage message)
{ {
_plexClientService.Notify(Settings, EPISODE_DOWNLOADED_TITLE_BRANDED, message.Message); _plexClientService.Notify(Settings, TRACK_DOWNLOADED_TITLE_BRANDED, message.Message);
} }

@ -24,12 +24,12 @@ namespace NzbDrone.Core.Notifications.Plex
public override void OnGrab(GrabMessage grabMessage) public override void OnGrab(GrabMessage grabMessage)
{ {
Notify(Settings, EPISODE_GRABBED_TITLE_BRANDED, grabMessage.Message); Notify(Settings, ALBUM_GRABBED_TITLE_BRANDED, grabMessage.Message);
} }
public override void OnDownload(DownloadMessage message) public override void OnDownload(DownloadMessage message)
{ {
Notify(Settings, EPISODE_DOWNLOADED_TITLE_BRANDED, message.Message); Notify(Settings, TRACK_DOWNLOADED_TITLE_BRANDED, message.Message);
} }
public override ValidationResult Test() public override ValidationResult Test()

@ -1,7 +1,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using FluentValidation.Results; using FluentValidation.Results;
using NzbDrone.Common.Extensions; using NzbDrone.Common.Extensions;
using NzbDrone.Core.Tv; using NzbDrone.Core.Music;
namespace NzbDrone.Core.Notifications.Plex namespace NzbDrone.Core.Notifications.Plex
{ {
@ -19,19 +19,19 @@ namespace NzbDrone.Core.Notifications.Plex
public override void OnDownload(DownloadMessage message) public override void OnDownload(DownloadMessage message)
{ {
UpdateIfEnabled(message.Series); UpdateIfEnabled(message.Artist);
} }
public override void OnRename(Series series) public override void OnRename(Artist artist)
{ {
UpdateIfEnabled(series); UpdateIfEnabled(artist);
} }
private void UpdateIfEnabled(Series series) private void UpdateIfEnabled(Artist artist)
{ {
if (Settings.UpdateLibrary) if (Settings.UpdateLibrary)
{ {
_plexServerService.UpdateLibrary(series, Settings); _plexServerService.UpdateLibrary(artist, Settings);
} }
} }

@ -1,4 +1,4 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Net; using System.Net;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
@ -21,7 +21,7 @@ namespace NzbDrone.Core.Notifications.Plex
void UpdateSeries(int metadataId, PlexServerSettings settings); void UpdateSeries(int metadataId, PlexServerSettings settings);
string Version(PlexServerSettings settings); string Version(PlexServerSettings settings);
List<PlexPreference> Preferences(PlexServerSettings settings); List<PlexPreference> Preferences(PlexServerSettings settings);
int? GetMetadataId(int sectionId, int tvdbId, string language, PlexServerSettings settings); int? GetMetadataId(int sectionId, string mdId, string language, PlexServerSettings settings);
} }
public class PlexServerProxy : IPlexServerProxy public class PlexServerProxy : IPlexServerProxy
@ -128,9 +128,9 @@ namespace NzbDrone.Core.Notifications.Plex
.Preferences; .Preferences;
} }
public int? GetMetadataId(int sectionId, int tvdbId, string language, PlexServerSettings settings) public int? GetMetadataId(int sectionId, string mbId, string language, PlexServerSettings settings)
{ {
var guid = string.Format("com.plexapp.agents.thetvdb://{0}?lang={1}", tvdbId, language); var guid = string.Format("com.plexapp.agents.lastfm://{0}?lang={1}", mbId, language); // TODO Plex Route for MB? LastFM?
var resource = string.Format("library/sections/{0}/all?guid={1}", sectionId, System.Web.HttpUtility.UrlEncode(guid)); var resource = string.Format("library/sections/{0}/all?guid={1}", sectionId, System.Web.HttpUtility.UrlEncode(guid));
var request = GetPlexServerRequest(resource, Method.GET, settings); var request = GetPlexServerRequest(resource, Method.GET, settings);
var client = GetPlexServerClient(settings); var client = GetPlexServerClient(settings);

@ -1,4 +1,4 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
@ -7,13 +7,13 @@ using NLog;
using NzbDrone.Common.Cache; using NzbDrone.Common.Cache;
using NzbDrone.Common.Extensions; using NzbDrone.Common.Extensions;
using NzbDrone.Core.Notifications.Plex.Models; using NzbDrone.Core.Notifications.Plex.Models;
using NzbDrone.Core.Tv; using NzbDrone.Core.Music;
namespace NzbDrone.Core.Notifications.Plex namespace NzbDrone.Core.Notifications.Plex
{ {
public interface IPlexServerService public interface IPlexServerService
{ {
void UpdateLibrary(Series series, PlexServerSettings settings); void UpdateLibrary(Artist artist, PlexServerSettings settings);
ValidationFailure Test(PlexServerSettings settings); ValidationFailure Test(PlexServerSettings settings);
} }
@ -32,7 +32,7 @@ namespace NzbDrone.Core.Notifications.Plex
_logger = logger; _logger = logger;
} }
public void UpdateLibrary(Series series, PlexServerSettings settings) public void UpdateLibrary(Artist artist, PlexServerSettings settings)
{ {
try try
{ {
@ -46,7 +46,7 @@ namespace NzbDrone.Core.Notifications.Plex
if (partialUpdates) if (partialUpdates)
{ {
UpdatePartialSection(series, sections, settings); UpdatePartialSection(artist, sections, settings);
} }
else else
@ -130,17 +130,17 @@ namespace NzbDrone.Core.Notifications.Plex
_plexServerProxy.Update(sectionId, settings); _plexServerProxy.Update(sectionId, settings);
} }
private void UpdatePartialSection(Series series, List<PlexSection> sections, PlexServerSettings settings) private void UpdatePartialSection(Artist artist, List<PlexSection> sections, PlexServerSettings settings)
{ {
var partiallyUpdated = false; var partiallyUpdated = false;
foreach (var section in sections) foreach (var section in sections)
{ {
var metadataId = GetMetadataId(section.Id, series, section.Language, settings); var metadataId = GetMetadataId(section.Id, artist, section.Language, settings);
if (metadataId.HasValue) if (metadataId.HasValue)
{ {
_logger.Debug("Updating Plex host: {0}, Section: {1}, Series: {2}", settings.Host, section.Id, series); _logger.Debug("Updating Plex host: {0}, Section: {1}, Artist: {2}", settings.Host, section.Id, artist);
_plexServerProxy.UpdateSeries(metadataId.Value, settings); _plexServerProxy.UpdateSeries(metadataId.Value, settings);
partiallyUpdated = true; partiallyUpdated = true;
@ -150,16 +150,16 @@ namespace NzbDrone.Core.Notifications.Plex
// Only update complete sections if all partial updates failed // Only update complete sections if all partial updates failed
if (!partiallyUpdated) if (!partiallyUpdated)
{ {
_logger.Debug("Unable to update partial section, updating all TV sections"); _logger.Debug("Unable to update partial section, updating all Music sections");
sections.ForEach(s => UpdateSection(s.Id, settings)); sections.ForEach(s => UpdateSection(s.Id, settings));
} }
} }
private int? GetMetadataId(int sectionId, Series series, string language, PlexServerSettings settings) private int? GetMetadataId(int sectionId, Artist artist, string language, PlexServerSettings settings)
{ {
_logger.Debug("Getting metadata from Plex host: {0} for series: {1}", settings.Host, series); _logger.Debug("Getting metadata from Plex host: {0} for series: {1}", settings.Host, artist);
return _plexServerProxy.GetMetadataId(sectionId, series.TvdbId, language, settings); return _plexServerProxy.GetMetadataId(sectionId, artist.ForeignArtistId, language, settings);
} }
public ValidationFailure Test(PlexServerSettings settings) public ValidationFailure Test(PlexServerSettings settings)
@ -170,7 +170,7 @@ namespace NzbDrone.Core.Notifications.Plex
if (sections.Empty()) if (sections.Empty())
{ {
return new ValidationFailure("Host", "At least one TV library is required"); return new ValidationFailure("Host", "At least one Music library is required");
} }
} }
catch(PlexAuthenticationException ex) catch(PlexAuthenticationException ex)

@ -20,12 +20,12 @@ namespace NzbDrone.Core.Notifications.Prowl
public override void OnGrab(GrabMessage grabMessage) public override void OnGrab(GrabMessage grabMessage)
{ {
_prowlService.SendNotification(EPISODE_GRABBED_TITLE, grabMessage.Message, Settings.ApiKey, (NotificationPriority)Settings.Priority); _prowlService.SendNotification(ALBUM_GRABBED_TITLE, grabMessage.Message, Settings.ApiKey, (NotificationPriority)Settings.Priority);
} }
public override void OnDownload(DownloadMessage message) public override void OnDownload(DownloadMessage message)
{ {
_prowlService.SendNotification(EPISODE_DOWNLOADED_TITLE, message.Message, Settings.ApiKey, (NotificationPriority)Settings.Priority); _prowlService.SendNotification(TRACK_DOWNLOADED_TITLE, message.Message, Settings.ApiKey, (NotificationPriority)Settings.Priority);
} }
public override ValidationResult Test() public override ValidationResult Test()

@ -19,12 +19,12 @@ namespace NzbDrone.Core.Notifications.PushBullet
public override void OnGrab(GrabMessage grabMessage) public override void OnGrab(GrabMessage grabMessage)
{ {
_proxy.SendNotification(EPISODE_GRABBED_TITLE_BRANDED, grabMessage.Message, Settings); _proxy.SendNotification(ALBUM_GRABBED_TITLE_BRANDED, grabMessage.Message, Settings);
} }
public override void OnDownload(DownloadMessage message) public override void OnDownload(DownloadMessage message)
{ {
_proxy.SendNotification(EPISODE_DOWNLOADED_TITLE_BRANDED, message.Message, Settings); _proxy.SendNotification(TRACK_DOWNLOADED_TITLE_BRANDED, message.Message, Settings);
} }
public override ValidationResult Test() public override ValidationResult Test()

@ -19,12 +19,12 @@ namespace NzbDrone.Core.Notifications.Pushalot
public override void OnGrab(GrabMessage grabMessage) public override void OnGrab(GrabMessage grabMessage)
{ {
_proxy.SendNotification(EPISODE_GRABBED_TITLE, grabMessage.Message, Settings); _proxy.SendNotification(ALBUM_GRABBED_TITLE, grabMessage.Message, Settings);
} }
public override void OnDownload(DownloadMessage message) public override void OnDownload(DownloadMessage message)
{ {
_proxy.SendNotification(EPISODE_DOWNLOADED_TITLE, message.Message, Settings); _proxy.SendNotification(TRACK_DOWNLOADED_TITLE, message.Message, Settings);
} }

@ -18,12 +18,12 @@ namespace NzbDrone.Core.Notifications.Pushover
public override void OnGrab(GrabMessage grabMessage) public override void OnGrab(GrabMessage grabMessage)
{ {
_proxy.SendNotification(EPISODE_GRABBED_TITLE, grabMessage.Message, Settings); _proxy.SendNotification(ALBUM_GRABBED_TITLE, grabMessage.Message, Settings);
} }
public override void OnDownload(DownloadMessage message) public override void OnDownload(DownloadMessage message)
{ {
_proxy.SendNotification(EPISODE_DOWNLOADED_TITLE, message.Message, Settings); _proxy.SendNotification(TRACK_DOWNLOADED_TITLE, message.Message, Settings);
} }
public override ValidationResult Test() public override ValidationResult Test()

@ -1,11 +1,11 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using FluentValidation.Results; using FluentValidation.Results;
using NLog; using NLog;
using NzbDrone.Common.Extensions; using NzbDrone.Common.Extensions;
using NzbDrone.Core.Notifications.Slack.Payloads; using NzbDrone.Core.Notifications.Slack.Payloads;
using NzbDrone.Core.Rest; using NzbDrone.Core.Rest;
using NzbDrone.Core.Tv; using NzbDrone.Core.Music;
using NzbDrone.Core.Validation; using NzbDrone.Core.Validation;
using RestSharp; using RestSharp;
@ -36,7 +36,7 @@ namespace NzbDrone.Core.Notifications.Slack
new Attachment new Attachment
{ {
Fallback = message.Message, Fallback = message.Message,
Title = message.Series.Title, Title = message.Artist.Name,
Text = message.Message, Text = message.Message,
Color = "warning" Color = "warning"
} }
@ -58,7 +58,7 @@ namespace NzbDrone.Core.Notifications.Slack
new Attachment new Attachment
{ {
Fallback = message.Message, Fallback = message.Message,
Title = message.Series.Title, Title = message.Artist.Name,
Text = message.Message, Text = message.Message,
Color = "good" Color = "good"
} }
@ -68,7 +68,7 @@ namespace NzbDrone.Core.Notifications.Slack
NotifySlack(payload); NotifySlack(payload);
} }
public override void OnRename(Series series) public override void OnRename(Artist artist)
{ {
var payload = new SlackPayload var payload = new SlackPayload
{ {
@ -79,7 +79,7 @@ namespace NzbDrone.Core.Notifications.Slack
{ {
new Attachment new Attachment
{ {
Title = series.Title, Title = artist.Name,
} }
} }
}; };

@ -1,9 +1,9 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using FluentValidation.Results; using FluentValidation.Results;
using NzbDrone.Common.EnvironmentInfo; using NzbDrone.Common.EnvironmentInfo;
using NzbDrone.Common.Extensions; using NzbDrone.Common.Extensions;
using NzbDrone.Core.Tv; using NzbDrone.Core.Music;
namespace NzbDrone.Core.Notifications.Synology namespace NzbDrone.Core.Notifications.Synology
{ {
@ -26,24 +26,24 @@ namespace NzbDrone.Core.Notifications.Synology
{ {
foreach (var oldFile in message.OldFiles) foreach (var oldFile in message.OldFiles)
{ {
var fullPath = Path.Combine(message.Series.Path, oldFile.RelativePath); var fullPath = Path.Combine(message.Artist.Path, oldFile.RelativePath);
_indexerProxy.DeleteFile(fullPath); _indexerProxy.DeleteFile(fullPath);
} }
{ {
var fullPath = Path.Combine(message.Series.Path, message.EpisodeFile.RelativePath); var fullPath = Path.Combine(message.Artist.Path, message.TrackFile.RelativePath);
_indexerProxy.AddFile(fullPath); _indexerProxy.AddFile(fullPath);
} }
} }
} }
public override void OnRename(Series series) public override void OnRename(Artist artist)
{ {
if (Settings.UpdateLibrary) if (Settings.UpdateLibrary)
{ {
_indexerProxy.UpdateFolder(series.Path); _indexerProxy.UpdateFolder(artist.Path);
} }
} }

@ -18,12 +18,12 @@ namespace NzbDrone.Core.Notifications.Telegram
public override void OnGrab(GrabMessage grabMessage) public override void OnGrab(GrabMessage grabMessage)
{ {
_proxy.SendNotification(EPISODE_GRABBED_TITLE, grabMessage.Message, Settings); _proxy.SendNotification(ALBUM_GRABBED_TITLE, grabMessage.Message, Settings);
} }
public override void OnDownload(DownloadMessage message) public override void OnDownload(DownloadMessage message)
{ {
_proxy.SendNotification(EPISODE_DOWNLOADED_TITLE, message.Message, Settings); _proxy.SendNotification(TRACK_DOWNLOADED_TITLE, message.Message, Settings);
} }
public override ValidationResult Test() public override ValidationResult Test()

@ -1,7 +1,7 @@

using System.Collections.Generic; using System.Collections.Generic;
using FluentValidation.Results; using FluentValidation.Results;
using NzbDrone.Core.Tv; using NzbDrone.Core.Music;
using NzbDrone.Common.Extensions; using NzbDrone.Common.Extensions;
namespace NzbDrone.Core.Notifications.Webhook namespace NzbDrone.Core.Notifications.Webhook
@ -19,17 +19,17 @@ namespace NzbDrone.Core.Notifications.Webhook
public override void OnGrab(GrabMessage message) public override void OnGrab(GrabMessage message)
{ {
_service.OnGrab(message.Series, message.Episode, message.Quality, Settings); _service.OnGrab(message.Artist, message.Album, message.Quality, Settings);
} }
public override void OnDownload(DownloadMessage message) public override void OnDownload(DownloadMessage message)
{ {
_service.OnDownload(message.Series, message.EpisodeFile, Settings); _service.OnDownload(message.Artist, message.TrackFile, Settings);
} }
public override void OnRename(Series series) public override void OnRename(Artist artist)
{ {
_service.OnRename(series, Settings); _service.OnRename(artist, Settings);
} }
public override string Name => "Webhook"; public override string Name => "Webhook";

@ -0,0 +1,26 @@
using NzbDrone.Core.Music;
using System;
namespace NzbDrone.Core.Notifications.Webhook
{
public class WebhookAlbum
{
public WebhookAlbum() { }
public WebhookAlbum(Album album)
{
Id = album.Id;
Title = album.Title;
ReleaseDate = album.ReleaseDate;
}
public int Id { get; set; }
public string Title { get; set; }
public DateTime? ReleaseDate { get; set; }
public string Quality { get; set; }
public int QualityVersion { get; set; }
public string ReleaseGroup { get; set; }
public string SceneName { get; set; }
}
}

@ -0,0 +1,22 @@
using NzbDrone.Core.Music;
namespace NzbDrone.Core.Notifications.Webhook
{
public class WebhookArtist
{
public int Id { get; set; }
public string Title { get; set; }
public string Path { get; set; }
public string MBId { get; set; }
public WebhookArtist() { }
public WebhookArtist(Artist artist)
{
Id = artist.Id;
Title = artist.Name;
Path = artist.Path;
MBId = artist.ForeignArtistId;
}
}
}

@ -1,32 +0,0 @@
using NzbDrone.Core.Tv;
using System;
namespace NzbDrone.Core.Notifications.Webhook
{
public class WebhookEpisode
{
public WebhookEpisode() { }
public WebhookEpisode(Episode episode)
{
Id = episode.Id;
SeasonNumber = episode.SeasonNumber;
EpisodeNumber = episode.EpisodeNumber;
Title = episode.Title;
AirDate = episode.AirDate;
AirDateUtc = episode.AirDateUtc;
}
public int Id { get; set; }
public int EpisodeNumber { get; set; }
public int SeasonNumber { get; set; }
public string Title { get; set; }
public string AirDate { get; set; }
public DateTime? AirDateUtc { get; set; }
public string Quality { get; set; }
public int QualityVersion { get; set; }
public string ReleaseGroup { get; set; }
public string SceneName { get; set; }
}
}

@ -1,11 +1,11 @@
using System.Collections.Generic; using System.Collections.Generic;
namespace NzbDrone.Core.Notifications.Webhook namespace NzbDrone.Core.Notifications.Webhook
{ {
public class WebhookPayload public class WebhookPayload
{ {
public string EventType { get; set; } public string EventType { get; set; }
public WebhookSeries Series { get; set; } public WebhookArtist Artist { get; set; }
public List<WebhookEpisode> Episodes { get; set; } public List<WebhookAlbum> Albums { get; set; }
} }
} }

@ -1,22 +0,0 @@
using NzbDrone.Core.Tv;
namespace NzbDrone.Core.Notifications.Webhook
{
public class WebhookSeries
{
public int Id { get; set; }
public string Title { get; set; }
public string Path { get; set; }
public int TvdbId { get; set; }
public WebhookSeries() { }
public WebhookSeries(Series series)
{
Id = series.Id;
Title = series.Title;
Path = series.Path;
TvdbId = series.TvdbId;
}
}
}

@ -1,6 +1,6 @@
using FluentValidation.Results; using FluentValidation.Results;
using NzbDrone.Core.MediaFiles; using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.Tv; using NzbDrone.Core.Music;
using NzbDrone.Core.Validation; using NzbDrone.Core.Validation;
using NzbDrone.Core.Rest; using NzbDrone.Core.Rest;
using RestSharp; using RestSharp;
@ -12,53 +12,53 @@ namespace NzbDrone.Core.Notifications.Webhook
{ {
public interface IWebhookService public interface IWebhookService
{ {
void OnDownload(Series series, EpisodeFile episodeFile, WebhookSettings settings); void OnDownload(Artist artist, TrackFile trackFile, WebhookSettings settings);
void OnRename(Series series, WebhookSettings settings); void OnRename(Artist artist, WebhookSettings settings);
void OnGrab(Series series, RemoteEpisode episode, QualityModel quality, WebhookSettings settings); void OnGrab(Artist artist, RemoteAlbum album, QualityModel quality, WebhookSettings settings);
ValidationFailure Test(WebhookSettings settings); ValidationFailure Test(WebhookSettings settings);
} }
public class WebhookService : IWebhookService public class WebhookService : IWebhookService
{ {
public void OnDownload(Series series, EpisodeFile episodeFile, WebhookSettings settings) public void OnDownload(Artist artist, TrackFile trackFile, WebhookSettings settings)
{ {
var payload = new WebhookPayload var payload = new WebhookPayload
{ {
EventType = "Download", EventType = "Download",
Series = new WebhookSeries(series), Artist = new WebhookArtist(artist),
Episodes = episodeFile.Episodes.Value.ConvertAll(x => new WebhookEpisode(x) { Albums = trackFile.Tracks.Value.ConvertAll(x => new WebhookAlbum(x.Album) {
Quality = episodeFile.Quality.Quality.Name, Quality = trackFile.Quality.Quality.Name,
QualityVersion = episodeFile.Quality.Revision.Version, QualityVersion = trackFile.Quality.Revision.Version,
ReleaseGroup = episodeFile.ReleaseGroup, ReleaseGroup = trackFile.ReleaseGroup,
SceneName = episodeFile.SceneName SceneName = trackFile.SceneName
}) })
}; };
NotifyWebhook(payload, settings); NotifyWebhook(payload, settings);
} }
public void OnRename(Series series, WebhookSettings settings) public void OnRename(Artist artist, WebhookSettings settings)
{ {
var payload = new WebhookPayload var payload = new WebhookPayload
{ {
EventType = "Rename", EventType = "Rename",
Series = new WebhookSeries(series) Artist = new WebhookArtist(artist)
}; };
NotifyWebhook(payload, settings); NotifyWebhook(payload, settings);
} }
public void OnGrab(Series series, RemoteEpisode episode, QualityModel quality, WebhookSettings settings) public void OnGrab(Artist artist, RemoteAlbum album, QualityModel quality, WebhookSettings settings)
{ {
var payload = new WebhookPayload var payload = new WebhookPayload
{ {
EventType = "Grab", EventType = "Grab",
Series = new WebhookSeries(series), Artist = new WebhookArtist(artist),
Episodes = episode.Episodes.ConvertAll(x => new WebhookEpisode(x) Albums = album.Albums.ConvertAll(x => new WebhookAlbum(x)
{ {
Quality = quality.Quality.Name, Quality = quality.Quality.Name,
QualityVersion = quality.Revision.Version, QualityVersion = quality.Revision.Version,
ReleaseGroup = episode.ParsedEpisodeInfo.ReleaseGroup ReleaseGroup = album.ParsedAlbumInfo.ReleaseGroup
}) })
}; };
NotifyWebhook(payload, settings); NotifyWebhook(payload, settings);
@ -87,19 +87,17 @@ namespace NzbDrone.Core.Notifications.Webhook
new WebhookPayload new WebhookPayload
{ {
EventType = "Test", EventType = "Test",
Series = new WebhookSeries() Artist = new WebhookArtist()
{ {
Id = 1, Id = 1,
Title = "Test Title", Title = "Test Title",
Path = "C:\\testpath", Path = "C:\\testpath",
TvdbId = 1234 MBId = "1234"
}, },
Episodes = new List<WebhookEpisode>() { Albums = new List<WebhookAlbum>() {
new WebhookEpisode() new WebhookAlbum()
{ {
Id = 123, Id = 123,
EpisodeNumber = 1,
SeasonNumber = 1,
Title = "Test title" Title = "Test title"
} }
} }

@ -1,4 +1,4 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
@ -6,7 +6,7 @@ using System.Xml.Linq;
using NLog; using NLog;
using NzbDrone.Common.Http; using NzbDrone.Common.Http;
using NzbDrone.Core.Notifications.Xbmc.Model; using NzbDrone.Core.Notifications.Xbmc.Model;
using NzbDrone.Core.Tv; using NzbDrone.Core.Music;
namespace NzbDrone.Core.Notifications.Xbmc namespace NzbDrone.Core.Notifications.Xbmc
{ {
@ -34,7 +34,7 @@ namespace NzbDrone.Core.Notifications.Xbmc
SendCommand(settings, command); SendCommand(settings, command);
} }
public void Update(XbmcSettings settings, Series series) public void Update(XbmcSettings settings, Artist artist)
{ {
if (!settings.AlwaysUpdate) if (!settings.AlwaysUpdate)
{ {
@ -48,7 +48,7 @@ namespace NzbDrone.Core.Notifications.Xbmc
} }
} }
UpdateLibrary(settings, series); UpdateLibrary(settings, artist);
} }
public void Clean(XbmcSettings settings) public void Clean(XbmcSettings settings)
@ -80,12 +80,12 @@ namespace NzbDrone.Core.Notifications.Xbmc
return new List<ActivePlayer>(); return new List<ActivePlayer>();
} }
internal string GetSeriesPath(XbmcSettings settings, Series series) internal string GetSeriesPath(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, tvshow, tvshowlinkpath where tvshow.c12 = {0} and tvshowlinkpath.idShow = tvshow.idShow and tvshowlinkpath.idPath = path.idPath",
series.TvdbId); artist.ForeignArtistId);
var command = string.Format("QueryVideoDatabase({0})", query); var command = string.Format("QueryVideoDatabase({0})", query);
const string setResponseCommand = const string setResponseCommand =
@ -137,17 +137,17 @@ namespace NzbDrone.Core.Notifications.Xbmc
return false; return false;
} }
private void UpdateLibrary(XbmcSettings settings, Series series) private void UpdateLibrary(XbmcSettings settings, Artist artist)
{ {
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, series); var xbmcSeriesPath = GetSeriesPath(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(xbmcSeriesPath))
{ {
_logger.Debug("Updating series [{0}] on XBMC host: {1}", series, 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(video,{0})", xbmcSeriesPath));
SendCommand(settings, command); SendCommand(settings, command);
} }
@ -155,7 +155,7 @@ namespace NzbDrone.Core.Notifications.Xbmc
else else
{ {
//Update the entire library //Update the entire library
_logger.Debug("Series [{0}] doesn't exist on XBMC host: {1}, Updating Entire Library", series, 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(video)");
SendCommand(settings, command); SendCommand(settings, command);
} }

@ -1,12 +1,12 @@
using NzbDrone.Core.Notifications.Xbmc.Model; using NzbDrone.Core.Notifications.Xbmc.Model;
using NzbDrone.Core.Tv; using NzbDrone.Core.Music;
namespace NzbDrone.Core.Notifications.Xbmc namespace NzbDrone.Core.Notifications.Xbmc
{ {
public interface IApiProvider public interface IApiProvider
{ {
void Notify(XbmcSettings settings, string title, string message); void Notify(XbmcSettings settings, string title, string message);
void Update(XbmcSettings settings, Series series); void Update(XbmcSettings settings, Artist artist);
void Clean(XbmcSettings settings); void Clean(XbmcSettings settings);
bool CanHandle(XbmcVersion version); bool CanHandle(XbmcVersion version);
} }

@ -1,9 +1,9 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using NLog; using NLog;
using NzbDrone.Core.Notifications.Xbmc.Model; using NzbDrone.Core.Notifications.Xbmc.Model;
using NzbDrone.Core.Tv; using NzbDrone.Core.Music;
namespace NzbDrone.Core.Notifications.Xbmc namespace NzbDrone.Core.Notifications.Xbmc
{ {
@ -28,7 +28,7 @@ namespace NzbDrone.Core.Notifications.Xbmc
_proxy.Notify(settings, title, message); _proxy.Notify(settings, title, message);
} }
public void Update(XbmcSettings settings, Series series) public void Update(XbmcSettings settings, Artist artist)
{ {
if (!settings.AlwaysUpdate) if (!settings.AlwaysUpdate)
{ {
@ -42,7 +42,7 @@ namespace NzbDrone.Core.Notifications.Xbmc
} }
} }
UpdateLibrary(settings, series); UpdateLibrary(settings, artist);
} }
public void Clean(XbmcSettings settings) public void Clean(XbmcSettings settings)
@ -55,22 +55,22 @@ namespace NzbDrone.Core.Notifications.Xbmc
return _proxy.GetActivePlayers(settings); return _proxy.GetActivePlayers(settings);
} }
public string GetSeriesPath(XbmcSettings settings, Series series) public string GetSeriesPath(XbmcSettings settings, Artist artist)
{ {
var allSeries = _proxy.GetSeries(settings); var allSeries = _proxy.GetArtist(settings);
if (!allSeries.Any()) if (!allSeries.Any())
{ {
_logger.Debug("No TV shows returned from XBMC"); _logger.Debug("No Artists returned from XBMC");
return null; return null;
} }
var matchingSeries = allSeries.FirstOrDefault(s => var matchingSeries = allSeries.FirstOrDefault(s =>
{ {
var tvdbId = 0; var tvdbId = "0";
int.TryParse(s.ImdbNumber, out tvdbId); //int.TryParse(s.ImdbNumber, out tvdbId);
return tvdbId == series.TvdbId || s.Label == series.Title; return tvdbId == artist.ForeignArtistId || s.Label == artist.Name;
}); });
if (matchingSeries != null) return matchingSeries.File; if (matchingSeries != null) return matchingSeries.File;
@ -78,20 +78,20 @@ namespace NzbDrone.Core.Notifications.Xbmc
return null; return null;
} }
private void UpdateLibrary(XbmcSettings settings, Series series) private void UpdateLibrary(XbmcSettings settings, Artist artist)
{ {
try try
{ {
var seriesPath = GetSeriesPath(settings, series); var seriesPath = GetSeriesPath(settings, artist);
if (seriesPath != null) if (seriesPath != null)
{ {
_logger.Debug("Updating series {0} (Path: {1}) on XBMC host: {2}", series, seriesPath, settings.Address); _logger.Debug("Updating artist {0} (Path: {1}) on XBMC host: {2}", artist, seriesPath, settings.Address);
} }
else else
{ {
_logger.Debug("Series {0} doesn't exist on XBMC host: {1}, Updating Entire Library", series, _logger.Debug("Artist {0} doesn't exist on XBMC host: {1}, Updating Entire Library", artist,
settings.Address); settings.Address);
} }

@ -1,10 +1,10 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Net.Sockets; using System.Net.Sockets;
using FluentValidation.Results; using FluentValidation.Results;
using NLog; using NLog;
using NzbDrone.Common.Extensions; using NzbDrone.Common.Extensions;
using NzbDrone.Core.Tv; using NzbDrone.Core.Music;
namespace NzbDrone.Core.Notifications.Xbmc namespace NzbDrone.Core.Notifications.Xbmc
{ {
@ -33,12 +33,12 @@ namespace NzbDrone.Core.Notifications.Xbmc
const string header = "Lidarr - Downloaded"; const string header = "Lidarr - Downloaded";
Notify(Settings, header, message.Message); Notify(Settings, header, message.Message);
UpdateAndClean(message.Series, message.OldFiles.Any()); UpdateAndClean(message.Artist, message.OldFiles.Any());
} }
public override void OnRename(Series series) public override void OnRename(Artist artist)
{ {
UpdateAndClean(series); UpdateAndClean(artist);
} }
public override string Name => "Kodi (XBMC)"; public override string Name => "Kodi (XBMC)";
@ -68,13 +68,13 @@ namespace NzbDrone.Core.Notifications.Xbmc
} }
} }
private void UpdateAndClean(Series series, bool clean = true) private void UpdateAndClean(Artist artist, bool clean = true)
{ {
try try
{ {
if (Settings.UpdateLibrary) if (Settings.UpdateLibrary)
{ {
_xbmcService.Update(Settings, series); _xbmcService.Update(Settings, artist);
} }
if (clean && Settings.CleanLibrary) if (clean && Settings.CleanLibrary)

@ -1,4 +1,4 @@
using System.Collections.Generic; using System.Collections.Generic;
using NLog; using NLog;
using NzbDrone.Common.Extensions; using NzbDrone.Common.Extensions;
using NzbDrone.Common.Serializer; using NzbDrone.Common.Serializer;
@ -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> GetSeries(XbmcSettings settings); List<TvShow> GetArtist(XbmcSettings settings);
} }
public class XbmcJsonApiProxy : IXbmcJsonApiProxy public class XbmcJsonApiProxy : IXbmcJsonApiProxy
@ -79,7 +79,7 @@ namespace NzbDrone.Core.Notifications.Xbmc
return Json.Deserialize<ActivePlayersEdenResult>(response).Result; return Json.Deserialize<ActivePlayersEdenResult>(response).Result;
} }
public List<TvShow> GetSeries(XbmcSettings settings) public List<TvShow> GetArtist(XbmcSettings settings)
{ {
var request = new RestRequest(); var request = new RestRequest();
var parameters = new Dictionary<string, object>(); var parameters = new Dictionary<string, object>();

@ -1,4 +1,4 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using FluentValidation.Results; using FluentValidation.Results;
@ -7,14 +7,14 @@ using NLog;
using NzbDrone.Common.Cache; using NzbDrone.Common.Cache;
using NzbDrone.Common.Serializer; using NzbDrone.Common.Serializer;
using NzbDrone.Core.Notifications.Xbmc.Model; using NzbDrone.Core.Notifications.Xbmc.Model;
using NzbDrone.Core.Tv; using NzbDrone.Core.Music;
namespace NzbDrone.Core.Notifications.Xbmc namespace NzbDrone.Core.Notifications.Xbmc
{ {
public interface IXbmcService public interface IXbmcService
{ {
void Notify(XbmcSettings settings, string title, string message); void Notify(XbmcSettings settings, string title, string message);
void Update(XbmcSettings settings, Series series); void Update(XbmcSettings settings, Artist artist);
void Clean(XbmcSettings settings); void Clean(XbmcSettings settings);
ValidationFailure Test(XbmcSettings settings, string message); ValidationFailure Test(XbmcSettings settings, string message);
} }
@ -45,10 +45,10 @@ namespace NzbDrone.Core.Notifications.Xbmc
provider.Notify(settings, title, message); provider.Notify(settings, title, message);
} }
public void Update(XbmcSettings settings, Series series) public void Update(XbmcSettings settings, Artist artist)
{ {
var provider = GetApiProvider(settings); var provider = GetApiProvider(settings);
provider.Update(settings, series); provider.Update(settings, artist);
} }
public void Clean(XbmcSettings settings) public void Clean(XbmcSettings settings)

@ -936,11 +936,11 @@
<Compile Include="Notifications\Telegram\TelegramSettings.cs" /> <Compile Include="Notifications\Telegram\TelegramSettings.cs" />
<Compile Include="Notifications\Twitter\OAuthToken.cs" /> <Compile Include="Notifications\Twitter\OAuthToken.cs" />
<Compile Include="Notifications\Twitter\TwitterException.cs" /> <Compile Include="Notifications\Twitter\TwitterException.cs" />
<Compile Include="Notifications\Webhook\WebhookEpisode.cs" /> <Compile Include="Notifications\Webhook\WebhookAlbum.cs" />
<Compile Include="Notifications\Webhook\WebhookException.cs" /> <Compile Include="Notifications\Webhook\WebhookException.cs" />
<Compile Include="Notifications\Webhook\WebhookMethod.cs" /> <Compile Include="Notifications\Webhook\WebhookMethod.cs" />
<Compile Include="Notifications\Webhook\WebhookPayload.cs" /> <Compile Include="Notifications\Webhook\WebhookPayload.cs" />
<Compile Include="Notifications\Webhook\WebhookSeries.cs" /> <Compile Include="Notifications\Webhook\WebhookArtist.cs" />
<Compile Include="Notifications\Webhook\WebhookService.cs" /> <Compile Include="Notifications\Webhook\WebhookService.cs" />
<Compile Include="Notifications\Webhook\WebhookSettings.cs" /> <Compile Include="Notifications\Webhook\WebhookSettings.cs" />
<Compile Include="Notifications\Webhook\Webhook.cs" /> <Compile Include="Notifications\Webhook\Webhook.cs" />

Loading…
Cancel
Save