Skip to content

Commit

Permalink
Merge pull request #3343 from MediaBrowser/dev
Browse files Browse the repository at this point in the history
update live tv queries
  • Loading branch information
LukePulverenti authored Jun 27, 2018
2 parents 7029366 + 3c81b0c commit ef1a508
Show file tree
Hide file tree
Showing 62 changed files with 242 additions and 174 deletions.
32 changes: 25 additions & 7 deletions Emby.Server.Implementations/Data/SqliteItemRepository.cs
Original file line number Diff line number Diff line change
Expand Up @@ -433,8 +433,8 @@ var createMediaStreamsTableCommand
"IsDefault",
"IsForced",
"IsExternal",
"Width",
"Height",
"Width",
"AverageFrameRate",
"RealFrameRate",
"Level",
Expand Down Expand Up @@ -3824,21 +3824,37 @@ private List<string> GetWhereClauses(InternalItemsQuery query, IStatement statem
statement.TryBind("@ParentIndexNumberNotEquals", query.ParentIndexNumberNotEquals.Value);
}
}
if (query.MinEndDate.HasValue)

var minEndDate = query.MinEndDate;
var maxEndDate = query.MaxEndDate;

if (query.HasAired.HasValue)
{
if (query.HasAired.Value)
{
maxEndDate = DateTime.UtcNow;
}
else
{
minEndDate = DateTime.UtcNow;
}
}

if (minEndDate.HasValue)
{
whereClauses.Add("EndDate>=@MinEndDate");
if (statement != null)
{
statement.TryBind("@MinEndDate", query.MinEndDate.Value);
statement.TryBind("@MinEndDate", minEndDate.Value);
}
}

if (query.MaxEndDate.HasValue)
if (maxEndDate.HasValue)
{
whereClauses.Add("EndDate<=@MaxEndDate");
if (statement != null)
{
statement.TryBind("@MaxEndDate", query.MaxEndDate.Value);
statement.TryBind("@MaxEndDate", maxEndDate.Value);
}
}

Expand Down Expand Up @@ -6080,8 +6096,10 @@ private void InsertMediaStreams(byte[] idBlob, List<MediaStream> streams, IDatab
statement.TryBind("@IsForced" + index, stream.IsForced);
statement.TryBind("@IsExternal" + index, stream.IsExternal);

statement.TryBind("@Width" + index, stream.Width);
statement.TryBind("@Height" + index, stream.Height);
// Yes these are backwards due to a mistake
statement.TryBind("@Width" + index, stream.Height);
statement.TryBind("@Height" + index, stream.Width);

statement.TryBind("@AverageFrameRate" + index, stream.AverageFrameRate);
statement.TryBind("@RealFrameRate" + index, stream.RealFrameRate);
statement.TryBind("@Level" + index, stream.Level);
Expand Down
9 changes: 8 additions & 1 deletion Emby.Server.Implementations/Library/ResolverHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,14 @@ private static void SetDateCreated(BaseItem item, IFileSystem fileSystem, FileSy
// directoryService.getFile may return null
if (info != null)
{
item.DateCreated = fileSystem.GetCreationTimeUtc(info);
var dateCreated = fileSystem.GetCreationTimeUtc(info);

if (dateCreated.Equals(DateTime.MinValue))
{
dateCreated = DateTime.UtcNow;
}

item.DateCreated = dateCreated;
}
}
else
Expand Down
119 changes: 31 additions & 88 deletions Emby.Server.Implementations/LiveTv/LiveTvManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@
using System.Threading.Tasks;
using MediaBrowser.Model.IO;
using MediaBrowser.Common.Events;

using MediaBrowser.Common.Security;
using MediaBrowser.Controller.Entities.Movies;
using MediaBrowser.Controller.Entities.TV;
Expand Down Expand Up @@ -782,16 +781,30 @@ public async Task<BaseItemDto> GetProgram(string id, CancellationToken cancellat
return dto;
}

public async Task<QueryResult<BaseItemDto>> GetPrograms(ProgramQuery query, DtoOptions options, CancellationToken cancellationToken)
public async Task<QueryResult<BaseItemDto>> GetPrograms(InternalItemsQuery query, DtoOptions options, CancellationToken cancellationToken)
{
var user = query.UserId.Equals(Guid.Empty) ? null : _userManager.GetUserById(query.UserId);
var user = query.User;

var topFolder = GetInternalLiveTvFolder(cancellationToken);

if (query.OrderBy.Length == 0)
{
// Unless something else was specified, order by start date to take advantage of a specialized index
query.OrderBy = new ValueTuple<string, SortOrder>[] { new ValueTuple<string, SortOrder>(ItemSortBy.StartDate, SortOrder.Ascending) };
if (query.IsAiring ?? false)
{
// Unless something else was specified, order by start date to take advantage of a specialized index
query.OrderBy = new ValueTuple<string, SortOrder>[]
{
new ValueTuple<string, SortOrder>(ItemSortBy.StartDate, SortOrder.Ascending)
};
}
else
{
// Unless something else was specified, order by start date to take advantage of a specialized index
query.OrderBy = new ValueTuple<string, SortOrder>[]
{
new ValueTuple<string, SortOrder>(ItemSortBy.StartDate, SortOrder.Ascending)
};
}
}

RemoveFields(options);
Expand All @@ -817,7 +830,9 @@ public async Task<QueryResult<BaseItemDto>> GetPrograms(ProgramQuery query, DtoO
EnableTotalRecordCount = query.EnableTotalRecordCount,
TopParentIds = new[] { topFolder.Id },
Name = query.Name,
DtoOptions = options
DtoOptions = options,
HasAired = query.HasAired,
IsAiring = query.IsAiring
};

if (!string.IsNullOrWhiteSpace(query.SeriesTimerId))
Expand All @@ -841,18 +856,6 @@ public async Task<QueryResult<BaseItemDto>> GetPrograms(ProgramQuery query, DtoO
}
}

if (query.HasAired.HasValue)
{
if (query.HasAired.Value)
{
internalQuery.MaxEndDate = DateTime.UtcNow;
}
else
{
internalQuery.MinEndDate = DateTime.UtcNow;
}
}

var queryResult = _libraryManager.QueryItems(internalQuery);

var returnArray = _dtoService.GetBaseItemDtos(queryResult.Items, options, user);
Expand All @@ -866,16 +869,17 @@ public async Task<QueryResult<BaseItemDto>> GetPrograms(ProgramQuery query, DtoO
return result;
}

public QueryResult<BaseItem> GetRecommendedProgramsInternal(RecommendedProgramQuery query, DtoOptions options, CancellationToken cancellationToken)
public QueryResult<BaseItem> GetRecommendedProgramsInternal(InternalItemsQuery query, DtoOptions options, CancellationToken cancellationToken)
{
var user = _userManager.GetUserById(query.UserId);
var user = query.User;

var topFolder = GetInternalLiveTvFolder(cancellationToken);

var internalQuery = new InternalItemsQuery(user)
{
IncludeItemTypes = new[] { typeof(LiveTvProgram).Name },
IsAiring = query.IsAiring,
HasAired = query.HasAired,
IsNews = query.IsNews,
IsMovie = query.IsMovie,
IsSeries = query.IsSeries,
Expand All @@ -893,18 +897,6 @@ public QueryResult<BaseItem> GetRecommendedProgramsInternal(RecommendedProgramQu
internalQuery.Limit = Math.Max(query.Limit.Value * 4, 200);
}

if (query.HasAired.HasValue)
{
if (query.HasAired.Value)
{
internalQuery.MaxEndDate = DateTime.UtcNow;
}
else
{
internalQuery.MinEndDate = DateTime.UtcNow;
}
}

var programList = _libraryManager.QueryItems(internalQuery).Items;
var totalCount = programList.Length;

Expand Down Expand Up @@ -932,13 +924,18 @@ public QueryResult<BaseItem> GetRecommendedProgramsInternal(RecommendedProgramQu
return result;
}

public QueryResult<BaseItemDto> GetRecommendedPrograms(RecommendedProgramQuery query, DtoOptions options, CancellationToken cancellationToken)
public QueryResult<BaseItemDto> GetRecommendedPrograms(InternalItemsQuery query, DtoOptions options, CancellationToken cancellationToken)
{
if (!(query.IsAiring ?? false))
{
return GetPrograms(query, options, cancellationToken).Result;
}

RemoveFields(options);

var internalResult = GetRecommendedProgramsInternal(query, options, cancellationToken);

var user = _userManager.GetUserById(query.UserId);
var user = query.User;

var returnArray = _dtoService.GetBaseItemDtos(internalResult.Items, options, user);

Expand Down Expand Up @@ -1472,60 +1469,6 @@ private QueryResult<BaseItem> GetEmbyRecordings(RecordingQuery query, DtoOptions
return result;
}

public QueryResult<BaseItemDto> GetRecordingSeries(RecordingQuery query, DtoOptions options, CancellationToken cancellationToken)
{
var user = query.UserId.Equals(Guid.Empty) ? null : _userManager.GetUserById(query.UserId);
if (user != null && !IsLiveTvEnabled(user))
{
return new QueryResult<BaseItemDto>();
}

if (user == null || (query.IsInProgress ?? false))
{
return new QueryResult<BaseItemDto>();
}

var folders = EmbyTV.EmbyTV.Current.GetRecordingFolders()
.SelectMany(i => i.Locations)
.Distinct(StringComparer.OrdinalIgnoreCase)
.Select(i => _libraryManager.FindByPath(i, true))
.Where(i => i != null)
.Where(i => i.IsVisibleStandalone(user))
.ToList();

if (folders.Count == 0)
{
return new QueryResult<BaseItemDto>();
}

var includeItemTypes = new List<string>();
var excludeItemTypes = new List<string>();

includeItemTypes.Add(typeof(Series).Name);

RemoveFields(options);

var internalResult = _libraryManager.GetItemsResult(new InternalItemsQuery(user)
{
Recursive = true,
AncestorIds = folders.Select(i => i.Id).ToArray(folders.Count),
Limit = query.Limit,
OrderBy = new[] { new ValueTuple<string, SortOrder>(ItemSortBy.DateCreated, SortOrder.Descending) },
EnableTotalRecordCount = query.EnableTotalRecordCount,
IncludeItemTypes = includeItemTypes.ToArray(includeItemTypes.Count),
ExcludeItemTypes = excludeItemTypes.ToArray(excludeItemTypes.Count),
DtoOptions = options
});

var returnArray = _dtoService.GetBaseItemDtos(internalResult.Items, options, user);

return new QueryResult<BaseItemDto>
{
Items = returnArray,
TotalRecordCount = internalResult.TotalRecordCount
};
}

public Task AddInfoToProgramDto(List<Tuple<BaseItem, BaseItemDto>> tuples, ItemFields[] fields, User user = null)
{
var programTuples = new List<Tuple<BaseItemDto, string, string>>();
Expand Down
13 changes: 9 additions & 4 deletions MediaBrowser.Api/LiveTv/LiveTvService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
using MediaBrowser.Model.Extensions;
using MediaBrowser.Model.Cryptography;
using System.Text;
using MediaBrowser.Controller.Entities;

namespace MediaBrowser.Api.LiveTv
{
Expand Down Expand Up @@ -346,6 +347,7 @@ public class GetPrograms : IReturn<QueryResult<BaseItemDto>>, IHasDtoOptions

[ApiMember(Name = "HasAired", Description = "Optional. Filter by programs that have completed airing, or not.", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")]
public bool? HasAired { get; set; }
public bool? IsAiring { get; set; }

[ApiMember(Name = "MaxStartDate", Description = "Optional. The maximum premiere date. Format = ISO", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET,POST")]
public string MaxStartDate { get; set; }
Expand Down Expand Up @@ -990,11 +992,13 @@ public object Get(GetChannel request)

public async Task<object> Get(GetPrograms request)
{
var query = new ProgramQuery
var user = request.UserId.Equals(Guid.Empty) ? null : _userManager.GetUserById(request.UserId);

var query = new InternalItemsQuery(user)
{
ChannelIds = ApiEntryPoint.Split(request.ChannelIds, ',', true).Select(i => new Guid(i)).ToArray(),
UserId = request.UserId,
HasAired = request.HasAired,
IsAiring = request.IsAiring,
EnableTotalRecordCount = request.EnableTotalRecordCount
};

Expand Down Expand Up @@ -1048,9 +1052,10 @@ public async Task<object> Get(GetPrograms request)

public object Get(GetRecommendedPrograms request)
{
var query = new RecommendedProgramQuery
var user = _userManager.GetUserById(request.UserId);

var query = new InternalItemsQuery(user)
{
UserId = request.UserId,
IsAiring = request.IsAiring,
Limit = request.Limit,
HasAired = request.HasAired,
Expand Down
Loading

0 comments on commit ef1a508

Please sign in to comment.