瀏覽代碼

Merge pull request #10951 from barronpm/livetv-di

Live TV DI
Cody Robibero 1 年之前
父節點
當前提交
ccfc85af11

+ 0 - 2
Emby.Server.Implementations/ApplicationHost.cs

@@ -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>());
         }
         }
 
 

+ 0 - 7
MediaBrowser.Controller/LiveTv/ILiveTvManager.cs

@@ -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>

+ 19 - 10
src/Jellyfin.LiveTv/EmbyTV/EmbyTV.cs

@@ -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>();

+ 4 - 0
src/Jellyfin.LiveTv/Extensions/LiveTvServiceCollectionExtensions.cs

@@ -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>();
     }
     }
 }
 }

+ 11 - 37
src/Jellyfin.LiveTv/LiveTvManager.cs

@@ -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 ILiveTvService[] _services = Array.Empty<ILiveTvService>();
-        private IListingsProvider[] _listingProviders = Array.Empty<IListingsProvider>();
+        private readonly ILiveTvService[] _services;
+        private readonly IListingsProvider[] _listingProviders;
 
 
         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);