mirror of https://github.com/lidarr/Lidarr
Oh hai search!
This commit is contained in:
parent
ac2d33443b
commit
cbbb6e2b18
|
@ -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]))
|
||||||
|
|
|
@ -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))
|
||||||
|
|
|
@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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(' ', '+');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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)
|
||||||
|
|
|
@ -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" };
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -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" />
|
||||||
|
|
|
@ -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>
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue