improve live tv images

This commit is contained in:
Luke Pulverenti 2017-06-11 16:40:25 -04:00
parent e56ef95283
commit 65e8cf0726
9 changed files with 151 additions and 47 deletions

View File

@ -176,7 +176,9 @@ namespace Emby.Server.Implementations.Channels
var internalResult = await GetChannelsInternal(query, cancellationToken).ConfigureAwait(false); var internalResult = await GetChannelsInternal(query, cancellationToken).ConfigureAwait(false);
var dtoOptions = new DtoOptions(); var dtoOptions = new DtoOptions()
{
};
var returnItems = (await _dtoService.GetBaseItemDtos(internalResult.Items, dtoOptions, user).ConfigureAwait(false)) var returnItems = (await _dtoService.GetBaseItemDtos(internalResult.Items, dtoOptions, user).ConfigureAwait(false))
.ToArray(); .ToArray();
@ -558,7 +560,10 @@ namespace Emby.Server.Implementations.Channels
totalRecordCount = items.Length; totalRecordCount = items.Length;
} }
var dtoOptions = new DtoOptions(); var dtoOptions = new DtoOptions()
{
Fields = query.Fields.ToList()
};
var returnItems = (await _dtoService.GetBaseItemDtos(items, dtoOptions, user).ConfigureAwait(false)) var returnItems = (await _dtoService.GetBaseItemDtos(items, dtoOptions, user).ConfigureAwait(false))
.ToArray(); .ToArray();
@ -825,7 +830,10 @@ namespace Emby.Server.Implementations.Channels
RefreshIfNeeded(internalResult.Items); RefreshIfNeeded(internalResult.Items);
var dtoOptions = new DtoOptions(); var dtoOptions = new DtoOptions()
{
Fields = query.Fields.ToList()
};
var returnItems = (await _dtoService.GetBaseItemDtos(internalResult.Items, dtoOptions, user).ConfigureAwait(false)) var returnItems = (await _dtoService.GetBaseItemDtos(internalResult.Items, dtoOptions, user).ConfigureAwait(false))
.ToArray(); .ToArray();
@ -974,7 +982,10 @@ namespace Emby.Server.Implementations.Channels
var internalResult = await GetChannelItemsInternal(query, new Progress<double>(), cancellationToken).ConfigureAwait(false); var internalResult = await GetChannelItemsInternal(query, new Progress<double>(), cancellationToken).ConfigureAwait(false);
var dtoOptions = new DtoOptions(); var dtoOptions = new DtoOptions()
{
Fields = query.Fields.ToList()
};
var returnItems = (await _dtoService.GetBaseItemDtos(internalResult.Items, dtoOptions, user).ConfigureAwait(false)) var returnItems = (await _dtoService.GetBaseItemDtos(internalResult.Items, dtoOptions, user).ConfigureAwait(false))
.ToArray(); .ToArray();

View File

@ -1079,7 +1079,10 @@ namespace Emby.Server.Implementations.Dto
if (audio != null) if (audio != null)
{ {
dto.Album = audio.Album; dto.Album = audio.Album;
dto.ExtraType = audio.ExtraType; if (audio.ExtraType.HasValue)
{
dto.ExtraType = audio.ExtraType.Value.ToString();
}
var albumParent = audio.AlbumEntity; var albumParent = audio.AlbumEntity;
@ -1234,7 +1237,10 @@ namespace Emby.Server.Implementations.Dto
dto.Chapters = GetChapterInfoDtos(item); dto.Chapters = GetChapterInfoDtos(item);
} }
dto.ExtraType = video.ExtraType; if (video.ExtraType.HasValue)
{
dto.ExtraType = video.ExtraType.Value.ToString();
}
} }
if (fields.Contains(ItemFields.MediaStreams)) if (fields.Contains(ItemFields.MediaStreams))
@ -1390,7 +1396,7 @@ namespace Emby.Server.Implementations.Dto
} }
} }
if (fields.Contains(ItemFields.SeriesPrimaryImage)) //if (fields.Contains(ItemFields.SeriesPrimaryImage))
{ {
series = series ?? season.Series; series = series ?? season.Series;
if (series != null) if (series != null)
@ -1581,7 +1587,7 @@ namespace Emby.Server.Implementations.Dto
{ {
var imageInfo = item.GetImageInfo(ImageType.Primary, 0); var imageInfo = item.GetImageInfo(ImageType.Primary, 0);
if (imageInfo == null || !imageInfo.IsLocalFile) if (imageInfo == null)
{ {
return null; return null;
} }
@ -1605,6 +1611,11 @@ namespace Emby.Server.Implementations.Dto
} }
else else
{ {
if (!imageInfo.IsLocalFile)
{
return null;
}
try try
{ {
size = _imageProcessor.GetImageSize(imageInfo); size = _imageProcessor.GetImageSize(imageInfo);

View File

@ -136,6 +136,9 @@ namespace Emby.Server.Implementations.LiveTv.Listings
var requestBody = "[\"" + string.Join("\", \"", programsID) + "\"]"; var requestBody = "[\"" + string.Join("\", \"", programsID) + "\"]";
httpOptions.RequestContent = requestBody; httpOptions.RequestContent = requestBody;
double wideAspect = 1.77777778;
var primaryImageCategory = "Logo";
using (var innerResponse = await Post(httpOptions, true, info).ConfigureAwait(false)) using (var innerResponse = await Post(httpOptions, true, info).ConfigureAwait(false))
{ {
StreamReader innerReader = new StreamReader(innerResponse.Content); StreamReader innerReader = new StreamReader(innerResponse.Content);
@ -167,13 +170,22 @@ namespace Emby.Server.Implementations.LiveTv.Listings
{ {
var programEntry = programDict[schedule.programID]; var programEntry = programDict[schedule.programID];
var allImages = (images[imageIndex].data ?? new List<ScheduleDirect.ImageData>()).OrderByDescending(GetSizeOrder).ToList(); var allImages = (images[imageIndex].data ?? new List<ScheduleDirect.ImageData>()).ToList();
var imagesWithText = allImages.Where(i => string.Equals(i.text, "yes", StringComparison.OrdinalIgnoreCase)).ToList(); var imagesWithText = allImages.Where(i => string.Equals(i.text, "yes", StringComparison.OrdinalIgnoreCase)).ToList();
programEntry.primaryImage = GetProgramImage(ApiUrl, imagesWithText, "Logo", true, 600) ?? double desiredAspect = IsMovie(programEntry) ? 0.666666667 : wideAspect;
GetProgramImage(ApiUrl, allImages, "Logo", true, 600);
programEntry.primaryImage = GetProgramImage(ApiUrl, imagesWithText, null, true, desiredAspect) ??
GetProgramImage(ApiUrl, allImages, null, true, desiredAspect);
programEntry.thumbImage = GetProgramImage(ApiUrl, imagesWithText, null, true, wideAspect);
// Don't supply the same image twice
if (string.Equals(programEntry.primaryImage, programEntry.thumbImage, StringComparison.Ordinal))
{
programEntry.thumbImage = null;
}
//programEntry.thumbImage = GetProgramImage(ApiUrl, data, "Iconic", false);
//programEntry.bannerImage = GetProgramImage(ApiUrl, data, "Banner", false) ?? //programEntry.bannerImage = GetProgramImage(ApiUrl, data, "Banner", false) ??
// GetProgramImage(ApiUrl, data, "Banner-L1", false) ?? // GetProgramImage(ApiUrl, data, "Banner-L1", false) ??
// GetProgramImage(ApiUrl, data, "Banner-LO", false) ?? // GetProgramImage(ApiUrl, data, "Banner-LO", false) ??
@ -220,9 +232,14 @@ namespace Emby.Server.Implementations.LiveTv.Listings
return channelNumber; return channelNumber;
} }
private bool IsMovie(ScheduleDirect.ProgramDetails programInfo)
{
var showType = programInfo.showType ?? string.Empty;
return showType.IndexOf("movie", StringComparison.OrdinalIgnoreCase) != -1 || showType.IndexOf("film", StringComparison.OrdinalIgnoreCase) != -1;
}
private ProgramInfo GetProgram(string channelId, ScheduleDirect.Program programInfo, ScheduleDirect.ProgramDetails details) private ProgramInfo GetProgram(string channelId, ScheduleDirect.Program programInfo, ScheduleDirect.ProgramDetails details)
{ {
//_logger.Debug("Show type is: " + (details.showType ?? "No ShowType"));
DateTime startAt = GetDate(programInfo.airDateTime); DateTime startAt = GetDate(programInfo.airDateTime);
DateTime endAt = startAt.AddSeconds(programInfo.duration); DateTime endAt = startAt.AddSeconds(programInfo.duration);
ProgramAudio audioType = ProgramAudio.Stereo; ProgramAudio audioType = ProgramAudio.Stereo;
@ -276,9 +293,10 @@ namespace Emby.Server.Implementations.LiveTv.Listings
IsRepeat = repeat, IsRepeat = repeat,
IsSeries = showType.IndexOf("series", StringComparison.OrdinalIgnoreCase) != -1, IsSeries = showType.IndexOf("series", StringComparison.OrdinalIgnoreCase) != -1,
ImageUrl = details.primaryImage, ImageUrl = details.primaryImage,
ThumbImageUrl = details.thumbImage,
IsKids = string.Equals(details.audience, "children", StringComparison.OrdinalIgnoreCase), IsKids = string.Equals(details.audience, "children", StringComparison.OrdinalIgnoreCase),
IsSports = showType.IndexOf("sports", StringComparison.OrdinalIgnoreCase) != -1, IsSports = showType.IndexOf("sports", StringComparison.OrdinalIgnoreCase) != -1,
IsMovie = showType.IndexOf("movie", StringComparison.OrdinalIgnoreCase) != -1 || showType.IndexOf("film", StringComparison.OrdinalIgnoreCase) != -1, IsMovie = IsMovie(details),
Etag = programInfo.md5 Etag = programInfo.md5
}; };
@ -378,36 +396,48 @@ namespace Emby.Server.Implementations.LiveTv.Listings
return date; return date;
} }
private string GetProgramImage(string apiUrl, List<ScheduleDirect.ImageData> images, string category, bool returnDefaultImage, int desiredWidth) private string GetProgramImage(string apiUrl, List<ScheduleDirect.ImageData> images, string category, bool returnDefaultImage, double desiredAspect)
{ {
string url = null; string url = null;
var matches = images var matches = images;
.Where(i => string.Equals(i.category, category, StringComparison.OrdinalIgnoreCase))
.ToList();
if (matches.Count == 0) if (!string.IsNullOrWhiteSpace(category))
{ {
if (!returnDefaultImage) matches = images
.Where(i => string.Equals(i.category, category, StringComparison.OrdinalIgnoreCase))
.ToList();
if (matches.Count == 0)
{ {
return null; if (!returnDefaultImage)
{
return null;
}
matches = images;
} }
matches = images;
} }
var match = matches.FirstOrDefault(i => matches = matches
{ .OrderBy(i => Math.Abs(desiredAspect - GetApsectRatio(i)))
if (!string.IsNullOrWhiteSpace(i.width)) .ThenByDescending(GetSizeOrder)
{ .ToList();
int value;
if (int.TryParse(i.width, out value))
{
return value <= desiredWidth;
}
}
return false; //var match = matches.FirstOrDefault(i =>
}); //{
// if (!string.IsNullOrWhiteSpace(i.width))
// {
// int value;
// if (int.TryParse(i.width, out value))
// {
// return value <= desiredWidth;
// }
// }
// return false;
//});
var match = matches.FirstOrDefault();
if (match == null) if (match == null)
{ {
@ -444,6 +474,31 @@ namespace Emby.Server.Implementations.LiveTv.Listings
return url; return url;
} }
private double GetApsectRatio(ScheduleDirect.ImageData i)
{
int width = 0;
int height = 0;
if (!string.IsNullOrWhiteSpace(i.width))
{
int.TryParse(i.width, out width);
}
if (!string.IsNullOrWhiteSpace(i.height))
{
int.TryParse(i.height, out height);
}
if (height == 0 || width == 0)
{
return 0;
}
double result = width;
result /= height;
return result;
}
private async Task<List<ScheduleDirect.ShowImages>> GetImageForPrograms( private async Task<List<ScheduleDirect.ShowImages>> GetImageForPrograms(
ListingsProviderInfo info, ListingsProviderInfo info,
List<string> programIds, List<string> programIds,

View File

@ -694,6 +694,20 @@ namespace Emby.Server.Implementations.LiveTv
} }
} }
if (!item.HasImage(ImageType.Thumb))
{
if (!string.IsNullOrWhiteSpace(info.ThumbImageUrl))
{
item.SetImage(new ItemImageInfo
{
Path = info.ImageUrl,
Type = ImageType.Thumb,
IsPlaceholder = true
}, 0);
}
}
var isUpdated = false; var isUpdated = false;
if (isNew) if (isNew)
{ {

View File

@ -27,6 +27,7 @@ using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.IO; using MediaBrowser.Controller.IO;
using MediaBrowser.Model.Globalization; using MediaBrowser.Model.Globalization;
using MediaBrowser.Model.Services; using MediaBrowser.Model.Services;
using MediaBrowser.Common.Extensions;
namespace MediaBrowser.Api.Library namespace MediaBrowser.Api.Library
{ {
@ -830,6 +831,11 @@ namespace MediaBrowser.Api.Library
: (Folder)_libraryManager.RootFolder) : (Folder)_libraryManager.RootFolder)
: _libraryManager.GetItemById(request.Id); : _libraryManager.GetItemById(request.Id);
if (item == null)
{
throw new ResourceNotFoundException("Item not found.");
}
while (item.ThemeSongIds.Count == 0 && request.InheritFromParent && item.GetParent() != null) while (item.ThemeSongIds.Count == 0 && request.InheritFromParent && item.GetParent() != null)
{ {
item = item.GetParent(); item = item.GetParent();
@ -874,6 +880,11 @@ namespace MediaBrowser.Api.Library
: (Folder)_libraryManager.RootFolder) : (Folder)_libraryManager.RootFolder)
: _libraryManager.GetItemById(request.Id); : _libraryManager.GetItemById(request.Id);
if (item == null)
{
throw new ResourceNotFoundException("Item not found.");
}
while (item.ThemeVideoIds.Count == 0 && request.InheritFromParent && item.GetParent() != null) while (item.ThemeVideoIds.Count == 0 && request.InheritFromParent && item.GetParent() != null)
{ {
item = item.GetParent(); item = item.GetParent();

View File

@ -107,6 +107,8 @@ namespace MediaBrowser.Controller.LiveTv
/// <value>The image URL.</value> /// <value>The image URL.</value>
public string ImageUrl { get; set; } public string ImageUrl { get; set; }
public string ThumbImageUrl { get; set; }
public string LogoImageUrl { get; set; } public string LogoImageUrl { get; set; }
/// <summary> /// <summary>

View File

@ -52,15 +52,22 @@ namespace MediaBrowser.LocalMetadata.Parsers
{ {
case "CollectionItem": case "CollectionItem":
{ {
using (var subReader = reader.ReadSubtree()) if (!reader.IsEmptyElement)
{ {
var child = GetLinkedChild(subReader); using (var subReader = reader.ReadSubtree())
if (child != null)
{ {
list.Add(child); var child = GetLinkedChild(subReader);
if (child != null)
{
list.Add(child);
}
} }
} }
else
{
reader.Read();
}
break; break;
} }

View File

@ -64,7 +64,7 @@ namespace MediaBrowser.Model.Dto
public DateTime? DateCreated { get; set; } public DateTime? DateCreated { get; set; }
public DateTime? DateLastMediaAdded { get; set; } public DateTime? DateLastMediaAdded { get; set; }
public ExtraType? ExtraType { get; set; } public string ExtraType { get; set; }
public int? AirsBeforeSeasonNumber { get; set; } public int? AirsBeforeSeasonNumber { get; set; }
public int? AirsAfterSeasonNumber { get; set; } public int? AirsAfterSeasonNumber { get; set; }

View File

@ -62,13 +62,6 @@ namespace MediaBrowser.Providers.Movies
public bool Supports(IHasImages item) public bool Supports(IHasImages item)
{ {
// Supports images for tv movies
var tvProgram = item as LiveTvProgram;
if (tvProgram != null && tvProgram.IsMovie)
{
return true;
}
return item is Movie || item is BoxSet || item is MusicVideo; return item is Movie || item is BoxSet || item is MusicVideo;
} }