diff --git a/NzbDrone.Core.Test/CentralDispatchFixture.cs b/NzbDrone.Core.Test/CentralDispatchFixture.cs index 10c016a3c..76546ff52 100644 --- a/NzbDrone.Core.Test/CentralDispatchFixture.cs +++ b/NzbDrone.Core.Test/CentralDispatchFixture.cs @@ -8,7 +8,6 @@ using NCrunch.Framework; using NUnit.Framework; using NzbDrone.Common; using NzbDrone.Core.Indexers; -using NzbDrone.Core.Indexers.Providers; using NzbDrone.Core.Jobs; using NzbDrone.Core.Providers; using NzbDrone.Core.Providers.ExternalNotification; diff --git a/NzbDrone.Core.Test/IndexerTests/IndexerFixture.cs b/NzbDrone.Core.Test/IndexerTests/IndexerFixture.cs index e4fb2ae3b..23ff885cb 100644 --- a/NzbDrone.Core.Test/IndexerTests/IndexerFixture.cs +++ b/NzbDrone.Core.Test/IndexerTests/IndexerFixture.cs @@ -11,7 +11,6 @@ using Moq; using NUnit.Framework; using NzbDrone.Common; using NzbDrone.Core.Indexers; -using NzbDrone.Core.Indexers.Providers; using NzbDrone.Core.Model; using NzbDrone.Core.Providers; using NzbDrone.Core.Providers.Core; @@ -164,7 +163,7 @@ namespace NzbDrone.Core.Test.IndexerTests .With(n => n.ApiKey = String.Empty) .Build(); - Mocker.GetMock().Setup(s => s.Enabled()).Returns(newznabDefs.ToList()); + Mocker.GetMock().Setup(s => s.Enabled()).Returns(newznabDefs.ToList()); Mocker.GetMock() .Setup(h => h.DownloadStream(It.IsAny(), It.IsAny())) @@ -363,7 +362,7 @@ namespace NzbDrone.Core.Test.IndexerTests .With(n => n.ApiKey = String.Empty) .Build(); - Mocker.GetMock().Setup(s => s.Enabled()).Returns(newznabDefs.ToList()); + Mocker.GetMock().Setup(s => s.Enabled()).Returns(newznabDefs.ToList()); Mocker.GetMock() .Setup(h => h.DownloadStream(It.IsAny(), It.IsAny())) diff --git a/NzbDrone.Core.Test/IndexerTests/NzbxFixture.cs b/NzbDrone.Core.Test/IndexerTests/NzbxFixture.cs index 77c734682..fc2c5d83c 100644 --- a/NzbDrone.Core.Test/IndexerTests/NzbxFixture.cs +++ b/NzbDrone.Core.Test/IndexerTests/NzbxFixture.cs @@ -10,7 +10,7 @@ using FluentAssertions; using Moq; using NUnit.Framework; using NzbDrone.Common; -using NzbDrone.Core.Indexers.Providers; +using NzbDrone.Core.Indexers; using NzbDrone.Core.Model; using NzbDrone.Core.Providers; using NzbDrone.Core.Providers.Core; diff --git a/NzbDrone.Core.Test/Indexers/IndexerServiceTest.cs b/NzbDrone.Core.Test/Indexers/IndexerServiceTest.cs index da2269dd6..1cb6fa3d6 100644 --- a/NzbDrone.Core.Test/Indexers/IndexerServiceTest.cs +++ b/NzbDrone.Core.Test/Indexers/IndexerServiceTest.cs @@ -9,7 +9,6 @@ using Moq; using NUnit.Framework; using NzbDrone.Common; using NzbDrone.Core.Indexers; -using NzbDrone.Core.Indexers.Providers; using NzbDrone.Core.Model; using NzbDrone.Core.Providers; using NzbDrone.Core.Providers.Core; diff --git a/NzbDrone.Core.Test/Indexers/NewznabServiceTest.cs b/NzbDrone.Core.Test/Indexers/NewznabServiceTest.cs new file mode 100644 index 000000000..f55712a42 --- /dev/null +++ b/NzbDrone.Core.Test/Indexers/NewznabServiceTest.cs @@ -0,0 +1,90 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Sockets; +using System.Security.Policy; +using FizzWare.NBuilder; +using FluentAssertions; +using Moq; +using NUnit.Framework; +using NzbDrone.Core.Indexers; +using NzbDrone.Core.Test.Framework; +using NzbDrone.Test.Common; + +namespace NzbDrone.Core.Test.Indexers +{ + [TestFixture] + // ReSharper disable InconsistentNaming + public class NewznabProviderTest : CoreTest + { + private void WithInvalidName() + { + Mocker.GetMock() + .Setup(s => s.All()) + .Returns(new List{new NewznabDefinition { OID = 1, Name = "", Url = "http://www.nzbdrone.com" }}); + } + + private void WithExisting() + { + Mocker.GetMock() + .Setup(s => s.All()) + .Returns(new List { new NewznabDefinition { OID = 1, Name = "Nzbs.org", Url = "http://nzbs.org" } }); + } + + [Test] + public void InitializeNewznabIndexers_should_initialize_build_in_indexers() + { + Subject.Init(); + + Mocker.GetMock() + .Verify(s => s.Insert(It.Is(n => n.BuiltIn)), Times.Exactly(3)); + } + + [Test] + public void should_delete_indexers_without_names() + { + WithInvalidName(); + + Subject.Init(); + + Mocker.GetMock() + .Verify(s => s.Delete(1), Times.Once()); + } + + [Test] + public void should_add_new_indexers() + { + WithExisting(); + + Subject.Init(); + + Mocker.GetMock() + .Verify(s => s.Insert(It.IsAny()), Times.Exactly(2)); + } + + [Test] + public void should_update_existing() + { + WithExisting(); + + Subject.Init(); + + Mocker.GetMock() + .Verify(s => s.Update(It.IsAny()), Times.Once()); + } + + [Test] + public void CheckHostname_should_do_nothing_if_hostname_is_valid() + { + Subject.CheckHostname("http://www.google.com"); + } + + [Test] + public void CheckHostname_should_log_error_and_throw_exception_if_dnsHostname_is_invalid() + { + Assert.Throws(() => Subject.CheckHostname("http://BadName")); + + ExceptionVerification.ExpectedErrors(1); + } + } +} \ No newline at end of file diff --git a/NzbDrone.Core.Test/ProviderTests/NewznabProviderTest.cs b/NzbDrone.Core.Test/ProviderTests/NewznabProviderTest.cs deleted file mode 100644 index b1cddb326..000000000 --- a/NzbDrone.Core.Test/ProviderTests/NewznabProviderTest.cs +++ /dev/null @@ -1,220 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Net.Sockets; -using FizzWare.NBuilder; -using FluentAssertions; -using NUnit.Framework; -using NzbDrone.Core.Providers; -using NzbDrone.Core.Repository; -using NzbDrone.Core.Test.Framework; -using NzbDrone.Test.Common; - -namespace NzbDrone.Core.Test.ProviderTests -{ - [TestFixture] - // ReSharper disable InconsistentNaming - public class NewznabProviderTest : SqlCeTest - { - [SetUp] - public void SetUp() - { - WithRealDb(); - InitiateSubject(); - } - - - [Test] - public void Save_should_clean_url_before_inserting() - { - - var newznab = new NewznabDefinition { Name = "Newznab Provider", Enable = true, Url = "http://www.nzbdrone.com/gibberish/test.aspx?hello=world" }; - const string expectedUrl = "http://www.nzbdrone.com"; - - - var result = Subject.Save(newznab); - - Db.Single(result).Url.Should().Be(expectedUrl); - } - - [Test] - public void Save_should_clean_url_before_updating() - { - var newznab = new NewznabDefinition { Name = "Newznab Provider", Enable = true, Url = "http://www.nzbdrone.com/gibberish/test.aspx?hello=world" }; - - var result = Subject.Save(newznab); - - Subject.All().Single(c => c.Id == result).Url.Should().Be("http://www.nzbdrone.com"); - } - - [Test] - public void Save_should_clean_url_before_inserting_when_url_is_not_empty() - { - var newznab = new NewznabDefinition { Name = "Newznab Provider", Enable = true, Url = "" }; - - var result = Subject.Save(newznab); - - - Subject.All().Single(c => c.Id == result).Url.Should().Be(""); - } - - [Test] - public void Save_should_clean_url_before_updating_when_url_is_not_empty() - { - var newznab = new NewznabDefinition { Name = "Newznab Provider", Enable = true, Url = "" }; - var result = Subject.Save(newznab); - - Db.Single(result).Url.Should().Be(""); - } - - [Test] - [Ignore("No longer clean newznab URLs")] - public void SaveAll_should_clean_urls_before_updating() - { - - var definitions = Builder.CreateListOfSize(5) - .All() - .With(d => d.Url = "http://www.nzbdrone.com") - .Build(); - var expectedUrl = "http://www.nzbdrone.com"; - var newUrl = "http://www.nzbdrone.com/gibberish/test.aspx?hello=world"; - - - Db.InsertMany(definitions); - - definitions.ToList().ForEach(d => d.Url = newUrl); - - - Subject.SaveAll(definitions); - - - Db.Fetch().Where(d => d.Url == expectedUrl).Should().HaveCount(5); - } - - [Test] - public void Enabled_should_return_all_enabled_newznab_providers() - { - - var definitions = Builder.CreateListOfSize(5) - .TheFirst(2) - .With(d => d.Enable = false) - .TheLast(3) - .With(d => d.Enable = true) - .Build(); - - - Db.InsertMany(definitions); - - - var result = Subject.Enabled(); - - - result.Should().HaveCount(3); - result.All(d => d.Enable).Should().BeTrue(); - } - - [Test] - public void All_should_return_all_newznab_providers() - { - - var userIndexers = Builder.CreateListOfSize(5) - .All().With(c => c.Url = "http://www.host.com/12") - .Build(); - - - Db.InsertMany(userIndexers); - - var result = Subject.All(); - - result.Should().HaveCount(8); - } - - - [Test] - public void All_should_return_empty_list_when_no_indexers_exist() - { - Db.Delete(""); - - Subject.All().Should().NotBeNull(); - Subject.All().Should().BeEmpty(); - - } - - [Test] - public void Delete_should_delete_newznab_provider() - { - var toBeDelete = Subject.All()[2]; - - Subject.Delete(toBeDelete.Id); - - Subject.All().Should().NotBeEmpty(); - Subject.All().Should().NotContain(c => c.Id == toBeDelete.Id); - } - - [Test] - public void InitializeNewznabIndexers_should_initialize_build_in_indexers() - { - var indexers = Subject.All(); - - indexers.Should().NotBeEmpty(); - indexers.Should().OnlyContain(i => i.BuiltIn); - } - - [Test] - public void InitializeNewznabIndexers_should_initialize_new_indexers_only() - { - - var definitions = Builder.CreateListOfSize(5) - .All() - .With(d => d.Id = 0) - .TheFirst(2) - .With(d => d.Url = "http://www.nzbdrone2.com") - .TheLast(3) - .With(d => d.Url = "http://www.nzbdrone.com") - .Build(); - - - Db.Insert(definitions[0]); - Db.Insert(definitions[2]); - - Mocker.SetConstant>(definitions); - - - var result = Db.Fetch(); - result.Where(d => d.Url == "http://www.nzbdrone.com").Should().HaveCount(1); - result.Where(d => d.Url == "http://www.nzbdrone2.com").Should().HaveCount(1); - } - - [Test] - public void InitializeNewznabIndexers_should_not_blow_up_if_more_than_one_indexer_with_the_same_url_is_found() - { - var definition = Builder.CreateNew() - .With(d => d.Url = "http://www.nzbdrone2.com") - .With(d => d.BuiltIn = false) - .Build(); - - Db.Insert(definition); - Db.Insert(definition); - - - Mocker.SetConstant>(new List { definition }); - - var result = Db.Fetch().Where(c => c.BuiltIn == false); - result.Should().HaveCount(2); - } - - [Test] - public void CheckHostname_should_do_nothing_if_hostname_is_valid() - { - Subject.CheckHostname("http://www.google.com"); - } - - [Test] - public void CheckHostname_should_log_error_and_throw_exception_if_dnsHostname_is_invalid() - { - Assert.Throws(() => Subject.CheckHostname("http://BadName")); - - ExceptionVerification.ExpectedErrors(1); - } - } -} \ No newline at end of file diff --git a/NzbDrone.Core.Test/ProviderTests/SearchTests/PerformSearchTestBase.cs b/NzbDrone.Core.Test/ProviderTests/SearchTests/PerformSearchTestBase.cs index 4b96e196b..5446d56db 100644 --- a/NzbDrone.Core.Test/ProviderTests/SearchTests/PerformSearchTestBase.cs +++ b/NzbDrone.Core.Test/ProviderTests/SearchTests/PerformSearchTestBase.cs @@ -6,7 +6,6 @@ using FizzWare.NBuilder; using Moq; using NUnit.Framework; using NzbDrone.Core.Indexers; -using NzbDrone.Core.Indexers.Providers; using NzbDrone.Core.Tv; using NzbDrone.Core.Model; using NzbDrone.Core.Model.Notification; diff --git a/NzbDrone.Core/ContainerExtentions.cs b/NzbDrone.Core/ContainerExtentions.cs index 11faff3bb..90adcd1ef 100644 --- a/NzbDrone.Core/ContainerExtentions.cs +++ b/NzbDrone.Core/ContainerExtentions.cs @@ -6,7 +6,7 @@ using Autofac.Core; using NLog; using NzbDrone.Common; using NzbDrone.Core.Datastore; -using NzbDrone.Core.Indexers.Providers; +using NzbDrone.Core.Indexers; using NzbDrone.Core.Instrumentation; using NzbDrone.Core.Providers.ExternalNotification; using NzbDrone.Core.Providers.Metadata; diff --git a/NzbDrone.Core/Indexers/Providers/FileSharingTalk.cs b/NzbDrone.Core/Indexers/FileSharingTalk.cs similarity index 98% rename from NzbDrone.Core/Indexers/Providers/FileSharingTalk.cs rename to NzbDrone.Core/Indexers/FileSharingTalk.cs index ea39aa99a..1d70dd8da 100644 --- a/NzbDrone.Core/Indexers/Providers/FileSharingTalk.cs +++ b/NzbDrone.Core/Indexers/FileSharingTalk.cs @@ -6,7 +6,7 @@ using NzbDrone.Common; using NzbDrone.Core.Model; using NzbDrone.Core.Providers.Core; -namespace NzbDrone.Core.Indexers.Providers +namespace NzbDrone.Core.Indexers { public class FileSharingTalk : IndexerBase { diff --git a/NzbDrone.Core/Indexers/Providers/IndexerBase.cs b/NzbDrone.Core/Indexers/IndexerBase.cs similarity index 99% rename from NzbDrone.Core/Indexers/Providers/IndexerBase.cs rename to NzbDrone.Core/Indexers/IndexerBase.cs index 4051e1302..25cd7572f 100644 --- a/NzbDrone.Core/Indexers/Providers/IndexerBase.cs +++ b/NzbDrone.Core/Indexers/IndexerBase.cs @@ -9,7 +9,7 @@ using NzbDrone.Common; using NzbDrone.Core.Model; using NzbDrone.Core.Providers.Core; -namespace NzbDrone.Core.Indexers.Providers +namespace NzbDrone.Core.Indexers { public abstract class IndexerBase { diff --git a/NzbDrone.Core/Indexers/IndexerService.cs b/NzbDrone.Core/Indexers/IndexerService.cs index 3ad42643e..7200ce18d 100644 --- a/NzbDrone.Core/Indexers/IndexerService.cs +++ b/NzbDrone.Core/Indexers/IndexerService.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.Linq; using NLog; -using NzbDrone.Core.Indexers.Providers; using NzbDrone.Core.Lifecycle; using PetaPoco; diff --git a/NzbDrone.Core/Indexers/Providers/Newznab.cs b/NzbDrone.Core/Indexers/Newznab.cs similarity index 96% rename from NzbDrone.Core/Indexers/Providers/Newznab.cs rename to NzbDrone.Core/Indexers/Newznab.cs index ef464c3df..e95062cb6 100644 --- a/NzbDrone.Core/Indexers/Providers/Newznab.cs +++ b/NzbDrone.Core/Indexers/Newznab.cs @@ -8,13 +8,13 @@ using NzbDrone.Core.Model; using NzbDrone.Core.Providers; using NzbDrone.Core.Providers.Core; -namespace NzbDrone.Core.Indexers.Providers +namespace NzbDrone.Core.Indexers { public class Newznab : IndexerBase { - private readonly NewznabProvider _newznabProvider; + private readonly NewznabService _newznabProvider; - public Newznab(HttpProvider httpProvider, ConfigProvider configProvider, NewznabProvider newznabProvider) + public Newznab(HttpProvider httpProvider, ConfigProvider configProvider, NewznabService newznabProvider) : base(httpProvider, configProvider) { _newznabProvider = newznabProvider; diff --git a/NzbDrone.Core/Indexers/NewznabDefinition.cs b/NzbDrone.Core/Indexers/NewznabDefinition.cs new file mode 100644 index 000000000..fc07515d9 --- /dev/null +++ b/NzbDrone.Core/Indexers/NewznabDefinition.cs @@ -0,0 +1,16 @@ +using System; +using System.ComponentModel.DataAnnotations; +using NzbDrone.Core.Datastore; +using PetaPoco; + +namespace NzbDrone.Core.Indexers +{ + public class NewznabDefinition : ModelBase + { + public Boolean Enabled { get; set; } + public String Name { get; set; } + public String Url { get; set; } + public String ApiKey { get; set; } + public bool BuiltIn { get; set; } + } +} \ No newline at end of file diff --git a/NzbDrone.Core/Indexers/NewznabRepository.cs b/NzbDrone.Core/Indexers/NewznabRepository.cs new file mode 100644 index 000000000..6e74b8777 --- /dev/null +++ b/NzbDrone.Core/Indexers/NewznabRepository.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using NzbDrone.Core.Datastore; + +namespace NzbDrone.Core.Indexers +{ + public interface INewznabRepository : IBasicRepository + { + IEnumerable Enabled(); + } + + public class NewznabRepository : BasicRepository, INewznabRepository + { + public NewznabRepository(IObjectDatabase objectDatabase) : base(objectDatabase) + { + } + + public IEnumerable Enabled() + { + return Queryable.Where(n => n.Enabled); + } + } +} diff --git a/NzbDrone.Core/Indexers/NewznabService.cs b/NzbDrone.Core/Indexers/NewznabService.cs new file mode 100644 index 000000000..5beeaf34a --- /dev/null +++ b/NzbDrone.Core/Indexers/NewznabService.cs @@ -0,0 +1,140 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using NLog; +using NzbDrone.Core.Lifecycle; +using PetaPoco; + +namespace NzbDrone.Core.Indexers +{ + public interface INewznabService + { + List All(); + List Enabled(); + NewznabDefinition Insert(NewznabDefinition definition); + void Update(NewznabDefinition definition); + } + + public class NewznabService : INewznabService, IInitializable + { + private readonly INewznabRepository _newznabRepository; + private readonly Logger _logger; + + public NewznabService(INewznabRepository newznabRepository, Logger logger) + { + _newznabRepository = newznabRepository; + _logger = logger; + } + + public List All() + { + return _newznabRepository.All().ToList(); + } + + public List Enabled() + { + return _newznabRepository.Enabled().ToList(); + } + + public NewznabDefinition Insert(NewznabDefinition definition) + { + definition.Url = definition.Url.ToLower(); + _logger.Debug("Adding Newznab definition for {0}", definition.Name); + return _newznabRepository.Insert(definition); + } + + public void Update(NewznabDefinition definition) + { + definition.Url = definition.Url.ToLower(); + _logger.Debug("Updating Newznab definition for {0}", definition.Name); + _newznabRepository.Update(definition); + } + + public void Delete(int id) + { + + _newznabRepository.Delete(id); + } + + public void CheckHostname(string url) + { + try + { + var uri = new Uri(url); + var hostname = uri.DnsSafeHost; + + Dns.GetHostEntry(hostname); + } + catch (Exception ex) + { + _logger.Error("Invalid address {0}, please correct the site URL.", url); + _logger.TraceException(ex.Message, ex); + throw; + } + + } + + public void Init() + { + var newznabIndexers = new List + { + new NewznabDefinition { Enabled = false, Name = "Nzbs.org", Url = "http://nzbs.org", BuiltIn = true }, + new NewznabDefinition { Enabled = false, Name = "Nzb.su", Url = "https://nzb.su", BuiltIn = true }, + new NewznabDefinition { Enabled = false, Name = "Dognzb.cr", Url = "https://dognzb.cr", BuiltIn = true } + }; + + _logger.Debug("Initializing Newznab indexers. Count {0}", newznabIndexers); + + try + { + var currentIndexers = All(); + + _logger.Debug("Deleting broken Newznab indexer"); + var brokenIndexers = currentIndexers.Where(i => String.IsNullOrEmpty(i.Name) || String.IsNullOrWhiteSpace(i.Url)).ToList(); + brokenIndexers.ForEach(e => Delete(e.OID)); + + currentIndexers = All(); + + foreach (var feedProvider in newznabIndexers) + { + try + { + NewznabDefinition indexerLocal = feedProvider; + var currentIndexer = currentIndexers + .FirstOrDefault(c => new Uri(c.Url.ToLower()).Host == new Uri(indexerLocal.Url.ToLower()).Host); + + if (currentIndexer == null) + { + var definition = new NewznabDefinition + { + Enabled = false, + Name = indexerLocal.Name, + Url = indexerLocal.Url, + ApiKey = indexerLocal.ApiKey, + BuiltIn = true + }; + + Insert(definition); + } + + else + { + currentIndexer.Url = indexerLocal.Url; + currentIndexer.BuiltIn = true; + Update(currentIndexer); + } + } + catch (Exception ex) + { + _logger.ErrorException("An error occurred while setting up indexer: " + feedProvider.Name, ex); + } + } + } + catch (Exception ex) + { + _logger.ErrorException("An Error occurred while initializing Newznab Indexers", ex); + } + } + } +} \ No newline at end of file diff --git a/NzbDrone.Core/Indexers/Providers/NzbClub.cs b/NzbDrone.Core/Indexers/NzbClub.cs similarity index 98% rename from NzbDrone.Core/Indexers/Providers/NzbClub.cs rename to NzbDrone.Core/Indexers/NzbClub.cs index 922903534..977b5898d 100644 --- a/NzbDrone.Core/Indexers/Providers/NzbClub.cs +++ b/NzbDrone.Core/Indexers/NzbClub.cs @@ -7,7 +7,7 @@ using NzbDrone.Common; using NzbDrone.Core.Model; using NzbDrone.Core.Providers.Core; -namespace NzbDrone.Core.Indexers.Providers +namespace NzbDrone.Core.Indexers { public class NzbClub : IndexerBase { diff --git a/NzbDrone.Core/Indexers/Providers/NzbIndex.cs b/NzbDrone.Core/Indexers/NzbIndex.cs similarity index 98% rename from NzbDrone.Core/Indexers/Providers/NzbIndex.cs rename to NzbDrone.Core/Indexers/NzbIndex.cs index 049b5ae3a..cd835ba4b 100644 --- a/NzbDrone.Core/Indexers/Providers/NzbIndex.cs +++ b/NzbDrone.Core/Indexers/NzbIndex.cs @@ -7,7 +7,7 @@ using NzbDrone.Common; using NzbDrone.Core.Model; using NzbDrone.Core.Providers.Core; -namespace NzbDrone.Core.Indexers.Providers +namespace NzbDrone.Core.Indexers { public class NzbIndex : IndexerBase { diff --git a/NzbDrone.Core/Indexers/Providers/NzbsRUs.cs b/NzbDrone.Core/Indexers/NzbsRUs.cs similarity index 98% rename from NzbDrone.Core/Indexers/Providers/NzbsRUs.cs rename to NzbDrone.Core/Indexers/NzbsRUs.cs index 565fdeb38..f0054af8f 100644 --- a/NzbDrone.Core/Indexers/Providers/NzbsRUs.cs +++ b/NzbDrone.Core/Indexers/NzbsRUs.cs @@ -7,7 +7,7 @@ using NzbDrone.Common; using NzbDrone.Core.Model; using NzbDrone.Core.Providers.Core; -namespace NzbDrone.Core.Indexers.Providers +namespace NzbDrone.Core.Indexers { public class NzbsRUs : IndexerBase { diff --git a/NzbDrone.Core/Indexers/Providers/Nzbx.cs b/NzbDrone.Core/Indexers/Nzbx.cs similarity index 99% rename from NzbDrone.Core/Indexers/Providers/Nzbx.cs rename to NzbDrone.Core/Indexers/Nzbx.cs index 1ffd9f2cd..eeb84fe17 100644 --- a/NzbDrone.Core/Indexers/Providers/Nzbx.cs +++ b/NzbDrone.Core/Indexers/Nzbx.cs @@ -9,7 +9,7 @@ using NzbDrone.Core.Model; using NzbDrone.Core.Model.Nzbx; using NzbDrone.Core.Providers.Core; -namespace NzbDrone.Core.Indexers.Providers +namespace NzbDrone.Core.Indexers { class Nzbx : IndexerBase { diff --git a/NzbDrone.Core/Indexers/Providers/Omgwtfnzbs.cs b/NzbDrone.Core/Indexers/Omgwtfnzbs.cs similarity index 98% rename from NzbDrone.Core/Indexers/Providers/Omgwtfnzbs.cs rename to NzbDrone.Core/Indexers/Omgwtfnzbs.cs index 73adaaf38..d78548c73 100644 --- a/NzbDrone.Core/Indexers/Providers/Omgwtfnzbs.cs +++ b/NzbDrone.Core/Indexers/Omgwtfnzbs.cs @@ -7,7 +7,7 @@ using NzbDrone.Common; using NzbDrone.Core.Model; using NzbDrone.Core.Providers.Core; -namespace NzbDrone.Core.Indexers.Providers +namespace NzbDrone.Core.Indexers { class Omgwtfnzbs : IndexerBase { diff --git a/NzbDrone.Core/Indexers/Providers/SyndicationFeedXmlReader.cs b/NzbDrone.Core/Indexers/SyndicationFeedXmlReader.cs similarity index 98% rename from NzbDrone.Core/Indexers/Providers/SyndicationFeedXmlReader.cs rename to NzbDrone.Core/Indexers/SyndicationFeedXmlReader.cs index 6f21848fc..addbe4959 100644 --- a/NzbDrone.Core/Indexers/Providers/SyndicationFeedXmlReader.cs +++ b/NzbDrone.Core/Indexers/SyndicationFeedXmlReader.cs @@ -11,7 +11,7 @@ using System.Threading; using System.Xml; using NLog; -namespace NzbDrone.Core.Indexers.Providers +namespace NzbDrone.Core.Indexers { public class SyndicationFeedXmlReader : XmlTextReader { diff --git a/NzbDrone.Core/Indexers/Providers/Wombles.cs b/NzbDrone.Core/Indexers/Wombles.cs similarity index 98% rename from NzbDrone.Core/Indexers/Providers/Wombles.cs rename to NzbDrone.Core/Indexers/Wombles.cs index 1a45df14c..3665c8461 100644 --- a/NzbDrone.Core/Indexers/Providers/Wombles.cs +++ b/NzbDrone.Core/Indexers/Wombles.cs @@ -6,7 +6,7 @@ using NzbDrone.Common; using NzbDrone.Core.Model; using NzbDrone.Core.Providers.Core; -namespace NzbDrone.Core.Indexers.Providers +namespace NzbDrone.Core.Indexers { public class Wombles : IndexerBase { diff --git a/NzbDrone.Core/NzbDrone.Core.csproj b/NzbDrone.Core/NzbDrone.Core.csproj index 5c7c02067..5ec05d2c4 100644 --- a/NzbDrone.Core/NzbDrone.Core.csproj +++ b/NzbDrone.Core/NzbDrone.Core.csproj @@ -269,6 +269,7 @@ + @@ -341,13 +342,13 @@ - + - - - - - + + + + + @@ -494,16 +495,16 @@ Code - + Code - + Code - + Code - + Code @@ -512,7 +513,7 @@ Code - + Code @@ -574,7 +575,7 @@ Code - + diff --git a/NzbDrone.Core/Providers/NewznabProvider.cs b/NzbDrone.Core/Providers/NewznabProvider.cs deleted file mode 100644 index 6e9e6bf9e..000000000 --- a/NzbDrone.Core/Providers/NewznabProvider.cs +++ /dev/null @@ -1,155 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Net; -using NLog; -using NzbDrone.Core.Repository; -using PetaPoco; - -namespace NzbDrone.Core.Providers -{ - public class NewznabProvider - { - private static readonly Logger logger = LogManager.GetCurrentClassLogger(); - private readonly IDatabase _database; - - public NewznabProvider(IDatabase database) - { - _database = database; - - var newznabIndexers = new List - { - new NewznabDefinition { Enable = false, Name = "Nzbs.org", Url = "http://nzbs.org", BuiltIn = true }, - new NewznabDefinition { Enable = false, Name = "Nzb.su", Url = "https://nzb.su", BuiltIn = true }, - new NewznabDefinition { Enable = false, Name = "Dognzb.cr", Url = "https://dognzb.cr", BuiltIn = true } - }; - - InitializeNewznabIndexers(newznabIndexers); - } - - public NewznabProvider() - { - - } - - public virtual List Enabled() - { - return _database.Fetch("WHERE Enable = 1"); - } - - public virtual List All() - { - return _database.Fetch(); - } - - public virtual int Save(NewznabDefinition definition) - { - //Cleanup the URL if it is not null or whitespace - if (!String.IsNullOrWhiteSpace(definition.Url)) - definition.Url = (new Uri(definition.Url).ParentUriString()); - - if (definition.Id == 0) - { - logger.Debug("Adding Newznab definitions for {0}", definition.Name); - return Convert.ToInt32(_database.Insert(definition)); - } - - logger.Debug("Updating Newznab definitions for {0}", definition.Name); - return _database.Update(definition); - } - - public virtual void SaveAll(IEnumerable definitions) - { - var definitionsList = definitions.ToList(); - - //Cleanup the URL for each definition - foreach (var newznabDefinition in definitionsList) - { - CheckHostname(newznabDefinition.Url); - //newznabDefinition.Url = new Uri(newznabDefinition.Url).ParentUriString(); - } - - _database.UpdateMany(definitionsList); - } - - private void InitializeNewznabIndexers(IList indexers) - { - logger.Debug("Initializing Newznab indexers. Count {0}", indexers.Count); - - try - { - var currentIndexers = All(); - - logger.Debug("Deleting broken Newznab indexer"); - var brokenIndexers = currentIndexers.Where(i => String.IsNullOrEmpty(i.Name) || String.IsNullOrWhiteSpace(i.Url)).ToList(); - brokenIndexers.ForEach(e => _database.Delete(e.Id)); - - currentIndexers = All(); - - foreach (var feedProvider in indexers) - { - try - { - NewznabDefinition indexerLocal = feedProvider; - var currentIndexer = currentIndexers - .FirstOrDefault( - c => - new Uri(c.Url.ToLower()).Host == new Uri(indexerLocal.Url.ToLower()).Host); - - if (currentIndexer == null) - { - var settings = new NewznabDefinition - { - Enable = false, - Name = indexerLocal.Name, - Url = indexerLocal.Url, - ApiKey = indexerLocal.ApiKey, - BuiltIn = true - }; - - Save(settings); - } - - else - { - currentIndexer.Url = indexerLocal.Url; - currentIndexer.BuiltIn = true; - Save(currentIndexer); - } - } - catch (Exception ex) - { - logger.ErrorException("An error occurred while setting up indexer: " + feedProvider.Name, ex); - } - } - } - catch (Exception ex) - { - logger.ErrorException("An Error occurred while initializing Newznab Indexers", ex); - } - } - - public virtual void Delete(int id) - { - _database.Delete(id); - } - - public virtual void CheckHostname(string url) - { - try - { - var uri = new Uri(url); - var hostname = uri.DnsSafeHost; - - Dns.GetHostEntry(hostname); - } - catch (Exception ex) - { - logger.Error("Invalid address {0}, please correct the site URL.", url); - logger.TraceException(ex.Message, ex); - throw; - } - - } - } -} \ No newline at end of file diff --git a/NzbDrone.Core/Repository/NewznabDefinition.cs b/NzbDrone.Core/Repository/NewznabDefinition.cs deleted file mode 100644 index 9a6dfa7ea..000000000 --- a/NzbDrone.Core/Repository/NewznabDefinition.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System; -using System.ComponentModel.DataAnnotations; -using PetaPoco; - -namespace NzbDrone.Core.Repository -{ - [TableName("NewznabDefinitions")] - [PrimaryKey("Id", autoIncrement = true)] - public class NewznabDefinition - { - public int Id { get; set; } - - public Boolean Enable { get; set; } - - [StringLength(100, MinimumLength = 2)] - [DisplayFormat(ConvertEmptyStringToNull = false)] - public String Name { get; set; } - - [DisplayFormat(ConvertEmptyStringToNull = false)] - [RegularExpression(@"^http[s]?://.+")] - public String Url { get; set; } - - public String ApiKey { get; set; } - - public bool BuiltIn { get; set; } - } -} \ No newline at end of file