grab image sizes at discovery time

This commit is contained in:
Luke Pulverenti 2014-10-12 11:18:26 -04:00
parent 47915df62c
commit 69b83082c8
11 changed files with 112 additions and 105 deletions

View File

@ -312,36 +312,6 @@ namespace MediaBrowser.Api.Images
} }
} }
var video = item as Video;
if (video != null)
{
var index = 0;
foreach (var chapter in _itemRepo.GetChapters(video.Id))
{
if (!string.IsNullOrEmpty(chapter.ImagePath))
{
var image = chapter.ImagePath;
var info = GetImageInfo(item, new ItemImageInfo
{
Path = image,
Type = ImageType.Chapter,
DateModified = _fileSystem.GetLastWriteTimeUtc(image)
}, index);
if (info != null)
{
list.Add(info);
}
}
index++;
}
}
return list; return list;
} }
@ -351,8 +321,6 @@ namespace MediaBrowser.Api.Images
{ {
var fileInfo = new FileInfo(info.Path); var fileInfo = new FileInfo(info.Path);
var size = _imageProcessor.GetImageSize(info.Path);
return new ImageInfo return new ImageInfo
{ {
Path = info.Path, Path = info.Path,
@ -360,8 +328,8 @@ namespace MediaBrowser.Api.Images
ImageType = info.Type, ImageType = info.Type,
ImageTag = _imageProcessor.GetImageCacheTag(item, info), ImageTag = _imageProcessor.GetImageCacheTag(item, info),
Size = fileInfo.Length, Size = fileInfo.Length,
Width = Convert.ToInt32(size.Width), Width = info.Width ?? 0,
Height = Convert.ToInt32(size.Height) Height = info.Height ?? 0
}; };
} }
catch (Exception ex) catch (Exception ex)

View File

@ -47,10 +47,9 @@ namespace MediaBrowser.Controller.Dto
/// <summary> /// <summary>
/// Gets the chapter information dto. /// Gets the chapter information dto.
/// </summary> /// </summary>
/// <param name="chapterInfo">The chapter information.</param>
/// <param name="item">The item.</param> /// <param name="item">The item.</param>
/// <returns>ChapterInfoDto.</returns> /// <returns>ChapterInfoDto.</returns>
ChapterInfoDto GetChapterInfoDto(ChapterInfo chapterInfo, BaseItem item); List<ChapterInfoDto> GetChapterInfoDtos(BaseItem item);
/// <summary> /// <summary>
/// Gets the user item data dto. /// Gets the user item data dto.

View File

@ -3,6 +3,7 @@ using MediaBrowser.Common.IO;
using MediaBrowser.Controller.Channels; using MediaBrowser.Controller.Channels;
using MediaBrowser.Controller.Collections; using MediaBrowser.Controller.Collections;
using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Drawing;
using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.LiveTv; using MediaBrowser.Controller.LiveTv;
using MediaBrowser.Controller.Localization; using MediaBrowser.Controller.Localization;
@ -253,6 +254,7 @@ namespace MediaBrowser.Controller.Entities
public static ILiveTvManager LiveTvManager { get; set; } public static ILiveTvManager LiveTvManager { get; set; }
public static IChannelManager ChannelManager { get; set; } public static IChannelManager ChannelManager { get; set; }
public static ICollectionManager CollectionManager { get; set; } public static ICollectionManager CollectionManager { get; set; }
public static IImageProcessor ImageProcessor { get; set; }
/// <summary> /// <summary>
/// Returns a <see cref="System.String" /> that represents this instance. /// Returns a <see cref="System.String" /> that represents this instance.
@ -1455,17 +1457,16 @@ namespace MediaBrowser.Controller.Entities
if (image == null) if (image == null)
{ {
ImageInfos.Add(new ItemImageInfo ImageInfos.Add(GetImageInfo(file, type));
{
Path = file.FullName,
Type = type,
DateModified = FileSystem.GetLastWriteTimeUtc(file)
});
} }
else else
{ {
var imageInfo = GetImageInfo(file, type);
image.Path = file.FullName; image.Path = file.FullName;
image.DateModified = FileSystem.GetLastWriteTimeUtc(file); image.DateModified = imageInfo.DateModified;
image.Width = imageInfo.Width;
image.Height = imageInfo.Height;
} }
} }
@ -1574,7 +1575,9 @@ namespace MediaBrowser.Controller.Entities
{ {
Path = path, Path = path,
DateModified = FileSystem.GetLastWriteTimeUtc(path), DateModified = FileSystem.GetLastWriteTimeUtc(path),
Type = imageType Type = imageType,
Width = chapter.ImageWidth,
Height = chapter.ImageHeight
}; };
} }
@ -1631,16 +1634,35 @@ namespace MediaBrowser.Controller.Entities
} }
} }
ImageInfos.AddRange(newImageList.Select(i => new ItemImageInfo ImageInfos.AddRange(newImageList.Select(i => GetImageInfo(i, imageType)));
{
Path = i.FullName,
Type = imageType,
DateModified = FileSystem.GetLastWriteTimeUtc(i)
}));
return newImageList.Count > 0; return newImageList.Count > 0;
} }
private ItemImageInfo GetImageInfo(FileSystemInfo file, ImageType type)
{
var info = new ItemImageInfo
{
Path = file.FullName,
Type = type,
DateModified = FileSystem.GetLastWriteTimeUtc(file)
};
try
{
var size = ImageProcessor.GetImageSize(info.Path);
info.Width = Convert.ToInt32(size.Width);
info.Height = Convert.ToInt32(size.Height);
}
catch
{
}
return info;
}
/// <summary> /// <summary>
/// Gets the file system path to delete when the item is to be deleted /// Gets the file system path to delete when the item is to be deleted
/// </summary> /// </summary>

View File

@ -10,5 +10,9 @@ namespace MediaBrowser.Controller.Entities
public ImageType Type { get; set; } public ImageType Type { get; set; }
public DateTime DateModified { get; set; } public DateTime DateModified { get; set; }
public int? Width { get; set; }
public int? Height { get; set; }
} }
} }

View File

@ -869,19 +869,22 @@ namespace MediaBrowser.Dlna.Didl
} }
int? width = null; int? width = imageInfo.Width;
int? height = null; int? height = imageInfo.Height;
try if (!height.HasValue && !width.HasValue)
{ {
var size = _imageProcessor.GetImageSize(imageInfo.Path, imageInfo.DateModified); try
{
var size = _imageProcessor.GetImageSize(imageInfo.Path, imageInfo.DateModified);
width = Convert.ToInt32(size.Width); width = Convert.ToInt32(size.Width);
height = Convert.ToInt32(size.Height); height = Convert.ToInt32(size.Height);
} }
catch catch
{ {
}
} }
return new ImageDownloadInfo return new ImageDownloadInfo

View File

@ -23,5 +23,17 @@ namespace MediaBrowser.Model.Entities
/// </summary> /// </summary>
/// <value>The image path.</value> /// <value>The image path.</value>
public string ImagePath { get; set; } public string ImagePath { get; set; }
/// <summary>
/// Gets or sets the height of the image.
/// </summary>
/// <value>The height of the image.</value>
public int? ImageHeight { get; set; }
/// <summary>
/// Gets or sets the width of the image.
/// </summary>
/// <value>The width of the image.</value>
public int? ImageWidth { get; set; }
} }
} }

View File

@ -1,5 +1,4 @@
using MediaBrowser.Controller.Drawing; using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Providers; using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Entities; using MediaBrowser.Model.Entities;
@ -18,12 +17,10 @@ namespace MediaBrowser.Providers.Photos
public class PhotoProvider : ICustomMetadataProvider<Photo>, IHasItemChangeMonitor public class PhotoProvider : ICustomMetadataProvider<Photo>, IHasItemChangeMonitor
{ {
private readonly ILogger _logger; private readonly ILogger _logger;
private readonly IImageProcessor _imageProcessor;
public PhotoProvider(ILogger logger, IImageProcessor imageProcessor) public PhotoProvider(ILogger logger)
{ {
_logger = logger; _logger = logger;
_imageProcessor = imageProcessor;
} }
public Task<ItemUpdateType> FetchAsync(Photo item, MetadataRefreshOptions options, CancellationToken cancellationToken) public Task<ItemUpdateType> FetchAsync(Photo item, MetadataRefreshOptions options, CancellationToken cancellationToken)
@ -142,9 +139,10 @@ namespace MediaBrowser.Providers.Photos
_logger.ErrorException("Image Provider - Error reading image tag for {0}", e, item.Path); _logger.ErrorException("Image Provider - Error reading image tag for {0}", e, item.Path);
} }
var size = _imageProcessor.GetImageSize(item.Path); var imageInfo = item.GetImageInfo(ImageType.Primary, 0);
item.Height = Convert.ToInt32(size.Height);
item.Width = Convert.ToInt32(size.Width); item.Height = imageInfo.Height;
item.Width = imageInfo.Width;
const ItemUpdateType result = ItemUpdateType.ImageUpdate | ItemUpdateType.MetadataImport; const ItemUpdateType result = ItemUpdateType.ImageUpdate | ItemUpdateType.MetadataImport;
return Task.FromResult(result); return Task.FromResult(result);

View File

@ -93,10 +93,10 @@ namespace MediaBrowser.Providers.TV
var hasBadData = HasInvalidContent(group); var hasBadData = HasInvalidContent(group);
var anySeasonsRemoved = await RemoveObsoleteOrMissingSeasons(group, episodeLookup, hasBadData) var anySeasonsRemoved = await RemoveObsoleteOrMissingSeasons(group, episodeLookup, false)
.ConfigureAwait(false); .ConfigureAwait(false);
var anyEpisodesRemoved = await RemoveObsoleteOrMissingEpisodes(group, episodeLookup, hasBadData) var anyEpisodesRemoved = await RemoveObsoleteOrMissingEpisodes(group, episodeLookup, false)
.ConfigureAwait(false); .ConfigureAwait(false);
var hasNewEpisodes = false; var hasNewEpisodes = false;
@ -204,12 +204,6 @@ namespace MediaBrowser.Providers.TV
IEnumerable<Tuple<int, int>> episodeLookup, IEnumerable<Tuple<int, int>> episodeLookup,
CancellationToken cancellationToken) CancellationToken cancellationToken)
{ {
// Be conservative here to avoid creating missing episodes for ones they already have
if (!seriesHasBadData)
{
return false;
}
var existingEpisodes = (from s in series var existingEpisodes = (from s in series
let seasonOffset = TvdbSeriesProvider.GetSeriesOffset(s.ProviderIds) ?? ((s.AnimeSeriesIndex ?? 1) - 1) let seasonOffset = TvdbSeriesProvider.GetSeriesOffset(s.ProviderIds) ?? ((s.AnimeSeriesIndex ?? 1) - 1)
from c in s.RecursiveChildren.OfType<Episode>() from c in s.RecursiveChildren.OfType<Episode>()

View File

@ -372,7 +372,7 @@ namespace MediaBrowser.Server.Implementations.Dto
dto.Longitude = item.Longitude; dto.Longitude = item.Longitude;
dto.Altitude = item.Altitude; dto.Altitude = item.Altitude;
dto.IsoSpeedRating = item.IsoSpeedRating; dto.IsoSpeedRating = item.IsoSpeedRating;
var album = item.Album; var album = item.Album;
if (album != null) if (album != null)
@ -659,7 +659,7 @@ namespace MediaBrowser.Server.Implementations.Dto
/// <param name="chapterInfo">The chapter info.</param> /// <param name="chapterInfo">The chapter info.</param>
/// <param name="item">The item.</param> /// <param name="item">The item.</param>
/// <returns>ChapterInfoDto.</returns> /// <returns>ChapterInfoDto.</returns>
public ChapterInfoDto GetChapterInfoDto(ChapterInfo chapterInfo, BaseItem item) private ChapterInfoDto GetChapterInfoDto(ChapterInfo chapterInfo, BaseItem item)
{ {
var dto = new ChapterInfoDto var dto = new ChapterInfoDto
{ {
@ -680,6 +680,13 @@ namespace MediaBrowser.Server.Implementations.Dto
return dto; return dto;
} }
public List<ChapterInfoDto> GetChapterInfoDtos(BaseItem item)
{
return _itemRepo.GetChapters(item.Id)
.Select(c => GetChapterInfoDto(c, item))
.ToList();
}
/// <summary> /// <summary>
/// Sets simple property values on a DTOBaseItem /// Sets simple property values on a DTOBaseItem
/// </summary> /// </summary>
@ -1055,20 +1062,7 @@ namespace MediaBrowser.Server.Implementations.Dto
if (fields.Contains(ItemFields.Chapters)) if (fields.Contains(ItemFields.Chapters))
{ {
List<ChapterInfoDto> chapters; dto.Chapters = GetChapterInfoDtos(item);
if (dto.MediaSources != null && dto.MediaSources.Count > 0)
{
chapters = _itemRepo.GetChapters(item.Id).Select(c => GetChapterInfoDto(c, item)).ToList();
}
else
{
chapters = _itemRepo.GetChapters(video.Id)
.Select(c => GetChapterInfoDto(c, item))
.ToList();
}
dto.Chapters = chapters;
} }
} }
@ -1435,21 +1429,35 @@ namespace MediaBrowser.Server.Implementations.Dto
// See if we can avoid a file system lookup by looking for the file in ResolveArgs // See if we can avoid a file system lookup by looking for the file in ResolveArgs
var dateModified = imageInfo.DateModified; var dateModified = imageInfo.DateModified;
double? width = imageInfo.Width;
double? height = imageInfo.Height;
ImageSize size; ImageSize size;
try if (!width.HasValue || !height.HasValue)
{ {
size = _imageProcessor.GetImageSize(path, dateModified); try
{
size = _imageProcessor.GetImageSize(path, dateModified);
}
catch (FileNotFoundException)
{
_logger.Error("Image file does not exist: {0}", path);
return;
}
catch (Exception ex)
{
_logger.ErrorException("Failed to determine primary image aspect ratio for {0}", ex, path);
return;
}
} }
catch (FileNotFoundException) else
{ {
_logger.Error("Image file does not exist: {0}", path); size = new ImageSize
return; {
} Height = height.Value,
catch (Exception ex) Width = width.Value
{ };
_logger.ErrorException("Failed to determine primary image aspect ratio for {0}", ex, path);
return;
} }
dto.OriginalPrimaryImageAspectRatio = size.Width / size.Height; dto.OriginalPrimaryImageAspectRatio = size.Width / size.Height;

View File

@ -1224,6 +1224,6 @@
"MessageNoDevicesSupportCameraUpload": "You currently don't have any devices that support camera upload.", "MessageNoDevicesSupportCameraUpload": "You currently don't have any devices that support camera upload.",
"LabelCameraUploadPath": "Camera upload path:", "LabelCameraUploadPath": "Camera upload path:",
"LabelCameraUploadPathHelp": "Select a custom upload path, if desired. If unspecified a default folder will be used.", "LabelCameraUploadPathHelp": "Select a custom upload path, if desired. If unspecified a default folder will be used.",
"LabelCreateCameraUploadSubfolder": "Create a sub-folder for each device", "LabelCreateCameraUploadSubfolder": "Create a subfolder for each device",
"LabelCreateCameraUploadSubfolderHelp": "Specific folders can be assigned to devices by clicking on the device on the Devices page." "LabelCreateCameraUploadSubfolderHelp": "Specific folders can be assigned to a device by clicking on it from the Devices page."
} }

View File

@ -26,7 +26,6 @@ using System;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using System.Collections.Generic; using System.Collections.Generic;
using System.Globalization; using System.Globalization;
using System.IO;
using System.Linq; using System.Linq;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -1594,7 +1593,7 @@ namespace MediaBrowser.Server.Implementations.Session
{ {
info.ChapterImagesItemId = chapterOwner.Id.ToString("N"); info.ChapterImagesItemId = chapterOwner.Id.ToString("N");
info.Chapters = _itemRepo.GetChapters(chapterOwner.Id).Select(i => _dtoService.GetChapterInfoDto(i, chapterOwner)).ToList(); info.Chapters = _dtoService.GetChapterInfoDtos(chapterOwner).ToList();
} }
if (!string.IsNullOrWhiteSpace(mediaSourceId)) if (!string.IsNullOrWhiteSpace(mediaSourceId))