remove more reliance on ActiveService

This commit is contained in:
Luke Pulverenti 2015-03-12 11:51:48 -04:00
parent 028a0a857a
commit e62b663ae0
11 changed files with 50 additions and 107 deletions

View File

@ -0,0 +1,8 @@

namespace MediaBrowser.Controller.LiveTv
{
public interface ILiveTvItem
{
string ServiceName { get; set; }
}
}

View File

@ -7,10 +7,8 @@ using System.Threading.Tasks;
namespace MediaBrowser.Controller.LiveTv namespace MediaBrowser.Controller.LiveTv
{ {
public interface ILiveTvRecording : IHasImages, IHasMediaSources, IHasUserData public interface ILiveTvRecording : IHasImages, IHasMediaSources, IHasUserData, ILiveTvItem
{ {
string ServiceName { get; set; }
string MediaType { get; } string MediaType { get; }
string Container { get; } string Container { get; }

View File

@ -11,7 +11,7 @@ using System.Runtime.Serialization;
namespace MediaBrowser.Controller.LiveTv namespace MediaBrowser.Controller.LiveTv
{ {
public class LiveTvChannel : BaseItem, IHasMediaSources public class LiveTvChannel : BaseItem, IHasMediaSources, ILiveTvItem
{ {
/// <summary> /// <summary>
/// Gets the user data key. /// Gets the user data key.
@ -58,6 +58,10 @@ namespace MediaBrowser.Controller.LiveTv
/// <value>The type of the channel.</value> /// <value>The type of the channel.</value>
public ChannelType ChannelType { get; set; } public ChannelType ChannelType { get; set; }
/// <summary>
/// Gets or sets the name of the service.
/// </summary>
/// <value>The name of the service.</value>
public string ServiceName { get; set; } public string ServiceName { get; set; }
/// <summary> /// <summary>

View File

@ -11,7 +11,7 @@ using System.Threading.Tasks;
namespace MediaBrowser.Controller.LiveTv namespace MediaBrowser.Controller.LiveTv
{ {
public class LiveTvProgram : BaseItem public class LiveTvProgram : BaseItem, ILiveTvItem
{ {
/// <summary> /// <summary>
/// Gets the user data key. /// Gets the user data key.

View File

@ -1,5 +1,4 @@
using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities;
using MediaBrowser.Model.Configuration;
using MediaBrowser.Model.Users; using MediaBrowser.Model.Users;
namespace MediaBrowser.Controller.LiveTv namespace MediaBrowser.Controller.LiveTv

View File

@ -185,6 +185,7 @@
<Compile Include="Library\MetadataConfigurationStore.cs" /> <Compile Include="Library\MetadataConfigurationStore.cs" />
<Compile Include="Library\PlaybackStopEventArgs.cs" /> <Compile Include="Library\PlaybackStopEventArgs.cs" />
<Compile Include="Library\UserDataSaveEventArgs.cs" /> <Compile Include="Library\UserDataSaveEventArgs.cs" />
<Compile Include="LiveTv\ILiveTvItem.cs" />
<Compile Include="LiveTv\RecordingGroup.cs" /> <Compile Include="LiveTv\RecordingGroup.cs" />
<Compile Include="LiveTv\RecordingStatusChangedEventArgs.cs" /> <Compile Include="LiveTv\RecordingStatusChangedEventArgs.cs" />
<Compile Include="LiveTv\ILiveTvRecording.cs" /> <Compile Include="LiveTv\ILiveTvRecording.cs" />

View File

@ -10,12 +10,6 @@ namespace MediaBrowser.Model.LiveTv
/// <value>The services.</value> /// <value>The services.</value>
public List<LiveTvServiceInfo> Services { get; set; } public List<LiveTvServiceInfo> Services { get; set; }
/// <summary>
/// Gets or sets the name of the active service.
/// </summary>
/// <value>The name of the active service.</value>
public string ActiveServiceName { get; set; }
/// <summary> /// <summary>
/// Gets or sets a value indicating whether this instance is enabled. /// Gets or sets a value indicating whether this instance is enabled.
/// </summary> /// </summary>
@ -28,18 +22,6 @@ namespace MediaBrowser.Model.LiveTv
/// <value>The enabled users.</value> /// <value>The enabled users.</value>
public List<string> EnabledUsers { get; set; } public List<string> EnabledUsers { get; set; }
/// <summary>
/// Gets or sets the status.
/// </summary>
/// <value>The status.</value>
public LiveTvServiceStatus Status { get; set; }
/// <summary>
/// Gets or sets the status message.
/// </summary>
/// <value>The status message.</value>
public string StatusMessage { get; set; }
public LiveTvInfo() public LiveTvInfo()
{ {
Services = new List<LiveTvServiceInfo>(); Services = new List<LiveTvServiceInfo>();

View File

@ -3,6 +3,5 @@
public class LiveTvOptions public class LiveTvOptions
{ {
public int? GuideDays { get; set; } public int? GuideDays { get; set; }
public string ActiveService { get; set; }
} }
} }

View File

@ -103,27 +103,9 @@ namespace MediaBrowser.Server.Implementations.LiveTv
{ {
_services.AddRange(services); _services.AddRange(services);
SetActiveService(GetConfiguration().ActiveService); ActiveService = _services.FirstOrDefault();
}
private void SetActiveService(string name) foreach (var service in _services)
{
var service = _services.FirstOrDefault(i => string.Equals(i.Name, name, StringComparison.OrdinalIgnoreCase)) ??
_services.FirstOrDefault();
SetActiveService(service);
}
private void SetActiveService(ILiveTvService service)
{
if (ActiveService != null)
{
ActiveService.DataSourceChanged -= service_DataSourceChanged;
}
ActiveService = service;
if (service != null)
{ {
service.DataSourceChanged += service_DataSourceChanged; service.DataSourceChanged += service_DataSourceChanged;
} }
@ -324,13 +306,13 @@ namespace MediaBrowser.Server.Implementations.LiveTv
public async Task<ILiveTvRecording> GetInternalRecording(string id, CancellationToken cancellationToken) public async Task<ILiveTvRecording> GetInternalRecording(string id, CancellationToken cancellationToken)
{ {
var service = ActiveService; var result = await GetInternalRecordings(new RecordingQuery
{
Id = id
var recordings = await service.GetRecordingsAsync(cancellationToken).ConfigureAwait(false); }, cancellationToken).ConfigureAwait(false);
var recording = recordings.FirstOrDefault(i => _tvDtoService.GetInternalRecordingId(service.Name, i.Id) == new Guid(id)); return result.Items.FirstOrDefault() as ILiveTvRecording;
return await GetRecording(recording, service.Name, cancellationToken).ConfigureAwait(false);
} }
private readonly SemaphoreSlim _liveStreamSemaphore = new SemaphoreSlim(1, 1); private readonly SemaphoreSlim _liveStreamSemaphore = new SemaphoreSlim(1, 1);
@ -345,29 +327,38 @@ namespace MediaBrowser.Server.Implementations.LiveTv
return await GetLiveStream(id, true, cancellationToken).ConfigureAwait(false); return await GetLiveStream(id, true, cancellationToken).ConfigureAwait(false);
} }
private ILiveTvService GetService(ILiveTvItem item)
{
return GetService(item.ServiceName);
}
private ILiveTvService GetService(string name)
{
return _services.FirstOrDefault(i => string.Equals(i.Name, name, StringComparison.OrdinalIgnoreCase));
}
private async Task<ChannelMediaInfo> GetLiveStream(string id, bool isChannel, CancellationToken cancellationToken) private async Task<ChannelMediaInfo> GetLiveStream(string id, bool isChannel, CancellationToken cancellationToken)
{ {
await _liveStreamSemaphore.WaitAsync(cancellationToken).ConfigureAwait(false); await _liveStreamSemaphore.WaitAsync(cancellationToken).ConfigureAwait(false);
try try
{ {
var service = ActiveService;
ChannelMediaInfo info; ChannelMediaInfo info;
if (isChannel) if (isChannel)
{ {
var channel = GetInternalChannel(id); var channel = GetInternalChannel(id);
var service = GetService(channel);
_logger.Info("Opening channel stream from {0}, external channel Id: {1}", service.Name, channel.ExternalId); _logger.Info("Opening channel stream from {0}, external channel Id: {1}", service.Name, channel.ExternalId);
info = await service.GetChannelStream(channel.ExternalId, cancellationToken).ConfigureAwait(false); info = await service.GetChannelStream(channel.ExternalId, cancellationToken).ConfigureAwait(false);
} }
else else
{ {
var recordings = await service.GetRecordingsAsync(cancellationToken).ConfigureAwait(false); var recording = await GetInternalRecording(id, cancellationToken).ConfigureAwait(false);
var recording = recordings.First(i => _tvDtoService.GetInternalRecordingId(service.Name, i.Id) == new Guid(id)); var service = GetService(recording);
_logger.Info("Opening recording stream from {0}, external recording Id: {1}", service.Name, recording.Id); _logger.Info("Opening recording stream from {0}, external recording Id: {1}", service.Name, recording.RecordingInfo.Id);
info = await service.GetRecordingStream(recording.Id, cancellationToken).ConfigureAwait(false); info = await service.GetRecordingStream(recording.RecordingInfo.Id, cancellationToken).ConfigureAwait(false);
} }
_logger.Info("Live stream info: {0}", _jsonSerializer.SerializeToString(info)); _logger.Info("Live stream info: {0}", _jsonSerializer.SerializeToString(info));
@ -668,13 +659,13 @@ namespace MediaBrowser.Server.Implementations.LiveTv
if (query.ChannelIdList.Length > 0) if (query.ChannelIdList.Length > 0)
{ {
var guids = query.ChannelIdList.Select(i => new Guid(i)).ToList(); var guids = query.ChannelIdList.Select(i => new Guid(i)).ToList();
var serviceName = ActiveService.Name;
programs = programs.Where(i => programs = programs.Where(i =>
{ {
var programChannelId = i.ExternalChannelId; var programChannelId = i.ExternalChannelId;
var internalProgramChannelId = _tvDtoService.GetInternalChannelId(serviceName, programChannelId); var service = GetService(i);
var internalProgramChannelId = _tvDtoService.GetInternalChannelId(service.Name, programChannelId);
return guids.Contains(internalProgramChannelId); return guids.Contains(internalProgramChannelId);
}); });
@ -1030,14 +1021,6 @@ namespace MediaBrowser.Server.Implementations.LiveTv
private async Task DeleteOldPrograms(List<Guid> currentIdList, IProgress<double> progress, CancellationToken cancellationToken) private async Task DeleteOldPrograms(List<Guid> currentIdList, IProgress<double> progress, CancellationToken cancellationToken)
{ {
var service = ActiveService;
if (service == null)
{
progress.Report(100);
return;
}
var list = _itemRepo.GetItemsOfType(typeof(LiveTvProgram)).ToList(); var list = _itemRepo.GetItemsOfType(typeof(LiveTvProgram)).ToList();
var numComplete = 0; var numComplete = 0;
@ -1223,28 +1206,6 @@ namespace MediaBrowser.Server.Implementations.LiveTv
return Task.WhenAll(tasks); return Task.WhenAll(tasks);
} }
private IEnumerable<ILiveTvService> GetServices(string serviceName, string channelId)
{
IEnumerable<ILiveTvService> services = _services;
if (string.IsNullOrEmpty(serviceName) && !string.IsNullOrEmpty(channelId))
{
var channel = GetInternalChannel(channelId);
if (channel != null)
{
serviceName = channel.ServiceName;
}
}
if (!string.IsNullOrEmpty(serviceName))
{
services = services.Where(i => string.Equals(i.Name, serviceName, StringComparison.OrdinalIgnoreCase));
}
return services;
}
public async Task<QueryResult<TimerInfoDto>> GetTimers(TimerQuery query, CancellationToken cancellationToken) public async Task<QueryResult<TimerInfoDto>> GetTimers(TimerQuery query, CancellationToken cancellationToken)
{ {
var service = ActiveService; var service = ActiveService;
@ -1299,8 +1260,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv
throw new ResourceNotFoundException(string.Format("Recording with Id {0} not found", recordingId)); throw new ResourceNotFoundException(string.Format("Recording with Id {0} not found", recordingId));
} }
var service = GetServices(recording.ServiceName, null) var service = GetService(recording.ServiceName);
.First();
await service.DeleteRecordingAsync(recording.ExternalId, CancellationToken.None).ConfigureAwait(false); await service.DeleteRecordingAsync(recording.ExternalId, CancellationToken.None).ConfigureAwait(false);
} }
@ -1314,8 +1274,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv
throw new ResourceNotFoundException(string.Format("Timer with Id {0} not found", id)); throw new ResourceNotFoundException(string.Format("Timer with Id {0} not found", id));
} }
var service = GetServices(timer.ServiceName, null) var service = GetService(timer.ServiceName);
.First();
await service.CancelTimerAsync(timer.ExternalId, CancellationToken.None).ConfigureAwait(false); await service.CancelTimerAsync(timer.ExternalId, CancellationToken.None).ConfigureAwait(false);
} }
@ -1329,8 +1288,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv
throw new ResourceNotFoundException(string.Format("Timer with Id {0} not found", id)); throw new ResourceNotFoundException(string.Format("Timer with Id {0} not found", id));
} }
var service = GetServices(timer.ServiceName, null) var service = GetService(timer.ServiceName);
.First();
await service.CancelSeriesTimerAsync(timer.ExternalId, CancellationToken.None).ConfigureAwait(false); await service.CancelSeriesTimerAsync(timer.ExternalId, CancellationToken.None).ConfigureAwait(false);
} }
@ -1518,7 +1476,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv
public async Task CreateTimer(TimerInfoDto timer, CancellationToken cancellationToken) public async Task CreateTimer(TimerInfoDto timer, CancellationToken cancellationToken)
{ {
var service = string.IsNullOrEmpty(timer.ServiceName) ? ActiveService : GetServices(timer.ServiceName, null).First(); var service = GetService(timer.ServiceName);
var info = await _tvDtoService.GetTimerInfo(timer, true, this, cancellationToken).ConfigureAwait(false); var info = await _tvDtoService.GetTimerInfo(timer, true, this, cancellationToken).ConfigureAwait(false);
@ -1531,7 +1489,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv
public async Task CreateSeriesTimer(SeriesTimerInfoDto timer, CancellationToken cancellationToken) public async Task CreateSeriesTimer(SeriesTimerInfoDto timer, CancellationToken cancellationToken)
{ {
var service = string.IsNullOrEmpty(timer.ServiceName) ? ActiveService : GetServices(timer.ServiceName, null).First(); var service = GetService(timer.ServiceName);
var info = await _tvDtoService.GetSeriesTimerInfo(timer, true, this, cancellationToken).ConfigureAwait(false); var info = await _tvDtoService.GetSeriesTimerInfo(timer, true, this, cancellationToken).ConfigureAwait(false);
@ -1546,7 +1504,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv
{ {
var info = await _tvDtoService.GetTimerInfo(timer, false, this, cancellationToken).ConfigureAwait(false); var info = await _tvDtoService.GetTimerInfo(timer, false, this, cancellationToken).ConfigureAwait(false);
var service = string.IsNullOrEmpty(timer.ServiceName) ? ActiveService : GetServices(timer.ServiceName, null).First(); var service = GetService(timer.ServiceName);
await service.UpdateTimerAsync(info, cancellationToken).ConfigureAwait(false); await service.UpdateTimerAsync(info, cancellationToken).ConfigureAwait(false);
} }
@ -1555,7 +1513,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv
{ {
var info = await _tvDtoService.GetSeriesTimerInfo(timer, false, this, cancellationToken).ConfigureAwait(false); var info = await _tvDtoService.GetSeriesTimerInfo(timer, false, this, cancellationToken).ConfigureAwait(false);
var service = string.IsNullOrEmpty(timer.ServiceName) ? ActiveService : GetServices(timer.ServiceName, null).First(); var service = GetService(timer.ServiceName);
await service.UpdateSeriesTimerAsync(info, cancellationToken).ConfigureAwait(false); await service.UpdateSeriesTimerAsync(info, cancellationToken).ConfigureAwait(false);
} }
@ -1821,16 +1779,10 @@ namespace MediaBrowser.Server.Implementations.LiveTv
var services = await GetServiceInfos(CancellationToken.None).ConfigureAwait(false); var services = await GetServiceInfos(CancellationToken.None).ConfigureAwait(false);
var servicesList = services.ToList(); var servicesList = services.ToList();
var activeServiceInfo = ActiveService == null ? null :
servicesList.FirstOrDefault(i => string.Equals(i.Name, ActiveService.Name, StringComparison.OrdinalIgnoreCase));
var info = new LiveTvInfo var info = new LiveTvInfo
{ {
Services = servicesList.ToList(), Services = servicesList.ToList(),
ActiveServiceName = activeServiceInfo == null ? null : activeServiceInfo.Name, IsEnabled = servicesList.Count > 0
IsEnabled = ActiveService != null,
Status = activeServiceInfo == null ? LiveTvServiceStatus.Unavailable : activeServiceInfo.Status,
StatusMessage = activeServiceInfo == null ? null : activeServiceInfo.StatusMessage
}; };
info.EnabledUsers = _userManager.Users info.EnabledUsers = _userManager.Users

View File

@ -586,6 +586,7 @@
"ValuePremieres": "Premieres {0}", "ValuePremieres": "Premieres {0}",
"ValueStudio": "Studio: {0}", "ValueStudio": "Studio: {0}",
"ValueStudios": "Studios: {0}", "ValueStudios": "Studios: {0}",
"ValueStatus": "Status: {0}",
"ValueSpecialEpisodeName": "Special - {0}", "ValueSpecialEpisodeName": "Special - {0}",
"LabelLimit": "Limit:", "LabelLimit": "Limit:",
"ValueLinks": "Links: {0}", "ValueLinks": "Links: {0}",

View File

@ -415,9 +415,8 @@
"TitleLiveTV": "Live TV", "TitleLiveTV": "Live TV",
"LabelNumberOfGuideDays": "Number of days of guide data to download:", "LabelNumberOfGuideDays": "Number of days of guide data to download:",
"LabelNumberOfGuideDaysHelp": "Downloading more days worth of guide data provides the ability to schedule out further in advance and view more listings, but it will also take longer to download. Auto will choose based on the number of channels.", "LabelNumberOfGuideDaysHelp": "Downloading more days worth of guide data provides the ability to schedule out further in advance and view more listings, but it will also take longer to download. Auto will choose based on the number of channels.",
"LabelActiveService": "Active Service:",
"LabelActiveServiceHelp": "Multiple tv plugins can be installed but only one can be active at a time.",
"OptionAutomatic": "Auto", "OptionAutomatic": "Auto",
"HeaderServices": "Services",
"LiveTvPluginRequired": "A Live TV service provider plugin is required in order to continue.", "LiveTvPluginRequired": "A Live TV service provider plugin is required in order to continue.",
"LiveTvPluginRequiredHelp": "Please install one of our available plugins, such as Next Pvr or ServerWmc.", "LiveTvPluginRequiredHelp": "Please install one of our available plugins, such as Next Pvr or ServerWmc.",
"LabelCustomizeOptionsPerMediaType": "Customize for media type:", "LabelCustomizeOptionsPerMediaType": "Customize for media type:",