From cd1abf72f6d59fae66b9351f4740ca31c55d908a Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 21 Nov 2015 22:48:57 -0500 Subject: [PATCH 1/4] update default images --- .../Folders/DefaultImageProvider.cs | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/MediaBrowser.Providers/Folders/DefaultImageProvider.cs b/MediaBrowser.Providers/Folders/DefaultImageProvider.cs index 270867f907..1f36c09761 100644 --- a/MediaBrowser.Providers/Folders/DefaultImageProvider.cs +++ b/MediaBrowser.Providers/Folders/DefaultImageProvider.cs @@ -51,7 +51,7 @@ namespace MediaBrowser.Providers.Folders if (!string.IsNullOrWhiteSpace(url)) { - list.AddRange(new List{ + list.AddRange(new List{ new RemoteImageInfo { ProviderName = Name, @@ -77,15 +77,15 @@ namespace MediaBrowser.Providers.Folders if (string.Equals(viewType, CollectionType.Books, StringComparison.OrdinalIgnoreCase)) { - //return urlPrefix + "books.png"; + return urlPrefix + "books.jpg"; } if (string.Equals(viewType, CollectionType.Games, StringComparison.OrdinalIgnoreCase)) { - //return urlPrefix + "games.png"; + return urlPrefix + "games.jpg"; } if (string.Equals(viewType, CollectionType.Music, StringComparison.OrdinalIgnoreCase)) { - //return urlPrefix + "music.png"; + return urlPrefix + "music.jpg"; } if (string.Equals(viewType, CollectionType.Photos, StringComparison.OrdinalIgnoreCase)) { @@ -93,11 +93,11 @@ namespace MediaBrowser.Providers.Folders } if (string.Equals(viewType, CollectionType.TvShows, StringComparison.OrdinalIgnoreCase)) { - //return urlPrefix + "tv.png"; + //return urlPrefix + "tv.jpg"; } if (string.Equals(viewType, CollectionType.Channels, StringComparison.OrdinalIgnoreCase)) { - return urlPrefix + "generic.png"; + return urlPrefix + "channels.jpg"; } if (string.Equals(viewType, CollectionType.LiveTv, StringComparison.OrdinalIgnoreCase)) { @@ -105,27 +105,27 @@ namespace MediaBrowser.Providers.Folders } if (string.Equals(viewType, CollectionType.Movies, StringComparison.OrdinalIgnoreCase)) { - //return urlPrefix + "movies.png"; + //return urlPrefix + "movies.jpg"; } if (string.Equals(viewType, CollectionType.Playlists, StringComparison.OrdinalIgnoreCase)) { - //return urlPrefix + "playlists.png"; + return urlPrefix + "playlists.jpg"; } if (string.Equals(viewType, CollectionType.HomeVideos, StringComparison.OrdinalIgnoreCase)) { - //return urlPrefix + "homevideos.png"; + return urlPrefix + "homevideos.jpg"; } if (string.Equals(viewType, CollectionType.MusicVideos, StringComparison.OrdinalIgnoreCase)) { - //return urlPrefix + "musicvideos.png"; + return urlPrefix + "musicvideos.jpg"; } if (string.Equals(viewType, CollectionType.BoxSets, StringComparison.OrdinalIgnoreCase)) { - //return urlPrefix + "generic.png"; + return urlPrefix + "collections.jpg"; } if (string.IsNullOrWhiteSpace(viewType)) { - //return urlPrefix + "generic.png"; + return urlPrefix + "generic.jpg"; } return null; From 4a24490752e16a700316bab1b3d1e95e1bc8a86a Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 21 Nov 2015 22:49:12 -0500 Subject: [PATCH 2/4] fix MarkPlayed --- MediaBrowser.Controller/Entities/Folder.cs | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs index 05965e1b5a..9ea1b64c0a 100644 --- a/MediaBrowser.Controller/Entities/Folder.cs +++ b/MediaBrowser.Controller/Entities/Folder.cs @@ -1178,13 +1178,20 @@ namespace MediaBrowser.Controller.Entities DateTime? datePlayed, bool resetPosition) { - var itemsResult = await GetItems(new InternalItemsQuery + var query = new InternalItemsQuery { User = user, Recursive = true, - IsFolder = false + IsFolder = false, + IsUnaired = false + }; - }).ConfigureAwait(false); + if (!user.Configuration.DisplayMissingEpisodes) + { + query.IsMissing = false; + } + + var itemsResult = await GetItems(query).ConfigureAwait(false); // Sweep through recursively and update status var tasks = itemsResult.Items.Select(c => c.MarkPlayed(user, datePlayed, resetPosition)); From 9e568bf99a7a37a4c997299c80a65ca6c3f223c9 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sun, 22 Nov 2015 13:18:53 -0500 Subject: [PATCH 3/4] update dlna profile header checks --- MediaBrowser.Dlna/DlnaManager.cs | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/MediaBrowser.Dlna/DlnaManager.cs b/MediaBrowser.Dlna/DlnaManager.cs index be49c0f893..2a688fa54d 100644 --- a/MediaBrowser.Dlna/DlnaManager.cs +++ b/MediaBrowser.Dlna/DlnaManager.cs @@ -251,7 +251,8 @@ namespace MediaBrowser.Dlna case HeaderMatchType.Substring: return value.IndexOf(header.Value, StringComparison.OrdinalIgnoreCase) != -1; case HeaderMatchType.Regex: - return Regex.IsMatch(value, header.Value, RegexOptions.IgnoreCase); + // Reports of IgnoreCase not working on linux so try it a couple different ways. + return Regex.IsMatch(value, header.Value, RegexOptions.IgnoreCase) || Regex.IsMatch(value.ToUpper(), header.Value.ToUpper(), RegexOptions.IgnoreCase); default: throw new ArgumentException("Unrecognized HeaderMatchType"); } @@ -280,7 +281,7 @@ namespace MediaBrowser.Dlna { try { - return _fileSystem.GetFiles(path) + return _fileSystem.GetFiles(path) .Where(i => string.Equals(i.Extension, ".xml", StringComparison.OrdinalIgnoreCase)) .Select(i => ParseProfileXmlFile(i.FullName, type)) .Where(i => i != null) @@ -318,7 +319,7 @@ namespace MediaBrowser.Dlna throw new ArgumentNullException("id"); } - var info = GetProfileInfosInternal().First(i => string.Equals(i.Info.Id, id)); + var info = GetProfileInfosInternal().First(i => string.Equals(i.Info.Id, id, StringComparison.OrdinalIgnoreCase)); return ParseProfileXmlFile(info.Path, info.Info.Type); } @@ -342,7 +343,7 @@ namespace MediaBrowser.Dlna { try { - return _fileSystem.GetFiles(path) + return _fileSystem.GetFiles(path) .Where(i => string.Equals(i.Extension, ".xml", StringComparison.OrdinalIgnoreCase)) .Select(i => new InternalProfileInfo { @@ -384,7 +385,7 @@ namespace MediaBrowser.Dlna if (!fileInfo.Exists || fileInfo.Length != stream.Length) { - _fileSystem.CreateDirectory(systemProfilesPath); + _fileSystem.CreateDirectory(systemProfilesPath); using (var fileStream = _fileSystem.GetFileStream(path, FileMode.Create, FileAccess.Write, FileShare.Read)) { @@ -395,12 +396,12 @@ namespace MediaBrowser.Dlna } // Not necessary, but just to make it easy to find - _fileSystem.CreateDirectory(UserProfilesPath); + _fileSystem.CreateDirectory(UserProfilesPath); } public void DeleteProfile(string id) { - var info = GetProfileInfosInternal().First(i => string.Equals(id, i.Info.Id)); + var info = GetProfileInfosInternal().First(i => string.Equals(id, i.Info.Id, StringComparison.OrdinalIgnoreCase)); if (info.Info.Type == DeviceProfileType.System) { @@ -448,7 +449,7 @@ namespace MediaBrowser.Dlna { _fileSystem.DeleteFile(current.Path); } - + _xmlSerializer.SerializeToFile(profile, path); } From d6952fe66e3f14aa41899604d5046819bdd00867 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sun, 22 Nov 2015 18:06:11 -0500 Subject: [PATCH 4/4] update live tv manager --- .../LiveTv/LiveTvManager.cs | 174 +++++++++--------- 1 file changed, 90 insertions(+), 84 deletions(-) diff --git a/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs b/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs index 7a0397a2d3..e09e06bd4b 100644 --- a/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs +++ b/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs @@ -534,7 +534,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv } } - private async Task GetChannel(ChannelInfo channelInfo, string serviceName, CancellationToken cancellationToken) + private async Task GetChannel(ChannelInfo channelInfo, string serviceName, Guid parentFolderId, CancellationToken cancellationToken) { var isNew = false; @@ -564,8 +564,6 @@ namespace MediaBrowser.Server.Implementations.LiveTv item.ServiceName = serviceName; item.Number = channelInfo.Number; - var replaceImages = new List(); - //if (!string.Equals(item.ProviderImageUrl, channelInfo.ImageUrl, StringComparison.OrdinalIgnoreCase)) //{ // isNew = true; @@ -577,13 +575,16 @@ namespace MediaBrowser.Server.Implementations.LiveTv // replaceImages.Add(ImageType.Primary); //} - if (!string.IsNullOrWhiteSpace(channelInfo.ImagePath)) - { - item.SetImagePath(ImageType.Primary, channelInfo.ImagePath); - } - else if (!string.IsNullOrWhiteSpace(channelInfo.ImageUrl)) + if (!item.HasImage(ImageType.Primary)) { - item.SetImagePath(ImageType.Primary, channelInfo.ImageUrl); + if (!string.IsNullOrWhiteSpace(channelInfo.ImagePath)) + { + item.SetImagePath(ImageType.Primary, channelInfo.ImagePath); + } + else if (!string.IsNullOrWhiteSpace(channelInfo.ImageUrl)) + { + item.SetImagePath(ImageType.Primary, channelInfo.ImageUrl); + } } if (string.IsNullOrEmpty(item.Name)) @@ -593,20 +594,20 @@ namespace MediaBrowser.Server.Implementations.LiveTv await item.RefreshMetadata(new MetadataRefreshOptions(_fileSystem) { - ForceSave = isNew, - ReplaceImages = replaceImages.Distinct().ToList() + ForceSave = isNew }, cancellationToken); return item; } - private async Task GetProgram(ProgramInfo info, string channelId, ChannelType channelType, string serviceName, CancellationToken cancellationToken) + private async Task GetProgram(ProgramInfo info, LiveTvChannel channel, ChannelType channelType, string serviceName, CancellationToken cancellationToken) { var id = _tvDtoService.GetInternalProgramId(serviceName, info.Id); var item = _libraryManager.GetItemById(id) as LiveTvProgram; var isNew = false; + var forceUpdate = false; if (item == null) { @@ -621,11 +622,15 @@ namespace MediaBrowser.Server.Implementations.LiveTv }; } - item.ChannelType = channelType; + //item.ChannelType = channelType; + if (!string.Equals(item.ServiceName, serviceName, StringComparison.Ordinal)) + { + forceUpdate = true; + } item.ServiceName = serviceName; item.Audio = info.Audio; - item.ChannelId = channelId; + item.ChannelId = channel.Id.ToString("N"); item.CommunityRating = item.CommunityRating ?? info.CommunityRating; item.EndDate = info.EndDate; item.EpisodeTitle = info.EpisodeTitle; @@ -674,12 +679,12 @@ namespace MediaBrowser.Server.Implementations.LiveTv }, 0); } } - + if (isNew) { await _libraryManager.CreateItem(item, cancellationToken).ConfigureAwait(false); } - else if (string.IsNullOrWhiteSpace(info.Etag)) + else if (forceUpdate || string.IsNullOrWhiteSpace(info.Etag)) { await _libraryManager.UpdateItem(item, ItemUpdateType.MetadataImport, cancellationToken).ConfigureAwait(false); } @@ -700,7 +705,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv return item; } - private async Task CreateRecordingRecord(RecordingInfo info, string serviceName, CancellationToken cancellationToken) + private async Task CreateRecordingRecord(RecordingInfo info, string serviceName, Guid parentFolderId, CancellationToken cancellationToken) { var isNew = false; @@ -769,13 +774,16 @@ namespace MediaBrowser.Server.Implementations.LiveTv } recording.IsSeries = info.IsSeries; - if (!string.IsNullOrWhiteSpace(info.ImagePath)) - { - item.SetImagePath(ImageType.Primary, info.ImagePath); - } - else if (!string.IsNullOrWhiteSpace(info.ImageUrl)) + if (!item.HasImage(ImageType.Primary)) { - item.SetImagePath(ImageType.Primary, info.ImageUrl); + if (!string.IsNullOrWhiteSpace(info.ImagePath)) + { + item.SetImagePath(ImageType.Primary, info.ImagePath); + } + else if (!string.IsNullOrWhiteSpace(info.ImageUrl)) + { + item.SetImagePath(ImageType.Primary, info.ImageUrl); + } } var statusChanged = info.Status != recording.Status; @@ -831,13 +839,18 @@ namespace MediaBrowser.Server.Implementations.LiveTv var dto = _dtoService.GetBaseItemDto(program, new DtoOptions(), user); - await AddRecordingInfo(new[] { dto }, cancellationToken).ConfigureAwait(false); + var list = new List>(); + list.Add(new Tuple(dto, program.ServiceName, program.ExternalId)); + + await AddRecordingInfo(list, cancellationToken).ConfigureAwait(false); return dto; } public async Task> GetPrograms(ProgramQuery query, DtoOptions options, CancellationToken cancellationToken) { + var user = string.IsNullOrEmpty(query.UserId) ? null : _userManager.GetUserById(query.UserId); + var internalQuery = new InternalItemsQuery { IncludeItemTypes = new[] { typeof(LiveTvProgram).Name }, @@ -856,7 +869,6 @@ namespace MediaBrowser.Server.Implementations.LiveTv SortOrder = query.SortOrder ?? SortOrder.Ascending }; - var user = string.IsNullOrEmpty(query.UserId) ? null : _userManager.GetUserById(query.UserId); if (user != null) { internalQuery.MaxParentalRating = user.Policy.MaxParentalRating; @@ -882,14 +894,15 @@ namespace MediaBrowser.Server.Implementations.LiveTv var queryResult = _libraryManager.QueryItems(internalQuery); var returnArray = queryResult.Items - .Select(i => _dtoService.GetBaseItemDto(i, options, user)) + .Cast() + .Select(i => new Tuple(_dtoService.GetBaseItemDto(i, options, user), i.ServiceName, i.ExternalId)) .ToArray(); await AddRecordingInfo(returnArray, cancellationToken).ConfigureAwait(false); var result = new QueryResult { - Items = returnArray, + Items = returnArray.Select(i => i.Item1).ToArray(), TotalRecordCount = queryResult.TotalRecordCount }; @@ -898,6 +911,8 @@ namespace MediaBrowser.Server.Implementations.LiveTv public async Task> GetRecommendedProgramsInternal(RecommendedProgramQuery query, CancellationToken cancellationToken) { + var user = _userManager.GetUserById(query.UserId); + var internalQuery = new InternalItemsQuery { IncludeItemTypes = new[] { typeof(LiveTvProgram).Name }, @@ -907,6 +922,16 @@ namespace MediaBrowser.Server.Implementations.LiveTv IsKids = query.IsKids }; + if (user != null) + { + internalQuery.MaxParentalRating = user.Policy.MaxParentalRating; + + if (user.Policy.BlockUnratedItems.Contains(UnratedItem.LiveTvProgram)) + { + internalQuery.HasParentalRating = true; + } + } + if (query.HasAired.HasValue) { if (query.HasAired.Value) @@ -919,17 +944,6 @@ namespace MediaBrowser.Server.Implementations.LiveTv } } - var user = _userManager.GetUserById(query.UserId); - if (user != null) - { - internalQuery.MaxParentalRating = user.Policy.MaxParentalRating; - - if (user.Policy.BlockUnratedItems.Contains(UnratedItem.LiveTvProgram)) - { - internalQuery.HasParentalRating = true; - } - } - IEnumerable programs = _libraryManager.QueryItems(internalQuery).Items.Cast(); var programList = programs.ToList(); @@ -970,14 +984,14 @@ namespace MediaBrowser.Server.Implementations.LiveTv var user = _userManager.GetUserById(query.UserId); var returnArray = internalResult.Items - .Select(i => _dtoService.GetBaseItemDto(i, options, user)) + .Select(i => new Tuple(_dtoService.GetBaseItemDto(i, options, user), i.ServiceName, i.ExternalId)) .ToArray(); await AddRecordingInfo(returnArray, cancellationToken).ConfigureAwait(false); var result = new QueryResult { - Items = returnArray, + Items = returnArray.Select(i => i.Item1).ToArray(), TotalRecordCount = internalResult.TotalRecordCount }; @@ -1053,40 +1067,46 @@ namespace MediaBrowser.Server.Implementations.LiveTv }).Sum(); } - private async Task AddRecordingInfo(IEnumerable programs, CancellationToken cancellationToken) + private async Task AddRecordingInfo(IEnumerable> programs, CancellationToken cancellationToken) { var timers = new Dictionary>(); - foreach (var program in programs) + foreach (var programTuple in programs) { - var internalProgram = GetInternalProgram(program.Id); + var program = programTuple.Item1; + var serviceName = programTuple.Item2; + var externalProgramId = programTuple.Item3; + + if (string.IsNullOrWhiteSpace(serviceName)) + { + continue; + } List timerList; - if (!timers.TryGetValue(internalProgram.ServiceName, out timerList)) + if (!timers.TryGetValue(serviceName, out timerList)) { try { - var tempTimers = await GetService(internalProgram.ServiceName).GetTimersAsync(cancellationToken).ConfigureAwait(false); - timers[internalProgram.ServiceName] = timerList = tempTimers.ToList(); + var tempTimers = await GetService(serviceName).GetTimersAsync(cancellationToken).ConfigureAwait(false); + timers[serviceName] = timerList = tempTimers.ToList(); } catch (Exception ex) { _logger.ErrorException("Error getting timer infos", ex); - timers[internalProgram.ServiceName] = timerList = new List(); + timers[serviceName] = timerList = new List(); } } - - var timer = timerList.FirstOrDefault(i => string.Equals(i.ProgramId, internalProgram.ExternalId, StringComparison.OrdinalIgnoreCase)); + var timer = timerList.FirstOrDefault(i => string.Equals(i.ProgramId, externalProgramId, StringComparison.OrdinalIgnoreCase)); if (timer != null) { - program.TimerId = _tvDtoService.GetInternalTimerId(internalProgram.ServiceName, timer.Id) + program.TimerId = _tvDtoService.GetInternalTimerId(serviceName, timer.Id) .ToString("N"); if (!string.IsNullOrEmpty(timer.SeriesTimerId)) { - program.SeriesTimerId = _tvDtoService.GetInternalSeriesTimerId(internalProgram.ServiceName, timer.SeriesTimerId) + program.SeriesTimerId = _tvDtoService.GetInternalSeriesTimerId(serviceName, timer.SeriesTimerId) .ToString("N"); } } @@ -1168,6 +1188,8 @@ namespace MediaBrowser.Server.Implementations.LiveTv var list = new List(); var numComplete = 0; + var parentFolder = await GetInternalLiveTvFolder(cancellationToken).ConfigureAwait(false); + var parentFolderId = parentFolder.Id; foreach (var channelInfo in allChannelsList) { @@ -1175,7 +1197,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv try { - var item = await GetChannel(channelInfo.Item2, channelInfo.Item1, cancellationToken).ConfigureAwait(false); + var item = await GetChannel(channelInfo.Item2, channelInfo.Item1, parentFolderId, cancellationToken).ConfigureAwait(false); list.Add(item); @@ -1205,6 +1227,8 @@ namespace MediaBrowser.Server.Implementations.LiveTv var guideDays = GetGuideDays(list.Count); + _logger.Info("Refreshing guide with {0} days of guide data", guideDays); + cancellationToken.ThrowIfCancellationRequested(); foreach (var currentChannel in list) @@ -1219,11 +1243,9 @@ namespace MediaBrowser.Server.Implementations.LiveTv var channelPrograms = await service.GetProgramsAsync(currentChannel.ExternalId, start, end, cancellationToken).ConfigureAwait(false); - var channelId = currentChannel.Id.ToString("N"); - foreach (var program in channelPrograms) { - var programItem = await GetProgram(program, channelId, currentChannel.ChannelType, service.Name, cancellationToken).ConfigureAwait(false); + var programItem = await GetProgram(program, currentChannel, currentChannel.ChannelType, service.Name, cancellationToken).ConfigureAwait(false); programs.Add(programItem.Id); } @@ -1290,13 +1312,14 @@ namespace MediaBrowser.Server.Implementations.LiveTv } } + private const int MaxGuideDays = 14; private double GetGuideDays(int channelCount) { var config = GetConfiguration(); if (config.GuideDays.HasValue) { - return config.GuideDays.Value; + return Math.Max(1, Math.Min(config.GuideDays.Value, MaxGuideDays)); } var programsPerDay = channelCount * 48; @@ -1305,7 +1328,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv var days = Math.Round(((double)maxPrograms) / programsPerDay); - return Math.Max(3, Math.Min(days, 14)); + return Math.Max(3, Math.Min(days, MaxGuideDays)); } private async Task>> GetChannels(ILiveTvService service, CancellationToken cancellationToken) @@ -1349,8 +1372,10 @@ namespace MediaBrowser.Server.Implementations.LiveTv }); var results = await Task.WhenAll(tasks).ConfigureAwait(false); + var folder = await GetInternalLiveTvFolder(cancellationToken).ConfigureAwait(false); + var parentFolderId = folder.Id; - var recordingTasks = results.SelectMany(i => i.ToList()).Select(i => CreateRecordingRecord(i.Item1, i.Item2.Name, cancellationToken)); + var recordingTasks = results.SelectMany(i => i.ToList()).Select(i => CreateRecordingRecord(i.Item1, i.Item2.Name, parentFolderId, cancellationToken)); var idList = await Task.WhenAll(recordingTasks).ConfigureAwait(false); @@ -1422,12 +1447,6 @@ namespace MediaBrowser.Server.Implementations.LiveTv .Where(i => _tvDtoService.GetInternalSeriesTimerId(i.ServiceName, i.SeriesTimerId) == guid); } - if (user != null) - { - var currentUser = user; - recordings = recordings.Where(i => i.IsParentalAllowed(currentUser)); - } - recordings = recordings.OrderByDescending(i => i.StartDate); var entityList = recordings.ToList(); @@ -1453,18 +1472,10 @@ namespace MediaBrowser.Server.Implementations.LiveTv public void AddInfoToProgramDto(BaseItem item, BaseItemDto dto, bool addChannelInfo, User user = null) { var program = (LiveTvProgram)item; - var service = GetService(program); - - dto.Id = _tvDtoService.GetInternalProgramId(service.Name, program.ExternalId).ToString("N"); dto.StartDate = program.StartDate; dto.EpisodeTitle = program.EpisodeTitle; - dto.Audio = program.Audio; - if (program.IsHD.HasValue && program.IsHD.Value) - { - dto.IsHD = program.IsHD; - } if (program.IsRepeat) { dto.IsRepeat = program.IsRepeat; @@ -1523,7 +1534,6 @@ namespace MediaBrowser.Server.Implementations.LiveTv var info = recording; - dto.Id = item.Id.ToString("N"); dto.SeriesTimerId = string.IsNullOrEmpty(info.SeriesTimerId) ? null : _tvDtoService.GetInternalSeriesTimerId(service.Name, info.SeriesTimerId).ToString("N"); @@ -1532,8 +1542,6 @@ namespace MediaBrowser.Server.Implementations.LiveTv dto.RecordingStatus = info.Status; dto.IsRepeat = info.IsRepeat; dto.EpisodeTitle = info.EpisodeTitle; - dto.Audio = info.Audio; - dto.IsHD = info.IsHD; dto.IsMovie = info.IsMovie; dto.IsSeries = info.IsSeries; dto.IsSports = info.IsSports; @@ -1810,13 +1818,12 @@ namespace MediaBrowser.Server.Implementations.LiveTv ChannelIds = new[] { id }, MaxStartDate = now, MinEndDate = now, - Limit = 1 + Limit = 1, + SortBy = new[] { "StartDate" } }).Items.Cast(); - var currentProgram = programs - .OrderBy(i => i.StartDate) - .FirstOrDefault(); + var currentProgram = programs.FirstOrDefault(); var dto = _tvDtoService.GetChannelInfoDto(channel, new DtoOptions(), currentProgram, user); @@ -1835,13 +1842,12 @@ namespace MediaBrowser.Server.Implementations.LiveTv ChannelIds = new[] { channel.Id.ToString("N") }, MaxStartDate = now, MinEndDate = now, - Limit = 1 + Limit = 1, + SortBy = new[] { "StartDate" } }).Items.Cast(); - var currentProgram = programs - .OrderBy(i => i.StartDate) - .FirstOrDefault(); + var currentProgram = programs.FirstOrDefault(); if (currentProgram != null) { @@ -2302,7 +2308,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv public async Task GetInternalLiveTvFolder(CancellationToken cancellationToken) { var name = _localization.GetLocalizedString("ViewTypeLiveTV"); - return await _libraryManager.GetNamedView(name, "livetv", name, cancellationToken).ConfigureAwait(false); + return await _libraryManager.GetNamedView(name, CollectionType.LiveTv, name, cancellationToken).ConfigureAwait(false); } public async Task SaveTunerHost(TunerHostInfo info)