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:
parent
6447b78a5a
commit
62f15d4d96
@ -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" />
|
||||||
|
29
NzbDrone.Api/Seasons/SeasonModule.cs
Normal file
29
NzbDrone.Api/Seasons/SeasonModule.cs
Normal 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));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -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" />
|
||||||
|
@ -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
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -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>
|
||||||
|
@ -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
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
@ -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
|
||||||
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -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>
|
@ -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') }});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
@ -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);
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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
|
||||||
|
@ -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>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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" />
|
||||||
|
@ -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} ",
|
||||||
|
16
NzbDrone.Core/Tv/Events/EpisodeInfoAddedEvent.cs
Normal file
16
NzbDrone.Core/Tv/Events/EpisodeInfoAddedEvent.cs
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
16
NzbDrone.Core/Tv/Events/EpisodeInfoUpdatedEvent.cs
Normal file
16
NzbDrone.Core/Tv/Events/EpisodeInfoUpdatedEvent.cs
Normal 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.
Loading…
Reference in New Issue
Block a user