commit
0dd43ed529
|
@ -484,6 +484,30 @@ namespace MediaBrowser.Api.LiveTv
|
|||
{
|
||||
}
|
||||
|
||||
[Route("/LiveTv/ChannelMappingOptions")]
|
||||
[Authenticated(AllowBeforeStartupWizard = true)]
|
||||
public class GetChannelMappingOptions
|
||||
{
|
||||
[ApiMember(Name = "Id", Description = "Provider id", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "GET")]
|
||||
public string ProviderId { get; set; }
|
||||
}
|
||||
|
||||
public class ChannelMappingOptions
|
||||
{
|
||||
public List<TunerChannelMapping> TunerChannels { get; set; }
|
||||
public List<NameIdPair> ProviderChannels { get; set; }
|
||||
public List<NameValuePair> Mappings { get; set; }
|
||||
public string ProviderName { get; set; }
|
||||
}
|
||||
|
||||
public class TunerChannelMapping
|
||||
{
|
||||
public string Name { get; set; }
|
||||
public string Number { get; set; }
|
||||
public string ProviderChannelNumber { get; set; }
|
||||
public string ProviderChannelName { get; set; }
|
||||
}
|
||||
|
||||
[Route("/LiveTv/Registration", "GET")]
|
||||
[Authenticated]
|
||||
public class GetLiveTvRegistrationInfo : IReturn<MBRegistrationRecord>
|
||||
|
@ -550,6 +574,66 @@ namespace MediaBrowser.Api.LiveTv
|
|||
return ToOptimizedResult(result);
|
||||
}
|
||||
|
||||
public async Task<object> Get(GetChannelMappingOptions request)
|
||||
{
|
||||
var config = GetConfiguration();
|
||||
|
||||
var listingProvider = config.ListingProviders.First(i => string.Equals(request.ProviderId, i.Id, StringComparison.OrdinalIgnoreCase));
|
||||
|
||||
var tunerChannels = await _liveTvManager.GetChannelsForListingsProvider(request.ProviderId, CancellationToken.None)
|
||||
.ConfigureAwait(false);
|
||||
|
||||
var providerChannels = await _liveTvManager.GetChannelsFromListingsProviderData(request.ProviderId, CancellationToken.None)
|
||||
.ConfigureAwait(false);
|
||||
|
||||
var mappings = listingProvider.ChannelMappings.ToList();
|
||||
|
||||
var result = new ChannelMappingOptions
|
||||
{
|
||||
TunerChannels = tunerChannels.Select(i => GetTunerChannelMapping(i, mappings, providerChannels)).ToList(),
|
||||
|
||||
ProviderChannels = providerChannels.Select(i => new NameIdPair
|
||||
{
|
||||
Name = i.Name,
|
||||
Id = i.Number
|
||||
|
||||
}).ToList(),
|
||||
|
||||
Mappings = mappings,
|
||||
|
||||
ProviderName = "Schedules Direct"
|
||||
};
|
||||
|
||||
return ToOptimizedResult(result);
|
||||
}
|
||||
|
||||
private TunerChannelMapping GetTunerChannelMapping(ChannelInfo channel, List<NameValuePair> mappings, List<ChannelInfo> providerChannels)
|
||||
{
|
||||
var result = new TunerChannelMapping
|
||||
{
|
||||
Name = channel.Number + " " + channel.Name,
|
||||
Number = channel.Number
|
||||
};
|
||||
|
||||
var mapping = mappings.FirstOrDefault(i => string.Equals(i.Name, channel.Number, StringComparison.OrdinalIgnoreCase));
|
||||
var providerChannelNumber = channel.Number;
|
||||
|
||||
if (mapping != null)
|
||||
{
|
||||
providerChannelNumber = mapping.Value;
|
||||
}
|
||||
|
||||
var providerChannel = providerChannels.FirstOrDefault(i => string.Equals(i.Number, providerChannelNumber, StringComparison.OrdinalIgnoreCase));
|
||||
|
||||
if (providerChannel != null)
|
||||
{
|
||||
result.ProviderChannelNumber = providerChannel.Number;
|
||||
result.ProviderChannelName = providerChannel.Name;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public object Get(GetSatIniMappings request)
|
||||
{
|
||||
return ToOptimizedResult(_liveTvManager.GetSatIniMappings());
|
||||
|
|
|
@ -1236,6 +1236,12 @@ namespace MediaBrowser.Api.Playback
|
|||
{
|
||||
var inputVideoCodec = videoStream == null ? null : videoStream.Codec;
|
||||
bitrate = ResolutionNormalizer.ScaleBitrate(bitrate.Value, inputVideoCodec, outputVideoCodec);
|
||||
|
||||
// If a max bitrate was requested, don't let the scaled bitrate exceed it
|
||||
if (request.VideoBitRate.HasValue)
|
||||
{
|
||||
bitrate = Math.Min(bitrate.Value, request.VideoBitRate.Value);
|
||||
}
|
||||
}
|
||||
|
||||
return bitrate;
|
||||
|
|
|
@ -387,7 +387,8 @@ namespace MediaBrowser.Controller.LiveTv
|
|||
|
||||
Task<List<ChannelInfo>> GetSatChannelScanResult(TunerHostInfo info, CancellationToken cancellationToken);
|
||||
|
||||
Task<List<ChannelInfo>> GetChannelsFromListingsProvider(string id, CancellationToken cancellationToken);
|
||||
Task<List<ChannelInfo>> GetChannelsForListingsProvider(string id, CancellationToken cancellationToken);
|
||||
Task<List<ChannelInfo>> GetChannelsFromListingsProviderData(string id, CancellationToken cancellationToken);
|
||||
|
||||
event EventHandler<GenericEventArgs<TimerEventInfo>> SeriesTimerCancelled;
|
||||
event EventHandler<GenericEventArgs<TimerEventInfo>> TimerCancelled;
|
||||
|
|
|
@ -226,4 +226,23 @@ namespace MediaBrowser.Controller.LiveTv
|
|||
/// <returns>Task.</returns>
|
||||
Task ResetTuner(string id, CancellationToken cancellationToken);
|
||||
}
|
||||
|
||||
public interface ISupportsNewTimerIds
|
||||
{
|
||||
/// <summary>
|
||||
/// Creates the timer asynchronous.
|
||||
/// </summary>
|
||||
/// <param name="info">The information.</param>
|
||||
/// <param name="cancellationToken">The cancellation token.</param>
|
||||
/// <returns>Task.</returns>
|
||||
Task<string> CreateTimer(TimerInfo info, CancellationToken cancellationToken);
|
||||
|
||||
/// <summary>
|
||||
/// Creates the series timer asynchronous.
|
||||
/// </summary>
|
||||
/// <param name="info">The information.</param>
|
||||
/// <param name="cancellationToken">The cancellation token.</param>
|
||||
/// <returns>Task.</returns>
|
||||
Task<string> CreateSeriesTimer(SeriesTimerInfo info, CancellationToken cancellationToken);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1015,17 +1015,17 @@ namespace MediaBrowser.Dlna.Didl
|
|||
int? width = null;
|
||||
int? height = null;
|
||||
|
||||
//try
|
||||
//{
|
||||
// var size = _imageProcessor.GetImageSize(imageInfo);
|
||||
try
|
||||
{
|
||||
var size = _imageProcessor.GetImageSize(imageInfo);
|
||||
|
||||
// width = Convert.ToInt32(size.Width);
|
||||
// height = Convert.ToInt32(size.Height);
|
||||
//}
|
||||
//catch
|
||||
//{
|
||||
width = Convert.ToInt32(size.Width);
|
||||
height = Convert.ToInt32(size.Height);
|
||||
}
|
||||
catch
|
||||
{
|
||||
|
||||
//}
|
||||
}
|
||||
|
||||
var inputFormat = (Path.GetExtension(imageInfo.Path) ?? string.Empty)
|
||||
.TrimStart('.')
|
||||
|
|
|
@ -425,6 +425,12 @@ namespace MediaBrowser.MediaEncoding.Encoder
|
|||
{
|
||||
var inputVideoCodec = videoStream == null ? null : videoStream.Codec;
|
||||
bitrate = ResolutionNormalizer.ScaleBitrate(bitrate.Value, inputVideoCodec, outputVideoCodec);
|
||||
|
||||
// If a max bitrate was requested, don't let the scaled bitrate exceed it
|
||||
if (request.VideoBitRate.HasValue)
|
||||
{
|
||||
bitrate = Math.Min(bitrate.Value, request.VideoBitRate.Value);
|
||||
}
|
||||
}
|
||||
|
||||
return bitrate;
|
||||
|
|
|
@ -35,7 +35,7 @@ using Microsoft.Win32;
|
|||
|
||||
namespace MediaBrowser.Server.Implementations.LiveTv.EmbyTV
|
||||
{
|
||||
public class EmbyTV : ILiveTvService, IHasRegistrationInfo, IDisposable
|
||||
public class EmbyTV : ILiveTvService, ISupportsNewTimerIds, IHasRegistrationInfo, IDisposable
|
||||
{
|
||||
private readonly IApplicationHost _appHpst;
|
||||
private readonly ILogger _logger;
|
||||
|
@ -382,6 +382,29 @@ namespace MediaBrowser.Server.Implementations.LiveTv.EmbyTV
|
|||
return list;
|
||||
}
|
||||
|
||||
public async Task<List<ChannelInfo>> GetChannelsForListingsProvider(ListingsProviderInfo listingsProvider, CancellationToken cancellationToken)
|
||||
{
|
||||
var list = new List<ChannelInfo>();
|
||||
|
||||
foreach (var hostInstance in _liveTvManager.TunerHosts)
|
||||
{
|
||||
try
|
||||
{
|
||||
var channels = await hostInstance.GetChannels(cancellationToken).ConfigureAwait(false);
|
||||
|
||||
list.AddRange(channels);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.ErrorException("Error getting channels", ex);
|
||||
}
|
||||
}
|
||||
|
||||
return list
|
||||
.Where(i => IsListingProviderEnabledForTuner(listingsProvider, i.TunerHostId))
|
||||
.ToList();
|
||||
}
|
||||
|
||||
public Task<IEnumerable<ChannelInfo>> GetChannelsAsync(CancellationToken cancellationToken)
|
||||
{
|
||||
return GetChannelsAsync(false, cancellationToken);
|
||||
|
@ -435,12 +458,22 @@ namespace MediaBrowser.Server.Implementations.LiveTv.EmbyTV
|
|||
|
||||
public Task CreateTimerAsync(TimerInfo info, CancellationToken cancellationToken)
|
||||
{
|
||||
info.Id = Guid.NewGuid().ToString("N");
|
||||
_timerProvider.Add(info);
|
||||
return Task.FromResult(0);
|
||||
return CreateTimer(info, cancellationToken);
|
||||
}
|
||||
|
||||
public async Task CreateSeriesTimerAsync(SeriesTimerInfo info, CancellationToken cancellationToken)
|
||||
public Task CreateSeriesTimerAsync(SeriesTimerInfo info, CancellationToken cancellationToken)
|
||||
{
|
||||
return CreateSeriesTimer(info, cancellationToken);
|
||||
}
|
||||
|
||||
public Task<string> CreateTimer(TimerInfo info, CancellationToken cancellationToken)
|
||||
{
|
||||
info.Id = Guid.NewGuid().ToString("N");
|
||||
_timerProvider.Add(info);
|
||||
return Task.FromResult(info.Id);
|
||||
}
|
||||
|
||||
public async Task<string> CreateSeriesTimer(SeriesTimerInfo info, CancellationToken cancellationToken)
|
||||
{
|
||||
info.Id = Guid.NewGuid().ToString("N");
|
||||
|
||||
|
@ -470,6 +503,8 @@ namespace MediaBrowser.Server.Implementations.LiveTv.EmbyTV
|
|||
|
||||
_seriesTimerProvider.Add(info);
|
||||
await UpdateTimersForSeriesTimer(epgData, info, false).ConfigureAwait(false);
|
||||
|
||||
return info.Id;
|
||||
}
|
||||
|
||||
public async Task UpdateSeriesTimerAsync(SeriesTimerInfo info, CancellationToken cancellationToken)
|
||||
|
|
|
@ -506,8 +506,8 @@ namespace MediaBrowser.Server.Implementations.LiveTv.Listings
|
|||
}
|
||||
|
||||
private async Task<List<ScheduleDirect.ShowImages>> GetImageForPrograms(
|
||||
ListingsProviderInfo info,
|
||||
List<string> programIds,
|
||||
ListingsProviderInfo info,
|
||||
List<string> programIds,
|
||||
CancellationToken cancellationToken)
|
||||
{
|
||||
var imageIdString = "[";
|
||||
|
@ -564,7 +564,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv.Listings
|
|||
|
||||
try
|
||||
{
|
||||
using (Stream responce = await Get(options, false, info).ConfigureAwait(false))
|
||||
using (Stream responce = await Get(options, false, info).ConfigureAwait(false))
|
||||
{
|
||||
var root = _jsonSerializer.DeserializeFromStream<List<ScheduleDirect.Headends>>(responce);
|
||||
|
||||
|
@ -666,58 +666,60 @@ namespace MediaBrowser.Server.Implementations.LiveTv.Listings
|
|||
}
|
||||
}
|
||||
|
||||
private async Task<HttpResponseInfo> Post(HttpRequestOptions options,
|
||||
bool enableRetry,
|
||||
ListingsProviderInfo providerInfo)
|
||||
private async Task<HttpResponseInfo> Post(HttpRequestOptions options,
|
||||
bool enableRetry,
|
||||
ListingsProviderInfo providerInfo)
|
||||
{
|
||||
try
|
||||
{
|
||||
return await _httpClient.Post(options).ConfigureAwait(false);
|
||||
}
|
||||
catch (HttpException ex)
|
||||
{
|
||||
_tokens.Clear();
|
||||
}
|
||||
catch (HttpException ex)
|
||||
{
|
||||
_tokens.Clear();
|
||||
|
||||
if (!ex.StatusCode.HasValue || (int)ex.StatusCode.Value >= 500)
|
||||
{
|
||||
enableRetry = false;
|
||||
}
|
||||
if (!ex.StatusCode.HasValue || (int)ex.StatusCode.Value >= 500)
|
||||
{
|
||||
enableRetry = false;
|
||||
}
|
||||
|
||||
if (!enableRetry) {
|
||||
throw;
|
||||
}
|
||||
}
|
||||
if (!enableRetry)
|
||||
{
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
var newToken = await GetToken (providerInfo, options.CancellationToken).ConfigureAwait (false);
|
||||
options.RequestHeaders ["token"] = newToken;
|
||||
return await Post (options, false, providerInfo).ConfigureAwait (false);
|
||||
var newToken = await GetToken(providerInfo, options.CancellationToken).ConfigureAwait(false);
|
||||
options.RequestHeaders["token"] = newToken;
|
||||
return await Post(options, false, providerInfo).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
private async Task<Stream> Get(HttpRequestOptions options,
|
||||
bool enableRetry,
|
||||
ListingsProviderInfo providerInfo)
|
||||
private async Task<Stream> Get(HttpRequestOptions options,
|
||||
bool enableRetry,
|
||||
ListingsProviderInfo providerInfo)
|
||||
{
|
||||
try
|
||||
{
|
||||
return await _httpClient.Get(options).ConfigureAwait(false);
|
||||
}
|
||||
catch (HttpException ex)
|
||||
{
|
||||
_tokens.Clear();
|
||||
}
|
||||
catch (HttpException ex)
|
||||
{
|
||||
_tokens.Clear();
|
||||
|
||||
if (!ex.StatusCode.HasValue || (int)ex.StatusCode.Value >= 500)
|
||||
{
|
||||
enableRetry = false;
|
||||
}
|
||||
if (!ex.StatusCode.HasValue || (int)ex.StatusCode.Value >= 500)
|
||||
{
|
||||
enableRetry = false;
|
||||
}
|
||||
|
||||
if (!enableRetry) {
|
||||
throw;
|
||||
}
|
||||
}
|
||||
if (!enableRetry)
|
||||
{
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
var newToken = await GetToken (providerInfo, options.CancellationToken).ConfigureAwait (false);
|
||||
options.RequestHeaders ["token"] = newToken;
|
||||
return await Get (options, false, providerInfo).ConfigureAwait (false);
|
||||
var newToken = await GetToken(providerInfo, options.CancellationToken).ConfigureAwait(false);
|
||||
options.RequestHeaders["token"] = newToken;
|
||||
return await Get(options, false, providerInfo).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
private async Task<string> GetTokenInternal(string username, string password,
|
||||
|
@ -734,7 +736,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv.Listings
|
|||
//_logger.Info("Obtaining token from Schedules Direct from addres: " + httpOptions.Url + " with body " +
|
||||
// httpOptions.RequestContent);
|
||||
|
||||
using (var responce = await Post(httpOptions, false, null).ConfigureAwait(false))
|
||||
using (var responce = await Post(httpOptions, false, null).ConfigureAwait(false))
|
||||
{
|
||||
var root = _jsonSerializer.DeserializeFromStream<ScheduleDirect.Token>(responce.Content);
|
||||
if (root.message == "OK")
|
||||
|
@ -816,7 +818,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv.Listings
|
|||
|
||||
try
|
||||
{
|
||||
using (var response = await Get(options, false, null).ConfigureAwait(false))
|
||||
using (var response = await Get(options, false, null).ConfigureAwait(false))
|
||||
{
|
||||
var root = _jsonSerializer.DeserializeFromStream<ScheduleDirect.Lineups>(response);
|
||||
|
||||
|
@ -871,7 +873,63 @@ namespace MediaBrowser.Server.Implementations.LiveTv.Listings
|
|||
|
||||
public async Task<List<ChannelInfo>> GetChannels(ListingsProviderInfo info, CancellationToken cancellationToken)
|
||||
{
|
||||
return new List<ChannelInfo>();
|
||||
var listingsId = info.ListingsId;
|
||||
if (string.IsNullOrWhiteSpace(listingsId))
|
||||
{
|
||||
throw new Exception("ListingsId required");
|
||||
}
|
||||
|
||||
var token = await GetToken(info, cancellationToken);
|
||||
|
||||
if (string.IsNullOrWhiteSpace(token))
|
||||
{
|
||||
throw new Exception("token required");
|
||||
}
|
||||
|
||||
ClearPairCache(listingsId);
|
||||
|
||||
var httpOptions = new HttpRequestOptions()
|
||||
{
|
||||
Url = ApiUrl + "/lineups/" + listingsId,
|
||||
UserAgent = UserAgent,
|
||||
CancellationToken = cancellationToken,
|
||||
LogErrorResponseBody = true,
|
||||
// The data can be large so give it some extra time
|
||||
TimeoutMs = 60000
|
||||
};
|
||||
|
||||
httpOptions.RequestHeaders["token"] = token;
|
||||
|
||||
var list = new List<ChannelInfo>();
|
||||
|
||||
using (var response = await Get(httpOptions, true, info).ConfigureAwait(false))
|
||||
{
|
||||
var root = _jsonSerializer.DeserializeFromStream<ScheduleDirect.Channel>(response);
|
||||
_logger.Info("Found " + root.map.Count + " channels on the lineup on ScheduleDirect");
|
||||
_logger.Info("Mapping Stations to Channel");
|
||||
foreach (ScheduleDirect.Map map in root.map)
|
||||
{
|
||||
var channelNumber = map.logicalChannelNumber;
|
||||
|
||||
if (string.IsNullOrWhiteSpace(channelNumber))
|
||||
{
|
||||
channelNumber = map.channel;
|
||||
}
|
||||
if (string.IsNullOrWhiteSpace(channelNumber))
|
||||
{
|
||||
channelNumber = map.atscMajor + "." + map.atscMinor;
|
||||
}
|
||||
channelNumber = channelNumber.TrimStart('0');
|
||||
|
||||
list.Add(new ChannelInfo
|
||||
{
|
||||
Number = channelNumber,
|
||||
Name = map.channel
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
public class ScheduleDirect
|
||||
|
|
|
@ -2013,7 +2013,18 @@ namespace MediaBrowser.Server.Implementations.LiveTv
|
|||
var defaultValues = await service.GetNewTimerDefaultsAsync(cancellationToken).ConfigureAwait(false);
|
||||
info.Priority = defaultValues.Priority;
|
||||
|
||||
await service.CreateTimerAsync(info, cancellationToken).ConfigureAwait(false);
|
||||
string newTimerId = null;
|
||||
var supportsNewTimerIds = service as ISupportsNewTimerIds;
|
||||
if (supportsNewTimerIds != null)
|
||||
{
|
||||
newTimerId = await supportsNewTimerIds.CreateTimer(info, cancellationToken).ConfigureAwait(false);
|
||||
newTimerId = _tvDtoService.GetInternalTimerId(timer.ServiceName, newTimerId).ToString("N");
|
||||
}
|
||||
else
|
||||
{
|
||||
await service.CreateTimerAsync(info, cancellationToken).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
_lastRecordingRefreshTime = DateTime.MinValue;
|
||||
_logger.Info("New recording scheduled");
|
||||
|
||||
|
@ -2021,7 +2032,8 @@ namespace MediaBrowser.Server.Implementations.LiveTv
|
|||
{
|
||||
Argument = new TimerEventInfo
|
||||
{
|
||||
ProgramId = info.ProgramId
|
||||
ProgramId = _tvDtoService.GetInternalProgramId(timer.ServiceName, info.ProgramId).ToString("N"),
|
||||
Id = newTimerId
|
||||
}
|
||||
}, _logger);
|
||||
}
|
||||
|
@ -2036,14 +2048,26 @@ namespace MediaBrowser.Server.Implementations.LiveTv
|
|||
var defaultValues = await service.GetNewTimerDefaultsAsync(cancellationToken).ConfigureAwait(false);
|
||||
info.Priority = defaultValues.Priority;
|
||||
|
||||
await service.CreateSeriesTimerAsync(info, cancellationToken).ConfigureAwait(false);
|
||||
string newTimerId = null;
|
||||
var supportsNewTimerIds = service as ISupportsNewTimerIds;
|
||||
if (supportsNewTimerIds != null)
|
||||
{
|
||||
newTimerId = await supportsNewTimerIds.CreateSeriesTimer(info, cancellationToken).ConfigureAwait(false);
|
||||
newTimerId = _tvDtoService.GetInternalSeriesTimerId(timer.ServiceName, newTimerId).ToString("N");
|
||||
}
|
||||
else
|
||||
{
|
||||
await service.CreateSeriesTimerAsync(info, cancellationToken).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
_lastRecordingRefreshTime = DateTime.MinValue;
|
||||
|
||||
EventHelper.QueueEventIfNotNull(SeriesTimerCreated, this, new GenericEventArgs<TimerEventInfo>
|
||||
{
|
||||
Argument = new TimerEventInfo
|
||||
{
|
||||
ProgramId = info.ProgramId
|
||||
ProgramId = _tvDtoService.GetInternalProgramId(timer.ServiceName, info.ProgramId).ToString("N"),
|
||||
Id = newTimerId
|
||||
}
|
||||
}, _logger);
|
||||
}
|
||||
|
@ -2561,7 +2585,13 @@ namespace MediaBrowser.Server.Implementations.LiveTv
|
|||
return new TunerHosts.SatIp.ChannelScan(_logger).Scan(info, cancellationToken);
|
||||
}
|
||||
|
||||
public Task<List<ChannelInfo>> GetChannelsFromListingsProvider(string id, CancellationToken cancellationToken)
|
||||
public Task<List<ChannelInfo>> GetChannelsForListingsProvider(string id, CancellationToken cancellationToken)
|
||||
{
|
||||
var info = GetConfiguration().ListingProviders.First(i => string.Equals(i.Id, id, StringComparison.OrdinalIgnoreCase));
|
||||
return EmbyTV.EmbyTV.Current.GetChannelsForListingsProvider(info, cancellationToken);
|
||||
}
|
||||
|
||||
public Task<List<ChannelInfo>> GetChannelsFromListingsProviderData(string id, CancellationToken cancellationToken)
|
||||
{
|
||||
var info = GetConfiguration().ListingProviders.First(i => string.Equals(i.Id, id, StringComparison.OrdinalIgnoreCase));
|
||||
var provider = _listingProviders.First(i => string.Equals(i.Type, info.Type, StringComparison.OrdinalIgnoreCase));
|
||||
|
|
|
@ -104,6 +104,9 @@
|
|||
<Content Include="dashboard-ui\components\apphost.js">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Include="dashboard-ui\components\channelmapper\channelmapper.js">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Include="dashboard-ui\components\chromecasthelpers.js">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
|
|
Loading…
Reference in New Issue
Block a user