diff --git a/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs b/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs
index 835f3357eb..041b4ea41d 100644
--- a/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs
+++ b/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs
@@ -1,4 +1,5 @@
-using MediaBrowser.Common.IO;
+using System.Globalization;
+using MediaBrowser.Common.IO;
using MediaBrowser.Common.Net;
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Devices;
@@ -287,7 +288,9 @@ namespace MediaBrowser.Api.Playback.Progressive
var contentType = state.GetMimeType(outputPath);
- var contentLength = state.EstimateContentLength ? GetEstimatedContentLength(state) : null;
+ // TODO: The isHeadRequest is only here because ServiceStack will add Content-Length=0 to the response
+ // What we really want to do is hunt that down and remove that
+ var contentLength = state.EstimateContentLength || isHeadRequest ? GetEstimatedContentLength(state) : null;
if (contentLength.HasValue)
{
@@ -299,10 +302,14 @@ namespace MediaBrowser.Api.Playback.Progressive
{
var streamResult = ResultFactory.GetResult(new byte[] { }, contentType, responseHeaders);
- if (!contentLength.HasValue)
+ var hasOptions = streamResult as IHasOptions;
+ if (hasOptions != null)
{
- var hasOptions = streamResult as IHasOptions;
- if (hasOptions != null)
+ if (contentLength.HasValue)
+ {
+ hasOptions.Options["Content-Length"] = contentLength.Value.ToString(CultureInfo.InvariantCulture);
+ }
+ else
{
if (hasOptions.Options.ContainsKey("Content-Length"))
{
diff --git a/MediaBrowser.Dlna/Profiles/WdtvLiveProfile.cs b/MediaBrowser.Dlna/Profiles/WdtvLiveProfile.cs
index ab8d5ea72f..a26c439113 100644
--- a/MediaBrowser.Dlna/Profiles/WdtvLiveProfile.cs
+++ b/MediaBrowser.Dlna/Profiles/WdtvLiveProfile.cs
@@ -11,6 +11,7 @@ namespace MediaBrowser.Dlna.Profiles
Name = "WDTV Live";
TimelineOffsetSeconds = 5;
+ IgnoreTranscodeByteRangeRequests = true;
Identification = new DeviceIdentification
{
diff --git a/MediaBrowser.Dlna/Ssdp/SsdpHandler.cs b/MediaBrowser.Dlna/Ssdp/SsdpHandler.cs
index 28ea5ad6c9..19c567a33e 100644
--- a/MediaBrowser.Dlna/Ssdp/SsdpHandler.cs
+++ b/MediaBrowser.Dlna/Ssdp/SsdpHandler.cs
@@ -118,10 +118,7 @@ namespace MediaBrowser.Dlna.Ssdp
public void Start()
{
- _socket = CreateMulticastSocket();
-
- _logger.Info("SSDP service started");
- Receive();
+ RestartSocketListener();
ReloadAliveNotifier();
}
@@ -289,6 +286,56 @@ namespace MediaBrowser.Dlna.Ssdp
}
}
+ private void RestartSocketListener()
+ {
+ if (_isDisposed)
+ {
+ StopSocketRetryTimer();
+ return;
+ }
+
+ try
+ {
+ _socket = CreateMulticastSocket();
+
+ _logger.Info("MultiCast socket created");
+
+ StopSocketRetryTimer();
+
+ Receive();
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Error creating MultiCast socket", ex);
+ //StartSocketRetryTimer();
+ }
+ }
+
+ private Timer _socketRetryTimer;
+ private readonly object _socketRetryLock = new object();
+ private void StartSocketRetryTimer()
+ {
+ lock (_socketRetryLock)
+ {
+ if (_socketRetryTimer == null)
+ {
+ _socketRetryTimer = new Timer(s => RestartSocketListener(), null, TimeSpan.FromSeconds(30), TimeSpan.FromSeconds(30));
+ }
+ }
+ }
+
+ private void StopSocketRetryTimer()
+ {
+ lock (_socketRetryLock)
+ {
+ if (_socketRetryTimer != null)
+ {
+ _socketRetryTimer.Dispose();
+ _socketRetryTimer = null;
+ }
+ }
+ }
+
private void Receive()
{
try
@@ -297,10 +344,15 @@ namespace MediaBrowser.Dlna.Ssdp
EndPoint endpoint = new IPEndPoint(IPAddress.Any, SSDPPort);
- _socket.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref endpoint, ReceiveCallback, buffer);
+ _socket.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref endpoint, ReceiveCallback,
+ buffer);
}
catch (ObjectDisposedException)
{
+ if (!_isDisposed)
+ {
+ //StartSocketRetryTimer();
+ }
}
catch (Exception ex)
{
@@ -348,6 +400,13 @@ namespace MediaBrowser.Dlna.Ssdp
OnMessageReceived(args);
}
+ catch (ObjectDisposedException)
+ {
+ if (!_isDisposed)
+ {
+ //StartSocketRetryTimer();
+ }
+ }
catch (Exception ex)
{
_logger.ErrorException("Failed to read SSDP message", ex);
diff --git a/MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs b/MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs
index 2cd855e966..4c34b5a95a 100644
--- a/MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs
+++ b/MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs
@@ -38,7 +38,7 @@ namespace MediaBrowser.MediaEncoding.Probing
var internalStreams = data.streams ?? new MediaStreamInfo[] { };
- info.MediaStreams = internalStreams.Select(s => GetMediaStream(s, data.format))
+ info.MediaStreams = internalStreams.Select(s => GetMediaStream(isAudio, s, data.format))
.Where(i => i != null)
.ToList();
@@ -94,7 +94,7 @@ namespace MediaBrowser.MediaEncoding.Probing
/// The stream info.
/// The format info.
/// MediaStream.
- private MediaStream GetMediaStream(MediaStreamInfo streamInfo, MediaFormatInfo formatInfo)
+ private MediaStream GetMediaStream(bool isAudio, MediaStreamInfo streamInfo, MediaFormatInfo formatInfo)
{
var stream = new MediaStream
{
@@ -129,7 +129,7 @@ namespace MediaBrowser.MediaEncoding.Probing
}
else if (string.Equals(streamInfo.codec_type, "video", StringComparison.OrdinalIgnoreCase))
{
- stream.Type = (streamInfo.codec_name ?? string.Empty).IndexOf("mjpeg", StringComparison.OrdinalIgnoreCase) != -1
+ stream.Type = isAudio
? MediaStreamType.EmbeddedImage
: MediaStreamType.Video;
diff --git a/MediaBrowser.Model/Dlna/DeviceProfile.cs b/MediaBrowser.Model/Dlna/DeviceProfile.cs
index 752b4d1798..2b0df9778c 100644
--- a/MediaBrowser.Model/Dlna/DeviceProfile.cs
+++ b/MediaBrowser.Model/Dlna/DeviceProfile.cs
@@ -76,6 +76,7 @@ namespace MediaBrowser.Model.Dlna
public bool RequiresPlainFolders { get; set; }
public bool EnableMSMediaReceiverRegistrar { get; set; }
+ public bool IgnoreTranscodeByteRangeRequests { get; set; }
public XmlAttribute[] XmlRootAttributes { get; set; }
diff --git a/MediaBrowser.Providers/MediaInfo/FFProbeAudioInfo.cs b/MediaBrowser.Providers/MediaInfo/FFProbeAudioInfo.cs
index d78f1b48e6..33f35450df 100644
--- a/MediaBrowser.Providers/MediaInfo/FFProbeAudioInfo.cs
+++ b/MediaBrowser.Providers/MediaInfo/FFProbeAudioInfo.cs
@@ -52,7 +52,7 @@ namespace MediaBrowser.Providers.MediaInfo
return ItemUpdateType.MetadataImport;
}
- private const string SchemaVersion = "2";
+ private const string SchemaVersion = "3";
private async Task GetMediaInfo(BaseItem item, CancellationToken cancellationToken)
{
diff --git a/MediaBrowser.Server.Implementations/Channels/ChannelDownloadScheduledTask.cs b/MediaBrowser.Server.Implementations/Channels/ChannelDownloadScheduledTask.cs
index 6514893477..18711c61e2 100644
--- a/MediaBrowser.Server.Implementations/Channels/ChannelDownloadScheduledTask.cs
+++ b/MediaBrowser.Server.Implementations/Channels/ChannelDownloadScheduledTask.cs
@@ -17,7 +17,6 @@ using MediaBrowser.Model.Querying;
using MoreLinq;
using System;
using System.Collections.Generic;
-using System.Globalization;
using System.IO;
using System.Linq;
using System.Threading;
diff --git a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj
index 4fb0569965..e7372ce377 100644
--- a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj
+++ b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj
@@ -48,8 +48,9 @@
..\packages\Interfaces.IO.1.0.0.5\lib\portable-net45+sl4+wp71+win8+wpa81\Interfaces.IO.dll
-
- ..\packages\MediaBrowser.Naming.1.0.0.35\lib\portable-net45+sl4+wp71+win8+wpa81\MediaBrowser.Naming.dll
+
+ False
+ ..\packages\MediaBrowser.Naming.1.0.0.36\lib\portable-net45+sl4+wp71+win8+wpa81\MediaBrowser.Naming.dll
False
diff --git a/MediaBrowser.Server.Implementations/Photos/PhotoAlbumImageProvider.cs b/MediaBrowser.Server.Implementations/Photos/PhotoAlbumImageProvider.cs
index f04c0bf770..b5ecc94a29 100644
--- a/MediaBrowser.Server.Implementations/Photos/PhotoAlbumImageProvider.cs
+++ b/MediaBrowser.Server.Implementations/Photos/PhotoAlbumImageProvider.cs
@@ -1,27 +1,44 @@
-using MediaBrowser.Common.Configuration;
-using MediaBrowser.Common.IO;
-using MediaBrowser.Controller.Drawing;
-using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Providers;
+using MediaBrowser.Model.Entities;
using System.Collections.Generic;
using System.Linq;
+using System.Threading;
using System.Threading.Tasks;
namespace MediaBrowser.Server.Implementations.Photos
{
- //public class PhotoAlbumImageProvider : BaseDynamicImageProvider
+ //public class PhotoAlbumImageProvider : IDynamicImageProvider
//{
- // public PhotoAlbumImageProvider(IFileSystem fileSystem, IProviderManager providerManager, IApplicationPaths applicationPaths, IImageProcessor imageProcessor)
- // : base(fileSystem, providerManager, applicationPaths, imageProcessor)
+ // public IEnumerable GetSupportedImages(IHasImages item)
// {
+ // return new List { ImageType.Primary };
// }
- // protected override Task> GetItemsWithImages(IHasImages item)
+ // public Task GetImage(IHasImages item, ImageType type, CancellationToken cancellationToken)
// {
- // var photoAlbum = (PhotoAlbum)item;
- // var items = GetFinalItems(photoAlbum.Children.ToList());
+ // var album = (PhotoAlbum)item;
- // return Task.FromResult(items);
+ // var image = album.Children
+ // .OfType()
+ // .Select(i => i.GetImagePath(type))
+ // .FirstOrDefault(i => !string.IsNullOrEmpty(i));
+
+ // return Task.FromResult(new DynamicImageResponse
+ // {
+ // Path = image,
+ // HasImage = !string.IsNullOrEmpty(image)
+ // });
+ // }
+
+ // public string Name
+ // {
+ // get { return "Image Extractor"; }
+ // }
+
+ // public bool Supports(IHasImages item)
+ // {
+ // return item is PhotoAlbum;
// }
//}
}
diff --git a/MediaBrowser.Server.Implementations/packages.config b/MediaBrowser.Server.Implementations/packages.config
index 0b81c1866d..fa7511143d 100644
--- a/MediaBrowser.Server.Implementations/packages.config
+++ b/MediaBrowser.Server.Implementations/packages.config
@@ -1,7 +1,7 @@
-
+
diff --git a/MediaBrowser.WebDashboard/Api/PackageCreator.cs b/MediaBrowser.WebDashboard/Api/PackageCreator.cs
index 89ae4a9b61..5c6228193e 100644
--- a/MediaBrowser.WebDashboard/Api/PackageCreator.cs
+++ b/MediaBrowser.WebDashboard/Api/PackageCreator.cs
@@ -220,9 +220,7 @@ namespace MediaBrowser.WebDashboard.Api
var files = new[]
{
"thirdparty/jquerymobile-1.4.5/jquery.mobile-1.4.5.min.css",
- "thirdparty/swipebox-master/css/swipebox.min.css" + versionString,
"thirdparty/fontawesome/css/font-awesome.min.css" + versionString,
- "thirdparty/jstree3.0.8/themes/default/style.min.css",
"css/all.css" + versionString
};
@@ -245,8 +243,7 @@ namespace MediaBrowser.WebDashboard.Api
var files = new List
{
- "scripts/all.js" + versionString,
- "thirdparty/swipebox-master/js/jquery.swipebox.min.js" + versionString
+ "scripts/all.js" + versionString
};
if (string.Equals(mode, "cordova", StringComparison.OrdinalIgnoreCase))
@@ -274,16 +271,12 @@ namespace MediaBrowser.WebDashboard.Api
await AppendResource(memoryStream, "thirdparty/jquery-2.1.1.min.js", newLineBytes).ConfigureAwait(false);
await AppendResource(memoryStream, "thirdparty/jquerymobile-1.4.5/jquery.mobile-1.4.5.min.js", newLineBytes).ConfigureAwait(false);
- await AppendResource(memoryStream, "thirdparty/jquery.unveil-custom.js", newLineBytes).ConfigureAwait(false);
-
- await AppendResource(memoryStream, "thirdparty/cast_sender.js", newLineBytes).ConfigureAwait(false);
await AppendResource(memoryStream, "thirdparty/browser.js", newLineBytes).ConfigureAwait(false);
- await AppendResource(memoryStream, "thirdparty/jstree3.0.8/jstree.js", newLineBytes).ConfigureAwait(false);
+ await AppendResource(memoryStream, "thirdparty/require.js", newLineBytes).ConfigureAwait(false);
+
+ await AppendResource(memoryStream, "thirdparty/jquery.unveil-custom.js", newLineBytes).ConfigureAwait(false);
- await AppendResource(memoryStream, "thirdparty/fastclick.js", newLineBytes).ConfigureAwait(false);
- await AppendResource(memoryStream, "thirdparty/headroom.js", newLineBytes).ConfigureAwait(false);
-
await AppendLocalization(memoryStream, culture).ConfigureAwait(false);
await memoryStream.WriteAsync(newLineBytes, 0, newLineBytes.Length).ConfigureAwait(false);
diff --git a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj
index 3d6d2c8d91..ce2e2d4229 100644
--- a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj
+++ b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj
@@ -1665,6 +1665,12 @@
PreserveNewest
+
+ PreserveNewest
+
+
+ PreserveNewest
+
PreserveNewest
diff --git a/SharedVersion.cs b/SharedVersion.cs
index 3f171bdf8e..e4ebaa224e 100644
--- a/SharedVersion.cs
+++ b/SharedVersion.cs
@@ -1,4 +1,4 @@
using System.Reflection;
//[assembly: AssemblyVersion("3.0.*")]
-[assembly: AssemblyVersion("3.0.5607.0")]
+[assembly: AssemblyVersion("3.0.5607.1")]