Merge pull request #10951 from barronpm/livetv-di

Live TV DI
pull/10955/head
Cody Robibero 4 months ago committed by GitHub
commit ccfc85af11
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -695,8 +695,6 @@ namespace Emby.Server.Implementations
GetExports<IMetadataSaver>(), GetExports<IMetadataSaver>(),
GetExports<IExternalId>()); GetExports<IExternalId>());
Resolve<ILiveTvManager>().AddParts(GetExports<ILiveTvService>(), GetExports<IListingsProvider>());
Resolve<IMediaSourceManager>().AddParts(GetExports<IMediaSourceProvider>()); Resolve<IMediaSourceManager>().AddParts(GetExports<IMediaSourceProvider>());
} }

@ -67,13 +67,6 @@ namespace MediaBrowser.Controller.LiveTv
/// <returns>Task.</returns> /// <returns>Task.</returns>
Task CancelSeriesTimer(string id); Task CancelSeriesTimer(string id);
/// <summary>
/// Adds the parts.
/// </summary>
/// <param name="services">The services.</param>
/// <param name="listingProviders">The listing providers.</param>
void AddParts(IEnumerable<ILiveTvService> services, IEnumerable<IListingsProvider> listingProviders);
/// <summary> /// <summary>
/// Gets the timer. /// Gets the timer.
/// </summary> /// </summary>

@ -52,7 +52,6 @@ namespace Jellyfin.LiveTv.EmbyTV
private readonly ItemDataProvider<SeriesTimerInfo> _seriesTimerProvider; private readonly ItemDataProvider<SeriesTimerInfo> _seriesTimerProvider;
private readonly TimerManager _timerProvider; private readonly TimerManager _timerProvider;
private readonly LiveTvManager _liveTvManager;
private readonly ITunerHostManager _tunerHostManager; private readonly ITunerHostManager _tunerHostManager;
private readonly IFileSystem _fileSystem; private readonly IFileSystem _fileSystem;
@ -62,6 +61,8 @@ namespace Jellyfin.LiveTv.EmbyTV
private readonly IMediaEncoder _mediaEncoder; private readonly IMediaEncoder _mediaEncoder;
private readonly IMediaSourceManager _mediaSourceManager; private readonly IMediaSourceManager _mediaSourceManager;
private readonly IStreamHelper _streamHelper; private readonly IStreamHelper _streamHelper;
private readonly LiveTvDtoService _tvDtoService;
private readonly IListingsProvider[] _listingsProviders;
private readonly ConcurrentDictionary<string, ActiveRecordingInfo> _activeRecordings = private readonly ConcurrentDictionary<string, ActiveRecordingInfo> _activeRecordings =
new ConcurrentDictionary<string, ActiveRecordingInfo>(StringComparer.OrdinalIgnoreCase); new ConcurrentDictionary<string, ActiveRecordingInfo>(StringComparer.OrdinalIgnoreCase);
@ -79,13 +80,14 @@ namespace Jellyfin.LiveTv.EmbyTV
ILogger<EmbyTV> logger, ILogger<EmbyTV> logger,
IHttpClientFactory httpClientFactory, IHttpClientFactory httpClientFactory,
IServerConfigurationManager config, IServerConfigurationManager config,
ILiveTvManager liveTvManager,
ITunerHostManager tunerHostManager, ITunerHostManager tunerHostManager,
IFileSystem fileSystem, IFileSystem fileSystem,
ILibraryManager libraryManager, ILibraryManager libraryManager,
ILibraryMonitor libraryMonitor, ILibraryMonitor libraryMonitor,
IProviderManager providerManager, IProviderManager providerManager,
IMediaEncoder mediaEncoder) IMediaEncoder mediaEncoder,
LiveTvDtoService tvDtoService,
IEnumerable<IListingsProvider> listingsProviders)
{ {
Current = this; Current = this;
@ -97,10 +99,11 @@ namespace Jellyfin.LiveTv.EmbyTV
_libraryMonitor = libraryMonitor; _libraryMonitor = libraryMonitor;
_providerManager = providerManager; _providerManager = providerManager;
_mediaEncoder = mediaEncoder; _mediaEncoder = mediaEncoder;
_liveTvManager = (LiveTvManager)liveTvManager; _tvDtoService = tvDtoService;
_tunerHostManager = tunerHostManager; _tunerHostManager = tunerHostManager;
_mediaSourceManager = mediaSourceManager; _mediaSourceManager = mediaSourceManager;
_streamHelper = streamHelper; _streamHelper = streamHelper;
_listingsProviders = listingsProviders.ToArray();
_seriesTimerProvider = new SeriesTimerManager(_logger, Path.Combine(DataPath, "seriestimers.json")); _seriesTimerProvider = new SeriesTimerManager(_logger, Path.Combine(DataPath, "seriestimers.json"));
_timerProvider = new TimerManager(_logger, Path.Combine(DataPath, "timers.json")); _timerProvider = new TimerManager(_logger, Path.Combine(DataPath, "timers.json"));
@ -938,7 +941,7 @@ namespace Jellyfin.LiveTv.EmbyTV
return _config.GetLiveTvConfiguration().ListingProviders return _config.GetLiveTvConfiguration().ListingProviders
.Select(i => .Select(i =>
{ {
var provider = _liveTvManager.ListingProviders.FirstOrDefault(l => string.Equals(l.Type, i.Type, StringComparison.OrdinalIgnoreCase)); var provider = _listingsProviders.FirstOrDefault(l => string.Equals(l.Type, i.Type, StringComparison.OrdinalIgnoreCase));
return provider is null ? null : new Tuple<IListingsProvider, ListingsProviderInfo>(provider, i); return provider is null ? null : new Tuple<IListingsProvider, ListingsProviderInfo>(provider, i);
}) })
@ -1182,6 +1185,12 @@ namespace Jellyfin.LiveTv.EmbyTV
return Path.Combine(recordPath, recordingFileName); return Path.Combine(recordPath, recordingFileName);
} }
private BaseItem GetLiveTvChannel(TimerInfo timer)
{
var internalChannelId = _tvDtoService.GetInternalChannelId(Name, timer.ChannelId);
return _libraryManager.GetItemById(internalChannelId);
}
private async Task RecordStream(TimerInfo timer, DateTime recordingEndDate, ActiveRecordingInfo activeRecordingInfo) private async Task RecordStream(TimerInfo timer, DateTime recordingEndDate, ActiveRecordingInfo activeRecordingInfo)
{ {
ArgumentNullException.ThrowIfNull(timer); ArgumentNullException.ThrowIfNull(timer);
@ -1207,7 +1216,7 @@ namespace Jellyfin.LiveTv.EmbyTV
var remoteMetadata = await FetchInternetMetadata(timer, CancellationToken.None).ConfigureAwait(false); var remoteMetadata = await FetchInternetMetadata(timer, CancellationToken.None).ConfigureAwait(false);
var recordPath = GetRecordingPath(timer, remoteMetadata, out string seriesPath); var recordPath = GetRecordingPath(timer, remoteMetadata, out string seriesPath);
var channelItem = _liveTvManager.GetLiveTvChannel(timer, this); var channelItem = GetLiveTvChannel(timer);
string liveStreamId = null; string liveStreamId = null;
RecordingStatus recordingStatus; RecordingStatus recordingStatus;
@ -2084,7 +2093,7 @@ namespace Jellyfin.LiveTv.EmbyTV
{ {
var query = new InternalItemsQuery var query = new InternalItemsQuery
{ {
ItemIds = new[] { _liveTvManager.GetInternalProgramId(programId) }, ItemIds = [_tvDtoService.GetInternalProgramId(programId)],
Limit = 1, Limit = 1,
DtoOptions = new DtoOptions() DtoOptions = new DtoOptions()
}; };
@ -2114,7 +2123,7 @@ namespace Jellyfin.LiveTv.EmbyTV
if (!string.IsNullOrWhiteSpace(channelId)) if (!string.IsNullOrWhiteSpace(channelId))
{ {
query.ChannelIds = new[] { _liveTvManager.GetInternalChannelId(Name, channelId) }; query.ChannelIds = [_tvDtoService.GetInternalChannelId(Name, channelId)];
} }
return _libraryManager.GetItemList(query).Cast<LiveTvProgram>().FirstOrDefault(); return _libraryManager.GetItemList(query).Cast<LiveTvProgram>().FirstOrDefault();
@ -2150,7 +2159,7 @@ namespace Jellyfin.LiveTv.EmbyTV
private void HandleDuplicateShowIds(List<TimerInfo> timers) private void HandleDuplicateShowIds(List<TimerInfo> timers)
{ {
// sort showings by HD channels first, then by startDate, record earliest showing possible // sort showings by HD channels first, then by startDate, record earliest showing possible
foreach (var timer in timers.OrderByDescending(t => _liveTvManager.GetLiveTvChannel(t, this).IsHD).ThenBy(t => t.StartDate).Skip(1)) foreach (var timer in timers.OrderByDescending(t => GetLiveTvChannel(t).IsHD).ThenBy(t => t.StartDate).Skip(1))
{ {
timer.Status = RecordingStatus.Cancelled; timer.Status = RecordingStatus.Cancelled;
_timerProvider.Update(timer); _timerProvider.Update(timer);
@ -2300,7 +2309,7 @@ namespace Jellyfin.LiveTv.EmbyTV
if (!seriesTimer.RecordAnyChannel) if (!seriesTimer.RecordAnyChannel)
{ {
query.ChannelIds = new[] { _liveTvManager.GetInternalChannelId(Name, seriesTimer.ChannelId) }; query.ChannelIds = [_tvDtoService.GetInternalChannelId(Name, seriesTimer.ChannelId)];
} }
var tempChannelCache = new Dictionary<Guid, LiveTvChannel>(); var tempChannelCache = new Dictionary<Guid, LiveTvChannel>();

@ -1,5 +1,6 @@
using Jellyfin.LiveTv.Channels; using Jellyfin.LiveTv.Channels;
using Jellyfin.LiveTv.Guide; using Jellyfin.LiveTv.Guide;
using Jellyfin.LiveTv.Listings;
using Jellyfin.LiveTv.TunerHosts; using Jellyfin.LiveTv.TunerHosts;
using Jellyfin.LiveTv.TunerHosts.HdHomerun; using Jellyfin.LiveTv.TunerHosts.HdHomerun;
using MediaBrowser.Controller.Channels; using MediaBrowser.Controller.Channels;
@ -27,7 +28,10 @@ public static class LiveTvServiceCollectionExtensions
services.AddSingleton<ITunerHostManager, TunerHostManager>(); services.AddSingleton<ITunerHostManager, TunerHostManager>();
services.AddSingleton<IGuideManager, GuideManager>(); services.AddSingleton<IGuideManager, GuideManager>();
services.AddSingleton<ILiveTvService, EmbyTV.EmbyTV>();
services.AddSingleton<ITunerHost, HdHomerunHost>(); services.AddSingleton<ITunerHost, HdHomerunHost>();
services.AddSingleton<ITunerHost, M3UTunerHost>(); services.AddSingleton<ITunerHost, M3UTunerHost>();
services.AddSingleton<IListingsProvider, SchedulesDirect>();
services.AddSingleton<IListingsProvider, XmlTvListingsProvider>();
} }
} }

@ -47,9 +47,8 @@ namespace Jellyfin.LiveTv
private readonly ILocalizationManager _localization; private readonly ILocalizationManager _localization;
private readonly IChannelManager _channelManager; private readonly IChannelManager _channelManager;
private readonly LiveTvDtoService _tvDtoService; private readonly LiveTvDtoService _tvDtoService;
private readonly ILiveTvService[] _services;
private ILiveTvService[] _services = Array.Empty<ILiveTvService>(); private readonly IListingsProvider[] _listingProviders;
private IListingsProvider[] _listingProviders = Array.Empty<IListingsProvider>();
public LiveTvManager( public LiveTvManager(
IServerConfigurationManager config, IServerConfigurationManager config,
@ -61,7 +60,9 @@ namespace Jellyfin.LiveTv
ITaskManager taskManager, ITaskManager taskManager,
ILocalizationManager localization, ILocalizationManager localization,
IChannelManager channelManager, IChannelManager channelManager,
LiveTvDtoService liveTvDtoService) LiveTvDtoService liveTvDtoService,
IEnumerable<ILiveTvService> services,
IEnumerable<IListingsProvider> listingProviders)
{ {
_config = config; _config = config;
_logger = logger; _logger = logger;
@ -73,6 +74,12 @@ namespace Jellyfin.LiveTv
_userDataManager = userDataManager; _userDataManager = userDataManager;
_channelManager = channelManager; _channelManager = channelManager;
_tvDtoService = liveTvDtoService; _tvDtoService = liveTvDtoService;
_services = services.ToArray();
_listingProviders = listingProviders.ToArray();
var defaultService = _services.OfType<EmbyTV.EmbyTV>().First();
defaultService.TimerCreated += OnEmbyTvTimerCreated;
defaultService.TimerCancelled += OnEmbyTvTimerCancelled;
} }
public event EventHandler<GenericEventArgs<TimerEventInfo>> SeriesTimerCancelled; public event EventHandler<GenericEventArgs<TimerEventInfo>> SeriesTimerCancelled;
@ -96,23 +103,6 @@ namespace Jellyfin.LiveTv
return EmbyTV.EmbyTV.Current.GetActiveRecordingPath(id); return EmbyTV.EmbyTV.Current.GetActiveRecordingPath(id);
} }
/// <inheritdoc />
public void AddParts(IEnumerable<ILiveTvService> services, IEnumerable<IListingsProvider> listingProviders)
{
_services = services.ToArray();
_listingProviders = listingProviders.ToArray();
foreach (var service in _services)
{
if (service is EmbyTV.EmbyTV embyTv)
{
embyTv.TimerCreated += OnEmbyTvTimerCreated;
embyTv.TimerCancelled += OnEmbyTvTimerCancelled;
}
}
}
private void OnEmbyTvTimerCancelled(object sender, GenericEventArgs<string> e) private void OnEmbyTvTimerCancelled(object sender, GenericEventArgs<string> e)
{ {
var timerId = e.Argument; var timerId = e.Argument;
@ -1165,12 +1155,6 @@ namespace Jellyfin.LiveTv
return new QueryResult<SeriesTimerInfoDto>(returnArray); return new QueryResult<SeriesTimerInfoDto>(returnArray);
} }
public BaseItem GetLiveTvChannel(TimerInfo timer, ILiveTvService service)
{
var internalChannelId = _tvDtoService.GetInternalChannelId(service.Name, timer.ChannelId);
return _libraryManager.GetItemById(internalChannelId);
}
public void AddChannelInfo(IReadOnlyCollection<(BaseItemDto ItemDto, LiveTvChannel Channel)> items, DtoOptions options, User user) public void AddChannelInfo(IReadOnlyCollection<(BaseItemDto ItemDto, LiveTvChannel Channel)> items, DtoOptions options, User user)
{ {
var now = DateTime.UtcNow; var now = DateTime.UtcNow;
@ -1636,16 +1620,6 @@ namespace Jellyfin.LiveTv
return provider.GetChannels(info, cancellationToken); return provider.GetChannels(info, cancellationToken);
} }
public Guid GetInternalChannelId(string serviceName, string externalId)
{
return _tvDtoService.GetInternalChannelId(serviceName, externalId);
}
public Guid GetInternalProgramId(string externalId)
{
return _tvDtoService.GetInternalProgramId(externalId);
}
/// <inheritdoc /> /// <inheritdoc />
public Task<BaseItem[]> GetRecordingFoldersAsync(User user) public Task<BaseItem[]> GetRecordingFoldersAsync(User user)
=> GetRecordingFoldersAsync(user, false); => GetRecordingFoldersAsync(user, false);

Loading…
Cancel
Save