mirror of https://github.com/jellyfin/jellyfin.git
updated nuget
This commit is contained in:
parent
a641059c57
commit
3b4c355838
|
@ -20,6 +20,12 @@ namespace MediaBrowser.Controller.LiveTv
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string ChannelName { get; set; }
|
public string ChannelName { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the program identifier.
|
||||||
|
/// </summary>
|
||||||
|
/// <value>The program identifier.</value>
|
||||||
|
public string ProgramId { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Name of the recording.
|
/// Name of the recording.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -46,14 +52,10 @@ namespace MediaBrowser.Controller.LiveTv
|
||||||
public string Status { get; set; } //TODO: Enum for status?? Difference NextPvr,Argus,...
|
public string Status { get; set; } //TODO: Enum for status?? Difference NextPvr,Argus,...
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Quality of the Recording.
|
/// Gets or sets a value indicating whether this instance is recurring.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string Quality { get; set; } // TODO: Enum for quality?? Difference NextPvr,Argus,...
|
/// <value><c>true</c> if this instance is recurring; otherwise, <c>false</c>.</value>
|
||||||
|
public bool IsRecurring { get; set; }
|
||||||
/// <summary>
|
|
||||||
/// Recurring recording?
|
|
||||||
/// </summary>
|
|
||||||
public bool Recurring { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Parent recurring.
|
/// Parent recurring.
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
|
||||||
|
|
||||||
namespace MediaBrowser.Model.LiveTv
|
namespace MediaBrowser.Model.LiveTv
|
||||||
{
|
{
|
||||||
|
@ -10,6 +9,18 @@ namespace MediaBrowser.Model.LiveTv
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string Id { get; set; }
|
public string Id { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the external identifier.
|
||||||
|
/// </summary>
|
||||||
|
/// <value>The external identifier.</value>
|
||||||
|
public string ExternalId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the program identifier.
|
||||||
|
/// </summary>
|
||||||
|
/// <value>The program identifier.</value>
|
||||||
|
public string ProgramId { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// ChannelId of the recording.
|
/// ChannelId of the recording.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -41,38 +52,8 @@ namespace MediaBrowser.Model.LiveTv
|
||||||
public DateTime EndDate { get; set; }
|
public DateTime EndDate { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Status of the recording.
|
/// IsRecurring recording?
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string Status { get; set; } //TODO: Enum for status?? Difference NextPvr,Argus,...
|
public bool IsRecurring { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Quality of the Recording.
|
|
||||||
/// </summary>
|
|
||||||
public string Quality { get; set; } // TODO: Enum for quality?? Difference NextPvr,Argus,...
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Recurring recording?
|
|
||||||
/// </summary>
|
|
||||||
public bool Recurring { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Parent recurring.
|
|
||||||
/// </summary>
|
|
||||||
public string RecurringParent { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Start date for the recurring, in UTC.
|
|
||||||
/// </summary>
|
|
||||||
public DateTime RecurrringStartDate { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// End date for the recurring, in UTC
|
|
||||||
/// </summary>
|
|
||||||
public DateTime RecurringEndDate { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// When do we need the recording?
|
|
||||||
/// </summary>
|
|
||||||
public List<string> DayMask { get; set; }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -7,13 +7,13 @@ using MediaBrowser.Controller.Persistence;
|
||||||
using MediaBrowser.Model.Entities;
|
using MediaBrowser.Model.Entities;
|
||||||
using MediaBrowser.Model.LiveTv;
|
using MediaBrowser.Model.LiveTv;
|
||||||
using MediaBrowser.Model.Logging;
|
using MediaBrowser.Model.Logging;
|
||||||
|
using MediaBrowser.Model.Querying;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using MediaBrowser.Model.Querying;
|
|
||||||
|
|
||||||
namespace MediaBrowser.Server.Implementations.LiveTv
|
namespace MediaBrowser.Server.Implementations.LiveTv
|
||||||
{
|
{
|
||||||
|
@ -32,6 +32,9 @@ namespace MediaBrowser.Server.Implementations.LiveTv
|
||||||
|
|
||||||
private List<Channel> _channels = new List<Channel>();
|
private List<Channel> _channels = new List<Channel>();
|
||||||
private List<ProgramInfoDto> _programs = new List<ProgramInfoDto>();
|
private List<ProgramInfoDto> _programs = new List<ProgramInfoDto>();
|
||||||
|
private List<RecordingInfoDto> _recordings = new List<RecordingInfoDto>();
|
||||||
|
|
||||||
|
private readonly SemaphoreSlim _updateSemaphore = new SemaphoreSlim(1, 1);
|
||||||
|
|
||||||
public LiveTvManager(IServerApplicationPaths appPaths, IFileSystem fileSystem, ILogger logger, IItemRepository itemRepo, IImageProcessor imageProcessor)
|
public LiveTvManager(IServerApplicationPaths appPaths, IFileSystem fileSystem, ILogger logger, IItemRepository itemRepo, IImageProcessor imageProcessor)
|
||||||
{
|
{
|
||||||
|
@ -137,62 +140,9 @@ namespace MediaBrowser.Server.Implementations.LiveTv
|
||||||
return _channels.FirstOrDefault(i => i.Id == guid);
|
return _channels.FirstOrDefault(i => i.Id == guid);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal async Task RefreshChannels(IProgress<double> progress, CancellationToken cancellationToken)
|
|
||||||
{
|
|
||||||
// Avoid implicitly captured closure
|
|
||||||
var currentCancellationToken = cancellationToken;
|
|
||||||
|
|
||||||
var channelTasks = _services.Select(i => i.GetChannelsAsync(currentCancellationToken));
|
|
||||||
|
|
||||||
progress.Report(10);
|
|
||||||
|
|
||||||
var results = await Task.WhenAll(channelTasks).ConfigureAwait(false);
|
|
||||||
|
|
||||||
var allChannels = results.SelectMany(i => i).ToList();
|
|
||||||
|
|
||||||
var list = new List<Channel>();
|
|
||||||
var programs = new List<ProgramInfoDto>();
|
|
||||||
|
|
||||||
var numComplete = 0;
|
|
||||||
|
|
||||||
foreach (var channelInfo in allChannels)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var item = await GetChannel(channelInfo, cancellationToken).ConfigureAwait(false);
|
|
||||||
|
|
||||||
var service = GetService(channelInfo);
|
|
||||||
|
|
||||||
var channelPrograms = await service.GetProgramsAsync(channelInfo.Id, cancellationToken).ConfigureAwait(false);
|
|
||||||
|
|
||||||
programs.AddRange(channelPrograms.Select(program => GetProgramInfoDto(program, item)));
|
|
||||||
|
|
||||||
list.Add(item);
|
|
||||||
}
|
|
||||||
catch (OperationCanceledException)
|
|
||||||
{
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
_logger.ErrorException("Error getting channel information for {0}", ex, channelInfo.Name);
|
|
||||||
}
|
|
||||||
|
|
||||||
numComplete++;
|
|
||||||
double percent = numComplete;
|
|
||||||
percent /= allChannels.Count;
|
|
||||||
|
|
||||||
progress.Report(90 * percent + 10);
|
|
||||||
}
|
|
||||||
|
|
||||||
_programs = programs;
|
|
||||||
_channels = list;
|
|
||||||
}
|
|
||||||
|
|
||||||
private ProgramInfoDto GetProgramInfoDto(ProgramInfo program, Channel channel)
|
private ProgramInfoDto GetProgramInfoDto(ProgramInfo program, Channel channel)
|
||||||
{
|
{
|
||||||
var id = channel.ServiceName + channel.ChannelId + program.Id;
|
var id = GetInternalProgramIdId(channel.ServiceName, program.Id).ToString("N");
|
||||||
id = id.GetMD5().ToString("N");
|
|
||||||
|
|
||||||
return new ProgramInfoDto
|
return new ProgramInfoDto
|
||||||
{
|
{
|
||||||
|
@ -208,6 +158,20 @@ namespace MediaBrowser.Server.Implementations.LiveTv
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Guid GetInternalChannelId(string serviceName, string externalChannelId)
|
||||||
|
{
|
||||||
|
var name = serviceName + externalChannelId;
|
||||||
|
|
||||||
|
return name.ToLower().GetMBId(typeof(Channel));
|
||||||
|
}
|
||||||
|
|
||||||
|
private Guid GetInternalProgramIdId(string serviceName, string externalProgramId)
|
||||||
|
{
|
||||||
|
var name = serviceName + externalProgramId;
|
||||||
|
|
||||||
|
return name.ToLower().GetMD5();
|
||||||
|
}
|
||||||
|
|
||||||
private async Task<Channel> GetChannel(ChannelInfo channelInfo, CancellationToken cancellationToken)
|
private async Task<Channel> GetChannel(ChannelInfo channelInfo, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
var path = Path.Combine(_appPaths.ItemsByNamePath, "channels", _fileSystem.GetValidFilename(channelInfo.ServiceName), _fileSystem.GetValidFilename(channelInfo.Name));
|
var path = Path.Combine(_appPaths.ItemsByNamePath, "channels", _fileSystem.GetValidFilename(channelInfo.ServiceName), _fileSystem.GetValidFilename(channelInfo.Name));
|
||||||
|
@ -229,9 +193,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv
|
||||||
isNew = true;
|
isNew = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
var type = typeof(Channel);
|
var id = GetInternalChannelId(channelInfo.ServiceName, channelInfo.Id);
|
||||||
|
|
||||||
var id = (path + channelInfo.Number).GetMBId(type);
|
|
||||||
|
|
||||||
var item = _itemRepo.RetrieveItem(id) as Channel;
|
var item = _itemRepo.RetrieveItem(id) as Channel;
|
||||||
|
|
||||||
|
@ -286,5 +248,134 @@ namespace MediaBrowser.Server.Implementations.LiveTv
|
||||||
TotalRecordCount = returnArray.Length
|
TotalRecordCount = returnArray.Length
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal async Task RefreshChannels(IProgress<double> progress, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
await _updateSemaphore.WaitAsync(cancellationToken).ConfigureAwait(false);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await RefreshChannelsInternal(progress, cancellationToken).ConfigureAwait(false);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
_updateSemaphore.Release();
|
||||||
|
}
|
||||||
|
|
||||||
|
await RefreshRecordings(new Progress<double>(), cancellationToken).ConfigureAwait(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task RefreshChannelsInternal(IProgress<double> progress, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
// Avoid implicitly captured closure
|
||||||
|
var currentCancellationToken = cancellationToken;
|
||||||
|
|
||||||
|
var channelTasks = _services.Select(i => i.GetChannelsAsync(currentCancellationToken));
|
||||||
|
|
||||||
|
progress.Report(10);
|
||||||
|
|
||||||
|
var results = await Task.WhenAll(channelTasks).ConfigureAwait(false);
|
||||||
|
|
||||||
|
var allChannels = results.SelectMany(i => i).ToList();
|
||||||
|
|
||||||
|
var list = new List<Channel>();
|
||||||
|
var programs = new List<ProgramInfoDto>();
|
||||||
|
|
||||||
|
var numComplete = 0;
|
||||||
|
|
||||||
|
foreach (var channelInfo in allChannels)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var item = await GetChannel(channelInfo, cancellationToken).ConfigureAwait(false);
|
||||||
|
|
||||||
|
var service = GetService(channelInfo);
|
||||||
|
|
||||||
|
var channelPrograms = await service.GetProgramsAsync(channelInfo.Id, cancellationToken).ConfigureAwait(false);
|
||||||
|
|
||||||
|
programs.AddRange(channelPrograms.Select(program => GetProgramInfoDto(program, item)));
|
||||||
|
|
||||||
|
list.Add(item);
|
||||||
|
}
|
||||||
|
catch (OperationCanceledException)
|
||||||
|
{
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_logger.ErrorException("Error getting channel information for {0}", ex, channelInfo.Name);
|
||||||
|
}
|
||||||
|
|
||||||
|
numComplete++;
|
||||||
|
double percent = numComplete;
|
||||||
|
percent /= allChannels.Count;
|
||||||
|
|
||||||
|
progress.Report(90 * percent + 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
_programs = programs;
|
||||||
|
_channels = list;
|
||||||
|
}
|
||||||
|
|
||||||
|
internal async Task RefreshRecordings(IProgress<double> progress, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
await _updateSemaphore.WaitAsync(cancellationToken).ConfigureAwait(false);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await RefreshRecordingsInternal(progress, cancellationToken).ConfigureAwait(false);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
_updateSemaphore.Release();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task RefreshRecordingsInternal(IProgress<double> progress, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
var list = new List<RecordingInfoDto>();
|
||||||
|
|
||||||
|
foreach (var service in _services)
|
||||||
|
{
|
||||||
|
var recordings = await GetRecordings(service, cancellationToken).ConfigureAwait(false);
|
||||||
|
|
||||||
|
list.AddRange(recordings);
|
||||||
|
}
|
||||||
|
|
||||||
|
_recordings = list;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task<IEnumerable<RecordingInfoDto>> GetRecordings(ILiveTvService service, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
var recordings = await service.GetRecordingsAsync(cancellationToken).ConfigureAwait(false);
|
||||||
|
|
||||||
|
return recordings.Select(i => GetRecordingInfoDto(i, service));
|
||||||
|
}
|
||||||
|
|
||||||
|
private RecordingInfoDto GetRecordingInfoDto(RecordingInfo info, ILiveTvService service)
|
||||||
|
{
|
||||||
|
var id = service.Name + info.ChannelId + info.Id;
|
||||||
|
id = id.GetMD5().ToString("N");
|
||||||
|
|
||||||
|
var dto = new RecordingInfoDto
|
||||||
|
{
|
||||||
|
ChannelName = info.ChannelName,
|
||||||
|
Description = info.Description,
|
||||||
|
EndDate = info.EndDate,
|
||||||
|
Name = info.Name,
|
||||||
|
IsRecurring = info.IsRecurring,
|
||||||
|
StartDate = info.StartDate,
|
||||||
|
Id = id,
|
||||||
|
ExternalId = info.Id,
|
||||||
|
ChannelId = GetInternalChannelId(service.Name, info.ChannelId).ToString("N")
|
||||||
|
};
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(info.ProgramId))
|
||||||
|
{
|
||||||
|
dto.ProgramId = GetInternalProgramIdId(service.Name, info.ProgramId).ToString("N");
|
||||||
|
}
|
||||||
|
|
||||||
|
return dto;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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.248</version>
|
<version>3.0.249</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.248" />
|
<dependency id="MediaBrowser.Common" version="3.0.249" />
|
||||||
<dependency id="NLog" version="2.1.0" />
|
<dependency id="NLog" version="2.1.0" />
|
||||||
<dependency id="ServiceStack.Text" version="3.9.58" />
|
<dependency id="ServiceStack.Text" version="3.9.58" />
|
||||||
<dependency id="SimpleInjector" version="2.3.6" />
|
<dependency id="SimpleInjector" version="2.3.6" />
|
||||||
|
|
|
@ -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.248</version>
|
<version>3.0.249</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.248</version>
|
<version>3.0.249</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.248" />
|
<dependency id="MediaBrowser.Common" version="3.0.249" />
|
||||||
</dependencies>
|
</dependencies>
|
||||||
</metadata>
|
</metadata>
|
||||||
<files>
|
<files>
|
||||||
|
|
Loading…
Reference in New Issue