1
0
mirror of https://github.com/Radarr/Radarr.git synced 2024-11-04 10:02:40 +01:00

season list is properly populated in series details.

This commit is contained in:
kay.one 2013-03-03 14:26:41 -08:00
parent 6447b78a5a
commit 62f15d4d96
18 changed files with 127 additions and 23 deletions

View File

@ -125,6 +125,7 @@
<Compile Include="Resolvers\NullableDatetimeToString.cs" /> <Compile Include="Resolvers\NullableDatetimeToString.cs" />
<Compile Include="RootFolders\RootFolderModule.cs" /> <Compile Include="RootFolders\RootFolderModule.cs" />
<Compile Include="Extensions\RootPathProvider.cs" /> <Compile Include="Extensions\RootPathProvider.cs" />
<Compile Include="Seasons\SeasonModule.cs" />
<Compile Include="Series\SeriesResource.cs" /> <Compile Include="Series\SeriesResource.cs" />
<Compile Include="Series\SeriesModule.cs" /> <Compile Include="Series\SeriesModule.cs" />
<Compile Include="Series\SeriesLookupModule.cs" /> <Compile Include="Series\SeriesLookupModule.cs" />

View File

@ -0,0 +1,29 @@
using System.Linq;
using Nancy;
using NzbDrone.Api.Extensions;
using NzbDrone.Core.Tv;
namespace NzbDrone.Api.Seasons
{
public class SeasonModule : NzbDroneApiModule
{
private readonly ISeasonService _seasonService;
public SeasonModule(ISeasonService seasonService)
: base("/Season")
{
_seasonService = seasonService;
Get["/"] = x => GetSeasons();
}
private Response GetSeasons()
{
var seriesId = Request.Query.SeriesId;
return JsonExtensions.AsResponse(_seasonService.GetSeasonsBySeries(seriesId));
}
}
}

View File

@ -122,10 +122,14 @@
<Content Include="Routing.js" /> <Content Include="Routing.js" />
<Content Include="Series\Delete\DeleteSeriesTemplate.html" /> <Content Include="Series\Delete\DeleteSeriesTemplate.html" />
<Content Include="Series\Delete\DeleteSeriesView.js" /> <Content Include="Series\Delete\DeleteSeriesView.js" />
<Content Include="Series\Details\EpisodeCollection.js" />
<Content Include="Series\Details\EpisodeItemTemplate.html" />
<Content Include="Series\Details\EpisodeItemView.js" />
<Content Include="Series\Details\EpisodeModel.js" /> <Content Include="Series\Details\EpisodeModel.js" />
<Content Include="Series\Details\SeasonCollection.js" /> <Content Include="Series\Details\SeasonCollection.js" />
<Content Include="Series\Details\SeasonCollectionTemplate.html" /> <Content Include="Series\Details\SeasonCompositeTemplate.html" />
<Content Include="Series\Details\SeasonCollectionView.js" /> <Content Include="Series\Details\SeasonCompositeView.js" />
<Content Include="Series\Details\SeasonModel.js" />
<Content Include="Series\Details\SeriesDetailsTemplate.html" /> <Content Include="Series\Details\SeriesDetailsTemplate.html" />
<Content Include="Series\Details\SeriesDetailsView.js" /> <Content Include="Series\Details\SeriesDetailsView.js" />
<Content Include="Series\Edit\EditSeriesTemplate.html" /> <Content Include="Series\Edit\EditSeriesTemplate.html" />

View File

@ -1,5 +1,6 @@
define(['app','Series/Details/SeasonModel'], function () { define(['app','Series/Details/SeasonModel'], function () {
NzbDrone.Series.Details.SeasonCollection = Backbone.Collection.extend({ NzbDrone.Series.Details.SeasonCollection = Backbone.Collection.extend({
url: NzbDrone.Constants.ApiRoot + '/season' url: NzbDrone.Constants.ApiRoot + '/season',
model: NzbDrone.Series.Details.SeasonModel
}); });
}); });

View File

@ -1,4 +1,4 @@
<h3>Season {{seasonNumber}}</h3> <h3>{{seasonTitle}}</h3>
<table class="table table-hover x-season-table"> <table class="table table-hover x-season-table">
<thead> <thead>
<tr> <tr>

View File

@ -6,9 +6,7 @@ define(['app', 'Series/Details/EpisodeItemView'], function () {
template: 'Series/Details/SeasonCompositeTemplate', template: 'Series/Details/SeasonCompositeTemplate',
initialize: function() { initialize: function() {
var episodes = this.model.get('episodes');
var test = 1;
//this.collection
} }
}); });
}); });

View File

@ -1,4 +1,21 @@
define(['app', 'Series/Details/SeasonCollection'], function (app) { define(['app'], function () {
NzbDrone.Series.Details.SeasonModel = Backbone.Model.extend({ NzbDrone.Series.Details.SeasonModel = Backbone.Model.extend({
mutators: {
seasonTitle: function () {
var seasonNumber = this.get('seasonNumber');
if (seasonNumber === 0) {
return "Specials"
}
return "Season " + seasonNumber;
}
},
defaults: {
seasonNumber: 0
}
}); });
}); });

View File

@ -1,4 +1,6 @@
<div> <div>
<div class="x-series-details"></div> <div class="x-series-details">
{{overview}}
</div>
<div class="x-series-seasons"></div> <div class="x-series-seasons"></div>
</div> </div>

View File

@ -1,4 +1,4 @@
define(['app', 'Quality/QualityProfileCollection', 'Series/Details/SeasonCompositeView'], function () { define(['app', 'Quality/QualityProfileCollection', 'Series/Details/SeasonCompositeView', 'Series/Details/SeasonCollection'], function () {
NzbDrone.Series.Details.SeriesDetailsView = Backbone.Marionette.CompositeView.extend({ NzbDrone.Series.Details.SeriesDetailsView = Backbone.Marionette.CompositeView.extend({
itemView: NzbDrone.Series.Details.SeasonCompositeView, itemView: NzbDrone.Series.Details.SeasonCompositeView,
@ -6,6 +6,8 @@ define(['app', 'Quality/QualityProfileCollection', 'Series/Details/SeasonComposi
template: 'Series/Details/SeriesDetailsTemplate', template: 'Series/Details/SeriesDetailsTemplate',
initialize: function () { initialize: function () {
this.collection = new NzbDrone.Series.Details.SeasonCollection();
this.collection.fetch({data: { seriesId: this.model.get('id') }});
} }
}); });
}); });

View File

@ -17,7 +17,7 @@ public void should_publish_event_to_handlers()
var intHandler = new Mock<IHandle<EventA>>(); var intHandler = new Mock<IHandle<EventA>>();
var aggregator = new EventAggregator(TestLogger, new List<IHandle> { intHandler.Object }); var aggregator = new EventAggregator(TestLogger, () => new List<IHandle> { intHandler.Object });
aggregator.Publish(eventA); aggregator.Publish(eventA);
intHandler.Verify(c => c.Handle(eventA), Times.Once()); intHandler.Verify(c => c.Handle(eventA), Times.Once());
@ -30,7 +30,7 @@ public void should_publish_to_more_than_one_handler()
var intHandler1 = new Mock<IHandle<EventA>>(); var intHandler1 = new Mock<IHandle<EventA>>();
var intHandler2 = new Mock<IHandle<EventA>>(); var intHandler2 = new Mock<IHandle<EventA>>();
var aggregator = new EventAggregator(TestLogger, new List<IHandle> { intHandler1.Object, intHandler2.Object }); var aggregator = new EventAggregator(TestLogger, () => new List<IHandle> { intHandler1.Object, intHandler2.Object });
aggregator.Publish(eventA); aggregator.Publish(eventA);
intHandler1.Verify(c => c.Handle(eventA), Times.Once()); intHandler1.Verify(c => c.Handle(eventA), Times.Once());
@ -44,7 +44,7 @@ public void should_not_publish_to_incompatible_handlers()
var aHandler = new Mock<IHandle<EventA>>(); var aHandler = new Mock<IHandle<EventA>>();
var bHandler = new Mock<IHandle<EventB>>(); var bHandler = new Mock<IHandle<EventB>>();
var aggregator = new EventAggregator(TestLogger, new List<IHandle> { aHandler.Object, bHandler.Object }); var aggregator = new EventAggregator(TestLogger, () => new List<IHandle> { aHandler.Object, bHandler.Object });
aggregator.Publish(eventA); aggregator.Publish(eventA);

View File

@ -1,18 +1,17 @@
using System.Collections.Generic; using System;
using System.Collections.Generic;
using System.Linq; using System.Linq;
using NLog; using NLog;
using NzbDrone.Common.EnsureThat;
namespace NzbDrone.Common.Eventing namespace NzbDrone.Common.Eventing
{ {
public class EventAggregator : IEventAggregator public class EventAggregator : IEventAggregator
{ {
private readonly Logger _logger; private readonly Logger _logger;
private readonly IEnumerable<IHandle> _handlers; private readonly Func<IEnumerable<IHandle>> _handlers;
public EventAggregator(Logger logger, IEnumerable<IHandle> handlers) public EventAggregator(Logger logger, Func<IEnumerable<IHandle>> handlers)
{ {
Ensure.That(() => handlers).HasItems();
_logger = logger; _logger = logger;
_handlers = handlers; _handlers = handlers;
} }
@ -21,7 +20,7 @@ public void Publish<TEvent>(TEvent message) where TEvent : IEvent
{ {
_logger.Trace("Publishing {0}", message.GetType().Name); _logger.Trace("Publishing {0}", message.GetType().Name);
foreach (var handler in _handlers.OfType<IHandle<TEvent>>()) foreach (var handler in _handlers().OfType<IHandle<TEvent>>())
{ {
_logger.Trace("{0} => {1}", message.GetType().Name, handler.GetType().Name); _logger.Trace("{0} => {1}", message.GetType().Name, handler.GetType().Name);
handler.Handle(message); handler.Handle(message);

View File

@ -1,4 +1,5 @@
using System; using System;
using System.Collections.Generic;
using System.Linq; using System.Linq;
namespace NzbDrone.Common.Eventing namespace NzbDrone.Common.Eventing

View File

@ -1,10 +1,12 @@
using System.IO; using System.Collections.Generic;
using System.IO;
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
using Autofac; using Autofac;
using Autofac.Core; using Autofac.Core;
using NLog; using NLog;
using NzbDrone.Common; using NzbDrone.Common;
using NzbDrone.Common.Eventing;
using NzbDrone.Core.Datastore; using NzbDrone.Core.Datastore;
using NzbDrone.Core.ExternalNotification; using NzbDrone.Core.ExternalNotification;
using NzbDrone.Core.Indexers; using NzbDrone.Core.Indexers;
@ -25,6 +27,7 @@ public static void RegisterCoreServices(this ContainerBuilder containerBuilder)
containerBuilder.InitDatabase(); containerBuilder.InitDatabase();
containerBuilder.RegisterModule<LogInjectionModule>(); containerBuilder.RegisterModule<LogInjectionModule>();
} }

View File

@ -261,6 +261,8 @@
<Compile Include="ReferenceData\SceneMappingProxy.cs" /> <Compile Include="ReferenceData\SceneMappingProxy.cs" />
<Compile Include="ReferenceData\SceneMappingRepository.cs" /> <Compile Include="ReferenceData\SceneMappingRepository.cs" />
<Compile Include="Tv\EpisodeService.cs" /> <Compile Include="Tv\EpisodeService.cs" />
<Compile Include="Tv\Events\EpisodeInfoUpdatedEvent.cs" />
<Compile Include="Tv\Events\EpisodeInfoAddedEvent.cs" />
<Compile Include="Tv\Events\SeriesAddedEvent.cs" /> <Compile Include="Tv\Events\SeriesAddedEvent.cs" />
<Compile Include="Tv\SeasonRepository.cs" /> <Compile Include="Tv\SeasonRepository.cs" />
<Compile Include="Tv\SeriesRepository.cs" /> <Compile Include="Tv\SeriesRepository.cs" />

View File

@ -7,6 +7,7 @@
using NzbDrone.Core.Download; using NzbDrone.Core.Download;
using NzbDrone.Core.Model; using NzbDrone.Core.Model;
using NzbDrone.Core.Providers; using NzbDrone.Core.Providers;
using NzbDrone.Core.Tv.Events;
namespace NzbDrone.Core.Tv namespace NzbDrone.Core.Tv
{ {
@ -41,12 +42,14 @@ public class EpisodeService : IEpisodeService, IHandle<EpisodeGrabbedEvent>
private readonly TvDbProvider _tvDbProvider; private readonly TvDbProvider _tvDbProvider;
private readonly ISeasonRepository _seasonRepository; private readonly ISeasonRepository _seasonRepository;
private readonly IEpisodeRepository _episodeRepository; private readonly IEpisodeRepository _episodeRepository;
private readonly IEventAggregator _eventAggregator;
public EpisodeService(TvDbProvider tvDbProviderProvider, ISeasonRepository seasonRepository, IEpisodeRepository episodeRepository) public EpisodeService(TvDbProvider tvDbProviderProvider, ISeasonRepository seasonRepository, IEpisodeRepository episodeRepository, IEventAggregator eventAggregator)
{ {
_tvDbProvider = tvDbProviderProvider; _tvDbProvider = tvDbProviderProvider;
_seasonRepository = seasonRepository; _seasonRepository = seasonRepository;
_episodeRepository = episodeRepository; _episodeRepository = episodeRepository;
_eventAggregator = eventAggregator;
} }
public void AddEpisode(Episode episode) public void AddEpisode(Episode episode)
@ -240,7 +243,7 @@ public void RefreshEpisodeInfo(Series series)
episodeToUpdate.Overview = episode.Overview; episodeToUpdate.Overview = episode.Overview;
episodeToUpdate.AirDate = episode.AirDate; episodeToUpdate.AirDate = episode.AirDate;
if(!String.IsNullOrWhiteSpace(series.AirTime) && episodeToUpdate.AirDate.HasValue) if (!String.IsNullOrWhiteSpace(series.AirTime) && episodeToUpdate.AirDate.HasValue)
{ {
episodeToUpdate.AirDate = episodeToUpdate.AirDate.Value.Add(Convert.ToDateTime(series.AirTime).TimeOfDay) episodeToUpdate.AirDate = episodeToUpdate.AirDate.Value.Add(Convert.ToDateTime(series.AirTime).TimeOfDay)
.AddHours(series.UtcOffset * -1); .AddHours(series.UtcOffset * -1);
@ -258,6 +261,16 @@ public void RefreshEpisodeInfo(Series series)
_episodeRepository.InsertMany(newList); _episodeRepository.InsertMany(newList);
_episodeRepository.UpdateMany(updateList); _episodeRepository.UpdateMany(updateList);
if (newList.Any())
{
_eventAggregator.Publish(new EpisodeInfoAddedEvent(newList));
}
if (updateList.Any())
{
_eventAggregator.Publish(new EpisodeInfoUpdatedEvent(updateList));
}
if (failCount != 0) if (failCount != 0)
{ {
logger.Info("Finished episode refresh for series: {0}. Successful: {1} - Failed: {2} ", logger.Info("Finished episode refresh for series: {0}. Successful: {1} - Failed: {2} ",

View File

@ -0,0 +1,16 @@
using System.Collections.Generic;
using System.Collections.ObjectModel;
using NzbDrone.Common.Eventing;
namespace NzbDrone.Core.Tv.Events
{
public class EpisodeInfoAddedEvent : IEvent
{
public ReadOnlyCollection<Episode> Episodes { get; private set; }
public EpisodeInfoAddedEvent(IList<Episode> episodes)
{
Episodes = new ReadOnlyCollection<Episode>(episodes);
}
}
}

View File

@ -0,0 +1,16 @@
using System.Collections.Generic;
using System.Collections.ObjectModel;
using NzbDrone.Common.Eventing;
namespace NzbDrone.Core.Tv.Events
{
public class EpisodeInfoUpdatedEvent : IEvent
{
public ReadOnlyCollection<Episode> Episodes { get; private set; }
public EpisodeInfoUpdatedEvent(IList<Episode> episodes)
{
Episodes = new ReadOnlyCollection<Episode>(episodes);
}
}
}

Binary file not shown.