mirror of
				https://github.com/jellyfin/jellyfin.git
				synced 2025-11-04 03:27:21 -05:00 
			
		
		
		
	added suggested live tv page
This commit is contained in:
		
							parent
							
								
									c8a106f485
								
							
						
					
					
						commit
						cc3e8dbbb9
					
				@ -154,6 +154,23 @@ namespace MediaBrowser.Api.LiveTv
 | 
				
			|||||||
        public string MaxEndDate { get; set; }
 | 
					        public string MaxEndDate { get; set; }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    [Route("/LiveTv/Programs/Recommended", "GET")]
 | 
				
			||||||
 | 
					    [Api(Description = "Gets available live tv epgs..")]
 | 
				
			||||||
 | 
					    public class GetRecommendedPrograms : IReturn<QueryResult<ProgramInfoDto>>
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        [ApiMember(Name = "UserId", Description = "Optional filter by user id.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET,POST")]
 | 
				
			||||||
 | 
					        public string UserId { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [ApiMember(Name = "Limit", Description = "Optional. The maximum number of records to return", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "GET")]
 | 
				
			||||||
 | 
					        public int? Limit { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [ApiMember(Name = "IsAiring", Description = "Optional. Filter by programs that are currently airing, or not.", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")]
 | 
				
			||||||
 | 
					        public bool? IsAiring { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [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; }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    [Route("/LiveTv/Programs/{Id}", "GET")]
 | 
					    [Route("/LiveTv/Programs/{Id}", "GET")]
 | 
				
			||||||
    [Api(Description = "Gets a live tv program")]
 | 
					    [Api(Description = "Gets a live tv program")]
 | 
				
			||||||
    public class GetProgram : IReturn<ProgramInfoDto>
 | 
					    public class GetProgram : IReturn<ProgramInfoDto>
 | 
				
			||||||
@ -331,6 +348,21 @@ namespace MediaBrowser.Api.LiveTv
 | 
				
			|||||||
            return ToOptimizedResult(result);
 | 
					            return ToOptimizedResult(result);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public object Get(GetRecommendedPrograms request)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var query = new RecommendedProgramQuery
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                UserId = request.UserId,
 | 
				
			||||||
 | 
					                IsAiring = request.IsAiring,
 | 
				
			||||||
 | 
					                Limit = request.Limit,
 | 
				
			||||||
 | 
					                HasAired = request.HasAired
 | 
				
			||||||
 | 
					            };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var result = _liveTvManager.GetRecommendedPrograms(query, CancellationToken.None).Result;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            return ToOptimizedResult(result);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public object Post(GetPrograms request)
 | 
					        public object Post(GetPrograms request)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            return Get(request);
 | 
					            return Get(request);
 | 
				
			||||||
 | 
				
			|||||||
@ -240,5 +240,14 @@ namespace MediaBrowser.Controller.LiveTv
 | 
				
			|||||||
        /// </summary>
 | 
					        /// </summary>
 | 
				
			||||||
        /// <returns>GuideInfo.</returns>
 | 
					        /// <returns>GuideInfo.</returns>
 | 
				
			||||||
        GuideInfo GetGuideInfo();
 | 
					        GuideInfo GetGuideInfo();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// Gets the recommended programs.
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <param name="query">The query.</param>
 | 
				
			||||||
 | 
					        /// <param name="cancellationToken">The cancellation token.</param>
 | 
				
			||||||
 | 
					        /// <returns>Task{QueryResult{ProgramInfoDto}}.</returns>
 | 
				
			||||||
 | 
					        Task<QueryResult<ProgramInfoDto>> GetRecommendedPrograms(RecommendedProgramQuery query,
 | 
				
			||||||
 | 
					            CancellationToken cancellationToken);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -1,4 +1,5 @@
 | 
				
			|||||||
using System.Collections.Generic;
 | 
					using System;
 | 
				
			||||||
 | 
					using System.Collections.Generic;
 | 
				
			||||||
using System.Threading;
 | 
					using System.Threading;
 | 
				
			||||||
using System.Threading.Tasks;
 | 
					using System.Threading.Tasks;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -135,9 +136,11 @@ namespace MediaBrowser.Controller.LiveTv
 | 
				
			|||||||
        /// Gets the programs asynchronous.
 | 
					        /// Gets the programs asynchronous.
 | 
				
			||||||
        /// </summary>
 | 
					        /// </summary>
 | 
				
			||||||
        /// <param name="channelId">The channel identifier.</param>
 | 
					        /// <param name="channelId">The channel identifier.</param>
 | 
				
			||||||
 | 
					        /// <param name="startDateUtc">The start date UTC.</param>
 | 
				
			||||||
 | 
					        /// <param name="endDateUtc">The end date UTC.</param>
 | 
				
			||||||
        /// <param name="cancellationToken">The cancellation token.</param>
 | 
					        /// <param name="cancellationToken">The cancellation token.</param>
 | 
				
			||||||
        /// <returns>Task{IEnumerable{ProgramInfo}}.</returns>
 | 
					        /// <returns>Task{IEnumerable{ProgramInfo}}.</returns>
 | 
				
			||||||
        Task<IEnumerable<ProgramInfo>> GetProgramsAsync(string channelId, CancellationToken cancellationToken);
 | 
					        Task<IEnumerable<ProgramInfo>> GetProgramsAsync(string channelId, DateTime startDateUtc, DateTime endDateUtc, CancellationToken cancellationToken);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /// <summary>
 | 
					        /// <summary>
 | 
				
			||||||
        /// Gets the recording stream.
 | 
					        /// Gets the recording stream.
 | 
				
			||||||
@ -162,5 +165,13 @@ namespace MediaBrowser.Controller.LiveTv
 | 
				
			|||||||
        /// <param name="cancellationToken">The cancellation token.</param>
 | 
					        /// <param name="cancellationToken">The cancellation token.</param>
 | 
				
			||||||
        /// <returns>Task.</returns>
 | 
					        /// <returns>Task.</returns>
 | 
				
			||||||
        Task CloseLiveStream(string id, CancellationToken cancellationToken);
 | 
					        Task CloseLiveStream(string id, CancellationToken cancellationToken);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// Records the live stream.
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <param name="id">The identifier.</param>
 | 
				
			||||||
 | 
					        /// <param name="cancellationToken">The cancellation token.</param>
 | 
				
			||||||
 | 
					        /// <returns>Task.</returns>
 | 
				
			||||||
 | 
					        Task RecordLiveStream(string id, CancellationToken cancellationToken);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,6 @@
 | 
				
			|||||||
using MediaBrowser.Controller.Entities;
 | 
					using MediaBrowser.Controller.Entities;
 | 
				
			||||||
using MediaBrowser.Model.LiveTv;
 | 
					using MediaBrowser.Model.LiveTv;
 | 
				
			||||||
 | 
					using System;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace MediaBrowser.Controller.LiveTv
 | 
					namespace MediaBrowser.Controller.LiveTv
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@ -28,6 +29,26 @@ namespace MediaBrowser.Controller.LiveTv
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public bool IsAiring
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            get
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                var now = DateTime.UtcNow;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                return now >= ProgramInfo.StartDate && now < ProgramInfo.EndDate;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public bool HasAired
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            get
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                var now = DateTime.UtcNow;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                return now >= ProgramInfo.EndDate;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public override string GetClientTypeName()
 | 
					        public override string GetClientTypeName()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            return "Program";
 | 
					            return "Program";
 | 
				
			||||||
 | 
				
			|||||||
@ -32,4 +32,31 @@ namespace MediaBrowser.Model.LiveTv
 | 
				
			|||||||
            ChannelIdList = new string[] { };
 | 
					            ChannelIdList = new string[] { };
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public class RecommendedProgramQuery
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// Gets or sets the user identifier.
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <value>The user identifier.</value>
 | 
				
			||||||
 | 
					        public string UserId { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// Gets or sets a value indicating whether this instance is airing.
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <value><c>true</c> if this instance is airing; otherwise, <c>false</c>.</value>
 | 
				
			||||||
 | 
					        public bool? IsAiring { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// Gets or sets a value indicating whether this instance has aired.
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <value><c>null</c> if [has aired] contains no value, <c>true</c> if [has aired]; otherwise, <c>false</c>.</value>
 | 
				
			||||||
 | 
					        public bool? HasAired { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// The maximum number of items to return
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <value>The limit.</value>
 | 
				
			||||||
 | 
					        public int? Limit { get; set; }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -32,6 +32,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv
 | 
				
			|||||||
        private readonly ILogger _logger;
 | 
					        private readonly ILogger _logger;
 | 
				
			||||||
        private readonly IItemRepository _itemRepo;
 | 
					        private readonly IItemRepository _itemRepo;
 | 
				
			||||||
        private readonly IUserManager _userManager;
 | 
					        private readonly IUserManager _userManager;
 | 
				
			||||||
 | 
					        private readonly IUserDataManager _userDataManager;
 | 
				
			||||||
        private readonly ILibraryManager _libraryManager;
 | 
					        private readonly ILibraryManager _libraryManager;
 | 
				
			||||||
        private readonly IMediaEncoder _mediaEncoder;
 | 
					        private readonly IMediaEncoder _mediaEncoder;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -54,6 +55,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv
 | 
				
			|||||||
            _userManager = userManager;
 | 
					            _userManager = userManager;
 | 
				
			||||||
            _libraryManager = libraryManager;
 | 
					            _libraryManager = libraryManager;
 | 
				
			||||||
            _mediaEncoder = mediaEncoder;
 | 
					            _mediaEncoder = mediaEncoder;
 | 
				
			||||||
 | 
					            _userDataManager = userDataManager;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            _tvDtoService = new LiveTvDtoService(dtoService, userDataManager, imageProcessor, logger, _itemRepo);
 | 
					            _tvDtoService = new LiveTvDtoService(dtoService, userDataManager, imageProcessor, logger, _itemRepo);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@ -428,7 +430,6 @@ namespace MediaBrowser.Server.Implementations.LiveTv
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var returnArray = programs
 | 
					            var returnArray = programs
 | 
				
			||||||
                .OrderBy(i => i.ProgramInfo.StartDate)
 | 
					 | 
				
			||||||
                .Select(i =>
 | 
					                .Select(i =>
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    var channel = GetChannel(i);
 | 
					                    var channel = GetChannel(i);
 | 
				
			||||||
@ -450,6 +451,138 @@ namespace MediaBrowser.Server.Implementations.LiveTv
 | 
				
			|||||||
            return result;
 | 
					            return result;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public async Task<QueryResult<ProgramInfoDto>> GetRecommendedPrograms(RecommendedProgramQuery query, CancellationToken cancellationToken)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            IEnumerable<LiveTvProgram> programs = _programs.Values;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var user = _userManager.GetUserById(new Guid(query.UserId));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // Avoid implicitly captured closure
 | 
				
			||||||
 | 
					            var currentUser = user;
 | 
				
			||||||
 | 
					            programs = programs.Where(i => i.IsParentalAllowed(currentUser));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (query.IsAiring.HasValue)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                var val = query.IsAiring.Value;
 | 
				
			||||||
 | 
					                programs = programs.Where(i => i.IsAiring == val);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (query.HasAired.HasValue)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                var val = query.HasAired.Value;
 | 
				
			||||||
 | 
					                programs = programs.Where(i => i.HasAired == val);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var serviceName = ActiveService.Name;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var programList = programs.ToList();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var genres = programList.SelectMany(i => i.Genres)
 | 
				
			||||||
 | 
					                .Distinct(StringComparer.OrdinalIgnoreCase)
 | 
				
			||||||
 | 
					                .Select(i => _libraryManager.GetGenre(i))
 | 
				
			||||||
 | 
					                .ToDictionary(i => i.Name, StringComparer.OrdinalIgnoreCase);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            programs = programList.OrderByDescending(i => GetRecommendationScore(i.ProgramInfo, user.Id, serviceName, genres))
 | 
				
			||||||
 | 
					                .ThenBy(i => i.ProgramInfo.StartDate);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (query.Limit.HasValue)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                programs = programs.Take(query.Limit.Value)
 | 
				
			||||||
 | 
					                    .OrderBy(i => i.ProgramInfo.StartDate);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var returnArray = programs
 | 
				
			||||||
 | 
					                .Select(i =>
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    var channel = GetChannel(i);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    var channelName = channel == null ? null : channel.ChannelInfo.Name;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    return _tvDtoService.GetProgramInfoDto(i, channelName, user);
 | 
				
			||||||
 | 
					                })
 | 
				
			||||||
 | 
					                .ToArray();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            await AddRecordingInfo(returnArray, cancellationToken).ConfigureAwait(false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var result = new QueryResult<ProgramInfoDto>
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                Items = returnArray,
 | 
				
			||||||
 | 
					                TotalRecordCount = returnArray.Length
 | 
				
			||||||
 | 
					            };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            return result;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        private int GetRecommendationScore(ProgramInfo program, Guid userId, string serviceName, Dictionary<string, Genre> genres)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var score = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (program.IsLive)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                score++;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (program.IsSeries && !program.IsRepeat)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                score++;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var internalChannelId = _tvDtoService.GetInternalChannelId(serviceName, program.ChannelId);
 | 
				
			||||||
 | 
					            var channel = GetInternalChannel(internalChannelId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var channelUserdata = _userDataManager.GetUserData(userId, channel.GetUserDataKey());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if ((channelUserdata.Likes ?? false))
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                score += 2;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else if (!(channelUserdata.Likes ?? true))
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                score -= 2;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (channelUserdata.IsFavorite)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                score += 3;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            score += GetGenreScore(program.Genres, userId, genres);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            return score;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        private int GetGenreScore(IEnumerable<string> programGenres, Guid userId, Dictionary<string, Genre> genres)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            return programGenres.Select(i =>
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                var score = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                Genre genre;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (genres.TryGetValue(i, out genre))
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    var genreUserdata = _userDataManager.GetUserData(userId, genre.GetUserDataKey());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    if ((genreUserdata.Likes ?? false))
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        score++;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    else if (!(genreUserdata.Likes ?? true))
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        score--;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    if (genreUserdata.IsFavorite)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        score += 2;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                return score;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            }).Sum();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        private async Task AddRecordingInfo(IEnumerable<ProgramInfoDto> programs, CancellationToken cancellationToken)
 | 
					        private async Task AddRecordingInfo(IEnumerable<ProgramInfoDto> programs, CancellationToken cancellationToken)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            var timers = await ActiveService.GetTimersAsync(cancellationToken).ConfigureAwait(false);
 | 
					            var timers = await ActiveService.GetTimersAsync(cancellationToken).ConfigureAwait(false);
 | 
				
			||||||
@ -533,7 +666,10 @@ namespace MediaBrowser.Server.Implementations.LiveTv
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
                try
 | 
					                try
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    var channelPrograms = await service.GetProgramsAsync(currentChannel.ChannelInfo.Id, cancellationToken).ConfigureAwait(false);
 | 
					                    var start = DateTime.UtcNow;
 | 
				
			||||||
 | 
					                    var end = start.AddDays(3);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    var channelPrograms = await service.GetProgramsAsync(currentChannel.ChannelInfo.Id, start, end, cancellationToken).ConfigureAwait(false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    var programTasks = channelPrograms.Select(program => GetProgram(program, currentChannel.ChannelInfo.ChannelType, service.Name, cancellationToken));
 | 
					                    var programTasks = channelPrograms.Select(program => GetProgram(program, currentChannel.ChannelInfo.ChannelType, service.Name, cancellationToken));
 | 
				
			||||||
                    var programEntities = await Task.WhenAll(programTasks).ConfigureAwait(false);
 | 
					                    var programEntities = await Task.WhenAll(programTasks).ConfigureAwait(false);
 | 
				
			||||||
 | 
				
			|||||||
@ -438,7 +438,7 @@ MediaBrowser.ApiClient = function ($, navigator, JSON, WebSocket, setTimeout, wi
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            options = options || {};
 | 
					            options = options || {};
 | 
				
			||||||
            
 | 
					            
 | 
				
			||||||
            if (options.channelIds) {
 | 
					            if (options.channelIds && options.channelIds.length > 1800) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                return self.ajax({
 | 
					                return self.ajax({
 | 
				
			||||||
                    type: "POST",
 | 
					                    type: "POST",
 | 
				
			||||||
@ -458,6 +458,17 @@ MediaBrowser.ApiClient = function ($, navigator, JSON, WebSocket, setTimeout, wi
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.getLiveTvRecommendedPrograms = function (options) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            options = options || {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            return self.ajax({
 | 
				
			||||||
 | 
					                type: "GET",
 | 
				
			||||||
 | 
					                url: self.getUrl("LiveTv/Programs/Recommended", options),
 | 
				
			||||||
 | 
					                dataType: "json"
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.getLiveTvRecordings = function (options) {
 | 
					        self.getLiveTvRecordings = function (options) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var url = self.getUrl("LiveTv/Recordings", options || {});
 | 
					            var url = self.getUrl("LiveTv/Recordings", options || {});
 | 
				
			||||||
 | 
				
			|||||||
@ -1,4 +1,4 @@
 | 
				
			|||||||
<?xml version="1.0" encoding="utf-8"?>
 | 
					<?xml version="1.0" encoding="utf-8"?>
 | 
				
			||||||
<packages>
 | 
					<packages>
 | 
				
			||||||
  <package id="MediaBrowser.ApiClient.Javascript" version="3.0.224" targetFramework="net45" />
 | 
					  <package id="MediaBrowser.ApiClient.Javascript" version="3.0.226" targetFramework="net45" />
 | 
				
			||||||
</packages>
 | 
					</packages>
 | 
				
			||||||
@ -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.Internal</id>
 | 
					        <id>MediaBrowser.Common.Internal</id>
 | 
				
			||||||
        <version>3.0.298</version>
 | 
					        <version>3.0.299</version>
 | 
				
			||||||
        <title>MediaBrowser.Common.Internal</title>
 | 
					        <title>MediaBrowser.Common.Internal</title>
 | 
				
			||||||
        <authors>Luke</authors>
 | 
					        <authors>Luke</authors>
 | 
				
			||||||
        <owners>ebr,Luke,scottisafool</owners>
 | 
					        <owners>ebr,Luke,scottisafool</owners>
 | 
				
			||||||
@ -12,7 +12,7 @@
 | 
				
			|||||||
        <description>Contains common components shared by Media Browser Theater and Media Browser Server. Not intended for plugin developer consumption.</description>
 | 
					        <description>Contains common components shared by Media Browser Theater and Media Browser Server. Not intended for plugin developer consumption.</description>
 | 
				
			||||||
        <copyright>Copyright © Media Browser 2013</copyright>
 | 
					        <copyright>Copyright © Media Browser 2013</copyright>
 | 
				
			||||||
        <dependencies>
 | 
					        <dependencies>
 | 
				
			||||||
            <dependency id="MediaBrowser.Common" version="3.0.298" />
 | 
					            <dependency id="MediaBrowser.Common" version="3.0.299" />
 | 
				
			||||||
            <dependency id="NLog" version="2.1.0" />
 | 
					            <dependency id="NLog" version="2.1.0" />
 | 
				
			||||||
            <dependency id="SimpleInjector" version="2.4.0" />
 | 
					            <dependency id="SimpleInjector" version="2.4.0" />
 | 
				
			||||||
            <dependency id="sharpcompress" version="0.10.2" />
 | 
					            <dependency id="sharpcompress" version="0.10.2" />
 | 
				
			||||||
 | 
				
			|||||||
@ -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.298</version>
 | 
					        <version>3.0.299</version>
 | 
				
			||||||
        <title>MediaBrowser.Common</title>
 | 
					        <title>MediaBrowser.Common</title>
 | 
				
			||||||
        <authors>Media Browser Team</authors>
 | 
					        <authors>Media Browser Team</authors>
 | 
				
			||||||
        <owners>ebr,Luke,scottisafool</owners>
 | 
					        <owners>ebr,Luke,scottisafool</owners>
 | 
				
			||||||
 | 
				
			|||||||
@ -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.298</version>
 | 
					        <version>3.0.299</version>
 | 
				
			||||||
        <title>Media Browser.Server.Core</title>
 | 
					        <title>Media Browser.Server.Core</title>
 | 
				
			||||||
        <authors>Media Browser Team</authors>
 | 
					        <authors>Media Browser 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 Media Browser Server.</description>
 | 
					        <description>Contains core components required to build plugins for Media Browser Server.</description>
 | 
				
			||||||
        <copyright>Copyright © Media Browser 2013</copyright>
 | 
					        <copyright>Copyright © Media Browser 2013</copyright>
 | 
				
			||||||
        <dependencies>
 | 
					        <dependencies>
 | 
				
			||||||
            <dependency id="MediaBrowser.Common" version="3.0.298" />
 | 
					            <dependency id="MediaBrowser.Common" version="3.0.299" />
 | 
				
			||||||
        </dependencies>
 | 
					        </dependencies>
 | 
				
			||||||
    </metadata>
 | 
					    </metadata>
 | 
				
			||||||
    <files>
 | 
					    <files>
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user