diff --git a/Emby.Drawing.Skia/Emby.Drawing.Skia.csproj b/Emby.Drawing.Skia/Emby.Drawing.Skia.csproj
index a4ab19f838..f2b32d52cb 100644
--- a/Emby.Drawing.Skia/Emby.Drawing.Skia.csproj
+++ b/Emby.Drawing.Skia/Emby.Drawing.Skia.csproj
@@ -64,7 +64,7 @@
- ..\packages\SkiaSharp.1.58.0\lib\portable-net45+win8+wpa81+wp8\SkiaSharp.dll
+ ..\packages\SkiaSharp.1.58.1\lib\portable-net45+win8+wpa81+wp8\SkiaSharp.dll
diff --git a/Emby.Drawing.Skia/SkiaEncoder.cs b/Emby.Drawing.Skia/SkiaEncoder.cs
index 77ab1919aa..24f586d96e 100644
--- a/Emby.Drawing.Skia/SkiaEncoder.cs
+++ b/Emby.Drawing.Skia/SkiaEncoder.cs
@@ -195,12 +195,26 @@ namespace Emby.Drawing.Skia
{
var codec = SKCodec.Create(stream);
+ if (codec == null)
+ {
+ origin = SKCodecOrigin.TopLeft;
+ return null;
+ }
+
// create the bitmap
var bitmap = new SKBitmap(codec.Info.Width, codec.Info.Height, !requiresTransparencyHack);
- // decode
- codec.GetPixels(bitmap.Info, bitmap.GetPixels());
- origin = codec.Origin;
+ if (bitmap != null)
+ {
+ // decode
+ codec.GetPixels(bitmap.Info, bitmap.GetPixels());
+
+ origin = codec.Origin;
+ }
+ else
+ {
+ origin = SKCodecOrigin.TopLeft;
+ }
return bitmap;
}
@@ -239,7 +253,7 @@ namespace Emby.Drawing.Skia
return Decode(path, forceAnalyzeBitmap, out origin);
}
- private SKBitmap GetBitmap(string path, bool cropWhitespace, bool autoOrient, ImageOrientation? orientation)
+ private SKBitmap GetBitmap(string path, bool cropWhitespace, bool autoOrient)
{
SKCodecOrigin origin;
@@ -247,11 +261,14 @@ namespace Emby.Drawing.Skia
{
var bitmap = GetBitmap(path, cropWhitespace, true, out origin);
- if (origin != SKCodecOrigin.TopLeft)
+ if (bitmap != null)
{
- using (bitmap)
+ if (origin != SKCodecOrigin.TopLeft)
{
- return RotateAndFlip(bitmap, origin);
+ using (bitmap)
+ {
+ return RotateAndFlip(bitmap, origin);
+ }
}
}
@@ -357,11 +374,11 @@ namespace Emby.Drawing.Skia
var blur = options.Blur ?? 0;
var hasIndicator = options.AddPlayedIndicator || options.UnplayedCount.HasValue || !options.PercentPlayed.Equals(0);
- using (var bitmap = GetBitmap(inputPath, options.CropWhiteSpace, autoOrient, orientation))
+ using (var bitmap = GetBitmap(inputPath, options.CropWhiteSpace, autoOrient))
{
if (bitmap == null)
{
- throw new Exception(string.Format("Skia unable to read image {0}", inputPath));
+ throw new ArgumentOutOfRangeException(string.Format("Skia unable to read image {0}", inputPath));
}
//_logger.Info("Color type {0}", bitmap.Info.ColorType);
diff --git a/Emby.Drawing.Skia/packages.config b/Emby.Drawing.Skia/packages.config
index 9d21b2864a..2b9b0aee43 100644
--- a/Emby.Drawing.Skia/packages.config
+++ b/Emby.Drawing.Skia/packages.config
@@ -1,4 +1,4 @@
-
+
\ No newline at end of file
diff --git a/Emby.Drawing/ImageProcessor.cs b/Emby.Drawing/ImageProcessor.cs
index 8f3042e2ad..356343baee 100644
--- a/Emby.Drawing/ImageProcessor.cs
+++ b/Emby.Drawing/ImageProcessor.cs
@@ -296,11 +296,6 @@ namespace Emby.Drawing
var tmpPath = Path.ChangeExtension(Path.Combine(_appPaths.TempDirectory, Guid.NewGuid().ToString("N")), Path.GetExtension(cacheFilePath));
_fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(tmpPath));
- if (item == null && string.Equals(options.ItemType, typeof(Photo).Name, StringComparison.OrdinalIgnoreCase))
- {
- item = _libraryManager().GetItemById(options.ItemId);
- }
-
if (options.CropWhiteSpace && !SupportsTransparency(originalImagePath))
{
options.CropWhiteSpace = false;
@@ -321,6 +316,15 @@ namespace Emby.Drawing
return new Tuple(cacheFilePath, GetMimeType(outputFormat, cacheFilePath), _fileSystem.GetLastWriteTimeUtc(cacheFilePath));
}
+ catch (ArgumentOutOfRangeException ex)
+ {
+ // Decoder failed to decode it
+#if DEBUG
+ _logger.ErrorException("Error encoding image", ex);
+#endif
+ // Just spit out the original file if all the options are default
+ return new Tuple(originalImagePath, MimeTypes.GetMimeType(originalImagePath), dateModified);
+ }
catch (Exception ex)
{
// If it fails for whatever reason, return the original image
diff --git a/Emby.Server.Implementations/HttpServer/HttpListenerHost.cs b/Emby.Server.Implementations/HttpServer/HttpListenerHost.cs
index 9297362f9e..a9ce513247 100644
--- a/Emby.Server.Implementations/HttpServer/HttpListenerHost.cs
+++ b/Emby.Server.Implementations/HttpServer/HttpListenerHost.cs
@@ -710,13 +710,6 @@ namespace Emby.Server.Implementations.HttpServer
Summary = route.Summary
});
- routes.Add(new RouteAttribute(NormalizeRoutePath(route.Path), route.Verbs)
- {
- Notes = route.Notes,
- Priority = route.Priority,
- Summary = route.Summary
- });
-
routes.Add(new RouteAttribute(DoubleNormalizeEmbyRoutePath(route.Path), route.Verbs)
{
Notes = route.Notes,
@@ -773,16 +766,6 @@ namespace Emby.Server.Implementations.HttpServer
return "emby/emby/" + path;
}
- private string NormalizeRoutePath(string path)
- {
- if (path.StartsWith("/", StringComparison.OrdinalIgnoreCase))
- {
- return "/mediabrowser" + path;
- }
-
- return "mediabrowser/" + path;
- }
-
private bool _disposed;
private readonly object _disposeLock = new object();
protected virtual void Dispose(bool disposing)
diff --git a/Emby.Server.Implementations/Services/ServiceController.cs b/Emby.Server.Implementations/Services/ServiceController.cs
index c3970b22f6..4dc14a1934 100644
--- a/Emby.Server.Implementations/Services/ServiceController.cs
+++ b/Emby.Server.Implementations/Services/ServiceController.cs
@@ -75,11 +75,7 @@ namespace Emby.Server.Implementations.Services
var attrs = appHost.GetRouteAttributes(requestType);
foreach (RouteAttribute attr in attrs)
{
- var restPath = new RestPath(appHost.CreateInstance, appHost.GetParseFn, requestType, attr.Path, attr.Verbs, attr.Summary, attr.Notes);
-
- if (!restPath.IsValid)
- throw new NotSupportedException(string.Format(
- "RestPath '{0}' on Type '{1}' is not Valid", attr.Path, requestType.GetMethodName()));
+ var restPath = new RestPath(appHost.CreateInstance, appHost.GetParseFn, requestType, attr.Path, attr.Verbs, attr.Summary);
RegisterRestPath(restPath);
}
@@ -92,8 +88,7 @@ namespace Emby.Server.Implementations.Services
if (!restPath.Path.StartsWith("/"))
throw new ArgumentException(string.Format("Route '{0}' on '{1}' must start with a '/'", restPath.Path, restPath.RequestType.GetMethodName()));
if (restPath.Path.IndexOfAny(InvalidRouteChars) != -1)
- throw new ArgumentException(string.Format("Route '{0}' on '{1}' contains invalid chars. " +
- "See https://github.com/ServiceStack/ServiceStack/wiki/Routing for info on valid routes.", restPath.Path, restPath.RequestType.GetMethodName()));
+ throw new ArgumentException(string.Format("Route '{0}' on '{1}' contains invalid chars. ", restPath.Path, restPath.RequestType.GetMethodName()));
List pathsAtFirstMatch;
if (!RestPathMap.TryGetValue(restPath.FirstMatchHashKey, out pathsAtFirstMatch))
diff --git a/Emby.Server.Implementations/Services/ServiceExec.cs b/Emby.Server.Implementations/Services/ServiceExec.cs
index fa9e26f28f..7971c6781d 100644
--- a/Emby.Server.Implementations/Services/ServiceExec.cs
+++ b/Emby.Server.Implementations/Services/ServiceExec.cs
@@ -11,7 +11,7 @@ namespace Emby.Server.Implementations.Services
{
public static class ServiceExecExtensions
{
- public static HashSet AllVerbs = new HashSet(new[] {
+ public static string[] AllVerbs = new[] {
"OPTIONS", "GET", "HEAD", "POST", "PUT", "DELETE", "TRACE", "CONNECT", // RFC 2616
"PROPFIND", "PROPPATCH", "MKCOL", "COPY", "MOVE", "LOCK", "UNLOCK", // RFC 2518
"VERSION-CONTROL", "REPORT", "CHECKOUT", "CHECKIN", "UNCHECKOUT",
@@ -22,7 +22,9 @@ namespace Emby.Server.Implementations.Services
"SEARCH", // https://datatracker.ietf.org/doc/draft-reschke-webdav-search/
"BCOPY", "BDELETE", "BMOVE", "BPROPFIND", "BPROPPATCH", "NOTIFY",
"POLL", "SUBSCRIBE", "UNSUBSCRIBE"
- });
+ };
+
+ public static HashSet AllVerbsSet = new HashSet(AllVerbs);
public static List GetActions(this Type serviceType)
{
diff --git a/Emby.Server.Implementations/Services/ServicePath.cs b/Emby.Server.Implementations/Services/ServicePath.cs
index da5e74f1fb..df5d713747 100644
--- a/Emby.Server.Implementations/Services/ServicePath.cs
+++ b/Emby.Server.Implementations/Services/ServicePath.cs
@@ -21,8 +21,6 @@ namespace Emby.Server.Implementations.Services
readonly bool[] componentsWithSeparators;
private readonly string restPath;
- private readonly string allowedVerbs;
- private readonly bool allowsAllVerbs;
public bool IsWildCardPath { get; private set; }
private readonly string[] literalsToMatch;
@@ -46,15 +44,7 @@ namespace Emby.Server.Implementations.Services
///
public int TotalComponentsCount { get; set; }
- public string[] Verbs
- {
- get
- {
- return allowsAllVerbs
- ? new[] { "ANY" }
- : AllowedVerbs.Split(new[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries);
- }
- }
+ public string[] Verbs { get; private set; }
public Type RequestType { get; private set; }
@@ -62,19 +52,11 @@ namespace Emby.Server.Implementations.Services
public string Summary { get; private set; }
- public string Notes { get; private set; }
-
- public bool AllowsAllVerbs { get { return this.allowsAllVerbs; } }
-
- public string AllowedVerbs { get { return this.allowedVerbs; } }
-
public int Priority { get; set; } //passed back to RouteAttribute
public static string[] GetPathPartsForMatching(string pathInfo)
{
- var parts = pathInfo.ToLower().Split(PathSeperatorChar)
- .Where(x => !String.IsNullOrEmpty(x)).ToArray();
- return parts;
+ return pathInfo.ToLower().Split(new[] { PathSeperatorChar }, StringSplitOptions.RemoveEmptyEntries);
}
public static List GetFirstMatchHashKeys(string[] pathPartsForMatching)
@@ -109,18 +91,13 @@ namespace Emby.Server.Implementations.Services
return list;
}
- public RestPath(Func createInstanceFn, Func> getParseFn, Type requestType, string path, string verbs, string summary = null, string notes = null)
+ public RestPath(Func createInstanceFn, Func> getParseFn, Type requestType, string path, string verbs, string summary = null)
{
this.RequestType = requestType;
this.Summary = summary;
- this.Notes = notes;
this.restPath = path;
- this.allowsAllVerbs = verbs == null || String.Equals(verbs, WildCard, StringComparison.OrdinalIgnoreCase);
- if (!this.allowsAllVerbs)
- {
- this.allowedVerbs = verbs.ToUpper();
- }
+ this.Verbs = string.IsNullOrWhiteSpace(verbs) ? ServiceExecExtensions.AllVerbs : verbs.ToUpper().Split(new[] { ' ', ',' }, StringSplitOptions.RemoveEmptyEntries);
var componentsList = new List();
@@ -153,7 +130,6 @@ namespace Emby.Server.Implementations.Services
this.PathComponentsCount = this.componentsWithSeparators.Length;
string firstLiteralMatch = null;
- var sbHashKey = new StringBuilder();
for (var i = 0; i < components.Length; i++)
{
var component = components[i];
@@ -172,7 +148,6 @@ namespace Emby.Server.Implementations.Services
else
{
this.literalsToMatch[i] = component.ToLower();
- sbHashKey.Append(i + PathSeperatorChar.ToString() + this.literalsToMatch);
if (firstLiteralMatch == null)
{
@@ -198,9 +173,6 @@ namespace Emby.Server.Implementations.Services
? this.PathComponentsCount + PathSeperator + firstLiteralMatch
: WildCardChar + PathSeperator + firstLiteralMatch;
- this.IsValid = sbHashKey.Length > 0;
- this.UniqueMatchHashKey = sbHashKey.ToString();
-
this.typeDeserializer = new StringMapTypeDeserializer(createInstanceFn, getParseFn, this.RequestType);
RegisterCaseInsenstivePropertyNameMappings();
}
@@ -220,26 +192,46 @@ namespace Emby.Server.Implementations.Services
};
- private static List _excludeTypes = new List { typeof(Stream) };
+ private static Type excludeType = typeof(Stream);
- internal static PropertyInfo[] GetSerializableProperties(Type type)
+ internal static List GetSerializableProperties(Type type)
{
- var properties = GetPublicProperties(type);
- var readableProperties = properties.Where(x => x.GetMethod != null);
+ var list = new List();
+ var props = GetPublicProperties(type);
- // else return those properties that are not decorated with IgnoreDataMember
- return readableProperties
- .Where(prop => prop.GetCustomAttributes(true)
- .All(attr =>
+ foreach (var prop in props)
+ {
+ if (prop.GetMethod == null)
+ {
+ continue;
+ }
+
+ if (excludeType == prop.PropertyType)
+ {
+ continue;
+ }
+
+ var ignored = false;
+ foreach (var attr in prop.GetCustomAttributes(true))
+ {
+ if (IgnoreAttributesNamed.Contains(attr.GetType().Name))
{
- var name = attr.GetType().Name;
- return !IgnoreAttributesNamed.Contains(name);
- }))
- .Where(prop => !_excludeTypes.Contains(prop.PropertyType))
- .ToArray();
+ ignored = true;
+ break;
+ }
+ }
+
+ if (!ignored)
+ {
+ list.Add(prop);
+ }
+ }
+
+ // else return those properties that are not decorated with IgnoreDataMember
+ return list;
}
- private static PropertyInfo[] GetPublicProperties(Type type)
+ private static List GetPublicProperties(Type type)
{
if (type.GetTypeInfo().IsInterface)
{
@@ -269,12 +261,19 @@ namespace Emby.Server.Implementations.Services
propertyInfos.InsertRange(0, newPropertyInfos);
}
- return propertyInfos.ToArray(propertyInfos.Count);
+ return propertyInfos;
}
- return GetTypesPublicProperties(type)
- .Where(t => t.GetIndexParameters().Length == 0) // ignore indexed properties
- .ToArray();
+ var list = new List();
+
+ foreach (var t in GetTypesPublicProperties(type))
+ {
+ if (t.GetIndexParameters().Length == 0)
+ {
+ list.Add(t);
+ }
+ }
+ return list;
}
private static PropertyInfo[] GetTypesPublicProperties(Type subType)
@@ -289,16 +288,11 @@ namespace Emby.Server.Implementations.Services
return pis.ToArray(pis.Count);
}
-
- public bool IsValid { get; set; }
-
///
/// Provide for quick lookups based on hashes that can be determined from a request url
///
public string FirstMatchHashKey { get; private set; }
- public string UniqueMatchHashKey { get; private set; }
-
private readonly StringMapTypeDeserializer typeDeserializer;
private readonly Dictionary propertyNamesMap = new Dictionary();
@@ -321,8 +315,14 @@ namespace Emby.Server.Implementations.Services
score += Math.Max((10 - VariableArgsCount), 1) * 100;
//Exact verb match is better than ANY
- var exactVerb = String.Equals(httpMethod, AllowedVerbs, StringComparison.OrdinalIgnoreCase);
- score += exactVerb ? 10 : 1;
+ if (Verbs.Length == 1 && string.Equals(httpMethod, Verbs[0], StringComparison.OrdinalIgnoreCase))
+ {
+ score += 10;
+ }
+ else
+ {
+ score += 1;
+ }
return score;
}
@@ -346,7 +346,7 @@ namespace Emby.Server.Implementations.Services
return false;
}
- if (!this.allowsAllVerbs && !StringContains(this.allowedVerbs, httpMethod))
+ if (!Verbs.Contains(httpMethod, StringComparer.OrdinalIgnoreCase))
{
//logger.Info("allowsAllVerbs mismatch for {0} for {1} allowedverbs {2}", httpMethod, string.Join("/", withPathInfoParts), this.allowedVerbs);
return false;
@@ -457,8 +457,7 @@ namespace Emby.Server.Implementations.Services
public object CreateRequest(string pathInfo, Dictionary queryStringAndFormData, object fromInstance)
{
- var requestComponents = pathInfo.Split(PathSeperatorChar)
- .Where(x => !String.IsNullOrEmpty(x)).ToArray();
+ var requestComponents = pathInfo.Split(new[] { PathSeperatorChar }, StringSplitOptions.RemoveEmptyEntries);
ExplodeComponents(ref requestComponents);
@@ -555,10 +554,5 @@ namespace Emby.Server.Implementations.Services
return this.typeDeserializer.PopulateFromMap(fromInstance, requestKeyValuesMap);
}
-
- public override int GetHashCode()
- {
- return UniqueMatchHashKey.GetHashCode();
- }
}
}
\ No newline at end of file
diff --git a/MediaBrowser.Server.Mono/MediaBrowser.Server.Mono.csproj b/MediaBrowser.Server.Mono/MediaBrowser.Server.Mono.csproj
index 7ddafb6360..04c4b50ef4 100644
--- a/MediaBrowser.Server.Mono/MediaBrowser.Server.Mono.csproj
+++ b/MediaBrowser.Server.Mono/MediaBrowser.Server.Mono.csproj
@@ -63,8 +63,7 @@
..\packages\SimpleInjector.4.0.8\lib\net45\SimpleInjector.dll
- ..\packages\SkiaSharp.1.58.0\lib\net45\SkiaSharp.dll
- True
+ ..\packages\SkiaSharp.1.58.1\lib\net45\SkiaSharp.dll
..\packages\SQLitePCLRaw.core.1.1.8\lib\net45\SQLitePCLRaw.core.dll
@@ -196,4 +195,11 @@
+
+
+
+ This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
+
+
+
\ No newline at end of file
diff --git a/MediaBrowser.Server.Mono/packages.config b/MediaBrowser.Server.Mono/packages.config
index 525a0098c8..cff873f1f7 100644
--- a/MediaBrowser.Server.Mono/packages.config
+++ b/MediaBrowser.Server.Mono/packages.config
@@ -4,7 +4,7 @@
-
+
\ No newline at end of file
diff --git a/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj b/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj
index 15abaaa62c..df2534d138 100644
--- a/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj
+++ b/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj
@@ -85,7 +85,7 @@
..\packages\SimpleInjector.4.0.8\lib\net45\SimpleInjector.dll
- ..\packages\SkiaSharp.1.58.0\lib\net45\SkiaSharp.dll
+ ..\packages\SkiaSharp.1.58.1\lib\net45\SkiaSharp.dll
..\packages\SQLitePCLRaw.core.1.1.8\lib\net45\SQLitePCLRaw.core.dll
@@ -162,6 +162,14 @@
+
+ x64\libSkiaSharp.dll
+ PreserveNewest
+
+
+ x86\libSkiaSharp.dll
+ PreserveNewest
+
MediaBrowser.InstallUtil.dll
PreserveNewest
@@ -174,17 +182,11 @@
MediaBrowser.Updater.exe
PreserveNewest
-
- PreserveNewest
-
PreserveNewest
-
- PreserveNewest
-
PreserveNewest
@@ -268,6 +270,13 @@
+
+
+
+ This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
+
+
+