mirror of
https://github.com/jellyfin/jellyfin.git
synced 2024-09-06 03:26:07 +02:00
added percent played overlay
This commit is contained in:
parent
b9bb87100b
commit
f380d7a092
6 changed files with 105 additions and 12 deletions
|
@ -59,6 +59,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()
|
||||||
{
|
{
|
||||||
EnableImageEnhancers = true;
|
EnableImageEnhancers = true;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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));
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -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" />
|
||||||
|
|
Loading…
Reference in a new issue