diff --git a/MediaBrowser.Api/Images/ImageRequest.cs b/MediaBrowser.Api/Images/ImageRequest.cs
index 294b7ae960..210ee5b64e 100644
--- a/MediaBrowser.Api/Images/ImageRequest.cs
+++ b/MediaBrowser.Api/Images/ImageRequest.cs
@@ -58,6 +58,12 @@ namespace MediaBrowser.Api.Images
[ApiMember(Name = "Indicator", Description = "Determines what overlay to render, if any. none, watched.", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")]
public ImageOverlay? Indicator { get; set; }
+
+ [ApiMember(Name = "PercentPlayed", Description = "Percent to render for the percent played overlay", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")]
+ public int PercentPlayed { get; set; }
+
+ [ApiMember(Name = "BackgroundColor", Description = "Optional. Apply a background color for transparent images.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
+ public string BackgroundColor { get; set; }
public ImageRequest()
{
diff --git a/MediaBrowser.Api/Images/ImageWriter.cs b/MediaBrowser.Api/Images/ImageWriter.cs
index be79878aa5..190d2ba473 100644
--- a/MediaBrowser.Api/Images/ImageWriter.cs
+++ b/MediaBrowser.Api/Images/ImageWriter.cs
@@ -90,7 +90,9 @@ namespace MediaBrowser.Api.Images
Quality = Request.Quality,
Width = Request.Width,
OutputFormat = Request.Format,
- Indicator = Request.Indicator
+ Indicator = Request.Indicator,
+ PercentPlayed = Request.PercentPlayed,
+ BackgroundColor = Request.BackgroundColor
};
return ImageProcessor.ProcessImage(options, responseStream);
diff --git a/MediaBrowser.Controller/Drawing/ImageProcessingOptions.cs b/MediaBrowser.Controller/Drawing/ImageProcessingOptions.cs
index 3c2e6ab375..5910601248 100644
--- a/MediaBrowser.Controller/Drawing/ImageProcessingOptions.cs
+++ b/MediaBrowser.Controller/Drawing/ImageProcessingOptions.cs
@@ -36,5 +36,9 @@ namespace MediaBrowser.Controller.Drawing
public ImageOutputFormat OutputFormat { get; set; }
public ImageOverlay? Indicator { get; set; }
+
+ public int PercentPlayed { get; set; }
+
+ public string BackgroundColor { get; set; }
}
}
diff --git a/MediaBrowser.Server.Implementations/Drawing/ImageProcessor.cs b/MediaBrowser.Server.Implementations/Drawing/ImageProcessor.cs
index 6458435baa..1f7361d2f6 100644
--- a/MediaBrowser.Server.Implementations/Drawing/ImageProcessor.cs
+++ b/MediaBrowser.Server.Implementations/Drawing/ImageProcessor.cs
@@ -109,7 +109,7 @@ namespace MediaBrowser.Server.Implementations.Drawing
var quality = options.Quality ?? 90;
- var cacheFilePath = GetCacheFilePath(originalImagePath, newSize, quality, dateModified, options.OutputFormat, options.Indicator);
+ var cacheFilePath = GetCacheFilePath(originalImagePath, newSize, quality, dateModified, options.OutputFormat, options.Indicator, options.PercentPlayed, options.BackgroundColor);
try
{
@@ -173,9 +173,11 @@ namespace MediaBrowser.Server.Implementations.Drawing
thumbnailGraph.PixelOffsetMode = PixelOffsetMode.HighQuality;
thumbnailGraph.CompositingMode = CompositingMode.SourceOver;
+ SetBackgroundColor(thumbnailGraph, options);
+
thumbnailGraph.DrawImage(originalImage, 0, 0, newWidth, newHeight);
- DrawIndicator(thumbnailGraph, newWidth, newHeight, options.Indicator);
+ DrawIndicator(thumbnailGraph, newWidth, newHeight, options.Indicator, options.PercentPlayed);
var outputFormat = GetOutputFormat(originalImage, options.OutputFormat);
@@ -206,9 +208,41 @@ namespace MediaBrowser.Server.Implementations.Drawing
}
}
- private WatchedIndicatorDrawer _watchedDrawer;
+ ///
+ /// Sets the color of the background.
+ ///
+ /// The graphics.
+ /// The options.
+ private void SetBackgroundColor(Graphics graphics, ImageProcessingOptions options)
+ {
+ var color = options.BackgroundColor;
- private void DrawIndicator(Graphics graphics, int imageWidth, int imageHeight, ImageOverlay? indicator)
+ if (!string.IsNullOrEmpty(color))
+ {
+ Color drawingColor;
+
+ try
+ {
+ drawingColor = ColorTranslator.FromHtml(color);
+ }
+ catch
+ {
+ drawingColor = ColorTranslator.FromHtml("#" + color);
+ }
+
+ graphics.Clear(drawingColor);
+ }
+ }
+
+ ///
+ /// Draws the indicator.
+ ///
+ /// The graphics.
+ /// Width of the image.
+ /// Height of the image.
+ /// The indicator.
+ /// The percent played.
+ private void DrawIndicator(Graphics graphics, int imageWidth, int imageHeight, ImageOverlay? indicator, int percentPlayed)
{
if (!indicator.HasValue)
{
@@ -217,13 +251,17 @@ namespace MediaBrowser.Server.Implementations.Drawing
try
{
- if (indicator.Value == ImageOverlay.Watched)
+ if (indicator.Value == ImageOverlay.Played)
{
- _watchedDrawer = _watchedDrawer ?? (_watchedDrawer = new WatchedIndicatorDrawer());
-
var currentImageSize = new Size(imageWidth, imageHeight);
- _watchedDrawer.Process(graphics, currentImageSize);
+ new WatchedIndicatorDrawer().Process(graphics, currentImageSize);
+ }
+ if (indicator.Value == ImageOverlay.PercentPlayed)
+ {
+ var currentImageSize = new Size(imageWidth, imageHeight);
+
+ new PercentPlayedDrawer().Process(graphics, currentImageSize, percentPlayed);
}
}
catch (Exception ex)
@@ -350,7 +388,7 @@ namespace MediaBrowser.Server.Implementations.Drawing
///
/// Gets the cache file path based on a set of parameters
///
- private string GetCacheFilePath(string originalPath, ImageSize outputSize, int quality, DateTime dateModified, ImageOutputFormat format, ImageOverlay? overlay)
+ private string GetCacheFilePath(string originalPath, ImageSize outputSize, int quality, DateTime dateModified, ImageOutputFormat format, ImageOverlay? overlay, int percentPlayed, string backgroundColor)
{
var filename = originalPath;
@@ -364,12 +402,18 @@ namespace MediaBrowser.Server.Implementations.Drawing
if (format != ImageOutputFormat.Original)
{
- filename += "format=" + format;
+ filename += "f=" + format;
}
if (overlay.HasValue)
{
- filename += "overlay=" + overlay.Value;
+ filename += "o=" + overlay.Value;
+ filename += "p=" + percentPlayed;
+ }
+
+ if (!string.IsNullOrEmpty(backgroundColor))
+ {
+ filename += "b=" + backgroundColor;
}
return GetCachePath(_resizedImageCachePath, filename, Path.GetExtension(originalPath));
diff --git a/MediaBrowser.Server.Implementations/Drawing/PercentPlayedDrawer.cs b/MediaBrowser.Server.Implementations/Drawing/PercentPlayedDrawer.cs
new file mode 100644
index 0000000000..3558244584
--- /dev/null
+++ b/MediaBrowser.Server.Implementations/Drawing/PercentPlayedDrawer.cs
@@ -0,0 +1,36 @@
+using System.Drawing;
+using System.Globalization;
+
+namespace MediaBrowser.Server.Implementations.Drawing
+{
+ public class PercentPlayedDrawer
+ {
+ private const int IndicatorWidth = 80;
+ private const int IndicatorHeight = 50;
+ private const int FontSize = 30;
+ private readonly CultureInfo _usCulture = new CultureInfo("en-US");
+
+ public void Process(Graphics graphics, Size imageSize, int percent)
+ {
+ var x = imageSize.Width - IndicatorWidth;
+
+ using (var backdroundBrush = new SolidBrush(Color.FromArgb(225, 102, 192, 16)))
+ {
+ graphics.FillRectangle(backdroundBrush, x, 0, IndicatorWidth, IndicatorHeight);
+
+ var text = string.Format("{0}%", percent.ToString(_usCulture));
+
+ x = imageSize.Width - (percent < 10 ? 66 : 75);
+
+ using (var font = new Font(FontFamily.GenericSansSerif, FontSize, FontStyle.Regular, GraphicsUnit.Pixel))
+ {
+ using (var fontBrush = new SolidBrush(Color.White))
+ {
+ graphics.DrawString(text, font, fontBrush, x, 6);
+ }
+ }
+ }
+
+ }
+ }
+}
diff --git a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj
index 80fee7d97a..f84c02c1f8 100644
--- a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj
+++ b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj
@@ -114,6 +114,7 @@
+