Merge pull request #2695 from MediaBrowser/dev

Dev
This commit is contained in:
Luke 2017-06-09 15:27:29 -04:00 committed by GitHub
commit 1b0f6f6c56
23 changed files with 214 additions and 399 deletions

View File

@ -130,7 +130,7 @@ namespace Emby.Drawing.ImageMagick
string.Equals(ext, ".webp", StringComparison.OrdinalIgnoreCase); string.Equals(ext, ".webp", StringComparison.OrdinalIgnoreCase);
} }
public string EncodeImage(string inputPath, DateTime dateModified, string outputPath, bool autoOrient, int quality, ImageProcessingOptions options, ImageFormat selectedOutputFormat) public string EncodeImage(string inputPath, DateTime dateModified, string outputPath, bool autoOrient, ImageOrientation? orientation, int quality, ImageProcessingOptions options, ImageFormat selectedOutputFormat)
{ {
// Even if the caller specified 100, don't use it because it takes forever // Even if the caller specified 100, don't use it because it takes forever
quality = Math.Min(quality, 99); quality = Math.Min(quality, 99);

View File

@ -184,7 +184,7 @@ namespace Emby.Drawing.Skia
} }
private string[] TransparentImageTypes = new string[] { ".png", ".gif", ".webp" }; private string[] TransparentImageTypes = new string[] { ".png", ".gif", ".webp" };
private SKBitmap Decode(string path, bool forceCleanBitmap = false) private SKBitmap Decode(string path, bool forceCleanBitmap, out SKCodecOrigin origin)
{ {
var requiresTransparencyHack = TransparentImageTypes.Contains(Path.GetExtension(path) ?? string.Empty); var requiresTransparencyHack = TransparentImageTypes.Contains(Path.GetExtension(path) ?? string.Empty);
@ -199,6 +199,8 @@ namespace Emby.Drawing.Skia
// decode // decode
codec.GetPixels(bitmap.Info, bitmap.GetPixels()); codec.GetPixels(bitmap.Info, bitmap.GetPixels());
origin = codec.Origin;
return bitmap; return bitmap;
} }
} }
@ -207,7 +209,7 @@ namespace Emby.Drawing.Skia
if (resultBitmap == null) if (resultBitmap == null)
{ {
return Decode(path, true); return Decode(path, true, out origin);
} }
// If we have to resize these they often end up distorted // If we have to resize these they often end up distorted
@ -215,27 +217,128 @@ namespace Emby.Drawing.Skia
{ {
using (resultBitmap) using (resultBitmap)
{ {
return Decode(path, true); return Decode(path, true, out origin);
} }
} }
origin = SKCodecOrigin.TopLeft;
return resultBitmap; return resultBitmap;
} }
private SKBitmap GetBitmap(string path, bool cropWhitespace) private SKBitmap GetBitmap(string path, bool cropWhitespace, bool forceAnalyzeBitmap, out SKCodecOrigin origin)
{ {
if (cropWhitespace) if (cropWhitespace)
{ {
using (var bitmap = Decode(path)) using (var bitmap = Decode(path, forceAnalyzeBitmap, out origin))
{ {
return CropWhiteSpace(bitmap); return CropWhiteSpace(bitmap);
} }
} }
return Decode(path); return Decode(path, forceAnalyzeBitmap, out origin);
} }
public string EncodeImage(string inputPath, DateTime dateModified, string outputPath, bool autoOrient, int quality, ImageProcessingOptions options, ImageFormat selectedOutputFormat) private SKBitmap GetBitmap(string path, bool cropWhitespace, bool autoOrient, ImageOrientation? orientation)
{
SKCodecOrigin origin;
if (autoOrient)
{
var bitmap = GetBitmap(path, cropWhitespace, true, out origin);
if (origin != SKCodecOrigin.TopLeft)
{
using (bitmap)
{
return RotateAndFlip(bitmap, origin);
}
}
return bitmap;
}
return GetBitmap(path, cropWhitespace, false, out origin);
}
private SKBitmap RotateAndFlip(SKBitmap original, SKCodecOrigin origin)
{
// these are the origins that represent a 90 degree turn in some fashion
var differentOrientations = new SKCodecOrigin[]
{
SKCodecOrigin.LeftBottom,
SKCodecOrigin.LeftTop,
SKCodecOrigin.RightBottom,
SKCodecOrigin.RightTop
};
// check if we need to turn the image
bool isDifferentOrientation = differentOrientations.Any(o => o == origin);
// define new width/height
var width = isDifferentOrientation ? original.Height : original.Width;
var height = isDifferentOrientation ? original.Width : original.Height;
var bitmap = new SKBitmap(width, height, true);
// todo: the stuff in this switch statement should be rewritten to use pointers
switch (origin)
{
case SKCodecOrigin.LeftBottom:
for (var x = 0; x < original.Width; x++)
for (var y = 0; y < original.Height; y++)
bitmap.SetPixel(y, original.Width - 1 - x, original.GetPixel(x, y));
break;
case SKCodecOrigin.RightTop:
for (var x = 0; x < original.Width; x++)
for (var y = 0; y < original.Height; y++)
bitmap.SetPixel(original.Height - 1 - y, x, original.GetPixel(x, y));
break;
case SKCodecOrigin.RightBottom:
for (var x = 0; x < original.Width; x++)
for (var y = 0; y < original.Height; y++)
bitmap.SetPixel(original.Height - 1 - y, original.Width - 1 - x, original.GetPixel(x, y));
break;
case SKCodecOrigin.LeftTop:
for (var x = 0; x < original.Width; x++)
for (var y = 0; y < original.Height; y++)
bitmap.SetPixel(y, x, original.GetPixel(x, y));
break;
case SKCodecOrigin.BottomLeft:
for (var x = 0; x < original.Width; x++)
for (var y = 0; y < original.Height; y++)
bitmap.SetPixel(x, original.Height - 1 - y, original.GetPixel(x, y));
break;
case SKCodecOrigin.BottomRight:
for (var x = 0; x < original.Width; x++)
for (var y = 0; y < original.Height; y++)
bitmap.SetPixel(original.Width - 1 - x, original.Height - 1 - y, original.GetPixel(x, y));
break;
case SKCodecOrigin.TopRight:
for (var x = 0; x < original.Width; x++)
for (var y = 0; y < original.Height; y++)
bitmap.SetPixel(original.Width - 1 - x, y, original.GetPixel(x, y));
break;
}
return bitmap;
}
public string EncodeImage(string inputPath, DateTime dateModified, string outputPath, bool autoOrient, ImageOrientation? orientation, int quality, ImageProcessingOptions options, ImageFormat selectedOutputFormat)
{ {
if (string.IsNullOrWhiteSpace(inputPath)) if (string.IsNullOrWhiteSpace(inputPath))
{ {
@ -253,7 +356,7 @@ namespace Emby.Drawing.Skia
var blur = options.Blur ?? 0; var blur = options.Blur ?? 0;
var hasIndicator = options.AddPlayedIndicator || options.UnplayedCount.HasValue || !options.PercentPlayed.Equals(0); var hasIndicator = options.AddPlayedIndicator || options.UnplayedCount.HasValue || !options.PercentPlayed.Equals(0);
using (var bitmap = GetBitmap(inputPath, options.CropWhiteSpace)) using (var bitmap = GetBitmap(inputPath, options.CropWhiteSpace, autoOrient, orientation))
{ {
if (bitmap == null) if (bitmap == null)
{ {
@ -265,7 +368,7 @@ namespace Emby.Drawing.Skia
var originalImageSize = new ImageSize(bitmap.Width, bitmap.Height); var originalImageSize = new ImageSize(bitmap.Width, bitmap.Height);
ImageHelper.SaveImageSize(inputPath, dateModified, originalImageSize); ImageHelper.SaveImageSize(inputPath, dateModified, originalImageSize);
if (!options.CropWhiteSpace && options.HasDefaultOptions(inputPath, originalImageSize)) if (!options.CropWhiteSpace && options.HasDefaultOptions(inputPath, originalImageSize) && !autoOrient)
{ {
// Just spit out the original file if all the options are default // Just spit out the original file if all the options are default
return inputPath; return inputPath;

View File

@ -217,14 +217,23 @@ namespace Emby.Drawing
dateModified = tuple.Item2; dateModified = tuple.Item2;
} }
if (options.HasDefaultOptions(originalImagePath)) var photo = item as Photo;
var autoOrient = false;
ImageOrientation? orientation = null;
if (photo != null && photo.Orientation.HasValue && photo.Orientation.Value != ImageOrientation.TopLeft)
{
autoOrient = true;
orientation = photo.Orientation;
}
if (options.HasDefaultOptions(originalImagePath) && !autoOrient)
{ {
// Just spit out the original file if all the options are default // Just spit out the original file if all the options are default
return new Tuple<string, string, DateTime>(originalImagePath, MimeTypes.GetMimeType(originalImagePath), dateModified); return new Tuple<string, string, DateTime>(originalImagePath, MimeTypes.GetMimeType(originalImagePath), dateModified);
} }
ImageSize? originalImageSize = GetSavedImageSize(originalImagePath, dateModified); ImageSize? originalImageSize = GetSavedImageSize(originalImagePath, dateModified);
if (originalImageSize.HasValue && options.HasDefaultOptions(originalImagePath, originalImageSize.Value)) if (originalImageSize.HasValue && options.HasDefaultOptions(originalImagePath, originalImageSize.Value) && !autoOrient)
{ {
// Just spit out the original file if all the options are default // Just spit out the original file if all the options are default
_logger.Info("Returning original image {0}", originalImagePath); _logger.Info("Returning original image {0}", originalImagePath);
@ -243,7 +252,6 @@ namespace Emby.Drawing
if (!_fileSystem.FileExists(cacheFilePath)) if (!_fileSystem.FileExists(cacheFilePath))
{ {
_fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(cacheFilePath));
var tmpPath = Path.ChangeExtension(Path.Combine(_appPaths.TempDirectory, Guid.NewGuid().ToString("N")), Path.GetExtension(cacheFilePath)); var tmpPath = Path.ChangeExtension(Path.Combine(_appPaths.TempDirectory, Guid.NewGuid().ToString("N")), Path.GetExtension(cacheFilePath));
_fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(tmpPath)); _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(tmpPath));
@ -252,13 +260,14 @@ namespace Emby.Drawing
item = _libraryManager().GetItemById(options.ItemId); item = _libraryManager().GetItemById(options.ItemId);
} }
var resultPath =_imageEncoder.EncodeImage(originalImagePath, dateModified, tmpPath, AutoOrient(item), quality, options, outputFormat); var resultPath = _imageEncoder.EncodeImage(originalImagePath, dateModified, tmpPath, autoOrient, orientation, quality, options, outputFormat);
if (string.Equals(resultPath, originalImagePath, StringComparison.OrdinalIgnoreCase)) if (string.Equals(resultPath, originalImagePath, StringComparison.OrdinalIgnoreCase))
{ {
return new Tuple<string, string, DateTime>(originalImagePath, MimeTypes.GetMimeType(originalImagePath), dateModified); return new Tuple<string, string, DateTime>(originalImagePath, MimeTypes.GetMimeType(originalImagePath), dateModified);
} }
_fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(cacheFilePath));
CopyFile(tmpPath, cacheFilePath); CopyFile(tmpPath, cacheFilePath);
return new Tuple<string, string, DateTime>(tmpPath, GetMimeType(outputFormat, cacheFilePath), _fileSystem.GetLastWriteTimeUtc(tmpPath)); return new Tuple<string, string, DateTime>(tmpPath, GetMimeType(outputFormat, cacheFilePath), _fileSystem.GetLastWriteTimeUtc(tmpPath));
@ -288,17 +297,6 @@ namespace Emby.Drawing
} }
} }
private bool AutoOrient(IHasImages item)
{
var photo = item as Photo;
if (photo != null && photo.Orientation.HasValue)
{
return true;
}
return false;
}
//private static int[][] OPERATIONS = new int[][] { //private static int[][] OPERATIONS = new int[][] {
// TopLeft // TopLeft
//new int[] { 0, NONE}, //new int[] { 0, NONE},

View File

@ -32,7 +32,7 @@ namespace Emby.Drawing
throw new NotImplementedException(); throw new NotImplementedException();
} }
public string EncodeImage(string inputPath, DateTime dateModified, string outputPath, bool autoOrient, int quality, ImageProcessingOptions options, ImageFormat selectedOutputFormat) public string EncodeImage(string inputPath, DateTime dateModified, string outputPath, bool autoOrient, ImageOrientation? orientation, int quality, ImageProcessingOptions options, ImageFormat selectedOutputFormat)
{ {
throw new NotImplementedException(); throw new NotImplementedException();
} }

View File

@ -123,7 +123,7 @@ namespace Emby.Server.Implementations.Activity
return; return;
} }
if (item.IsThemeMedia) if (e.Item != null && e.Item.IsThemeMedia)
{ {
// Don't report theme song or local trailer playback // Don't report theme song or local trailer playback
return; return;
@ -155,7 +155,7 @@ namespace Emby.Server.Implementations.Activity
return; return;
} }
if (item.IsThemeMedia) if (e.Item != null && e.Item.IsThemeMedia)
{ {
// Don't report theme song or local trailer playback // Don't report theme song or local trailer playback
return; return;

View File

@ -23,6 +23,7 @@ using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Model.Threading; using MediaBrowser.Model.Threading;
using MediaBrowser.Model.Dto;
namespace Emby.Server.Implementations.Notifications namespace Emby.Server.Implementations.Notifications
{ {
@ -260,7 +261,7 @@ namespace Emby.Server.Implementations.Notifications
var item = e.MediaInfo; var item = e.MediaInfo;
if ( item.IsThemeMedia) if (e.Item != null && e.Item.IsThemeMedia)
{ {
// Don't report theme song or local trailer playback // Don't report theme song or local trailer playback
return; return;
@ -430,7 +431,7 @@ namespace Emby.Server.Implementations.Notifications
return name; return name;
} }
public static string GetItemName(BaseItemInfo item) public static string GetItemName(BaseItemDto item)
{ {
var name = item.Name; var name = item.Name;

View File

@ -338,7 +338,7 @@ namespace Emby.Server.Implementations.Session
} }
} }
info.Item = GetItemInfo(libraryItem, libraryItem, mediaSource); info.Item = GetItemInfo(libraryItem, mediaSource);
info.Item.RunTimeTicks = runtimeTicks; info.Item.RunTimeTicks = runtimeTicks;
} }
@ -813,7 +813,7 @@ namespace Emby.Server.Implementations.Session
mediaSource = await GetMediaSource(hasMediaSources, info.MediaSourceId, info.LiveStreamId).ConfigureAwait(false); mediaSource = await GetMediaSource(hasMediaSources, info.MediaSourceId, info.LiveStreamId).ConfigureAwait(false);
} }
info.Item = GetItemInfo(libraryItem, libraryItem, mediaSource); info.Item = GetItemInfo(libraryItem, mediaSource);
} }
else else
{ {
@ -1637,165 +1637,65 @@ namespace Emby.Server.Implementations.Session
return dto; return dto;
} }
private DtoOptions _itemInfoDtoOptions;
/// <summary> /// <summary>
/// Converts a BaseItem to a BaseItemInfo /// Converts a BaseItem to a BaseItemInfo
/// </summary> /// </summary>
/// <param name="item">The item.</param> private BaseItemDto GetItemInfo(BaseItem item, MediaSourceInfo mediaSource)
/// <param name="chapterOwner">The chapter owner.</param>
/// <param name="mediaSource">The media source.</param>
/// <returns>BaseItemInfo.</returns>
/// <exception cref="System.ArgumentNullException">item</exception>
private BaseItemInfo GetItemInfo(BaseItem item, BaseItem chapterOwner, MediaSourceInfo mediaSource)
{ {
if (item == null) if (item == null)
{ {
throw new ArgumentNullException("item"); throw new ArgumentNullException("item");
} }
var info = new BaseItemInfo var dtoOptions = _itemInfoDtoOptions;
{
Id = GetDtoId(item),
Name = item.Name,
MediaType = item.MediaType,
Type = item.GetClientTypeName(),
RunTimeTicks = item.RunTimeTicks,
IndexNumber = item.IndexNumber,
ParentIndexNumber = item.ParentIndexNumber,
PremiereDate = item.PremiereDate,
ProductionYear = item.ProductionYear,
IsThemeMedia = item.IsThemeMedia
};
info.PrimaryImageTag = GetImageCacheTag(item, ImageType.Primary); if (_itemInfoDtoOptions == null)
if (info.PrimaryImageTag != null)
{ {
info.PrimaryImageItemId = GetDtoId(item); dtoOptions = new DtoOptions
}
var episode = item as Episode;
if (episode != null)
{
info.IndexNumberEnd = episode.IndexNumberEnd;
}
var hasSeries = item as IHasSeries;
if (hasSeries != null)
{
info.SeriesName = hasSeries.SeriesName;
}
var recording = item as ILiveTvRecording;
if (recording != null)
{
if (recording.IsSeries)
{ {
info.Name = recording.EpisodeTitle; AddProgramRecordingInfo = false
info.SeriesName = recording.Name; };
if (string.IsNullOrWhiteSpace(info.Name)) dtoOptions.Fields.Remove(ItemFields.BasicSyncInfo);
{ dtoOptions.Fields.Remove(ItemFields.SyncInfo);
info.Name = recording.Name; dtoOptions.Fields.Remove(ItemFields.CanDelete);
} dtoOptions.Fields.Remove(ItemFields.CanDownload);
} dtoOptions.Fields.Remove(ItemFields.ChildCount);
dtoOptions.Fields.Remove(ItemFields.CustomRating);
dtoOptions.Fields.Remove(ItemFields.DateLastMediaAdded);
dtoOptions.Fields.Remove(ItemFields.DateLastRefreshed);
dtoOptions.Fields.Remove(ItemFields.DateLastSaved);
dtoOptions.Fields.Remove(ItemFields.DisplayMediaType);
dtoOptions.Fields.Remove(ItemFields.DisplayPreferencesId);
dtoOptions.Fields.Remove(ItemFields.Etag);
dtoOptions.Fields.Remove(ItemFields.ExternalEtag);
dtoOptions.Fields.Remove(ItemFields.IndexOptions);
dtoOptions.Fields.Remove(ItemFields.InheritedParentalRatingValue);
dtoOptions.Fields.Remove(ItemFields.ItemCounts);
dtoOptions.Fields.Remove(ItemFields.Keywords);
dtoOptions.Fields.Remove(ItemFields.MediaSourceCount);
dtoOptions.Fields.Remove(ItemFields.MediaStreams);
dtoOptions.Fields.Remove(ItemFields.MediaSources);
dtoOptions.Fields.Remove(ItemFields.People);
dtoOptions.Fields.Remove(ItemFields.PlayAccess);
dtoOptions.Fields.Remove(ItemFields.People);
dtoOptions.Fields.Remove(ItemFields.ProductionLocations);
dtoOptions.Fields.Remove(ItemFields.RecursiveItemCount);
dtoOptions.Fields.Remove(ItemFields.RemoteTrailers);
dtoOptions.Fields.Remove(ItemFields.SeasonUserData);
dtoOptions.Fields.Remove(ItemFields.SeriesGenres);
dtoOptions.Fields.Remove(ItemFields.Settings);
dtoOptions.Fields.Remove(ItemFields.SortName);
dtoOptions.Fields.Remove(ItemFields.Tags);
dtoOptions.Fields.Remove(ItemFields.ThemeSongIds);
dtoOptions.Fields.Remove(ItemFields.ThemeVideoIds);
_itemInfoDtoOptions = dtoOptions;
} }
var audio = item as Audio; var info = _dtoService.GetBaseItemDto(item, dtoOptions);
if (audio != null)
{
info.Album = audio.Album;
info.Artists = audio.Artists;
if (info.PrimaryImageTag == null)
{
var album = audio.AlbumEntity;
if (album != null && album.HasImage(ImageType.Primary))
{
info.PrimaryImageTag = GetImageCacheTag(album, ImageType.Primary);
if (info.PrimaryImageTag != null)
{
info.PrimaryImageItemId = GetDtoId(album);
}
}
}
}
var musicVideo = item as MusicVideo;
if (musicVideo != null)
{
info.Album = musicVideo.Album;
info.Artists = musicVideo.Artists.ToList();
}
var backropItem = item.HasImage(ImageType.Backdrop) ? item : null;
var thumbItem = item.HasImage(ImageType.Thumb) ? item : null;
var logoItem = item.HasImage(ImageType.Logo) ? item : null;
if (thumbItem == null)
{
if (episode != null)
{
var series = episode.Series;
if (series != null && series.HasImage(ImageType.Thumb))
{
thumbItem = series;
}
}
}
if (backropItem == null)
{
if (episode != null)
{
var series = episode.Series;
if (series != null && series.HasImage(ImageType.Backdrop))
{
backropItem = series;
}
}
}
if (backropItem == null)
{
backropItem = item.GetParents().FirstOrDefault(i => i.HasImage(ImageType.Backdrop));
}
if (thumbItem == null)
{
thumbItem = item.GetParents().FirstOrDefault(i => i.HasImage(ImageType.Thumb));
}
if (logoItem == null)
{
logoItem = item.GetParents().FirstOrDefault(i => i.HasImage(ImageType.Logo));
}
if (thumbItem != null)
{
info.ThumbImageTag = GetImageCacheTag(thumbItem, ImageType.Thumb);
info.ThumbItemId = GetDtoId(thumbItem);
}
if (backropItem != null)
{
info.BackdropImageTag = GetImageCacheTag(backropItem, ImageType.Backdrop);
info.BackdropItemId = GetDtoId(backropItem);
}
if (logoItem != null)
{
info.LogoImageTag = GetImageCacheTag(logoItem, ImageType.Logo);
info.LogoItemId = GetDtoId(logoItem);
}
if (chapterOwner != null)
{
info.ChapterImagesItemId = chapterOwner.Id.ToString("N");
info.Chapters = _dtoService.GetChapterInfoDtos(chapterOwner).ToList();
}
if (mediaSource != null) if (mediaSource != null)
{ {
@ -1837,7 +1737,7 @@ namespace Emby.Server.Implementations.Session
//ReportNowViewingItem(sessionId, info); //ReportNowViewingItem(sessionId, info);
} }
public void ReportNowViewingItem(string sessionId, BaseItemInfo item) public void ReportNowViewingItem(string sessionId, BaseItemDto item)
{ {
//var session = GetSession(sessionId); //var session = GetSession(sessionId);

View File

@ -98,7 +98,7 @@ namespace MediaBrowser.Api.Session
[Route("/Sessions/{Id}/Playing/{Command}", "POST", Summary = "Issues a playstate command to a client")] [Route("/Sessions/{Id}/Playing/{Command}", "POST", Summary = "Issues a playstate command to a client")]
[Authenticated] [Authenticated]
public class SendPlaystateCommand : IReturnVoid public class SendPlaystateCommand : PlaystateRequest, IReturnVoid
{ {
/// <summary> /// <summary>
/// Gets or sets the id. /// Gets or sets the id.
@ -106,19 +106,6 @@ namespace MediaBrowser.Api.Session
/// <value>The id.</value> /// <value>The id.</value>
[ApiMember(Name = "Id", Description = "Session Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")] [ApiMember(Name = "Id", Description = "Session Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")]
public string Id { get; set; } public string Id { get; set; }
/// <summary>
/// Gets or sets the position to seek to
/// </summary>
[ApiMember(Name = "SeekPositionTicks", Description = "The position to seek to.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")]
public long? SeekPositionTicks { get; set; }
/// <summary>
/// Gets or sets the play command.
/// </summary>
/// <value>The play command.</value>
[ApiMember(Name = "Command", Description = "The command to send - stop, pause, unpause, nexttrack, previoustrack, seek, fullscreen.", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")]
public PlaystateCommand Command { get; set; }
} }
[Route("/Sessions/{Id}/System/{Command}", "POST", Summary = "Issues a system command to a client")] [Route("/Sessions/{Id}/System/{Command}", "POST", Summary = "Issues a system command to a client")]
@ -414,13 +401,7 @@ namespace MediaBrowser.Api.Session
public void Post(SendPlaystateCommand request) public void Post(SendPlaystateCommand request)
{ {
var command = new PlaystateRequest var task = _sessionManager.SendPlaystateCommand(GetSession(_sessionContext).Result.Id, request.Id, request, CancellationToken.None);
{
Command = request.Command,
SeekPositionTicks = request.SeekPositionTicks
};
var task = _sessionManager.SendPlaystateCommand(GetSession(_sessionContext).Result.Id, request.Id, command, CancellationToken.None);
Task.WaitAll(task); Task.WaitAll(task);
} }

View File

@ -19,7 +19,7 @@ namespace MediaBrowser.Controller.Drawing
/// <summary> /// <summary>
/// Encodes the image. /// Encodes the image.
/// </summary> /// </summary>
string EncodeImage(string inputPath, DateTime dateModified, string outputPath, bool autoOrient, int quality, ImageProcessingOptions options, ImageFormat outputFormat); string EncodeImage(string inputPath, DateTime dateModified, string outputPath, bool autoOrient, ImageOrientation? orientation, int quality, ImageProcessingOptions options, ImageFormat outputFormat);
/// <summary> /// <summary>
/// Creates the image collage. /// Creates the image collage.

View File

@ -149,6 +149,7 @@ namespace MediaBrowser.Controller.Entities
public string[] PresetViews { get; set; } public string[] PresetViews { get; set; }
public TrailerType[] TrailerTypes { get; set; } public TrailerType[] TrailerTypes { get; set; }
public SourceType[] SourceTypes { get; set; }
public DayOfWeek[] AirDays { get; set; } public DayOfWeek[] AirDays { get; set; }
public SeriesStatus[] SeriesStatuses { get; set; } public SeriesStatus[] SeriesStatuses { get; set; }
@ -214,6 +215,7 @@ namespace MediaBrowser.Controller.Entities
ExcludeInheritedTags = new string[] { }; ExcludeInheritedTags = new string[] { };
PresetViews = new string[] { }; PresetViews = new string[] { };
TrailerTypes = new TrailerType[] { }; TrailerTypes = new TrailerType[] { };
SourceTypes = new SourceType[] { };
AirDays = new DayOfWeek[] { }; AirDays = new DayOfWeek[] { };
SeriesStatuses = new SeriesStatus[] { }; SeriesStatuses = new SeriesStatus[] { };
OrderBy = new List<Tuple<string, SortOrder>>(); OrderBy = new List<Tuple<string, SortOrder>>();

View File

@ -1,5 +1,5 @@
using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities;
using MediaBrowser.Model.Entities; using MediaBrowser.Model.Dto;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@ -13,7 +13,7 @@ namespace MediaBrowser.Controller.Library
public List<User> Users { get; set; } public List<User> Users { get; set; }
public long? PlaybackPositionTicks { get; set; } public long? PlaybackPositionTicks { get; set; }
public BaseItem Item { get; set; } public BaseItem Item { get; set; }
public BaseItemInfo MediaInfo { get; set; } public BaseItemDto MediaInfo { get; set; }
public string MediaSourceId { get; set; } public string MediaSourceId { get; set; }
public bool IsPaused { get; set; } public bool IsPaused { get; set; }
public bool IsAutomated { get; set; } public bool IsAutomated { get; set; }

View File

@ -1604,7 +1604,7 @@ namespace MediaBrowser.Controller.MediaEncoding
} }
// Only do this for video files due to sometimes unpredictable codec names coming from BDInfo // Only do this for video files due to sometimes unpredictable codec names coming from BDInfo
if (state.VideoType == VideoType.VideoFile && string.IsNullOrWhiteSpace(encodingOptions.HardwareAccelerationType)) if (state.VideoType == VideoType.VideoFile && state.RunTimeTicks.HasValue && string.IsNullOrWhiteSpace(encodingOptions.HardwareAccelerationType))
{ {
foreach (var stream in state.MediaSource.MediaStreams) foreach (var stream in state.MediaSource.MediaStreams)
{ {

View File

@ -1,7 +1,7 @@
using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Security; using MediaBrowser.Controller.Security;
using MediaBrowser.Model.Entities; using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Events; using MediaBrowser.Model.Events;
using MediaBrowser.Model.Session; using MediaBrowser.Model.Session;
using MediaBrowser.Model.Users; using MediaBrowser.Model.Users;
@ -249,7 +249,7 @@ namespace MediaBrowser.Controller.Session
/// </summary> /// </summary>
/// <param name="sessionId">The session identifier.</param> /// <param name="sessionId">The session identifier.</param>
/// <param name="item">The item.</param> /// <param name="item">The item.</param>
void ReportNowViewingItem(string sessionId, BaseItemInfo item); void ReportNowViewingItem(string sessionId, BaseItemDto item);
/// <summary> /// <summary>
/// Authenticates the new session. /// Authenticates the new session.

View File

@ -1,4 +1,4 @@
using MediaBrowser.Model.Entities; using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Session; using MediaBrowser.Model.Session;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@ -100,13 +100,13 @@ namespace MediaBrowser.Controller.Session
/// Gets or sets the name of the now viewing item. /// Gets or sets the name of the now viewing item.
/// </summary> /// </summary>
/// <value>The name of the now viewing item.</value> /// <value>The name of the now viewing item.</value>
public BaseItemInfo NowViewingItem { get; set; } public BaseItemDto NowViewingItem { get; set; }
/// <summary> /// <summary>
/// Gets or sets the now playing item. /// Gets or sets the now playing item.
/// </summary> /// </summary>
/// <value>The now playing item.</value> /// <value>The now playing item.</value>
public BaseItemInfo NowPlayingItem { get; set; } public BaseItemDto NowPlayingItem { get; set; }
public BaseItem FullNowPlayingItem { get; set; } public BaseItem FullNowPlayingItem { get; set; }

View File

@ -17,9 +17,16 @@ namespace MediaBrowser.LocalMetadata.Parsers
{ {
case "CollectionItems": case "CollectionItems":
using (var subReader = reader.ReadSubtree()) if (!reader.IsEmptyElement)
{ {
FetchFromCollectionItemsNode(subReader, item); using (var subReader = reader.ReadSubtree())
{
FetchFromCollectionItemsNode(subReader, item);
}
}
else
{
reader.Read();
} }
break; break;

View File

@ -1,178 +0,0 @@
using MediaBrowser.Model.Dto;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using MediaBrowser.Model.Serialization;
namespace MediaBrowser.Model.Entities
{
/// <summary>
/// This is a stub class containing only basic information about an item
/// </summary>
[DebuggerDisplay("Name = {Name}, ID = {Id}, Type = {Type}")]
public class BaseItemInfo
{
/// <summary>
/// Gets or sets the name.
/// </summary>
/// <value>The name.</value>
public string Name { get; set; }
/// <summary>
/// Gets or sets the id.
/// </summary>
/// <value>The id.</value>
public string Id { get; set; }
/// <summary>
/// Gets or sets the type.
/// </summary>
/// <value>The type.</value>
public string Type { get; set; }
/// <summary>
/// Gets or sets the type of the media.
/// </summary>
/// <value>The type of the media.</value>
public string MediaType { get; set; }
/// <summary>
/// Gets or sets the run time ticks.
/// </summary>
/// <value>The run time ticks.</value>
public long? RunTimeTicks { get; set; }
/// <summary>
/// Gets or sets the primary image tag.
/// </summary>
/// <value>The primary image tag.</value>
public string PrimaryImageTag { get; set; }
/// <summary>
/// Gets or sets the primary image item identifier.
/// </summary>
/// <value>The primary image item identifier.</value>
public string PrimaryImageItemId { get; set; }
/// <summary>
/// Gets or sets the logo image tag.
/// </summary>
/// <value>The logo image tag.</value>
public string LogoImageTag { get; set; }
/// <summary>
/// Gets or sets the logo item identifier.
/// </summary>
/// <value>The logo item identifier.</value>
public string LogoItemId { get; set; }
/// <summary>
/// Gets or sets the thumb image tag.
/// </summary>
/// <value>The thumb image tag.</value>
public string ThumbImageTag { get; set; }
/// <summary>
/// Gets or sets the thumb item identifier.
/// </summary>
/// <value>The thumb item identifier.</value>
public string ThumbItemId { get; set; }
/// <summary>
/// Gets or sets the thumb image tag.
/// </summary>
/// <value>The thumb image tag.</value>
public string BackdropImageTag { get; set; }
/// <summary>
/// Gets or sets the thumb item identifier.
/// </summary>
/// <value>The thumb item identifier.</value>
public string BackdropItemId { get; set; }
/// <summary>
/// Gets or sets the premiere date.
/// </summary>
/// <value>The premiere date.</value>
public DateTime? PremiereDate { get; set; }
/// <summary>
/// Gets or sets the production year.
/// </summary>
/// <value>The production year.</value>
public int? ProductionYear { get; set; }
/// <summary>
/// Gets or sets the index number.
/// </summary>
/// <value>The index number.</value>
public int? IndexNumber { get; set; }
/// <summary>
/// Gets or sets the index number end.
/// </summary>
/// <value>The index number end.</value>
public int? IndexNumberEnd { get; set; }
/// <summary>
/// Gets or sets the parent index number.
/// </summary>
/// <value>The parent index number.</value>
public int? ParentIndexNumber { get; set; }
/// <summary>
/// Gets or sets the name of the series.
/// </summary>
/// <value>The name of the series.</value>
public string SeriesName { get; set; }
/// <summary>
/// Gets or sets the album.
/// </summary>
/// <value>The album.</value>
public string Album { get; set; }
public bool IsThemeMedia { get; set; }
/// <summary>
/// Gets or sets the artists.
/// </summary>
/// <value>The artists.</value>
public List<string> Artists { get; set; }
/// <summary>
/// Gets or sets the media streams.
/// </summary>
/// <value>The media streams.</value>
public List<MediaStream> MediaStreams { get; set; }
/// <summary>
/// Gets or sets the chapter images item identifier.
/// </summary>
/// <value>The chapter images item identifier.</value>
public string ChapterImagesItemId { get; set; }
/// <summary>
/// Gets or sets the chapters.
/// </summary>
/// <value>The chapters.</value>
public List<ChapterInfoDto> Chapters { get; set; }
/// <summary>
/// Gets a value indicating whether this instance has primary image.
/// </summary>
/// <value><c>true</c> if this instance has primary image; otherwise, <c>false</c>.</value>
[IgnoreDataMember]
public bool HasPrimaryImage
{
get { return PrimaryImageTag != null; }
}
public BaseItemInfo()
{
Artists = new List<string>();
MediaStreams = new List<MediaStream>();
Chapters = new List<ChapterInfoDto>();
}
}
}

View File

@ -322,7 +322,6 @@
<Compile Include="Querying\EpisodeQuery.cs" /> <Compile Include="Querying\EpisodeQuery.cs" />
<Compile Include="Querying\ItemCountsQuery.cs" /> <Compile Include="Querying\ItemCountsQuery.cs" />
<Compile Include="Querying\ItemsByNameQuery.cs" /> <Compile Include="Querying\ItemsByNameQuery.cs" />
<Compile Include="Entities\BaseItemInfo.cs" />
<Compile Include="Querying\LatestItemsQuery.cs" /> <Compile Include="Querying\LatestItemsQuery.cs" />
<Compile Include="Querying\MovieRecommendationQuery.cs" /> <Compile Include="Querying\MovieRecommendationQuery.cs" />
<Compile Include="Querying\NextUpQuery.cs" /> <Compile Include="Querying\NextUpQuery.cs" />

View File

@ -1,4 +1,4 @@
using MediaBrowser.Model.Entities; using MediaBrowser.Model.Dto;
namespace MediaBrowser.Model.Session namespace MediaBrowser.Model.Session
{ {
@ -17,7 +17,7 @@ namespace MediaBrowser.Model.Session
/// Gets or sets the item. /// Gets or sets the item.
/// </summary> /// </summary>
/// <value>The item.</value> /// <value>The item.</value>
public BaseItemInfo Item { get; set; } public BaseItemDto Item { get; set; }
/// <summary> /// <summary>
/// Gets or sets the item identifier. /// Gets or sets the item identifier.
@ -67,6 +67,8 @@ namespace MediaBrowser.Model.Session
/// <value>The position ticks.</value> /// <value>The position ticks.</value>
public long? PositionTicks { get; set; } public long? PositionTicks { get; set; }
public long? playbackStartTimeTicks { get; set; }
/// <summary> /// <summary>
/// Gets or sets the volume level. /// Gets or sets the volume level.
/// </summary> /// </summary>

View File

@ -1,4 +1,4 @@
using MediaBrowser.Model.Entities; using MediaBrowser.Model.Dto;
namespace MediaBrowser.Model.Session namespace MediaBrowser.Model.Session
{ {
@ -11,7 +11,7 @@ namespace MediaBrowser.Model.Session
/// Gets or sets the item. /// Gets or sets the item.
/// </summary> /// </summary>
/// <value>The item.</value> /// <value>The item.</value>
public BaseItemInfo Item { get; set; } public BaseItemDto Item { get; set; }
/// <summary> /// <summary>
/// Gets or sets the item identifier. /// Gets or sets the item identifier.
/// </summary> /// </summary>

View File

@ -1,4 +1,4 @@
using MediaBrowser.Model.Entities; using MediaBrowser.Model.Dto;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
@ -72,7 +72,7 @@ namespace MediaBrowser.Model.Session
/// Gets or sets the now viewing item. /// Gets or sets the now viewing item.
/// </summary> /// </summary>
/// <value>The now viewing item.</value> /// <value>The now viewing item.</value>
public BaseItemInfo NowViewingItem { get; set; } public BaseItemDto NowViewingItem { get; set; }
/// <summary> /// <summary>
/// Gets or sets the name of the device. /// Gets or sets the name of the device.
@ -84,7 +84,7 @@ namespace MediaBrowser.Model.Session
/// Gets or sets the now playing item. /// Gets or sets the now playing item.
/// </summary> /// </summary>
/// <value>The now playing item.</value> /// <value>The now playing item.</value>
public BaseItemInfo NowPlayingItem { get; set; } public BaseItemDto NowPlayingItem { get; set; }
/// <summary> /// <summary>
/// Gets or sets the device id. /// Gets or sets the device id.

View File

@ -2,7 +2,7 @@
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd"> <package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
<metadata> <metadata>
<id>MediaBrowser.Common</id> <id>MediaBrowser.Common</id>
<version>3.0.702</version> <version>3.0.703</version>
<title>Emby.Common</title> <title>Emby.Common</title>
<authors>Emby Team</authors> <authors>Emby Team</authors>
<owners>ebr,Luke,scottisafool</owners> <owners>ebr,Luke,scottisafool</owners>

View File

@ -2,7 +2,7 @@
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd"> <package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
<metadata> <metadata>
<id>MediaBrowser.Server.Core</id> <id>MediaBrowser.Server.Core</id>
<version>3.0.702</version> <version>3.0.703</version>
<title>Emby.Server.Core</title> <title>Emby.Server.Core</title>
<authors>Emby Team</authors> <authors>Emby Team</authors>
<owners>ebr,Luke,scottisafool</owners> <owners>ebr,Luke,scottisafool</owners>
@ -12,7 +12,7 @@
<description>Contains core components required to build plugins for Emby Server.</description> <description>Contains core components required to build plugins for Emby Server.</description>
<copyright>Copyright © Emby 2013</copyright> <copyright>Copyright © Emby 2013</copyright>
<dependencies> <dependencies>
<dependency id="MediaBrowser.Common" version="3.0.702" /> <dependency id="MediaBrowser.Common" version="3.0.703" />
</dependencies> </dependencies>
</metadata> </metadata>
<files> <files>

View File

@ -1,3 +1,3 @@
using System.Reflection; using System.Reflection;
[assembly: AssemblyVersion("3.2.19.6")] [assembly: AssemblyVersion("3.2.19.7")]