From 7d3f6c81e04d871e5e57a451be17372a657839a7 Mon Sep 17 00:00:00 2001 From: "kay.one" Date: Mon, 25 Apr 2011 11:41:20 -0700 Subject: [PATCH 1/4] Exceptioneer is only enabled during release. Nzbdrone.exe waits for enter before closing on error. --- NzbDrone.Web/log.config | 8 ++++++++ NzbDrone/Program.cs | 15 ++++++++++----- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/NzbDrone.Web/log.config b/NzbDrone.Web/log.config index d5f9d9205..ac57d4f6d 100644 --- a/NzbDrone.Web/log.config +++ b/NzbDrone.Web/log.config @@ -12,6 +12,9 @@ + @@ -19,6 +22,11 @@ + + + + + diff --git a/NzbDrone/Program.cs b/NzbDrone/Program.cs index eb891dd20..2a585add6 100644 --- a/NzbDrone/Program.cs +++ b/NzbDrone/Program.cs @@ -48,6 +48,9 @@ private static void Main() { AppDomainException(e); } + + Console.WriteLine("Press enter to exit."); + Console.ReadLine(); } private static void Attach() @@ -88,12 +91,14 @@ private static void AppDomainException(object excepion) Console.WriteLine("EPIC FAIL: {0}", excepion); Logger.Fatal("EPIC FAIL: {0}", excepion); +#if Release new Client - { - ApiKey = "43BBF60A-EB2A-4C1C-B09E-422ADF637265", - ApplicationName = "NZBDrone", - CurrentException = excepion as Exception - }.Submit(); + { + ApiKey = "43BBF60A-EB2A-4C1C-B09E-422ADF637265", + ApplicationName = "NZBDrone", + CurrentException = excepion as Exception + }.Submit(); +#endif IISController.StopServer(); } From 5d678be6b1a700e745c00b32b00ed85333c3a472 Mon Sep 17 00:00:00 2001 From: "kay.one" Date: Mon, 25 Apr 2011 11:44:26 -0700 Subject: [PATCH 2/4] removed .org file --- NzbDrone.Web/NzbDrone.Web.csproj.orig | 854 -------------------------- 1 file changed, 854 deletions(-) delete mode 100644 NzbDrone.Web/NzbDrone.Web.csproj.orig diff --git a/NzbDrone.Web/NzbDrone.Web.csproj.orig b/NzbDrone.Web/NzbDrone.Web.csproj.orig deleted file mode 100644 index a7c07c9be..000000000 --- a/NzbDrone.Web/NzbDrone.Web.csproj.orig +++ /dev/null @@ -1,854 +0,0 @@ - - - - Debug - AnyCPU - - - 2.0 - {43BD3BBD-1531-4D8F-9C08-E1CD544AB2CD} - {E53F8FEA-EAE0-44A6-8774-FFD645390401};{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} - Library - Properties - NzbDrone.Web - NzbDrone.Web - v4.0 - true - false - - false - - - true - full - false - Bin\ - DEBUG;TRACE - prompt - 4 - AnyCPU - false - true - false - true - - - pdbonly - true - bin\ - TRACE - prompt - 4 - true - false - - - - ..\NzbDrone.Core\Libraries\Castle.Core.dll - - - True - - - False - ..\packages\Ninject.2.2.1.0\lib\.NetFramework 4.0\Ninject.dll - - - - - D:\My Dropbox\Git\NzbDrone\NzbDrone.Core\Libraries\SubSonic.Core.dll - - - - - - ..\NzbDrone.Core\Libraries\System.Data.SQLite.dll - True - - - - - - - 3.5 - - - - - True - - - True - - - True - - - True - - - True - - - True - - - - - - - - ..\packages\TelerikMvcExtensions.2011.1.315\lib\net40\Telerik.Web.Mvc.dll - - - True - - - True - - - ..\NzbDrone.Core\Libraries\TvdbLib.dll - - - - - True - True - EditorLocalization.bg-BG.resx - - - True - True - EditorLocalization.de-DE.resx - - - True - True - EditorLocalization.en-US.resx - - - True - True - EditorLocalization.fr-FR.resx - - - True - True - EditorLocalization.pl-PL.resx - - - True - True - EditorLocalization.pt-BR.resx - - - True - True - EditorLocalization.ru-RU.resx - - - True - True - EditorLocalization.uk-UA.resx - - - True - True - GridLocalization.bg-BG.resx - - - True - True - GridLocalization.de-DE.resx - - - True - True - GridLocalization.en-US.resx - - - True - True - GridLocalization.es-ES.resx - - - True - True - GridLocalization.fr-FR.resx - - - True - True - GridLocalization.pl-PL.resx - - - True - True - GridLocalization.pt-BR.resx - - - True - True - GridLocalization.pt-PT.resx - - - True - True - GridLocalization.ru-RU.resx - - - True - True - GridLocalization.uk-UA.resx - - - True - True - UploadLocalization.bg-BG.resx - - - True - True - UploadLocalization.en-US.resx - - - - - - - - - - - - - Global.asax - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -<<<<<<< HEAD - - - - - - - - - - -======= ->>>>>>> markus101 - - Designer - - - Web.config - - - Web.config - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {FF5EE3B6-913B-47CE-9CEB-11C51B4E1205} - NzbDrone.Core - - - - - Designer - - - - - - - - GlobalResourceProxyGenerator - UploadLocalization.en-US.designer.cs - - - - - GlobalResourceProxyGenerator - UploadLocalization.bg-BG.designer.cs - - - - - GlobalResourceProxyGenerator - GridLocalization.uk-UA.designer.cs - - - - - GlobalResourceProxyGenerator - GridLocalization.ru-RU.designer.cs - - - - - GlobalResourceProxyGenerator - GridLocalization.pt-PT.designer.cs - - - - - GlobalResourceProxyGenerator - GridLocalization.pt-BR.designer.cs - - - - - GlobalResourceProxyGenerator - GridLocalization.pl-PL.designer.cs - - - - - GlobalResourceProxyGenerator - GridLocalization.fr-FR.designer.cs - - - - - GlobalResourceProxyGenerator - GridLocalization.es-ES.designer.cs - - - - - GlobalResourceProxyGenerator - GridLocalization.en-US.designer.cs - - - - - GlobalResourceProxyGenerator - GridLocalization.de-DE.designer.cs - - - - - GlobalResourceProxyGenerator - GridLocalization.bg-BG.designer.cs - - - - - GlobalResourceProxyGenerator - EditorLocalization.uk-UA.designer.cs - - - - - GlobalResourceProxyGenerator - EditorLocalization.ru-RU.designer.cs - - - - - GlobalResourceProxyGenerator - EditorLocalization.pt-BR.designer.cs - - - - - GlobalResourceProxyGenerator - EditorLocalization.pl-PL.designer.cs - - - - - GlobalResourceProxyGenerator - EditorLocalization.fr-FR.designer.cs - - - - - GlobalResourceProxyGenerator - EditorLocalization.en-US.designer.cs - - - - - GlobalResourceProxyGenerator - EditorLocalization.de-DE.designer.cs - - - - - GlobalResourceProxyGenerator - EditorLocalization.bg-BG.designer.cs - - - - - - - - - - - - - True - - - - - \ No newline at end of file From 3353b3b2d305b3b1e01cb2b136222a8abe54b2ae Mon Sep 17 00:00:00 2001 From: "kay.one" Date: Mon, 25 Apr 2011 11:45:48 -0700 Subject: [PATCH 3/4] Added resharper style sharing file --- NzbDrone.5.1.ReSharper | 71 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 NzbDrone.5.1.ReSharper diff --git a/NzbDrone.5.1.ReSharper b/NzbDrone.5.1.ReSharper new file mode 100644 index 000000000..e35a0f72a --- /dev/null +++ b/NzbDrone.5.1.ReSharper @@ -0,0 +1,71 @@ + + + + + SOLUTION + + + + public + protected + internal + private + new + abstract + virtual + override + sealed + static + readonly + extern + unsafe + volatile + + + + + $object$_On$event$ + $event$Handler + + + + + + + $object$_On$event$ + $event$Handler + + + + + + + + + + + + + + $object$_On$event$ + $event$Handler + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From b65fe99b3085e6595b096f2ad82be576138bdb20 Mon Sep 17 00:00:00 2001 From: "kay.one" Date: Mon, 25 Apr 2011 13:21:52 -0700 Subject: [PATCH 4/4] Fixed network auth issue, custom parser issue --- NzbDrone.Core.Test/IndexerProviderTest.cs | 95 ++++++++++++++++++- NzbDrone.Core/NzbDrone.Core.csproj | 1 + NzbDrone.Core/Providers/Core/HttpProvider.cs | 3 +- .../Providers/Indexer/IndexerProviderBase.cs | 18 +++- .../Providers/Indexer/NewzbinProvider.cs | 15 ++- .../Providers/Indexer/NzbMatrixProvider.cs | 8 +- .../Providers/Indexer/NzbsOrgProvider.cs | 7 +- .../Providers/Indexer/NzbsRUsProvider.cs | 6 +- 8 files changed, 136 insertions(+), 17 deletions(-) diff --git a/NzbDrone.Core.Test/IndexerProviderTest.cs b/NzbDrone.Core.Test/IndexerProviderTest.cs index ed38159ab..c7f0318b7 100644 --- a/NzbDrone.Core.Test/IndexerProviderTest.cs +++ b/NzbDrone.Core.Test/IndexerProviderTest.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.IO; +using System.Net; using System.ServiceModel.Syndication; using System.Xml; using AutoMoq; @@ -11,6 +12,7 @@ using NzbDrone.Core.Providers.Core; using NzbDrone.Core.Providers.Indexer; using NzbDrone.Core.Repository; +using NzbDrone.Core.Repository.Quality; using SubSonic.Repository; namespace NzbDrone.Core.Test @@ -29,7 +31,7 @@ public void parse_feed_xml(string fileName) var mocker = new AutoMoqer(); mocker.GetMock() - .Setup(h => h.DownloadStream(It.IsAny())) + .Setup(h => h.DownloadStream(It.IsAny(), It.IsAny())) .Returns(File.OpenRead(".\\Files\\Rss\\" + fileName)); var fakeSettings = Builder.CreateNew().Build(); @@ -47,6 +49,63 @@ public void parse_feed_xml(string fileName) Assert.IsEmpty(exceptions); } + + + [Test] + [Row("Adventure.Inc.S03E19.DVDRip.XviD-OSiTV", 3, 19, QualityTypes.DVD)] + public void parse_feed_test_success(string title, int season, int episode, QualityTypes quality) + { + var mocker = new AutoMoqer(); + + var summary = "My fake summary"; + + var fakeSettings = Builder.CreateNew().Build(); + mocker.GetMock() + .Setup(c => c.GetSettings(It.IsAny())) + .Returns(fakeSettings); + + mocker.GetMock() + .Setup(c => c.FindSeries(It.IsAny())) + .Returns(Builder.CreateNew().Build()); + + + var fakeRssItem = Builder.CreateNew() + .With(c => c.Title = new TextSyndicationContent(title)) + .With(c => c.Summary = new TextSyndicationContent(summary)) + .Build(); + + var result = mocker.Resolve().ParseFeed(fakeRssItem); + + Assert.IsNotNull(result); + Assert.AreEqual(summary, result.EpisodeTitle); + } + + [Test] + [Row("Adventure.Inc.DVDRip.XviD-OSiTV")] + public void parse_feed_test_fail(string title) + { + var mocker = new AutoMoqer(); + + + + var fakeSettings = Builder.CreateNew().Build(); + mocker.GetMock() + .Setup(c => c.GetSettings(It.IsAny())) + .Returns(fakeSettings); + + mocker.GetMock(MockBehavior.Strict); + + + var fakeRssItem = Builder.CreateNew() + .With(c => c.Title = new TextSyndicationContent(title)) + .Build(); + + var result = mocker.Resolve().ParseFeed(fakeRssItem); + + Assert.IsNull(result); + } + + [Test] public void downloadFeed() { @@ -102,6 +161,11 @@ protected override string[] Urls get { return new[] { "www.google.com" }; } } + protected override NetworkCredential Credentials + { + get { return null; } + } + public override string Name { get { return "Mocked Indexer"; } @@ -137,4 +201,33 @@ protected override string NzbDownloadUrl(SyndicationItem item) } } + public class CustomParserIndexer : IndexerProviderBase + { + public CustomParserIndexer(SeriesProvider seriesProvider, SeasonProvider seasonProvider, EpisodeProvider episodeProvider, ConfigProvider configProvider, HttpProvider httpProvider, IndexerProvider indexerProvider, HistoryProvider historyProvider, SabProvider sabProvider) + : base(seriesProvider, seasonProvider, episodeProvider, configProvider, httpProvider, indexerProvider, historyProvider, sabProvider) + { + } + + public override string Name + { + get { return "Custom parser"; } + } + + protected override string[] Urls + { + get { return new[] { "http://www.google.com" }; } + } + + protected override string NzbDownloadUrl(SyndicationItem item) + { + return "http://www.google.com"; + } + + protected override Model.EpisodeParseResult CustomParser(SyndicationItem item, Model.EpisodeParseResult currentResult) + { + currentResult.EpisodeTitle = item.Summary.Text; + return currentResult; + } + } + } \ No newline at end of file diff --git a/NzbDrone.Core/NzbDrone.Core.csproj b/NzbDrone.Core/NzbDrone.Core.csproj index ebd2c3da9..0f9621696 100644 --- a/NzbDrone.Core/NzbDrone.Core.csproj +++ b/NzbDrone.Core/NzbDrone.Core.csproj @@ -166,6 +166,7 @@ + diff --git a/NzbDrone.Core/Providers/Core/HttpProvider.cs b/NzbDrone.Core/Providers/Core/HttpProvider.cs index 91ff84661..6e440632d 100644 --- a/NzbDrone.Core/Providers/Core/HttpProvider.cs +++ b/NzbDrone.Core/Providers/Core/HttpProvider.cs @@ -40,10 +40,11 @@ public virtual string DownloadString(string address, string username, string pas } } - public virtual Stream DownloadStream(string url) + public virtual Stream DownloadStream(string url, NetworkCredential credential) { var request = WebRequest.Create(url); + request.Credentials = credential; var response = request.GetResponse(); return response.GetResponseStream(); diff --git a/NzbDrone.Core/Providers/Indexer/IndexerProviderBase.cs b/NzbDrone.Core/Providers/Indexer/IndexerProviderBase.cs index 82c9aedf7..aa7ed2111 100644 --- a/NzbDrone.Core/Providers/Indexer/IndexerProviderBase.cs +++ b/NzbDrone.Core/Providers/Indexer/IndexerProviderBase.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.IO; +using System.Net; using System.ServiceModel.Syndication; using NLog; using NzbDrone.Core.Model; @@ -48,6 +49,15 @@ protected IndexerProviderBase(SeriesProvider seriesProvider, SeasonProvider seas protected abstract string[] Urls { get; } + /// + /// Gets the credential. + /// + protected virtual NetworkCredential Credentials + { + get { return null; } + } + + public IndexerSetting Settings { get @@ -70,7 +80,7 @@ public List Fetch() { _logger.Trace("Downloading RSS " + url); - var reader = new SyndicationFeedXmlReader(_httpProvider.DownloadStream(url)); + var reader = new SyndicationFeedXmlReader(_httpProvider.DownloadStream(url, Credentials)); var feed = SyndicationFeed.Load(reader).Items; foreach (var item in feed) @@ -168,10 +178,10 @@ internal void ProcessItem(SyndicationItem feedItem) /// /// RSS feed item to parse /// Detailed episode info - protected EpisodeParseResult ParseFeed(SyndicationItem item) + public EpisodeParseResult ParseFeed(SyndicationItem item) { var episodeParseResult = Parser.ParseEpisodeInfo(item.Title.Text); - if (episodeParseResult == null) return CustomParser(item, null); + if (episodeParseResult == null) return null; var seriesInfo = _seriesProvider.FindSeries(episodeParseResult.CleanTitle); @@ -185,7 +195,7 @@ protected EpisodeParseResult ParseFeed(SyndicationItem item) } _logger.Debug("Unable to map {0} to any of series in database", episodeParseResult.CleanTitle); - return CustomParser(item, episodeParseResult); + return null; } /// diff --git a/NzbDrone.Core/Providers/Indexer/NewzbinProvider.cs b/NzbDrone.Core/Providers/Indexer/NewzbinProvider.cs index a2bca27e2..843753420 100644 --- a/NzbDrone.Core/Providers/Indexer/NewzbinProvider.cs +++ b/NzbDrone.Core/Providers/Indexer/NewzbinProvider.cs @@ -1,4 +1,7 @@ -using System.ServiceModel.Syndication; +using System; +using System.Net; +using System.ServiceModel.Syndication; +using System.Web; using NzbDrone.Core.Model; using NzbDrone.Core.Providers.Core; using SubSonic.Repository; @@ -7,7 +10,8 @@ namespace NzbDrone.Core.Providers.Indexer { public class NewzbinProvider : IndexerProviderBase { - public NewzbinProvider(SeriesProvider seriesProvider, SeasonProvider seasonProvider, EpisodeProvider episodeProvider, ConfigProvider configProvider, HttpProvider httpProvider, IndexerProvider indexerProvider, HistoryProvider historyProvider, SabProvider sabProvider) : base(seriesProvider, seasonProvider, episodeProvider, configProvider, httpProvider, indexerProvider, historyProvider, sabProvider) + public NewzbinProvider(SeriesProvider seriesProvider, SeasonProvider seasonProvider, EpisodeProvider episodeProvider, ConfigProvider configProvider, HttpProvider httpProvider, IndexerProvider indexerProvider, HistoryProvider historyProvider, SabProvider sabProvider) + : base(seriesProvider, seasonProvider, episodeProvider, configProvider, httpProvider, indexerProvider, historyProvider, sabProvider) { } @@ -17,11 +21,16 @@ protected override string[] Urls { return new[] { - string.Format("http://{0}:{1}@www.newzbin.com/browse/category/p/tv?feed=rss&hauth=1", _configProvider.NewzbinUsername, _configProvider.NewzbinPassword) + "http://www.newzbin.com/browse/category/p/tv?feed=rss&hauth=1" }; } } + protected override NetworkCredential Credentials + { + get { return new NetworkCredential(_configProvider.NewzbinUsername, _configProvider.NewzbinPassword); } + } + public override string Name { get { return "Newzbin"; } diff --git a/NzbDrone.Core/Providers/Indexer/NzbMatrixProvider.cs b/NzbDrone.Core/Providers/Indexer/NzbMatrixProvider.cs index b4fe6c134..686fbddd1 100644 --- a/NzbDrone.Core/Providers/Indexer/NzbMatrixProvider.cs +++ b/NzbDrone.Core/Providers/Indexer/NzbMatrixProvider.cs @@ -1,4 +1,6 @@ -using System.ServiceModel.Syndication; +using System; +using System.Net; +using System.ServiceModel.Syndication; using NzbDrone.Core.Providers.Core; using SubSonic.Repository; @@ -6,7 +8,8 @@ namespace NzbDrone.Core.Providers.Indexer { public class NzbMatrixProvider : IndexerProviderBase { - public NzbMatrixProvider(SeriesProvider seriesProvider, SeasonProvider seasonProvider, EpisodeProvider episodeProvider, ConfigProvider configProvider, HttpProvider httpProvider, IndexerProvider indexerProvider, HistoryProvider historyProvider, SabProvider sabProvider) : base(seriesProvider, seasonProvider, episodeProvider, configProvider, httpProvider, indexerProvider, historyProvider, sabProvider) + public NzbMatrixProvider(SeriesProvider seriesProvider, SeasonProvider seasonProvider, EpisodeProvider episodeProvider, ConfigProvider configProvider, HttpProvider httpProvider, IndexerProvider indexerProvider, HistoryProvider historyProvider, SabProvider sabProvider) + : base(seriesProvider, seasonProvider, episodeProvider, configProvider, httpProvider, indexerProvider, historyProvider, sabProvider) { } @@ -23,7 +26,6 @@ protected override string[] Urls }; } } - public override string Name { diff --git a/NzbDrone.Core/Providers/Indexer/NzbsOrgProvider.cs b/NzbDrone.Core/Providers/Indexer/NzbsOrgProvider.cs index ac0d99919..aa918173e 100644 --- a/NzbDrone.Core/Providers/Indexer/NzbsOrgProvider.cs +++ b/NzbDrone.Core/Providers/Indexer/NzbsOrgProvider.cs @@ -1,4 +1,5 @@ -using System.ServiceModel.Syndication; +using System.Net; +using System.ServiceModel.Syndication; using NzbDrone.Core.Providers.Core; using SubSonic.Repository; @@ -6,7 +7,8 @@ namespace NzbDrone.Core.Providers.Indexer { public class NzbsOrgProvider : IndexerProviderBase { - public NzbsOrgProvider(SeriesProvider seriesProvider, SeasonProvider seasonProvider, EpisodeProvider episodeProvider, ConfigProvider configProvider, HttpProvider httpProvider, IndexerProvider indexerProvider, HistoryProvider historyProvider, SabProvider sabProvider) : base(seriesProvider, seasonProvider, episodeProvider, configProvider, httpProvider, indexerProvider, historyProvider, sabProvider) + public NzbsOrgProvider(SeriesProvider seriesProvider, SeasonProvider seasonProvider, EpisodeProvider episodeProvider, ConfigProvider configProvider, HttpProvider httpProvider, IndexerProvider indexerProvider, HistoryProvider historyProvider, SabProvider sabProvider) + : base(seriesProvider, seasonProvider, episodeProvider, configProvider, httpProvider, indexerProvider, historyProvider, sabProvider) { } @@ -26,7 +28,6 @@ public override string Name get { return "Nzbs.org"; } } - protected override string NzbDownloadUrl(SyndicationItem item) { return item.Id; diff --git a/NzbDrone.Core/Providers/Indexer/NzbsRUsProvider.cs b/NzbDrone.Core/Providers/Indexer/NzbsRUsProvider.cs index d90a1c30a..8e193b220 100644 --- a/NzbDrone.Core/Providers/Indexer/NzbsRUsProvider.cs +++ b/NzbDrone.Core/Providers/Indexer/NzbsRUsProvider.cs @@ -1,4 +1,5 @@ -using System.ServiceModel.Syndication; +using System.Net; +using System.ServiceModel.Syndication; using NzbDrone.Core.Providers.Core; using SubSonic.Repository; @@ -6,7 +7,8 @@ namespace NzbDrone.Core.Providers.Indexer { public class NzbsRUsProvider : IndexerProviderBase { - public NzbsRUsProvider(SeriesProvider seriesProvider, SeasonProvider seasonProvider, EpisodeProvider episodeProvider, ConfigProvider configProvider, HttpProvider httpProvider, IndexerProvider indexerProvider, HistoryProvider historyProvider, SabProvider sabProvider) : base(seriesProvider, seasonProvider, episodeProvider, configProvider, httpProvider, indexerProvider, historyProvider, sabProvider) + public NzbsRUsProvider(SeriesProvider seriesProvider, SeasonProvider seasonProvider, EpisodeProvider episodeProvider, ConfigProvider configProvider, HttpProvider httpProvider, IndexerProvider indexerProvider, HistoryProvider historyProvider, SabProvider sabProvider) + : base(seriesProvider, seasonProvider, episodeProvider, configProvider, httpProvider, indexerProvider, historyProvider, sabProvider) { }