mirror of
https://github.com/lidarr/lidarr.git
synced 2025-07-16 10:03:51 -07:00
Initial Notification Support, XBMC and PLEX still need work.
This commit is contained in:
parent
56e8f5c730
commit
864549b1f3
47 changed files with 381 additions and 399 deletions
|
@ -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,
|
|
||||||
episode.Title,
|
|
||||||
qualityString);
|
|
||||||
}
|
|
||||||
|
|
||||||
var episodeNumbers = string.Concat(episodes.Select(e => e.EpisodeNumber)
|
return string.Format("{0} - {1} - [{4}]",
|
||||||
.Select(i => string.Format("x{0:00}", i)));
|
artist.Name,
|
||||||
|
albumTitles,
|
||||||
var episodeTitles = string.Join(" + ", episodes.Select(e => e.Title));
|
|
||||||
|
|
||||||
return string.Format("{0} - {1}{2} - {3} [{4}]",
|
|
||||||
series.Title,
|
|
||||||
episodes.First().SeasonNumber,
|
|
||||||
episodeNumbers,
|
|
||||||
episodeTitles,
|
|
||||||
qualityString);
|
qualityString);
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool ShouldHandleSeries(ProviderDefinition definition, Series series)
|
private string GetTrackMessage(Artist artist, List<Track> tracks, QualityModel quality)
|
||||||
|
{
|
||||||
|
var qualityString = quality.Quality.ToString();
|
||||||
|
|
||||||
|
if (quality.Revision.Version > 1)
|
||||||
|
{
|
||||||
|
qualityString += " Proper";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
var trackTitles = string.Join(" + ", tracks.Select(e => e.Title));
|
||||||
|
|
||||||
|
return string.Format("{0} - {1} - [{4}]",
|
||||||
|
artist.Name,
|
||||||
|
trackTitles,
|
||||||
|
qualityString);
|
||||||
|
}
|
||||||
|
|
||||||
|
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";
|
||||||
|
|
26
src/NzbDrone.Core/Notifications/Webhook/WebhookAlbum.cs
Normal file
26
src/NzbDrone.Core/Notifications/Webhook/WebhookAlbum.cs
Normal file
|
@ -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; }
|
||||||
|
}
|
||||||
|
}
|
22
src/NzbDrone.Core/Notifications/Webhook/WebhookArtist.cs
Normal file
22
src/NzbDrone.Core/Notifications/Webhook/WebhookArtist.cs
Normal file
|
@ -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…
Add table
Add a link
Reference in a new issue