mirror of
https://github.com/Radarr/Radarr.git
synced 2024-11-04 10:02:40 +01:00
Added some update APIs to check for updates and download and extract the update package.
Todo: apply updated, UI.
This commit is contained in:
parent
e5c4f34e0e
commit
8f9946eb63
@ -84,17 +84,5 @@ public void quality_profile_initialized()
|
||||
{
|
||||
CentralDispatch.NinjectKernel.Get<QualityProvider>().All().Should().HaveCount(2);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void get_version()
|
||||
{
|
||||
CentralDispatch.Version.Should().NotBeNull();
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void BuildDate_should_be_within_the_hour()
|
||||
{
|
||||
CentralDispatch.BuildDateTime.Should().BeWithin(TimeSpan.FromHours(1));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
BIN
NzbDrone.Core.Test/Files/TestArchive.zip
Normal file
BIN
NzbDrone.Core.Test/Files/TestArchive.zip
Normal file
Binary file not shown.
@ -4,6 +4,7 @@
|
||||
using NLog.Config;
|
||||
using NUnit.Framework;
|
||||
using NzbDrone.Core;
|
||||
using NzbDrone.Core.Providers;
|
||||
using NzbDrone.Core.Test.Framework;
|
||||
|
||||
[SetUpFixture]
|
||||
@ -20,7 +21,7 @@ public void SetUp()
|
||||
{
|
||||
try
|
||||
{
|
||||
LogManager.Configuration = new XmlLoggingConfiguration(Path.Combine(CentralDispatch.AppPath, "log.config"), false);
|
||||
LogManager.Configuration = new XmlLoggingConfiguration(Path.Combine(new EnviromentProvider().AppPath, "log.config"), false);
|
||||
LogManager.ThrowExceptions = true;
|
||||
|
||||
var exceptionVerification = new ExceptionVerification();
|
||||
|
@ -1,4 +1,5 @@
|
||||
using NUnit.Framework;
|
||||
using System.IO;
|
||||
using NUnit.Framework;
|
||||
using NzbDrone.Core.Providers.Jobs;
|
||||
|
||||
namespace NzbDrone.Core.Test.Framework
|
||||
@ -11,8 +12,10 @@ public class TestBase
|
||||
public void Setup()
|
||||
{
|
||||
ExceptionVerification.Reset();
|
||||
|
||||
|
||||
if (Directory.Exists(TempFolder))
|
||||
{
|
||||
Directory.Delete(TempFolder, true);
|
||||
}
|
||||
}
|
||||
|
||||
[TearDown]
|
||||
@ -22,5 +25,20 @@ public void TearDown()
|
||||
ExceptionVerification.AssertNoUnexcpectedLogs();
|
||||
}
|
||||
|
||||
|
||||
protected string TempFolder
|
||||
{
|
||||
get { return Path.Combine(Directory.GetCurrentDirectory(), "_temp"); }
|
||||
}
|
||||
|
||||
protected string GetTestFilePath(string fileName)
|
||||
{
|
||||
return Path.Combine(@".\Files\", fileName);
|
||||
}
|
||||
|
||||
protected string ReadTestFile(string fileName)
|
||||
{
|
||||
return File.ReadAllText(GetTestFilePath(fileName));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,4 +1,5 @@
|
||||
using System.IO;
|
||||
using System.Net;
|
||||
using AutoMoq;
|
||||
using FizzWare.NBuilder;
|
||||
using Moq;
|
||||
@ -24,6 +25,7 @@ public void BannerDownload_all()
|
||||
.Build();
|
||||
|
||||
var mocker = new AutoMoqer(MockBehavior.Strict);
|
||||
mocker.Resolve<EnviromentProvider>();
|
||||
|
||||
var notification = new ProgressNotification("Banner Download");
|
||||
|
||||
@ -32,8 +34,7 @@ public void BannerDownload_all()
|
||||
.Returns(fakeSeries);
|
||||
|
||||
mocker.GetMock<HttpProvider>()
|
||||
.Setup(s => s.DownloadFile(It.IsAny<string>(), It.IsAny<string>()))
|
||||
.Returns(true);
|
||||
.Setup(s => s.DownloadFile(It.IsAny<string>(), It.IsAny<string>()));
|
||||
|
||||
mocker.GetMock<DiskProvider>()
|
||||
.Setup(S => S.CreateDirectory(It.IsAny<string>()))
|
||||
@ -58,6 +59,7 @@ public void BannerDownload_some_null_BannerUrl()
|
||||
.Build();
|
||||
|
||||
var mocker = new AutoMoqer(MockBehavior.Strict);
|
||||
mocker.Resolve<EnviromentProvider>();
|
||||
|
||||
var notification = new ProgressNotification("Banner Download");
|
||||
|
||||
@ -66,8 +68,7 @@ public void BannerDownload_some_null_BannerUrl()
|
||||
.Returns(fakeSeries);
|
||||
|
||||
mocker.GetMock<HttpProvider>()
|
||||
.Setup(s => s.DownloadFile(It.IsAny<string>(), It.IsAny<string>()))
|
||||
.Returns(true);
|
||||
.Setup(s => s.DownloadFile(It.IsAny<string>(), It.IsAny<string>()));
|
||||
|
||||
mocker.GetMock<DiskProvider>()
|
||||
.Setup(S => S.CreateDirectory(It.IsAny<string>()))
|
||||
@ -89,9 +90,10 @@ public void BannerDownload_some_failed_download()
|
||||
var fakeSeries = Builder<Series>.CreateListOfSize(10)
|
||||
.Build();
|
||||
|
||||
var path = Path.Combine(CentralDispatch.AppPath, "Content", "Images", "Banners");
|
||||
var path = Path.Combine(new EnviromentProvider().AppPath, "Content", "Images", "Banners");
|
||||
|
||||
var mocker = new AutoMoqer(MockBehavior.Strict);
|
||||
mocker.Resolve<EnviromentProvider>();
|
||||
|
||||
var notification = new ProgressNotification("Banner Download");
|
||||
|
||||
@ -101,43 +103,42 @@ public void BannerDownload_some_failed_download()
|
||||
|
||||
mocker.GetMock<HttpProvider>()
|
||||
.Setup(s => s.DownloadFile(It.IsAny<string>(), Path.Combine(path, "1.jpg")))
|
||||
.Returns(false);
|
||||
.Throws(new WebException());
|
||||
|
||||
mocker.GetMock<HttpProvider>()
|
||||
.Setup(s => s.DownloadFile(It.IsAny<string>(), Path.Combine(path, "2.jpg")))
|
||||
.Returns(true);
|
||||
.Setup(s => s.DownloadFile(It.IsAny<string>(), Path.Combine(path, "2.jpg")));
|
||||
|
||||
mocker.GetMock<HttpProvider>()
|
||||
.Setup(s => s.DownloadFile(It.IsAny<string>(), Path.Combine(path, "3.jpg")))
|
||||
.Returns(false);
|
||||
.Throws(new WebException());
|
||||
|
||||
mocker.GetMock<HttpProvider>()
|
||||
.Setup(s => s.DownloadFile(It.IsAny<string>(), Path.Combine(path, "4.jpg")))
|
||||
.Returns(true);
|
||||
.Setup(s => s.DownloadFile(It.IsAny<string>(), Path.Combine(path, "4.jpg")));
|
||||
|
||||
|
||||
mocker.GetMock<HttpProvider>()
|
||||
.Setup(s => s.DownloadFile(It.IsAny<string>(), Path.Combine(path, "5.jpg")))
|
||||
.Returns(false);
|
||||
.Throws(new WebException());
|
||||
|
||||
mocker.GetMock<HttpProvider>()
|
||||
.Setup(s => s.DownloadFile(It.IsAny<string>(), Path.Combine(path, "6.jpg")))
|
||||
.Returns(true);
|
||||
.Setup(s => s.DownloadFile(It.IsAny<string>(), Path.Combine(path, "6.jpg")));
|
||||
|
||||
|
||||
mocker.GetMock<HttpProvider>()
|
||||
.Setup(s => s.DownloadFile(It.IsAny<string>(), Path.Combine(path, "7.jpg")))
|
||||
.Returns(false);
|
||||
.Throws(new WebException());
|
||||
|
||||
mocker.GetMock<HttpProvider>()
|
||||
.Setup(s => s.DownloadFile(It.IsAny<string>(), Path.Combine(path, "8.jpg")))
|
||||
.Returns(true);
|
||||
.Setup(s => s.DownloadFile(It.IsAny<string>(), Path.Combine(path, "8.jpg")));
|
||||
|
||||
|
||||
mocker.GetMock<HttpProvider>()
|
||||
.Setup(s => s.DownloadFile(It.IsAny<string>(), Path.Combine(path, "9.jpg")))
|
||||
.Returns(false);
|
||||
.Throws(new WebException());
|
||||
|
||||
mocker.GetMock<HttpProvider>()
|
||||
.Setup(s => s.DownloadFile(It.IsAny<string>(), Path.Combine(path, "10.jpg")))
|
||||
.Returns(true);
|
||||
.Setup(s => s.DownloadFile(It.IsAny<string>(), Path.Combine(path, "10.jpg")));
|
||||
|
||||
|
||||
mocker.GetMock<DiskProvider>()
|
||||
.Setup(S => S.CreateDirectory(It.IsAny<string>()))
|
||||
@ -160,6 +161,7 @@ public void BannerDownload_all_failed_download()
|
||||
.Build();
|
||||
|
||||
var mocker = new AutoMoqer(MockBehavior.Strict);
|
||||
mocker.Resolve<EnviromentProvider>();
|
||||
|
||||
var notification = new ProgressNotification("Banner Download");
|
||||
|
||||
@ -169,7 +171,7 @@ public void BannerDownload_all_failed_download()
|
||||
|
||||
mocker.GetMock<HttpProvider>()
|
||||
.Setup(s => s.DownloadFile(It.IsAny<string>(), It.IsAny<string>()))
|
||||
.Returns(false);
|
||||
.Throws(new WebException());
|
||||
|
||||
mocker.GetMock<DiskProvider>()
|
||||
.Setup(S => S.CreateDirectory(It.IsAny<string>()))
|
||||
@ -193,6 +195,7 @@ public void BannerDownload_single_banner()
|
||||
.Build();
|
||||
|
||||
var mocker = new AutoMoqer(MockBehavior.Strict);
|
||||
mocker.Resolve<EnviromentProvider>();
|
||||
|
||||
var notification = new ProgressNotification("Banner Download");
|
||||
|
||||
@ -202,7 +205,7 @@ public void BannerDownload_single_banner()
|
||||
|
||||
mocker.GetMock<HttpProvider>()
|
||||
.Setup(s => s.DownloadFile(It.IsAny<string>(), It.IsAny<string>()))
|
||||
.Returns(true);
|
||||
.Throws(new WebException());
|
||||
|
||||
mocker.GetMock<DiskProvider>()
|
||||
.Setup(S => S.CreateDirectory(It.IsAny<string>()))
|
||||
@ -231,7 +234,7 @@ public void Download_Banner()
|
||||
|
||||
mocker.GetMock<HttpProvider>()
|
||||
.Setup(s => s.DownloadFile(It.IsAny<string>(), It.IsAny<string>()))
|
||||
.Returns(true);
|
||||
.Throws(new WebException());
|
||||
|
||||
//Act
|
||||
mocker.Resolve<BannerDownloadJob>().DownloadBanner(notification, fakeSeries);
|
||||
|
@ -92,8 +92,11 @@
|
||||
<Compile Include="JobTests\BannerDownloadJobTest.cs" />
|
||||
<Compile Include="ProviderTests\ConfigFileProviderTest.cs" />
|
||||
<Compile Include="Framework\AutoMoq\TestBaseTests.cs" />
|
||||
<Compile Include="ProviderTests\DiskProviderTests\ExtractArchiveFixture.cs" />
|
||||
<Compile Include="ProviderTests\PostDownloadProviderTest.cs" />
|
||||
<Compile Include="JobTests\SearchJobTest.cs" />
|
||||
<Compile Include="ProviderTests\UpdateProviderTests\PreformUpdateFixture.cs" />
|
||||
<Compile Include="ProviderTests\UpdateProviderTests\GetAvilableUpdateFixture.cs" />
|
||||
<Compile Include="SortHelperTest.cs" />
|
||||
<Compile Include="ProviderTests\EpisodeProviderTest_DeleteInvalidEpisodes.cs" />
|
||||
<Compile Include="ProviderTests\InventoryProvider_IsAcceptableSizeTest.cs" />
|
||||
@ -213,6 +216,9 @@
|
||||
<SubType>Designer</SubType>
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<None Include="Files\TestArchive.zip">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="packages.config" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
|
@ -0,0 +1,29 @@
|
||||
using FluentAssertions;
|
||||
using NUnit.Framework;
|
||||
using NzbDrone.Core.Providers.Core;
|
||||
using NzbDrone.Core.Test.Framework;
|
||||
using System.IO;
|
||||
|
||||
namespace NzbDrone.Core.Test.ProviderTests.DiskProviderTests
|
||||
{
|
||||
[TestFixture]
|
||||
public class ExtractArchiveFixture : TestBase
|
||||
{
|
||||
[Test]
|
||||
public void Should_extract_to_correct_folder()
|
||||
{
|
||||
var diskProvider = new DiskProvider();
|
||||
|
||||
var destination = Path.Combine(TempFolder, "destination");
|
||||
diskProvider.ExtractArchive(GetTestFilePath("TestArchive.zip"), destination);
|
||||
|
||||
|
||||
var destinationFolder = new DirectoryInfo(destination);
|
||||
|
||||
destinationFolder.Exists.Should().BeTrue();
|
||||
destinationFolder.GetDirectories().Should().HaveCount(1);
|
||||
destinationFolder.GetDirectories("*", SearchOption.AllDirectories).Should().HaveCount(3);
|
||||
destinationFolder.GetFiles("*.*", SearchOption.AllDirectories).Should().HaveCount(6);
|
||||
}
|
||||
}
|
||||
}
|
@ -20,6 +20,8 @@ namespace NzbDrone.Core.Test.ProviderTests
|
||||
public class LogProviderTest : TestBase
|
||||
{
|
||||
|
||||
private const string loggerName ="Core.Test.ProviderTests.LogProviderTest";
|
||||
|
||||
|
||||
[Test]
|
||||
public void write_log()
|
||||
@ -46,7 +48,7 @@ public void write_log()
|
||||
var logItem = db.Fetch<Log>().First();
|
||||
Assert.AreNotEqual(new DateTime(), logItem.Time);
|
||||
Assert.AreEqual(message, logItem.Message);
|
||||
Assert.AreEqual("Core.Test.LogProviderTest", logItem.Logger);
|
||||
Assert.AreEqual(loggerName, logItem.Logger);
|
||||
|
||||
Logger.Name.Should().EndWith(logItem.Logger);
|
||||
|
||||
@ -143,7 +145,7 @@ public void write_log_exception()
|
||||
var logItem = db.Fetch<Log>().First();
|
||||
Assert.AreNotEqual(new DateTime(), logItem.Time);
|
||||
Assert.AreEqual(message + ": " + ex.Message, logItem.Message);
|
||||
Assert.AreEqual("Core.Test.LogProviderTest", logItem.Logger);
|
||||
Assert.AreEqual(loggerName, logItem.Logger);
|
||||
Assert.AreEqual(LogLevel.Error.Name, logItem.Level);
|
||||
Assert.AreEqual(ex.GetType().ToString(), logItem.ExceptionType);
|
||||
Assert.AreEqual(ex.ToString(), logItem.Exception);
|
||||
@ -177,7 +179,7 @@ public void write_log_exception_no_message_should_use_exception_message()
|
||||
var logItem = db.Fetch<Log>().First();
|
||||
Assert.AreNotEqual(new DateTime(), logItem.Time);
|
||||
Assert.AreEqual(ex.Message, logItem.Message);
|
||||
Assert.AreEqual("Core.Test.LogProviderTest", logItem.Logger);
|
||||
Assert.AreEqual(loggerName, logItem.Logger);
|
||||
Assert.AreEqual(LogLevel.Error.Name, logItem.Level);
|
||||
Assert.AreEqual(ex.GetType().ToString(), logItem.ExceptionType);
|
||||
Assert.AreEqual(ex.ToString(), logItem.Exception);
|
||||
|
@ -20,7 +20,7 @@ public class TvDbProviderTest : TestBase
|
||||
[TestCase("South Park")]
|
||||
public void successful_search(string title)
|
||||
{
|
||||
var result = new TvDbProvider().SearchSeries(title);
|
||||
var result = new TvDbProvider(new EnviromentProvider()).SearchSeries(title);
|
||||
|
||||
result.Should().NotBeEmpty();
|
||||
result[0].SeriesName.Should().Be(title);
|
||||
@ -35,7 +35,7 @@ public void successful_search(string title)
|
||||
public void no_search_result()
|
||||
{
|
||||
//setup
|
||||
var tvdbProvider = new TvDbProvider();
|
||||
var tvdbProvider = new TvDbProvider(new EnviromentProvider());
|
||||
|
||||
//act
|
||||
var result = tvdbProvider.SearchSeries(Guid.NewGuid().ToString());
|
||||
@ -49,7 +49,7 @@ public void no_search_result()
|
||||
public void none_unique_season_episode_number()
|
||||
{
|
||||
//setup
|
||||
var tvdbProvider = new TvDbProvider();
|
||||
var tvdbProvider = new TvDbProvider(new EnviromentProvider());
|
||||
|
||||
//act
|
||||
var result = tvdbProvider.GetSeries(75978, true);//Family guy
|
||||
@ -65,7 +65,7 @@ public void none_unique_season_episode_number()
|
||||
public void American_dad_fix()
|
||||
{
|
||||
//setup
|
||||
var tvdbProvider = new TvDbProvider();
|
||||
var tvdbProvider = new TvDbProvider(new EnviromentProvider());
|
||||
|
||||
//act
|
||||
var result = tvdbProvider.GetSeries(73141, true);
|
||||
|
@ -0,0 +1,66 @@
|
||||
using System;
|
||||
using AutoMoq;
|
||||
using FluentAssertions;
|
||||
using Moq;
|
||||
using NUnit.Framework;
|
||||
using NzbDrone.Core.Providers;
|
||||
using NzbDrone.Core.Providers.Core;
|
||||
using NzbDrone.Core.Test.Framework;
|
||||
|
||||
namespace NzbDrone.Core.Test.ProviderTests.UpdateProviderTests
|
||||
{
|
||||
class GetAvilableUpdateFixture : TestBase
|
||||
{
|
||||
private AutoMoqer _mocker = null;
|
||||
|
||||
private static Version _latestsTestVersion = new Version("0.6.0.3");
|
||||
private static string _latestsTestUrl = "http://update.nzbdrone.com/_test/NzbDrone.master.0.6.0.3.zip";
|
||||
private static string _latestsTestFileName = "NzbDrone.master.0.6.0.3.zip";
|
||||
|
||||
[SetUp]
|
||||
public void setup()
|
||||
{
|
||||
_mocker = new AutoMoqer(MockBehavior.Strict);
|
||||
|
||||
_mocker.GetMock<ConfigProvider>().SetupGet(c => c.UpdateUrl).Returns("http://update.nzbdrone.com/_test/");
|
||||
_mocker.Resolve<HttpProvider>();
|
||||
}
|
||||
|
||||
[TestCase("0.6.0.9")]
|
||||
[TestCase("0.7.0.1")]
|
||||
[TestCase("1.0.0.0")]
|
||||
public void should_return_null_if_latests_is_lower_than_current_version(string currentVersion)
|
||||
{
|
||||
_mocker.GetMock<EnviromentProvider>().SetupGet(c => c.Version).Returns(new Version(currentVersion));
|
||||
|
||||
var updatePackage = _mocker.Resolve<UpdateProvider>().GetAvilableUpdate();
|
||||
|
||||
updatePackage.Should().BeNull();
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void should_return_null_if_latests_is_equal_to_current_version()
|
||||
{
|
||||
_mocker.GetMock<EnviromentProvider>().SetupGet(c => c.Version).Returns(_latestsTestVersion);
|
||||
|
||||
var updatePackage = _mocker.Resolve<UpdateProvider>().GetAvilableUpdate();
|
||||
|
||||
updatePackage.Should().BeNull();
|
||||
}
|
||||
|
||||
[TestCase("0.0.0.0")]
|
||||
[TestCase("0.0.0.1")]
|
||||
[TestCase("0.0.10.10")]
|
||||
public void should_return_update_if_latests_is_higher_than_current_version(string currentVersion)
|
||||
{
|
||||
_mocker.GetMock<EnviromentProvider>().SetupGet(c => c.Version).Returns(new Version(currentVersion));
|
||||
|
||||
var updatePackage = _mocker.Resolve<UpdateProvider>().GetAvilableUpdate();
|
||||
|
||||
updatePackage.Should().NotBeNull();
|
||||
updatePackage.Version.Should().Be(_latestsTestVersion);
|
||||
updatePackage.FileName.Should().BeEquivalentTo(_latestsTestFileName);
|
||||
updatePackage.Url.Should().BeEquivalentTo(_latestsTestUrl);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,75 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using AutoMoq;
|
||||
using FluentAssertions;
|
||||
using Moq;
|
||||
using NUnit.Framework;
|
||||
using NzbDrone.Core.Model;
|
||||
using NzbDrone.Core.Providers;
|
||||
using NzbDrone.Core.Providers.Core;
|
||||
using NzbDrone.Core.Test.Framework;
|
||||
|
||||
namespace NzbDrone.Core.Test.ProviderTests.UpdateProviderTests
|
||||
{
|
||||
[TestFixture]
|
||||
internal class PreformUpdateFixture : TestBase
|
||||
{
|
||||
private AutoMoqer _mocker = null;
|
||||
|
||||
[SetUp]
|
||||
public void setup()
|
||||
{
|
||||
_mocker = new AutoMoqer(MockBehavior.Strict);
|
||||
_mocker.GetMock<EnviromentProvider>()
|
||||
.SetupGet(c => c.TempPath).Returns(TempFolder);
|
||||
}
|
||||
|
||||
|
||||
[Test]
|
||||
public void Should_call_download_file_using_correct_arguments()
|
||||
{
|
||||
//Act
|
||||
var updatePackage = new UpdatePackage
|
||||
{
|
||||
FileName = "NzbDrone.kay.one.0.6.0.2031.zip",
|
||||
Url = "http://update.nzbdrone.com/kayone/NzbDrone.kay.one.0.6.0.2031.zip",
|
||||
Version = new Version("0.6.0.2031")
|
||||
};
|
||||
|
||||
_mocker.GetMock<HttpProvider>().Setup(
|
||||
c => c.DownloadFile(updatePackage.Url, Path.Combine(TempFolder, updatePackage.FileName)));
|
||||
|
||||
_mocker.Resolve<UpdateProvider>().PreformUpdate(updatePackage);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Should_download_and_extract_to_temp_folder()
|
||||
{
|
||||
|
||||
var updateSubFolder = new DirectoryInfo(Path.Combine(TempFolder, UpdateProvider.SandboxFolderName));
|
||||
|
||||
var updatePackage = new UpdatePackage
|
||||
{
|
||||
FileName = "NzbDrone.kay.one.0.6.0.2031.zip",
|
||||
Url = "http://update.nzbdrone.com/_test/NzbDrone.zip",
|
||||
Version = new Version("0.6.0.2031")
|
||||
};
|
||||
|
||||
|
||||
//Act
|
||||
updateSubFolder.Exists.Should().BeFalse();
|
||||
|
||||
_mocker.Resolve<HttpProvider>();
|
||||
_mocker.Resolve<DiskProvider>();
|
||||
_mocker.Resolve<UpdateProvider>().PreformUpdate(updatePackage);
|
||||
updateSubFolder.Refresh();
|
||||
//Assert
|
||||
|
||||
updateSubFolder.Exists.Should().BeTrue();
|
||||
updateSubFolder.GetDirectories("nzbdrone").Should().HaveCount(1);
|
||||
updateSubFolder.GetDirectories().Should().HaveCount(1);
|
||||
updateSubFolder.GetFiles().Should().HaveCount(1);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -23,35 +23,6 @@ public static class CentralDispatch
|
||||
private static readonly Object KernelLock = new object();
|
||||
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
|
||||
|
||||
|
||||
public static Version Version
|
||||
{
|
||||
get { return Assembly.GetExecutingAssembly().GetName().Version; }
|
||||
}
|
||||
|
||||
|
||||
public static DateTime BuildDateTime
|
||||
{
|
||||
get
|
||||
{
|
||||
var fileLocation = Assembly.GetCallingAssembly().Location;
|
||||
return new FileInfo(fileLocation).CreationTime;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static String AppPath
|
||||
{
|
||||
get
|
||||
{
|
||||
if (!String.IsNullOrWhiteSpace(HostingEnvironment.ApplicationPhysicalPath))
|
||||
{
|
||||
return HostingEnvironment.ApplicationPhysicalPath;
|
||||
}
|
||||
return Directory.GetCurrentDirectory();
|
||||
}
|
||||
}
|
||||
|
||||
public static StandardKernel NinjectKernel
|
||||
{
|
||||
get
|
||||
|
@ -4,13 +4,14 @@
|
||||
using System.Data.SqlServerCe;
|
||||
using System.IO;
|
||||
using MvcMiniProfiler.Data;
|
||||
using NzbDrone.Core.Providers;
|
||||
using PetaPoco;
|
||||
|
||||
namespace NzbDrone.Core.Datastore
|
||||
{
|
||||
public static class Connection
|
||||
{
|
||||
private static readonly DirectoryInfo AppDataPath = new DirectoryInfo(Path.Combine(CentralDispatch.AppPath, "App_Data"));
|
||||
private static readonly DirectoryInfo AppDataPath = new DirectoryInfo(Path.Combine(new EnviromentProvider().AppPath, "App_Data"));
|
||||
|
||||
static Connection()
|
||||
{
|
||||
|
@ -3,6 +3,7 @@
|
||||
using Ninject;
|
||||
using NLog;
|
||||
using NLog.Config;
|
||||
using NzbDrone.Core.Providers;
|
||||
|
||||
namespace NzbDrone.Core.Instrumentation
|
||||
{
|
||||
@ -15,7 +16,7 @@ public static void Setup()
|
||||
LogManager.ThrowExceptions = true;
|
||||
}
|
||||
|
||||
LogManager.Configuration = new XmlLoggingConfiguration(Path.Combine(CentralDispatch.AppPath, "log.config"),
|
||||
LogManager.Configuration = new XmlLoggingConfiguration(Path.Combine(new EnviromentProvider().AppPath, "log.config"),
|
||||
false);
|
||||
|
||||
LogManager.ConfigurationReloaded += ((s, e) => StartDbLogging());
|
||||
|
14
NzbDrone.Core/Model/UpdatePackage.cs
Normal file
14
NzbDrone.Core/Model/UpdatePackage.cs
Normal file
@ -0,0 +1,14 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace NzbDrone.Core.Model
|
||||
{
|
||||
public class UpdatePackage
|
||||
{
|
||||
public string Url { get; set; }
|
||||
public string FileName { get; set; }
|
||||
public Version Version { get; set; }
|
||||
}
|
||||
}
|
@ -125,6 +125,9 @@
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\Libraries\Exceptioneer.WindowsFormsClient.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Ionic.Zip">
|
||||
<HintPath>..\packages\DotNetZip.1.9.1.8\lib\net20\Ionic.Zip.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Microsoft.CSharp" />
|
||||
<Reference Include="Migrator, Version=0.9.1.26254, Culture=neutral, PublicKeyToken=3b3586e9632ecfce, processorArchitecture=x86">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
@ -203,12 +206,14 @@
|
||||
<Compile Include="Model\SabnzbdInfoModel.cs" />
|
||||
<Compile Include="Model\Search\SearchModel.cs" />
|
||||
<Compile Include="Model\Search\SearchType.cs" />
|
||||
<Compile Include="Model\UpdatePackage.cs" />
|
||||
<Compile Include="Model\Xbmc\ActionType.cs" />
|
||||
<Compile Include="Model\Xbmc\ActivePlayersResult.cs" />
|
||||
<Compile Include="Model\Xbmc\ErrorResult.cs" />
|
||||
<Compile Include="Model\Xbmc\IconType.cs" />
|
||||
<Compile Include="Providers\Converting\AtomicParsleyProvider.cs" />
|
||||
<Compile Include="Providers\Converting\HandbrakeProvider.cs" />
|
||||
<Compile Include="Providers\EnviromentProvider.cs" />
|
||||
<Compile Include="Providers\Core\ConfigFileProvider.cs" />
|
||||
<Compile Include="Providers\Core\UdpProvider.cs" />
|
||||
<Compile Include="Providers\Jobs\BacklogSearchJob.cs" />
|
||||
@ -222,6 +227,7 @@
|
||||
<Compile Include="Providers\PostDownloadProvider.cs" />
|
||||
<Compile Include="Providers\QualityTypeProvider.cs" />
|
||||
<Compile Include="Providers\SearchProvider.cs" />
|
||||
<Compile Include="Providers\UpdateProvider.cs" />
|
||||
<Compile Include="Providers\Xbmc\ResourceManager.cs" />
|
||||
<Compile Include="Model\Xbmc\TvShowResult.cs" />
|
||||
<Compile Include="Model\Xbmc\Params.cs" />
|
||||
|
@ -11,7 +11,7 @@ namespace NzbDrone.Core.Providers.Core
|
||||
{
|
||||
public class ConfigFileProvider
|
||||
{
|
||||
private string _configFile = Path.Combine(CentralDispatch.AppPath, "App_Data", "Config.xml");
|
||||
private string _configFile = Path.Combine(new EnviromentProvider().AppPath, "App_Data", "Config.xml");
|
||||
|
||||
public string ConfigFile
|
||||
{
|
||||
@ -113,7 +113,7 @@ public virtual void SetValue(string key, object value, string parent = null)
|
||||
public virtual void CreateDefaultConfigFile()
|
||||
{
|
||||
//Create the config file here
|
||||
Directory.CreateDirectory(Path.Combine(CentralDispatch.AppPath, "App_Data"));
|
||||
Directory.CreateDirectory(Path.Combine(new EnviromentProvider().AppPath, "App_Data"));
|
||||
|
||||
if (!File.Exists(ConfigFile))
|
||||
{
|
||||
|
@ -305,6 +305,12 @@ public virtual string XbmcPassword
|
||||
set { SetValue("XbmcPassword", value); }
|
||||
}
|
||||
|
||||
public virtual string UpdateUrl
|
||||
{
|
||||
get { return GetValue("UpdateUrl", @"http://update.nzbdrone.com/master/"); }
|
||||
set { SetValue("UpdateUrl", value); }
|
||||
}
|
||||
|
||||
private string GetValue(string key)
|
||||
{
|
||||
return GetValue(key, String.Empty);
|
||||
|
@ -2,11 +2,15 @@
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using Ionic.Zip;
|
||||
using NLog;
|
||||
|
||||
namespace NzbDrone.Core.Providers.Core
|
||||
{
|
||||
public class DiskProvider
|
||||
{
|
||||
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
|
||||
|
||||
public virtual bool FolderExists(string path)
|
||||
{
|
||||
return Directory.Exists(path);
|
||||
@ -74,6 +78,18 @@ public virtual void MoveDirectory(string source, string destination)
|
||||
Directory.Move(source, destination);
|
||||
}
|
||||
|
||||
public virtual void ExtractArchive(string compressedFile, string destination)
|
||||
{
|
||||
Logger.Trace("Extracting archive [{0}] to [{1}]", compressedFile, destination);
|
||||
|
||||
using (ZipFile zipFile = ZipFile.Read(compressedFile))
|
||||
{
|
||||
zipFile.ExtractAll(destination);
|
||||
}
|
||||
|
||||
Logger.Trace("Extraction complete.");
|
||||
}
|
||||
|
||||
public virtual void InheritFolderPermissions(string filename)
|
||||
{
|
||||
var fs = File.GetAccessControl(filename);
|
||||
|
@ -1,4 +1,5 @@
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Net;
|
||||
using System.Text;
|
||||
@ -50,19 +51,29 @@ public virtual Stream DownloadStream(string url, NetworkCredential credential)
|
||||
return response.GetResponseStream();
|
||||
}
|
||||
|
||||
public virtual bool DownloadFile(string address, string fileName)
|
||||
public virtual void DownloadFile(string url, string fileName)
|
||||
{
|
||||
try
|
||||
{
|
||||
var fileInfo = new FileInfo(fileName);
|
||||
if (!fileInfo.Directory.Exists)
|
||||
{
|
||||
fileInfo.Directory.Create();
|
||||
}
|
||||
|
||||
Logger.Trace("Downloading [{0}] to [{1}]", url, fileName);
|
||||
|
||||
var stopWatch = Stopwatch.StartNew();
|
||||
var webClient = new WebClient();
|
||||
webClient.DownloadFile(address, fileName);
|
||||
return true;
|
||||
webClient.DownloadFile(url, fileName);
|
||||
stopWatch.Stop();
|
||||
Logger.Trace("Downloading Completed. took {0:0}s", stopWatch.Elapsed.Seconds);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logger.Warn("Failed to get response from: {0}", address);
|
||||
Logger.Warn("Failed to get response from: {0}", url);
|
||||
Logger.TraceException(ex.Message, ex);
|
||||
return false;
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
|
55
NzbDrone.Core/Providers/EnviromentProvider.cs
Normal file
55
NzbDrone.Core/Providers/EnviromentProvider.cs
Normal file
@ -0,0 +1,55 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Web.Hosting;
|
||||
using NLog;
|
||||
using Ninject;
|
||||
using NzbDrone.Core.Model;
|
||||
using NzbDrone.Core.Providers.Core;
|
||||
|
||||
namespace NzbDrone.Core.Providers
|
||||
{
|
||||
public class EnviromentProvider
|
||||
{
|
||||
|
||||
public virtual Version Version
|
||||
{
|
||||
get { return Assembly.GetExecutingAssembly().GetName().Version; }
|
||||
}
|
||||
|
||||
public virtual DateTime BuildDateTime
|
||||
{
|
||||
get
|
||||
{
|
||||
var fileLocation = Assembly.GetCallingAssembly().Location;
|
||||
return new FileInfo(fileLocation).CreationTime;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public virtual String AppPath
|
||||
{
|
||||
get
|
||||
{
|
||||
if (!String.IsNullOrWhiteSpace(HostingEnvironment.ApplicationPhysicalPath))
|
||||
{
|
||||
return HostingEnvironment.ApplicationPhysicalPath;
|
||||
}
|
||||
return Directory.GetCurrentDirectory();
|
||||
}
|
||||
}
|
||||
|
||||
public virtual String TempPath
|
||||
{
|
||||
get
|
||||
{
|
||||
return Path.GetTempPath();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -15,17 +15,19 @@ public class BannerDownloadJob : IJob
|
||||
private readonly SeriesProvider _seriesProvider;
|
||||
private readonly HttpProvider _httpProvider;
|
||||
private readonly DiskProvider _diskProvider;
|
||||
private readonly EnviromentProvider _enviromentProvider;
|
||||
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
|
||||
|
||||
private string _bannerPath = "";
|
||||
private const string _bannerUrlPrefix = "http://www.thetvdb.com/banners/";
|
||||
|
||||
[Inject]
|
||||
public BannerDownloadJob(SeriesProvider seriesProvider, HttpProvider httpProvider, DiskProvider diskProvider)
|
||||
public BannerDownloadJob(SeriesProvider seriesProvider, HttpProvider httpProvider, DiskProvider diskProvider, EnviromentProvider enviromentProvider)
|
||||
{
|
||||
_seriesProvider = seriesProvider;
|
||||
_httpProvider = httpProvider;
|
||||
_diskProvider = diskProvider;
|
||||
_enviromentProvider = enviromentProvider;
|
||||
}
|
||||
|
||||
public BannerDownloadJob()
|
||||
@ -47,7 +49,7 @@ public virtual void Start(ProgressNotification notification, int targetId, int s
|
||||
{
|
||||
Logger.Debug("Starting banner download job");
|
||||
|
||||
_bannerPath = Path.Combine(CentralDispatch.AppPath, "Content", "Images", "Banners");
|
||||
_bannerPath = Path.Combine(_enviromentProvider.AppPath, "Content", "Images", "Banners");
|
||||
_diskProvider.CreateDirectory(_bannerPath);
|
||||
|
||||
if (targetId > 0)
|
||||
@ -76,10 +78,12 @@ public virtual void DownloadBanner(ProgressNotification notification, Series ser
|
||||
|
||||
notification.CurrentMessage = string.Format("Downloading banner for '{0}'", series.Title);
|
||||
|
||||
if (_httpProvider.DownloadFile(_bannerUrlPrefix + series.BannerUrl, bannerFilename))
|
||||
try
|
||||
{
|
||||
_httpProvider.DownloadFile(_bannerUrlPrefix + series.BannerUrl, bannerFilename);
|
||||
notification.CurrentMessage = string.Format("Successfully download banner for '{0}'", series.Title);
|
||||
|
||||
else
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
Logger.Debug("Failed to download banner for '{0}'", series.Title);
|
||||
notification.CurrentMessage = string.Format("Failed to download banner for '{0}'", series.Title);
|
||||
|
@ -278,7 +278,7 @@ private void Execute(Type jobType, int targetId = 0, int secondaryTargetId = 0)
|
||||
settings.Success = true;
|
||||
|
||||
sw.Stop();
|
||||
Logger.Debug("Job '{0}' successfully completed in {1}.{2} seconds.", jobImplementation.Name, sw.Elapsed.Seconds, sw.Elapsed.Milliseconds / 100,
|
||||
Logger.Debug("Job '{0}' successfully completed in {1:0}.{2} seconds.", jobImplementation.Name, sw.Elapsed.TotalSeconds, sw.Elapsed.Milliseconds / 100,
|
||||
sw.Elapsed.Seconds);
|
||||
}
|
||||
catch (Exception e)
|
||||
|
@ -3,6 +3,7 @@
|
||||
using System.Linq;
|
||||
using System.Text.RegularExpressions;
|
||||
using NLog;
|
||||
using Ninject;
|
||||
using TvdbLib;
|
||||
using TvdbLib.Cache;
|
||||
using TvdbLib.Data;
|
||||
@ -11,14 +12,22 @@ namespace NzbDrone.Core.Providers
|
||||
{
|
||||
public class TvDbProvider
|
||||
{
|
||||
private readonly EnviromentProvider _enviromentProvider;
|
||||
private const string TVDB_APIKEY = "5D2D188E86E07F4F";
|
||||
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
|
||||
|
||||
private readonly TvdbHandler _handler;
|
||||
|
||||
[Inject]
|
||||
public TvDbProvider(EnviromentProvider enviromentProvider)
|
||||
{
|
||||
_enviromentProvider = enviromentProvider;
|
||||
_handler = new TvdbHandler(new XmlCacheProvider(_enviromentProvider.AppPath + @"\cache\tvdb"), TVDB_APIKEY);
|
||||
}
|
||||
|
||||
public TvDbProvider()
|
||||
{
|
||||
_handler = new TvdbHandler(new XmlCacheProvider(CentralDispatch.AppPath + @"\cache\tvdb"), TVDB_APIKEY);
|
||||
|
||||
}
|
||||
|
||||
public virtual IList<TvdbSearchResult> SearchSeries(string title)
|
||||
|
87
NzbDrone.Core/Providers/UpdateProvider.cs
Normal file
87
NzbDrone.Core/Providers/UpdateProvider.cs
Normal file
@ -0,0 +1,87 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
using NLog;
|
||||
using Ninject;
|
||||
using NzbDrone.Core.Model;
|
||||
using NzbDrone.Core.Providers.Core;
|
||||
|
||||
namespace NzbDrone.Core.Providers
|
||||
{
|
||||
class UpdateProvider
|
||||
{
|
||||
private readonly HttpProvider _httpProvider;
|
||||
private readonly ConfigProvider _configProvider;
|
||||
private readonly EnviromentProvider _enviromentProvider;
|
||||
private readonly DiskProvider _diskProvider;
|
||||
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
|
||||
|
||||
private static readonly Regex ParseRegex = new Regex(@"(?:\>)(?<filename>NzbDrone.+?(?<version>\d+\.\d+\.\d+\.\d+).+?)(?:\<\/A\>)", RegexOptions.IgnoreCase);
|
||||
|
||||
public const string SandboxFolderName = "nzbdrone_update";
|
||||
|
||||
[Inject]
|
||||
public UpdateProvider(HttpProvider httpProvider, ConfigProvider configProvider, EnviromentProvider enviromentProvider, DiskProvider diskProvider)
|
||||
{
|
||||
_httpProvider = httpProvider;
|
||||
_configProvider = configProvider;
|
||||
_enviromentProvider = enviromentProvider;
|
||||
_diskProvider = diskProvider;
|
||||
}
|
||||
|
||||
public UpdateProvider()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
private List<UpdatePackage> GetAvailablePackages()
|
||||
{
|
||||
var updateList = new List<UpdatePackage>();
|
||||
var rawUpdateList = _httpProvider.DownloadString(_configProvider.UpdateUrl);
|
||||
var matches = ParseRegex.Matches(rawUpdateList);
|
||||
|
||||
foreach (Match match in matches)
|
||||
{
|
||||
var updatePackage = new UpdatePackage();
|
||||
updatePackage.FileName = match.Groups["filename"].Value;
|
||||
updatePackage.Url = _configProvider.UpdateUrl + updatePackage.FileName;
|
||||
updatePackage.Version = new Version(match.Groups["version"].Value);
|
||||
updateList.Add(updatePackage);
|
||||
}
|
||||
|
||||
return updateList;
|
||||
}
|
||||
|
||||
public virtual UpdatePackage GetAvilableUpdate()
|
||||
{
|
||||
var latestAvailable = GetAvailablePackages().OrderByDescending(c => c.Version).FirstOrDefault();
|
||||
|
||||
if (latestAvailable != null && latestAvailable.Version > _enviromentProvider.Version)
|
||||
{
|
||||
Logger.Debug("An update is available ({0}) => ({1})", _enviromentProvider.Version, latestAvailable.Version);
|
||||
return latestAvailable;
|
||||
}
|
||||
|
||||
Logger.Trace("No updates available");
|
||||
return null;
|
||||
}
|
||||
|
||||
public virtual void PreformUpdate(UpdatePackage updatePackage)
|
||||
{
|
||||
var tempSubFolder = Path.Combine(_enviromentProvider.TempPath, SandboxFolderName);
|
||||
var packageDestination = Path.Combine(tempSubFolder, updatePackage.FileName);
|
||||
|
||||
Logger.Info("Downloading update package from [{0}] to [{1}]", updatePackage.Url, packageDestination);
|
||||
_httpProvider.DownloadFile(updatePackage.Url, packageDestination);
|
||||
Logger.Info("Download completed for update package from [{0}]", updatePackage.FileName);
|
||||
|
||||
Logger.Info("Extracting Update package");
|
||||
_diskProvider.ExtractArchive(packageDestination, tempSubFolder);
|
||||
Logger.Info("Update package extracted successfully");
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -1,7 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="DotNetZip" version="1.9.1.8" />
|
||||
<package id="MiniProfiler" version="1.9" />
|
||||
<package id="Ninject" version="2.2.1.4" />
|
||||
<package id="SqlServerCompact" version="4.0.8482.1" />
|
||||
<package id="NLog" version="2.0.0.2000" />
|
||||
<package id="SqlServerCompact" version="4.0.8482.1" />
|
||||
</packages>
|
@ -1,5 +1,5 @@
|
||||
@using NzbDrone.Core
|
||||
<div>
|
||||
NZBDrone @CentralDispatch.Version (@CentralDispatch.BuildDateTime.ToString("MMM d, yyyy"))
|
||||
@*NZBDrone @CentralDispatch.Version (@CentralDispatch.BuildDateTime.ToString("MMM d, yyyy"))*@
|
||||
</div>
|
||||
|
||||
|
BIN
packages/DotNetZip.1.9.1.8/DotNetZip.1.9.1.8.nupkg
vendored
Normal file
BIN
packages/DotNetZip.1.9.1.8/DotNetZip.1.9.1.8.nupkg
vendored
Normal file
Binary file not shown.
BIN
packages/DotNetZip.1.9.1.8/lib/net20/Ionic.Zip.dll
vendored
Normal file
BIN
packages/DotNetZip.1.9.1.8/lib/net20/Ionic.Zip.dll
vendored
Normal file
Binary file not shown.
18132
packages/DotNetZip.1.9.1.8/lib/net20/Ionic.Zip.xml
vendored
Normal file
18132
packages/DotNetZip.1.9.1.8/lib/net20/Ionic.Zip.xml
vendored
Normal file
File diff suppressed because it is too large
Load Diff
BIN
packages/DotNetZip.1.9.1.8/lib/sl/Ionic.Zip.dll
vendored
Normal file
BIN
packages/DotNetZip.1.9.1.8/lib/sl/Ionic.Zip.dll
vendored
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user