diff --git a/src/NzbDrone.Api/Extensions/Pipelines/CacheHeaderPipeline.cs b/src/NzbDrone.Api/Extensions/Pipelines/CacheHeaderPipeline.cs
index 183326415..1ac4ae86c 100644
--- a/src/NzbDrone.Api/Extensions/Pipelines/CacheHeaderPipeline.cs
+++ b/src/NzbDrone.Api/Extensions/Pipelines/CacheHeaderPipeline.cs
@@ -1,18 +1,11 @@
using Nancy;
using Nancy.Bootstrapper;
-using NzbDrone.Api.Frontend;
+using NzbDrone.Common.EnvironmentInfo;
namespace NzbDrone.Api.Extensions.Pipelines
{
- public class CacheHeaderPipeline : IRegisterNancyPipeline
+ public class NzbDroneVersionPipeline : IRegisterNancyPipeline
{
- private readonly ICacheableSpecification _cacheableSpecification;
-
- public CacheHeaderPipeline(ICacheableSpecification cacheableSpecification)
- {
- _cacheableSpecification = cacheableSpecification;
- }
-
public void Register(IPipelines pipelines)
{
pipelines.AfterRequest.AddItemToStartOfPipeline(Handle);
@@ -20,14 +13,7 @@ namespace NzbDrone.Api.Extensions.Pipelines
private void Handle(NancyContext context)
{
- if (_cacheableSpecification.IsCacheable(context))
- {
- context.Response.Headers.EnableCache();
- }
- else
- {
- context.Response.Headers.DisableCache();
- }
+ context.Response.Headers.Add("X-ApplicationVersion", BuildInfo.Version.ToString());
}
}
}
\ No newline at end of file
diff --git a/src/NzbDrone.Api/Extensions/Pipelines/NzbDroneVersionPipeline.cs b/src/NzbDrone.Api/Extensions/Pipelines/NzbDroneVersionPipeline.cs
new file mode 100644
index 000000000..183326415
--- /dev/null
+++ b/src/NzbDrone.Api/Extensions/Pipelines/NzbDroneVersionPipeline.cs
@@ -0,0 +1,33 @@
+using Nancy;
+using Nancy.Bootstrapper;
+using NzbDrone.Api.Frontend;
+
+namespace NzbDrone.Api.Extensions.Pipelines
+{
+ public class CacheHeaderPipeline : IRegisterNancyPipeline
+ {
+ private readonly ICacheableSpecification _cacheableSpecification;
+
+ public CacheHeaderPipeline(ICacheableSpecification cacheableSpecification)
+ {
+ _cacheableSpecification = cacheableSpecification;
+ }
+
+ public void Register(IPipelines pipelines)
+ {
+ pipelines.AfterRequest.AddItemToStartOfPipeline(Handle);
+ }
+
+ private void Handle(NancyContext context)
+ {
+ if (_cacheableSpecification.IsCacheable(context))
+ {
+ context.Response.Headers.EnableCache();
+ }
+ else
+ {
+ context.Response.Headers.DisableCache();
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/NzbDrone.Api/NzbDrone.Api.csproj b/src/NzbDrone.Api/NzbDrone.Api.csproj
index d0c5875ca..9c7f11503 100644
--- a/src/NzbDrone.Api/NzbDrone.Api.csproj
+++ b/src/NzbDrone.Api/NzbDrone.Api.csproj
@@ -122,6 +122,7 @@
+
diff --git a/src/NzbDrone.Host/NzbDrone.Host.csproj b/src/NzbDrone.Host/NzbDrone.Host.csproj
index 861ae81e9..8aba54433 100644
--- a/src/NzbDrone.Host/NzbDrone.Host.csproj
+++ b/src/NzbDrone.Host/NzbDrone.Host.csproj
@@ -101,6 +101,7 @@
+
diff --git a/src/NzbDrone.Host/Owin/MiddleWare/NancyMiddleWare.cs b/src/NzbDrone.Host/Owin/MiddleWare/NancyMiddleWare.cs
index 9e74c1e71..c6116a46a 100644
--- a/src/NzbDrone.Host/Owin/MiddleWare/NancyMiddleWare.cs
+++ b/src/NzbDrone.Host/Owin/MiddleWare/NancyMiddleWare.cs
@@ -13,7 +13,7 @@ namespace NzbDrone.Host.Owin.MiddleWare
_nancyBootstrapper = nancyBootstrapper;
}
- public int Order { get { return 1; } }
+ public int Order { get { return 2; } }
public void Attach(IAppBuilder appBuilder)
{
diff --git a/src/NzbDrone.Host/Owin/MiddleWare/NzbDroneVersionMiddleWare.cs b/src/NzbDrone.Host/Owin/MiddleWare/NzbDroneVersionMiddleWare.cs
new file mode 100644
index 000000000..a7a76644a
--- /dev/null
+++ b/src/NzbDrone.Host/Owin/MiddleWare/NzbDroneVersionMiddleWare.cs
@@ -0,0 +1,32 @@
+using System.Threading.Tasks;
+using Microsoft.Owin;
+using NzbDrone.Common.EnvironmentInfo;
+using Owin;
+
+namespace NzbDrone.Host.Owin.MiddleWare
+{
+ public class NzbDroneVersionMiddleWare : IOwinMiddleWare
+ {
+ public int Order { get { return 0; } }
+
+ public void Attach(IAppBuilder appBuilder)
+ {
+ appBuilder.Use(typeof (AddApplicationVersionHeader));
+ }
+ }
+
+ public class AddApplicationVersionHeader : OwinMiddleware
+ {
+ public AddApplicationVersionHeader(OwinMiddleware next)
+ : base(next)
+ {
+ }
+
+ public override Task Invoke(OwinRequest request, OwinResponse response)
+ {
+ response.AddHeader("X-ApplicationVersion", BuildInfo.Version.ToString());
+
+ return Next.Invoke(request, response);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/NzbDrone.Host/Owin/MiddleWare/SignalRMiddleWare.cs b/src/NzbDrone.Host/Owin/MiddleWare/SignalRMiddleWare.cs
index 35499eacd..395ff6f2f 100644
--- a/src/NzbDrone.Host/Owin/MiddleWare/SignalRMiddleWare.cs
+++ b/src/NzbDrone.Host/Owin/MiddleWare/SignalRMiddleWare.cs
@@ -8,7 +8,7 @@ namespace NzbDrone.Host.Owin.MiddleWare
{
public class SignalRMiddleWare : IOwinMiddleWare
{
- public int Order { get { return 0; } }
+ public int Order { get { return 1; } }
public SignalRMiddleWare(IContainer container)
{
diff --git a/src/UI/Mixins/jquery.ajax.js b/src/UI/Mixins/jquery.ajax.js
index 5105d8ae8..8186a7784 100644
--- a/src/UI/Mixins/jquery.ajax.js
+++ b/src/UI/Mixins/jquery.ajax.js
@@ -28,6 +28,29 @@ define(
xhr.headers['X-Api-Key'] = window.NzbDrone.ApiKey;
}
- return original.apply(this, arguments);
+ return original.apply(this, arguments).done(function (response, status, xhr){
+ var version = xhr.getResponseHeader('X-ApplicationVersion');
+
+ if (!window.NzbDrone || !window.NzbDrone.Version) {
+ return;
+ }
+
+ if (version !== window.NzbDrone.Version) {
+ var vent = require('vent');
+ var messenger = require('Shared/Messenger');
+
+ if (!vent || !messenger) {
+ return;
+ }
+
+ messenger.show({
+ message : 'NzbDrone has been updated',
+ hideAfter : 0,
+ id : 'droneUpdated'
+ });
+
+ vent.trigger(vent.Events.ServerUpdated);
+ }
+ });
};
});
diff --git a/src/UI/Series/SeriesController.js b/src/UI/Series/SeriesController.js
index ed9334b08..5e358683d 100644
--- a/src/UI/Series/SeriesController.js
+++ b/src/UI/Series/SeriesController.js
@@ -19,7 +19,7 @@ define(
series: function () {
this.setTitle('NzbDrone');
- AppLayout.mainRegion.show(new SeriesIndexLayout());
+ this.showMainRegion(new SeriesIndexLayout());
},
seriesDetails: function (query) {
@@ -28,7 +28,7 @@ define(
if (series.length !== 0) {
var targetSeries = series[0];
this.setTitle(targetSeries.get('title'));
- AppLayout.mainRegion.show(new SeriesDetailsLayout({ model: targetSeries }));
+ this.showMainRegion(new SeriesDetailsLayout({ model: targetSeries }));
}
else {
this.showNotFound();
diff --git a/src/UI/Shared/SignalRBroadcaster.js b/src/UI/Shared/SignalRBroadcaster.js
index 38bc4b6dc..928b14e9a 100644
--- a/src/UI/Shared/SignalRBroadcaster.js
+++ b/src/UI/Shared/SignalRBroadcaster.js
@@ -50,15 +50,6 @@ define(
this.signalRconnection.reconnected(function() {
tryingToReconnect = false;
-
- var currentVersion = StatusModel.get('version');
-
- var promise = StatusModel.fetch();
- promise.done(function () {
- if (StatusModel.get('version') !== currentVersion) {
- vent.trigger(vent.Events.ServerUpdated);
- }
- });
});
this.signalRconnection.disconnected(function () {