added percent played overlay

This commit is contained in:
Luke Pulverenti 2013-09-21 11:06:00 -04:00
parent b9bb87100b
commit f380d7a092
6 changed files with 105 additions and 12 deletions

View file

@ -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")] [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; } 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() public ImageRequest()
{ {

View file

@ -90,7 +90,9 @@ namespace MediaBrowser.Api.Images
Quality = Request.Quality, Quality = Request.Quality,
Width = Request.Width, Width = Request.Width,
OutputFormat = Request.Format, OutputFormat = Request.Format,
Indicator = Request.Indicator Indicator = Request.Indicator,
PercentPlayed = Request.PercentPlayed,
BackgroundColor = Request.BackgroundColor
}; };
return ImageProcessor.ProcessImage(options, responseStream); return ImageProcessor.ProcessImage(options, responseStream);

View file

@ -36,5 +36,9 @@ namespace MediaBrowser.Controller.Drawing
public ImageOutputFormat OutputFormat { get; set; } public ImageOutputFormat OutputFormat { get; set; }
public ImageOverlay? Indicator { get; set; } public ImageOverlay? Indicator { get; set; }
public int PercentPlayed { get; set; }
public string BackgroundColor { get; set; }
} }
} }

View file

@ -109,7 +109,7 @@ namespace MediaBrowser.Server.Implementations.Drawing
var quality = options.Quality ?? 90; 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 try
{ {
@ -173,9 +173,11 @@ namespace MediaBrowser.Server.Implementations.Drawing
thumbnailGraph.PixelOffsetMode = PixelOffsetMode.HighQuality; thumbnailGraph.PixelOffsetMode = PixelOffsetMode.HighQuality;
thumbnailGraph.CompositingMode = CompositingMode.SourceOver; thumbnailGraph.CompositingMode = CompositingMode.SourceOver;
SetBackgroundColor(thumbnailGraph, options);
thumbnailGraph.DrawImage(originalImage, 0, 0, newWidth, newHeight); 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); var outputFormat = GetOutputFormat(originalImage, options.OutputFormat);
@ -206,9 +208,41 @@ namespace MediaBrowser.Server.Implementations.Drawing
} }
} }
private WatchedIndicatorDrawer _watchedDrawer; /// <summary>
/// Sets the color of the background.
/// </summary>
/// <param name="graphics">The graphics.</param>
/// <param name="options">The options.</param>
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);
}
}
/// <summary>
/// Draws the indicator.
/// </summary>
/// <param name="graphics">The graphics.</param>
/// <param name="imageWidth">Width of the image.</param>
/// <param name="imageHeight">Height of the image.</param>
/// <param name="indicator">The indicator.</param>
/// <param name="percentPlayed">The percent played.</param>
private void DrawIndicator(Graphics graphics, int imageWidth, int imageHeight, ImageOverlay? indicator, int percentPlayed)
{ {
if (!indicator.HasValue) if (!indicator.HasValue)
{ {
@ -217,13 +251,17 @@ namespace MediaBrowser.Server.Implementations.Drawing
try try
{ {
if (indicator.Value == ImageOverlay.Watched) if (indicator.Value == ImageOverlay.Played)
{ {
_watchedDrawer = _watchedDrawer ?? (_watchedDrawer = new WatchedIndicatorDrawer());
var currentImageSize = new Size(imageWidth, imageHeight); 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) catch (Exception ex)
@ -350,7 +388,7 @@ namespace MediaBrowser.Server.Implementations.Drawing
/// <summary> /// <summary>
/// Gets the cache file path based on a set of parameters /// Gets the cache file path based on a set of parameters
/// </summary> /// </summary>
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; var filename = originalPath;
@ -364,12 +402,18 @@ namespace MediaBrowser.Server.Implementations.Drawing
if (format != ImageOutputFormat.Original) if (format != ImageOutputFormat.Original)
{ {
filename += "format=" + format; filename += "f=" + format;
} }
if (overlay.HasValue) 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)); return GetCachePath(_resizedImageCachePath, filename, Path.GetExtension(originalPath));

View file

@ -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);
}
}
}
}
}
}

View file

@ -114,6 +114,7 @@
<Compile Include="BdInfo\BdInfoExaminer.cs" /> <Compile Include="BdInfo\BdInfoExaminer.cs" />
<Compile Include="Configuration\ServerConfigurationManager.cs" /> <Compile Include="Configuration\ServerConfigurationManager.cs" />
<Compile Include="Drawing\ImageHeader.cs" /> <Compile Include="Drawing\ImageHeader.cs" />
<Compile Include="Drawing\PercentPlayedDrawer.cs" />
<Compile Include="Drawing\WatchedIndicatorDrawer.cs" /> <Compile Include="Drawing\WatchedIndicatorDrawer.cs" />
<Compile Include="Dto\DtoService.cs" /> <Compile Include="Dto\DtoService.cs" />
<Compile Include="EntryPoints\LibraryChangedNotifier.cs" /> <Compile Include="EntryPoints\LibraryChangedNotifier.cs" />