remove more reliance on ActiveService

pull/702/head
Luke Pulverenti 9 years ago
parent 028a0a857a
commit e62b663ae0

@ -0,0 +1,8 @@

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

@ -7,10 +7,8 @@ using System.Threading.Tasks;
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 Container { get; }

@ -11,7 +11,7 @@ using System.Runtime.Serialization;
namespace MediaBrowser.Controller.LiveTv
{
public class LiveTvChannel : BaseItem, IHasMediaSources
public class LiveTvChannel : BaseItem, IHasMediaSources, ILiveTvItem
{
/// <summary>
/// Gets the user data key.
@ -58,6 +58,10 @@ namespace MediaBrowser.Controller.LiveTv
/// <value>The type of the channel.</value>
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; }
/// <summary>

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

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

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

@ -10,12 +10,6 @@ namespace MediaBrowser.Model.LiveTv
/// <value>The services.</value>
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>
/// Gets or sets a value indicating whether this instance is enabled.
/// </summary>
@ -28,18 +22,6 @@ namespace MediaBrowser.Model.LiveTv
/// <value>The enabled users.</value>
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()
{
Services = new List<LiveTvServiceInfo>();

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

@ -103,27 +103,9 @@ namespace MediaBrowser.Server.Implementations.LiveTv
{
_services.AddRange(services);
SetActiveService(GetConfiguration().ActiveService);
}
private void SetActiveService(string name)
{
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 = _services.FirstOrDefault();
ActiveService = service;
if (service != null)
foreach (var service in _services)
{
service.DataSourceChanged += service_DataSourceChanged;
}
@ -324,13 +306,13 @@ namespace MediaBrowser.Server.Implementations.LiveTv
public async Task<ILiveTvRecording> GetInternalRecording(string id, CancellationToken cancellationToken)
{
var service = ActiveService;
var recordings = await service.GetRecordingsAsync(cancellationToken).ConfigureAwait(false);
var result = await GetInternalRecordings(new RecordingQuery
{
Id = id
var recording = recordings.FirstOrDefault(i => _tvDtoService.GetInternalRecordingId(service.Name, i.Id) == new Guid(id));
}, cancellationToken).ConfigureAwait(false);
return await GetRecording(recording, service.Name, cancellationToken).ConfigureAwait(false);
return result.Items.FirstOrDefault() as ILiveTvRecording;
}
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);
}
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)
{
await _liveStreamSemaphore.WaitAsync(cancellationToken).ConfigureAwait(false);
try
{
var service = ActiveService;
ChannelMediaInfo info;
if (isChannel)
{
var channel = GetInternalChannel(id);
var service = GetService(channel);
_logger.Info("Opening channel stream from {0}, external channel Id: {1}", service.Name, channel.ExternalId);
info = await service.GetChannelStream(channel.ExternalId, cancellationToken).ConfigureAwait(false);
}
else
{
var recordings = await service.GetRecordingsAsync(cancellationToken).ConfigureAwait(false);
var recording = recordings.First(i => _tvDtoService.GetInternalRecordingId(service.Name, i.Id) == new Guid(id));
var recording = await GetInternalRecording(id, cancellationToken).ConfigureAwait(false);
var service = GetService(recording);
_logger.Info("Opening recording stream from {0}, external recording Id: {1}", service.Name, recording.Id);
info = await service.GetRecordingStream(recording.Id, cancellationToken).ConfigureAwait(false);
_logger.Info("Opening recording stream from {0}, external recording Id: {1}", service.Name, recording.RecordingInfo.Id);
info = await service.GetRecordingStream(recording.RecordingInfo.Id, cancellationToken).ConfigureAwait(false);
}
_logger.Info("Live stream info: {0}", _jsonSerializer.SerializeToString(info));
@ -668,13 +659,13 @@ namespace MediaBrowser.Server.Implementations.LiveTv
if (query.ChannelIdList.Length > 0)
{
var guids = query.ChannelIdList.Select(i => new Guid(i)).ToList();
var serviceName = ActiveService.Name;
programs = programs.Where(i =>
{
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);
});
@ -1030,14 +1021,6 @@ namespace MediaBrowser.Server.Implementations.LiveTv
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 numComplete = 0;
@ -1223,28 +1206,6 @@ namespace MediaBrowser.Server.Implementations.LiveTv
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)
{
var service = ActiveService;
@ -1299,8 +1260,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv
throw new ResourceNotFoundException(string.Format("Recording with Id {0} not found", recordingId));
}
var service = GetServices(recording.ServiceName, null)
.First();
var service = GetService(recording.ServiceName);
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));
}
var service = GetServices(timer.ServiceName, null)
.First();
var service = GetService(timer.ServiceName);
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));
}
var service = GetServices(timer.ServiceName, null)
.First();
var service = GetService(timer.ServiceName);
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)
{
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);
@ -1531,7 +1489,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv
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);
@ -1546,7 +1504,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv
{
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);
}
@ -1555,7 +1513,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv
{
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);
}
@ -1821,16 +1779,10 @@ namespace MediaBrowser.Server.Implementations.LiveTv
var services = await GetServiceInfos(CancellationToken.None).ConfigureAwait(false);
var servicesList = services.ToList();
var activeServiceInfo = ActiveService == null ? null :
servicesList.FirstOrDefault(i => string.Equals(i.Name, ActiveService.Name, StringComparison.OrdinalIgnoreCase));
var info = new LiveTvInfo
{
Services = servicesList.ToList(),
ActiveServiceName = activeServiceInfo == null ? null : activeServiceInfo.Name,
IsEnabled = ActiveService != null,
Status = activeServiceInfo == null ? LiveTvServiceStatus.Unavailable : activeServiceInfo.Status,
StatusMessage = activeServiceInfo == null ? null : activeServiceInfo.StatusMessage
IsEnabled = servicesList.Count > 0
};
info.EnabledUsers = _userManager.Users

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

@ -415,9 +415,8 @@
"TitleLiveTV": "Live TV",
"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.",
"LabelActiveService": "Active Service:",
"LabelActiveServiceHelp": "Multiple tv plugins can be installed but only one can be active at a time.",
"OptionAutomatic": "Auto",
"HeaderServices": "Services",
"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.",
"LabelCustomizeOptionsPerMediaType": "Customize for media type:",

Loading…
Cancel
Save