Merge branch 'master' of git://github.com/kayone/NzbDrone

This commit is contained in:
Mark McDowall 2011-05-26 23:04:41 -07:00
commit f5604fa955
11 changed files with 96 additions and 14 deletions

View File

@ -80,7 +80,7 @@ namespace NzbDrone.Core.Test
mocker.GetMock<SeriesProvider>() mocker.GetMock<SeriesProvider>()
.Setup(p => p.GetAllSeries()) .Setup(p => p.GetAllSeries())
.Returns(series.AsQueryable()); .Returns(series);
mocker.GetMock<MediaFileProvider>() mocker.GetMock<MediaFileProvider>()
.Setup(s => s.Scan(series[0])) .Setup(s => s.Scan(series[0]))
@ -109,7 +109,7 @@ namespace NzbDrone.Core.Test
mocker.GetMock<SeriesProvider>() mocker.GetMock<SeriesProvider>()
.Setup(p => p.GetAllSeries()) .Setup(p => p.GetAllSeries())
.Returns(series.AsQueryable()); .Returns(series);
mocker.GetMock<MediaFileProvider>() mocker.GetMock<MediaFileProvider>()
.Setup(s => s.Scan(series[0])) .Setup(s => s.Scan(series[0]))
@ -140,7 +140,7 @@ namespace NzbDrone.Core.Test
mocker.GetMock<SeriesProvider>() mocker.GetMock<SeriesProvider>()
.Setup(p => p.GetAllSeries()) .Setup(p => p.GetAllSeries())
.Returns(series.AsQueryable()); .Returns(series);
mocker.GetMock<MediaFileProvider>() mocker.GetMock<MediaFileProvider>()
.Setup(s => s.Scan(series[0])) .Setup(s => s.Scan(series[0]))

View File

@ -35,7 +35,7 @@ namespace NzbDrone.Core.Test
mocker.GetMock<SeriesProvider>() mocker.GetMock<SeriesProvider>()
.Setup(p => p.GetAllSeries()) .Setup(p => p.GetAllSeries())
.Returns(series.AsQueryable()); .Returns(series);
mocker.GetMock<DiskScanJob>() mocker.GetMock<DiskScanJob>()
@ -95,7 +95,7 @@ namespace NzbDrone.Core.Test
mocker.GetMock<SeriesProvider>() mocker.GetMock<SeriesProvider>()
.Setup(p => p.GetAllSeries()) .Setup(p => p.GetAllSeries())
.Returns(series.AsQueryable()); .Returns(series);
mocker.GetMock<UpdateInfoJob>() mocker.GetMock<UpdateInfoJob>()
.Setup(j => j.Start(notification, series[0].SeriesId)) .Setup(j => j.Start(notification, series[0].SeriesId))

View File

@ -187,8 +187,31 @@ namespace NzbDrone.Core.Test
Assert.ForAll(result, r => r.CleanTitle == "simpsons"); Assert.ForAll(result, r => r.CleanTitle == "simpsons");
Assert.ForAll(result, r => r.SeasonNumber == 21); Assert.ForAll(result, r => r.SeasonNumber == 21);
Assert.ForAll(result, r => r.EpisodeNumbers.Contains(23)); Assert.ForAll(result, r => r.EpisodeNumbers.Contains(23));
}
[Test]
public void nzbsorg_multi_word_search_returns_valid_results()
{
var mocker = new AutoMoqer();
mocker.GetMock<ConfigProvider>()
.SetupGet(c => c.NzbsOrgUId)
.Returns("43516");
mocker.GetMock<ConfigProvider>()
.SetupGet(c => c.NzbsOrgHash)
.Returns("bc8edb4cc49d4ae440775adec5ac001f");
mocker.Resolve<HttpProvider>();
var result = mocker.Resolve<NzbsOrg>().FetchEpisode("Blue Bloods", 1, 19);
Assert.IsNotEmpty(result);
Assert.ForAll(result, r => r.CleanTitle == "bluebloods");
Assert.ForAll(result, r => r.SeasonNumber == 1);
Assert.ForAll(result, r => r.EpisodeNumbers.Contains(19));
} }
} }
} }

View File

@ -324,10 +324,10 @@ namespace NzbDrone.Core.Test
public void scan_media_job_should_not_scan_new_series() public void scan_media_job_should_not_scan_new_series()
{ {
var mocker = new AutoMoqer(); var mocker = new AutoMoqer();
IQueryable<Series> fakeSeries = Builder<Series>.CreateListOfSize(2) var fakeSeries = Builder<Series>.CreateListOfSize(2)
.WhereTheFirst(1).Has(c => c.Episodes = new List<Episode>()) .WhereTheFirst(1).Has(c => c.Episodes = new List<Episode>())
.AndTheNext(1).Has(c => c.Episodes = Builder<Episode>.CreateListOfSize(10).Build()) .AndTheNext(1).Has(c => c.Episodes = Builder<Episode>.CreateListOfSize(10).Build())
.Build().AsQueryable(); .Build();
mocker.GetMock<SeriesProvider>() mocker.GetMock<SeriesProvider>()
.Setup(c => c.GetAllSeries()).Returns(fakeSeries); .Setup(c => c.GetAllSeries()).Returns(fakeSeries);

View File

@ -110,6 +110,9 @@ namespace NzbDrone.Core
_kernel.Bind<IndexerBase>().To<NzbMatrix>().InSingletonScope(); _kernel.Bind<IndexerBase>().To<NzbMatrix>().InSingletonScope();
_kernel.Bind<IndexerBase>().To<NzbsRUs>().InSingletonScope(); _kernel.Bind<IndexerBase>().To<NzbsRUs>().InSingletonScope();
_kernel.Bind<IndexerBase>().To<Newzbin>().InSingletonScope(); _kernel.Bind<IndexerBase>().To<Newzbin>().InSingletonScope();
var indexers = _kernel.GetAll<IndexerBase>();
_kernel.Get<IndexerProvider>().InitializeIndexers(indexers.ToList());
} }
private static void BindJobs() private static void BindJobs()
@ -119,6 +122,7 @@ namespace NzbDrone.Core
_kernel.Bind<IJob>().To<UpdateInfoJob>().InTransientScope(); _kernel.Bind<IJob>().To<UpdateInfoJob>().InTransientScope();
_kernel.Bind<IJob>().To<DiskScanJob>().InTransientScope(); _kernel.Bind<IJob>().To<DiskScanJob>().InTransientScope();
_kernel.Bind<IJob>().To<DeleteSeriesJob>().InTransientScope(); _kernel.Bind<IJob>().To<DeleteSeriesJob>().InTransientScope();
_kernel.Bind<IJob>().To<EpisodeSearchJob>().InTransientScope();
_kernel.Get<JobProvider>().Initialize(); _kernel.Get<JobProvider>().Initialize();
_kernel.Get<WebTimer>().StartTimer(30); _kernel.Get<WebTimer>().StartTimer(30);

View File

@ -25,7 +25,7 @@ namespace NzbDrone.Core.Providers.Indexer
public IndexerBase() public IndexerBase()
{ {
} }
/// <summary> /// <summary>
@ -96,7 +96,7 @@ namespace NzbDrone.Core.Providers.Indexer
public virtual IList<EpisodeParseResult> FetchEpisode(string seriesTitle, int seasonNumber, int episodeNumber) public virtual IList<EpisodeParseResult> FetchEpisode(string seriesTitle, int seasonNumber, int episodeNumber)
{ {
_logger.Debug("Searching {0} for {1}-S{2}E{3:00}", Name, seriesTitle, seasonNumber, episodeNumber); _logger.Debug("Searching {0} for {1}-S{2:00}E{3:00}", Name, seriesTitle, seasonNumber, episodeNumber);
var result = new List<EpisodeParseResult>(); var result = new List<EpisodeParseResult>();
@ -162,5 +162,10 @@ namespace NzbDrone.Core.Providers.Indexer
return CustomParser(item, episodeParseResult); return CustomParser(item, episodeParseResult);
} }
protected static string GetQueryTitle(string title)
{
return title.Trim().Replace(' ', '+');
}
} }
} }

View File

@ -11,7 +11,8 @@ namespace NzbDrone.Core.Providers.Indexer
{ {
public class NzbsOrg : IndexerBase public class NzbsOrg : IndexerBase
{ {
public NzbsOrg(HttpProvider httpProvider, ConfigProvider configProvider) : base(httpProvider, configProvider) public NzbsOrg(HttpProvider httpProvider, ConfigProvider configProvider)
: base(httpProvider, configProvider)
{ {
} }
@ -43,11 +44,11 @@ namespace NzbDrone.Core.Providers.Indexer
foreach (var url in Urls) foreach (var url in Urls)
{ {
searchUrls.Add(String.Format("{0}&action=search&q={1}+s{2}e{3:00}", url, seriesTitle, seasonNumber, episodeNumber)); searchUrls.Add(String.Format("{0}&action=search&q={1}+s{2:00}e{3:00}", url, GetQueryTitle(seriesTitle), seasonNumber, episodeNumber));
} }
return searchUrls; return searchUrls;
} }
} }
} }

View File

@ -1,4 +1,5 @@
using System; using System;
using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
@ -33,9 +34,9 @@ namespace NzbDrone.Core.Providers
{ {
} }
public virtual IQueryable<Series> GetAllSeries() public virtual IList<Series> GetAllSeries()
{ {
return _repository.All<Series>(); return _repository.All<Series>().ToList();
} }
public virtual Series GetSeries(int seriesId) public virtual Series GetSeries(int seriesId)

View File

@ -0,0 +1,32 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Web.Mvc;
using NzbDrone.Core.Providers;
using NzbDrone.Core.Providers.Core;
using NzbDrone.Core.Providers.Jobs;
using NzbDrone.Web.Models;
namespace NzbDrone.Web.Controllers
{
public class EpisodeController : Controller
{
private readonly JobProvider _jobProvider;
public EpisodeController(JobProvider jobProvider)
{
_jobProvider = jobProvider;
}
public JsonResult Search(int episodeId)
{
_jobProvider.QueueJob(typeof(EpisodeSearchJob), episodeId);
return new JsonResult { Data = "ok" };
}
}
}

View File

@ -215,6 +215,7 @@
<DesignTime>True</DesignTime> <DesignTime>True</DesignTime>
<DependentUpon>UploadLocalization.en-US.resx</DependentUpon> <DependentUpon>UploadLocalization.en-US.resx</DependentUpon>
</Compile> </Compile>
<Compile Include="Controllers\EpisodeController.cs" />
<Compile Include="Controllers\HealthController.cs" /> <Compile Include="Controllers\HealthController.cs" />
<Compile Include="Controllers\HistoryController.cs" /> <Compile Include="Controllers\HistoryController.cs" />
<Compile Include="Controllers\LogController.cs" /> <Compile Include="Controllers\LogController.cs" />

View File

@ -78,6 +78,8 @@
columns.Bound(c => c.AirDate).Format("{0:d}").Width(0); columns.Bound(c => c.AirDate).Format("{0:d}").Width(0);
columns.Bound(c => c.Quality).Width(0); columns.Bound(c => c.Quality).Width(0);
columns.Bound(c => c.Status).Width(0); columns.Bound(c => c.Status).Width(0);
columns.Bound(o => o.EpisodeId).Title("")
.ClientTemplate("<a href='#Search' onClick=\"return searchForEpisode('<#= EpisodeId #>')\" >Search</a>");
}) })
.DetailView(detailView => detailView.ClientTemplate("<div><#= Overview #> </br><#= Path #> </div>")) .DetailView(detailView => detailView.ClientTemplate("<div><#= Overview #> </br><#= Path #> </div>"))
.ClientEvents(clientEvents => .ClientEvents(clientEvents =>
@ -150,5 +152,18 @@
function episodeDetailExpanded(e) { function episodeDetailExpanded(e) {
$console.log("OnDetailViewExpand :: " + e.masterRow.cells[1].innerHTML); $console.log("OnDetailViewExpand :: " + e.masterRow.cells[1].innerHTML);
} }
var searchUrl = '@Url.Action("Search", "Episode")';
function searchForEpisode(id) {
$.ajax({
type: "POST",
url: searchUrl,
data: jQuery.param({ episodeId: id }),
error: function (req, status, error) {
alert("Sorry! We could search for " + id + " at this time. " + error);
}
});
}
</script> </script>
} }