aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs')
-rw-r--r--MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs205
1 files changed, 109 insertions, 96 deletions
diff --git a/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs b/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs
index edfca0d6c..f55d19a5d 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<LiveTvChannel> GetChannel(ChannelInfo channelInfo, string serviceName, CancellationToken cancellationToken)
+ private async Task<LiveTvChannel> GetChannel(ChannelInfo channelInfo, string serviceName, Guid parentFolderId, CancellationToken cancellationToken)
{
var isNew = false;
@@ -560,12 +560,16 @@ namespace MediaBrowser.Server.Implementations.LiveTv
}
item.ExternalId = channelInfo.Id;
+ if (!item.ParentId.Equals(parentFolderId))
+ {
+ isNew = true;
+ }
+ item.ParentId = parentFolderId;
+
item.ChannelType = channelInfo.ChannelType;
item.ServiceName = serviceName;
item.Number = channelInfo.Number;
- var replaceImages = new List<ImageType>();
-
//if (!string.Equals(item.ProviderImageUrl, channelInfo.ImageUrl, StringComparison.OrdinalIgnoreCase))
//{
// isNew = true;
@@ -577,13 +581,16 @@ namespace MediaBrowser.Server.Implementations.LiveTv
// replaceImages.Add(ImageType.Primary);
//}
- if (!string.IsNullOrWhiteSpace(channelInfo.ImagePath))
+ if (!item.HasImage(ImageType.Primary))
{
- item.SetImagePath(ImageType.Primary, channelInfo.ImagePath);
- }
- else if (!string.IsNullOrWhiteSpace(channelInfo.ImageUrl))
- {
- 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 +600,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<LiveTvProgram> GetProgram(ProgramInfo info, string channelId, ChannelType channelType, string serviceName, CancellationToken cancellationToken)
+ private async Task<LiveTvProgram> 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 +628,21 @@ namespace MediaBrowser.Server.Implementations.LiveTv
};
}
- item.ChannelType = channelType;
+ if (!item.ParentId.Equals(channel.Id))
+ {
+ forceUpdate = true;
+ }
+ item.ParentId = channel.Id;
+
+ //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;
@@ -653,20 +670,23 @@ namespace MediaBrowser.Server.Implementations.LiveTv
item.IndexNumber = info.EpisodeNumber;
item.ParentIndexNumber = info.SeasonNumber;
- 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);
+ }
}
-
+
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);
}
@@ -687,7 +707,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv
return item;
}
- private async Task<Guid> CreateRecordingRecord(RecordingInfo info, string serviceName, CancellationToken cancellationToken)
+ private async Task<Guid> CreateRecordingRecord(RecordingInfo info, string serviceName, Guid parentFolderId, CancellationToken cancellationToken)
{
var isNew = false;
@@ -734,6 +754,8 @@ namespace MediaBrowser.Server.Implementations.LiveTv
recording.ExternalId = info.Id;
+ var dataChanged = false;
+
recording.Audio = info.Audio;
recording.EndDate = info.EndDate;
recording.EpisodeTitle = info.EpisodeTitle;
@@ -744,31 +766,46 @@ namespace MediaBrowser.Server.Implementations.LiveTv
recording.IsNews = info.IsNews;
recording.IsPremiere = info.IsPremiere;
recording.IsRepeat = info.IsRepeat;
- recording.IsSeries = info.IsSeries;
recording.IsSports = info.IsSports;
recording.SeriesTimerId = info.SeriesTimerId;
recording.StartDate = info.StartDate;
- if (!string.IsNullOrWhiteSpace(info.ImagePath))
+ if (!dataChanged)
{
- item.SetImagePath(ImageType.Primary, info.ImagePath);
+ dataChanged = recording.IsSeries != info.IsSeries;
}
- else if (!string.IsNullOrWhiteSpace(info.ImageUrl))
+ recording.IsSeries = info.IsSeries;
+
+ if (!item.ParentId.Equals(parentFolderId))
{
- item.SetImagePath(ImageType.Primary, info.ImageUrl);
+ dataChanged = true;
}
+ item.ParentId = parentFolderId;
+ if (!item.HasImage(ImageType.Primary))
+ {
+ 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;
recording.Status = info.Status;
recording.ServiceName = serviceName;
- var pathChanged = false;
-
if (!string.IsNullOrEmpty(info.Path))
{
- pathChanged = !string.Equals(item.Path, info.Path);
+ if (!dataChanged)
+ {
+ dataChanged = !string.Equals(item.Path, info.Path);
+ }
var fileInfo = _fileSystem.GetFileInfo(info.Path);
recording.DateCreated = _fileSystem.GetCreationTimeUtc(fileInfo);
@@ -777,7 +814,10 @@ namespace MediaBrowser.Server.Implementations.LiveTv
}
else if (!string.IsNullOrEmpty(info.Url))
{
- pathChanged = !string.Equals(item.Path, info.Url);
+ if (!dataChanged)
+ {
+ dataChanged = !string.Equals(item.Path, info.Url);
+ }
item.Path = info.Url;
}
@@ -787,7 +827,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv
{
await _libraryManager.CreateItem(item, cancellationToken).ConfigureAwait(false);
}
- else if (pathChanged || info.DateLastUpdated > recording.DateLastSaved || statusChanged)
+ else if (dataChanged || info.DateLastUpdated > recording.DateLastSaved || statusChanged)
{
metadataRefreshMode = MetadataRefreshMode.FullRefresh;
await _libraryManager.UpdateItem(item, ItemUpdateType.MetadataImport, cancellationToken).ConfigureAwait(false);
@@ -814,7 +854,9 @@ namespace MediaBrowser.Server.Implementations.LiveTv
public async Task<QueryResult<BaseItemDto>> GetPrograms(ProgramQuery query, DtoOptions options, CancellationToken cancellationToken)
{
- var internalQuery = new InternalItemsQuery
+ var user = string.IsNullOrEmpty(query.UserId) ? null : _userManager.GetUserById(query.UserId);
+
+ var internalQuery = new InternalItemsQuery(user)
{
IncludeItemTypes = new[] { typeof(LiveTvProgram).Name },
MinEndDate = query.MinEndDate,
@@ -832,17 +874,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;
-
- if (user.Policy.BlockUnratedItems.Contains(UnratedItem.LiveTvProgram))
- {
- internalQuery.HasParentalRating = true;
- }
- }
-
if (query.HasAired.HasValue)
{
if (query.HasAired.Value)
@@ -874,7 +905,9 @@ namespace MediaBrowser.Server.Implementations.LiveTv
public async Task<QueryResult<LiveTvProgram>> GetRecommendedProgramsInternal(RecommendedProgramQuery query, CancellationToken cancellationToken)
{
- var internalQuery = new InternalItemsQuery
+ var user = _userManager.GetUserById(query.UserId);
+
+ var internalQuery = new InternalItemsQuery(user)
{
IncludeItemTypes = new[] { typeof(LiveTvProgram).Name },
IsAiring = query.IsAiring,
@@ -895,17 +928,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<LiveTvProgram> programs = _libraryManager.QueryItems(internalQuery).Items.Cast<LiveTvProgram>();
var programList = programs.ToList();
@@ -1037,6 +1059,11 @@ namespace MediaBrowser.Server.Implementations.LiveTv
{
var internalProgram = GetInternalProgram(program.Id);
+ if (string.IsNullOrWhiteSpace(internalProgram.ServiceName))
+ {
+ continue;
+ }
+
List<TimerInfo> timerList;
if (!timers.TryGetValue(internalProgram.ServiceName, out timerList))
{
@@ -1052,7 +1079,6 @@ namespace MediaBrowser.Server.Implementations.LiveTv
}
}
-
var timer = timerList.FirstOrDefault(i => string.Equals(i.ProgramId, internalProgram.ExternalId, StringComparison.OrdinalIgnoreCase));
if (timer != null)
@@ -1144,6 +1170,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv
var list = new List<LiveTvChannel>();
var numComplete = 0;
+ var folder = await GetInternalLiveTvFolder(cancellationToken).ConfigureAwait(false);
foreach (var channelInfo in allChannelsList)
{
@@ -1151,7 +1178,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, folder.Id, cancellationToken).ConfigureAwait(false);
list.Add(item);
@@ -1195,11 +1222,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);
}
@@ -1325,8 +1350,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);
@@ -1350,7 +1377,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv
await RefreshRecordings(cancellationToken).ConfigureAwait(false);
- var internalQuery = new InternalItemsQuery
+ var internalQuery = new InternalItemsQuery(user)
{
IncludeItemTypes = new[] { typeof(LiveTvVideoRecording).Name, typeof(LiveTvAudioRecording).Name }
};
@@ -1360,8 +1387,8 @@ namespace MediaBrowser.Server.Implementations.LiveTv
internalQuery.ChannelIds = new[] { query.ChannelId };
}
- var queryResult = _libraryManager.GetItems(internalQuery);
- IEnumerable<ILiveTvRecording> recordings = queryResult.Items.Cast<ILiveTvRecording>();
+ var queryResult = _libraryManager.GetItems(internalQuery, user, new string[] { });
+ IEnumerable<ILiveTvRecording> recordings = queryResult.Cast<ILiveTvRecording>();
if (!string.IsNullOrEmpty(query.Id))
{
@@ -1398,12 +1425,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();
@@ -1429,18 +1450,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;
@@ -1499,7 +1512,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");
@@ -1508,8 +1520,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;
@@ -1653,7 +1663,12 @@ namespace MediaBrowser.Server.Implementations.LiveTv
}
- await _libraryManager.DeleteItem((BaseItem)recording).ConfigureAwait(false);
+ // This is the responsibility of the live tv service
+ await _libraryManager.DeleteItem((BaseItem)recording, new DeleteOptions
+ {
+ DeleteFileLocation = false
+
+ }).ConfigureAwait(false);
_lastRecordingRefreshTime = DateTime.MinValue;
}
@@ -1775,19 +1790,18 @@ namespace MediaBrowser.Server.Implementations.LiveTv
var now = DateTime.UtcNow;
- var programs = _libraryManager.GetItems(new InternalItemsQuery
+ var programs = _libraryManager.GetItems(new InternalItemsQuery(user)
{
IncludeItemTypes = new[] { typeof(LiveTvProgram).Name },
ChannelIds = new[] { id },
MaxStartDate = now,
MinEndDate = now,
- Limit = 1
+ Limit = 1,
+ SortBy = new[] { "StartDate" }
- }).Items.Cast<LiveTvProgram>();
+ }, user, new string[] { }).Cast<LiveTvProgram>();
- var currentProgram = programs
- .OrderBy(i => i.StartDate)
- .FirstOrDefault();
+ var currentProgram = programs.FirstOrDefault();
var dto = _tvDtoService.GetChannelInfoDto(channel, new DtoOptions(), currentProgram, user);
@@ -1800,19 +1814,18 @@ namespace MediaBrowser.Server.Implementations.LiveTv
var now = DateTime.UtcNow;
- var programs = _libraryManager.GetItems(new InternalItemsQuery
+ var programs = _libraryManager.GetItems(new InternalItemsQuery(user)
{
IncludeItemTypes = new[] { typeof(LiveTvProgram).Name },
ChannelIds = new[] { channel.Id.ToString("N") },
MaxStartDate = now,
MinEndDate = now,
- Limit = 1
+ Limit = 1,
+ SortBy = new[] { "StartDate" }
- }).Items.Cast<LiveTvProgram>();
+ }, user, new string[] { }).Cast<LiveTvProgram>();
- var currentProgram = programs
- .OrderBy(i => i.StartDate)
- .FirstOrDefault();
+ var currentProgram = programs.FirstOrDefault();
if (currentProgram != null)
{