diff --git a/MediaBrowser.Api/Images/ImageByNameService.cs b/MediaBrowser.Api/Images/ImageByNameService.cs
index 8fbc56ce31..189e0f84b8 100644
--- a/MediaBrowser.Api/Images/ImageByNameService.cs
+++ b/MediaBrowser.Api/Images/ImageByNameService.cs
@@ -7,6 +7,7 @@ using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
+using System.Threading.Tasks;
using MediaBrowser.Common.IO;
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
@@ -179,7 +180,7 @@ namespace MediaBrowser.Api.Images
///
/// The request.
/// System.Object.
- public object Get(GetGeneralImage request)
+ public Task Get(GetGeneralImage request)
{
var filename = string.Equals(request.Type, "primary", StringComparison.OrdinalIgnoreCase)
? "folder"
@@ -238,7 +239,7 @@ namespace MediaBrowser.Api.Images
///
/// The request.
/// System.Object.
- public object Get(GetMediaInfoImage request)
+ public Task Get(GetMediaInfoImage request)
{
var themeFolder = Path.Combine(_appPaths.MediaInfoImagesPath, request.Theme);
diff --git a/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs b/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs
index 471bfe6045..ab2cab2241 100644
--- a/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs
+++ b/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs
@@ -421,7 +421,7 @@ namespace MediaBrowser.Api.Playback.Hls
// If all transcoding has completed, just return immediately
if (transcodingJob != null && transcodingJob.HasExited && FileSystem.FileExists(segmentPath))
{
- return GetSegmentResult(state, segmentPath, segmentIndex, transcodingJob);
+ return await GetSegmentResult(state, segmentPath, segmentIndex, transcodingJob).ConfigureAwait(false);
}
var segmentFilename = Path.GetFileName(segmentPath);
@@ -441,7 +441,7 @@ namespace MediaBrowser.Api.Playback.Hls
{
if (FileSystem.FileExists(segmentPath))
{
- return GetSegmentResult(state, segmentPath, segmentIndex, transcodingJob);
+ return await GetSegmentResult(state, segmentPath, segmentIndex, transcodingJob).ConfigureAwait(false);
}
//break;
}
@@ -457,10 +457,10 @@ namespace MediaBrowser.Api.Playback.Hls
}
cancellationToken.ThrowIfCancellationRequested();
- return GetSegmentResult(state, segmentPath, segmentIndex, transcodingJob);
+ return await GetSegmentResult(state, segmentPath, segmentIndex, transcodingJob).ConfigureAwait(false);
}
- private object GetSegmentResult(StreamState state, string segmentPath, int index, TranscodingJob transcodingJob)
+ private Task GetSegmentResult(StreamState state, string segmentPath, int index, TranscodingJob transcodingJob)
{
var segmentEndingPositionTicks = GetEndPositionTicks(state, index);
@@ -476,7 +476,7 @@ namespace MediaBrowser.Api.Playback.Hls
ApiEntryPoint.Instance.OnTranscodeEndRequest(transcodingJob);
}
}
- }).Result;
+ });
}
private async Task GetMasterPlaylistInternal(StreamRequest request, string method)
diff --git a/MediaBrowser.Api/Playback/Hls/HlsSegmentService.cs b/MediaBrowser.Api/Playback/Hls/HlsSegmentService.cs
index 65c1af79e3..f3683c6cba 100644
--- a/MediaBrowser.Api/Playback/Hls/HlsSegmentService.cs
+++ b/MediaBrowser.Api/Playback/Hls/HlsSegmentService.cs
@@ -124,13 +124,13 @@ namespace MediaBrowser.Api.Playback.Hls
///
/// The request.
/// System.Object.
- public object Get(GetHlsAudioSegmentLegacy request)
+ public Task Get(GetHlsAudioSegmentLegacy request)
{
// TODO: Deprecate with new iOS app
var file = request.SegmentId + Path.GetExtension(Request.PathInfo);
file = Path.Combine(_appPaths.TranscodingTempPath, file);
- return ResultFactory.GetStaticFileResult(Request, file, FileShareMode.ReadWrite).Result;
+ return ResultFactory.GetStaticFileResult(Request, file, FileShareMode.ReadWrite);
}
private Task GetFileResult(string path, string playlistPath)
diff --git a/MediaBrowser.Api/Social/SharingService.cs b/MediaBrowser.Api/Social/SharingService.cs
index 86fe0a136c..37941bd4a3 100644
--- a/MediaBrowser.Api/Social/SharingService.cs
+++ b/MediaBrowser.Api/Social/SharingService.cs
@@ -146,14 +146,14 @@ namespace MediaBrowser.Api.Social
{
if (image.IsLocalFile)
{
- return _resultFactory.GetStaticFileResult(Request, image.Path);
+ return await _resultFactory.GetStaticFileResult(Request, image.Path).ConfigureAwait(false);
}
try
{
// Don't fail the request over this
var updatedImage = await _libraryManager.ConvertImageToLocal(item, image, 0).ConfigureAwait(false);
- return _resultFactory.GetStaticFileResult(Request, updatedImage.Path);
+ return await _resultFactory.GetStaticFileResult(Request, updatedImage.Path).ConfigureAwait(false);
}
catch
{
diff --git a/MediaBrowser.Controller/Entities/UserViewBuilder.cs b/MediaBrowser.Controller/Entities/UserViewBuilder.cs
index 9debdf9bae..3820de83d1 100644
--- a/MediaBrowser.Controller/Entities/UserViewBuilder.cs
+++ b/MediaBrowser.Controller/Entities/UserViewBuilder.cs
@@ -566,18 +566,35 @@ namespace MediaBrowser.Controller.Entities
private async Task> GetMovieGenres(Folder parent, User user, InternalItemsQuery query)
{
- var result = _libraryManager.GetGenres(new InternalItemsQuery(user)
+ var tasks = parent.QueryRecursive(new InternalItemsQuery(user)
{
- AncestorIds = new[] { parent.Id.ToString("N") },
- StartIndex = query.StartIndex,
- Limit = query.Limit
- });
+ IncludeItemTypes = new[] { typeof(Movie).Name },
+ Recursive = true,
+ EnableTotalRecordCount = false
- return new QueryResult
- {
- TotalRecordCount = result.TotalRecordCount,
- Items = result.Items.Select(i => i.Item1).ToArray()
- };
+ }).Items
+ .SelectMany(i => i.Genres)
+ .DistinctNames()
+ .Select(i =>
+ {
+ try
+ {
+ return _libraryManager.GetGenre(i);
+ }
+ catch
+ {
+ // Full exception logged at lower levels
+ _logger.Error("Error getting genre");
+ return null;
+ }
+
+ })
+ .Where(i => i != null)
+ .Select(i => GetUserView(i.Name, SpecialFolder.MovieGenre, i.SortName, parent));
+
+ var genres = await Task.WhenAll(tasks).ConfigureAwait(false);
+
+ return GetResult(genres, parent, query);
}
private async Task> GetMovieGenreItems(Folder queryParent, Folder displayParent, User user, InternalItemsQuery query)
@@ -692,18 +709,35 @@ namespace MediaBrowser.Controller.Entities
private async Task> GetTvGenres(Folder parent, User user, InternalItemsQuery query)
{
- var result = _libraryManager.GetGenres(new InternalItemsQuery(user)
+ var tasks = parent.QueryRecursive(new InternalItemsQuery(user)
{
- AncestorIds = new[] { parent.Id.ToString("N") },
- StartIndex = query.StartIndex,
- Limit = query.Limit
- });
+ IncludeItemTypes = new[] { typeof(Series).Name },
+ Recursive = true,
+ EnableTotalRecordCount = false
- return new QueryResult
- {
- TotalRecordCount = result.TotalRecordCount,
- Items = result.Items.Select(i => i.Item1).ToArray()
- };
+ }).Items
+ .SelectMany(i => i.Genres)
+ .DistinctNames()
+ .Select(i =>
+ {
+ try
+ {
+ return _libraryManager.GetGenre(i);
+ }
+ catch
+ {
+ // Full exception logged at lower levels
+ _logger.Error("Error getting genre");
+ return null;
+ }
+
+ })
+ .Where(i => i != null)
+ .Select(i => GetUserView(i.Name, SpecialFolder.TvGenre, i.SortName, parent));
+
+ var genres = await Task.WhenAll(tasks).ConfigureAwait(false);
+
+ return GetResult(genres, parent, query);
}
private QueryResult GetTvGenreItems(Folder queryParent, Folder displayParent, User user, InternalItemsQuery query)
diff --git a/MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs b/MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs
index d86e4da376..643d0c9560 100644
--- a/MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs
+++ b/MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs
@@ -196,17 +196,25 @@ namespace MediaBrowser.Server.Implementations.HttpServer
return new WebSocketSharpListener(_logger, cert, _memoryStreamProvider, _textEncoding, _networkManager, _socketFactory, _cryptoProvider, new StreamFactory(), enableDualMode, GetRequest);
}
- public static ICertificate GetCert(string certificateLocation)
+ public ICertificate GetCert(string certificateLocation)
{
- X509Certificate2 localCert = new X509Certificate2(certificateLocation);
- //localCert.PrivateKey = PrivateKey.CreateFromFile(pvk_file).RSA;
- if (localCert.PrivateKey == null)
+ try
{
- //throw new FileNotFoundException("Secure requested, no private key included", certificateLocation);
+ X509Certificate2 localCert = new X509Certificate2(certificateLocation);
+ //localCert.PrivateKey = PrivateKey.CreateFromFile(pvk_file).RSA;
+ if (localCert.PrivateKey == null)
+ {
+ //throw new FileNotFoundException("Secure requested, no private key included", certificateLocation);
+ return null;
+ }
+
+ return new Certificate(localCert);
+ }
+ catch (Exception ex)
+ {
+ Logger.ErrorException("Error loading cert from {0}", ex, certificateLocation);
return null;
}
-
- return new Certificate(localCert);
}
private IHttpRequest GetRequest(HttpListenerContext httpContext)
diff --git a/MediaBrowser.Server.Mono/MediaBrowser.Server.Mono.csproj b/MediaBrowser.Server.Mono/MediaBrowser.Server.Mono.csproj
index dcc409d3a1..c7de9a62b6 100644
--- a/MediaBrowser.Server.Mono/MediaBrowser.Server.Mono.csproj
+++ b/MediaBrowser.Server.Mono/MediaBrowser.Server.Mono.csproj
@@ -24,7 +24,7 @@
4
x86
true
- true
+ false
full
@@ -35,7 +35,7 @@
AnyCPU
true
false
- true
+ false
false
@@ -55,7 +55,7 @@
false
- true
+ false
diff --git a/MediaBrowser.Server.Startup.Common/ApplicationHost.cs b/MediaBrowser.Server.Startup.Common/ApplicationHost.cs
index e8aa4de3e6..c155a968e9 100644
--- a/MediaBrowser.Server.Startup.Common/ApplicationHost.cs
+++ b/MediaBrowser.Server.Startup.Common/ApplicationHost.cs
@@ -1037,7 +1037,7 @@ namespace MediaBrowser.Server.Startup.Common
// Generate self-signed cert
var certHost = GetHostnameFromExternalDns(ServerConfigurationManager.Configuration.WanDdns);
- var certPath = Path.Combine(ServerConfigurationManager.ApplicationPaths.ProgramDataPath, "ssl", "cert_" + certHost.GetMD5().ToString("N") + ".pfx");
+ var certPath = Path.Combine(ServerConfigurationManager.ApplicationPaths.ProgramDataPath, "ssl", "cert_" + (certHost + "1").GetMD5().ToString("N") + ".pfx");
if (generateCertificate)
{
diff --git a/Nuget/MediaBrowser.Common.nuspec b/Nuget/MediaBrowser.Common.nuspec
index 7b949fcb14..464a29eb23 100644
--- a/Nuget/MediaBrowser.Common.nuspec
+++ b/Nuget/MediaBrowser.Common.nuspec
@@ -2,7 +2,7 @@
MediaBrowser.Common
- 3.0.688
+ 3.0.689
Emby.Common
Emby Team
ebr,Luke,scottisafool
diff --git a/Nuget/MediaBrowser.Server.Core.nuspec b/Nuget/MediaBrowser.Server.Core.nuspec
index 96986de9ba..96e9a697a2 100644
--- a/Nuget/MediaBrowser.Server.Core.nuspec
+++ b/Nuget/MediaBrowser.Server.Core.nuspec
@@ -2,7 +2,7 @@
MediaBrowser.Server.Core
- 3.0.688
+ 3.0.689
Emby.Server.Core
Emby Team
ebr,Luke,scottisafool
@@ -12,7 +12,7 @@
Contains core components required to build plugins for Emby Server.
Copyright © Emby 2013
-
+