Skip to content

Commit

Permalink
Merge pull request jellyfin#10951 from barronpm/livetv-di
Browse files Browse the repository at this point in the history
Live TV DI
  • Loading branch information
crobibero authored and KrzaQ committed Feb 13, 2024
2 parents 453c117 + 269d4ad commit 956bf29
Show file tree
Hide file tree
Showing 5 changed files with 34 additions and 56 deletions.
2 changes: 0 additions & 2 deletions Emby.Server.Implementations/ApplicationHost.cs
Original file line number Diff line number Diff line change
Expand Up @@ -695,8 +695,6 @@ private void FindParts()
GetExports<IMetadataSaver>(),
GetExports<IExternalId>());

Resolve<ILiveTvManager>().AddParts(GetExports<ILiveTvService>(), GetExports<IListingsProvider>());

Resolve<IMediaSourceManager>().AddParts(GetExports<IMediaSourceProvider>());
}

Expand Down
7 changes: 0 additions & 7 deletions MediaBrowser.Controller/LiveTv/ILiveTvManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -67,13 +67,6 @@ public interface ILiveTvManager
/// <returns>Task.</returns>
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>
/// Gets the timer.
/// </summary>
Expand Down
29 changes: 19 additions & 10 deletions src/Jellyfin.LiveTv/EmbyTV/EmbyTV.cs
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,6 @@ public sealed class EmbyTV : ILiveTvService, ISupportsDirectStreamProvider, ISup
private readonly ItemDataProvider<SeriesTimerInfo> _seriesTimerProvider;
private readonly TimerManager _timerProvider;

private readonly LiveTvManager _liveTvManager;
private readonly ITunerHostManager _tunerHostManager;
private readonly IFileSystem _fileSystem;

Expand All @@ -62,6 +61,8 @@ public sealed class EmbyTV : ILiveTvService, ISupportsDirectStreamProvider, ISup
private readonly IMediaEncoder _mediaEncoder;
private readonly IMediaSourceManager _mediaSourceManager;
private readonly IStreamHelper _streamHelper;
private readonly LiveTvDtoService _tvDtoService;
private readonly IListingsProvider[] _listingsProviders;

private readonly ConcurrentDictionary<string, ActiveRecordingInfo> _activeRecordings =
new ConcurrentDictionary<string, ActiveRecordingInfo>(StringComparer.OrdinalIgnoreCase);
Expand All @@ -79,13 +80,14 @@ public sealed class EmbyTV : ILiveTvService, ISupportsDirectStreamProvider, ISup
ILogger<EmbyTV> logger,
IHttpClientFactory httpClientFactory,
IServerConfigurationManager config,
ILiveTvManager liveTvManager,
ITunerHostManager tunerHostManager,
IFileSystem fileSystem,
ILibraryManager libraryManager,
ILibraryMonitor libraryMonitor,
IProviderManager providerManager,
IMediaEncoder mediaEncoder)
IMediaEncoder mediaEncoder,
LiveTvDtoService tvDtoService,
IEnumerable<IListingsProvider> listingsProviders)
{
Current = this;

Expand All @@ -97,10 +99,11 @@ public sealed class EmbyTV : ILiveTvService, ISupportsDirectStreamProvider, ISup
_libraryMonitor = libraryMonitor;
_providerManager = providerManager;
_mediaEncoder = mediaEncoder;
_liveTvManager = (LiveTvManager)liveTvManager;
_tvDtoService = tvDtoService;
_tunerHostManager = tunerHostManager;
_mediaSourceManager = mediaSourceManager;
_streamHelper = streamHelper;
_listingsProviders = listingsProviders.ToArray();

_seriesTimerProvider = new SeriesTimerManager(_logger, Path.Combine(DataPath, "seriestimers.json"));
_timerProvider = new TimerManager(_logger, Path.Combine(DataPath, "timers.json"));
Expand Down Expand Up @@ -938,7 +941,7 @@ public async Task<IEnumerable<ProgramInfo>> GetProgramsAsync(string channelId, D
return _config.GetLiveTvConfiguration().ListingProviders
.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);
})
Expand Down Expand Up @@ -1182,6 +1185,12 @@ private string GetRecordingPath(TimerInfo timer, RemoteSearchResult metadata, ou
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)
{
ArgumentNullException.ThrowIfNull(timer);
Expand All @@ -1207,7 +1216,7 @@ private async Task RecordStream(TimerInfo timer, DateTime recordingEndDate, Acti
var remoteMetadata = await FetchInternetMetadata(timer, CancellationToken.None).ConfigureAwait(false);
var recordPath = GetRecordingPath(timer, remoteMetadata, out string seriesPath);

var channelItem = _liveTvManager.GetLiveTvChannel(timer, this);
var channelItem = GetLiveTvChannel(timer);

string liveStreamId = null;
RecordingStatus recordingStatus;
Expand Down Expand Up @@ -2084,7 +2093,7 @@ private LiveTvProgram GetProgramInfoFromCache(string programId)
{
var query = new InternalItemsQuery
{
ItemIds = new[] { _liveTvManager.GetInternalProgramId(programId) },
ItemIds = [_tvDtoService.GetInternalProgramId(programId)],
Limit = 1,
DtoOptions = new DtoOptions()
};
Expand Down Expand Up @@ -2114,7 +2123,7 @@ private LiveTvProgram GetProgramInfoFromCache(string channelId, DateTime startDa

if (!string.IsNullOrWhiteSpace(channelId))
{
query.ChannelIds = new[] { _liveTvManager.GetInternalChannelId(Name, channelId) };
query.ChannelIds = [_tvDtoService.GetInternalChannelId(Name, channelId)];
}

return _libraryManager.GetItemList(query).Cast<LiveTvProgram>().FirstOrDefault();
Expand Down Expand Up @@ -2150,7 +2159,7 @@ private bool ShouldCancelTimerForSeriesTimer(SeriesTimerInfo seriesTimer, TimerI
private void HandleDuplicateShowIds(List<TimerInfo> timers)
{
// 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;
_timerProvider.Update(timer);
Expand Down Expand Up @@ -2300,7 +2309,7 @@ private IEnumerable<TimerInfo> GetTimersForSeries(SeriesTimerInfo seriesTimer)

if (!seriesTimer.RecordAnyChannel)
{
query.ChannelIds = new[] { _liveTvManager.GetInternalChannelId(Name, seriesTimer.ChannelId) };
query.ChannelIds = [_tvDtoService.GetInternalChannelId(Name, seriesTimer.ChannelId)];
}

var tempChannelCache = new Dictionary<Guid, LiveTvChannel>();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using Jellyfin.LiveTv.Channels;
using Jellyfin.LiveTv.Guide;
using Jellyfin.LiveTv.Listings;
using Jellyfin.LiveTv.TunerHosts;
using Jellyfin.LiveTv.TunerHosts.HdHomerun;
using MediaBrowser.Controller.Channels;
Expand Down Expand Up @@ -27,7 +28,10 @@ public static void AddLiveTvServices(this IServiceCollection services)
services.AddSingleton<ITunerHostManager, TunerHostManager>();
services.AddSingleton<IGuideManager, GuideManager>();

services.AddSingleton<ILiveTvService, EmbyTV.EmbyTV>();
services.AddSingleton<ITunerHost, HdHomerunHost>();
services.AddSingleton<ITunerHost, M3UTunerHost>();
services.AddSingleton<IListingsProvider, SchedulesDirect>();
services.AddSingleton<IListingsProvider, XmlTvListingsProvider>();
}
}
48 changes: 11 additions & 37 deletions src/Jellyfin.LiveTv/LiveTvManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -48,9 +48,8 @@ public class LiveTvManager : ILiveTvManager
private readonly ILocalizationManager _localization;
private readonly IChannelManager _channelManager;
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(
IServerConfigurationManager config,
Expand All @@ -62,7 +61,9 @@ public class LiveTvManager : ILiveTvManager
ITaskManager taskManager,
ILocalizationManager localization,
IChannelManager channelManager,
LiveTvDtoService liveTvDtoService)
LiveTvDtoService liveTvDtoService,
IEnumerable<ILiveTvService> services,
IEnumerable<IListingsProvider> listingProviders)
{
_config = config;
_logger = logger;
Expand All @@ -74,6 +75,12 @@ public class LiveTvManager : ILiveTvManager
_userDataManager = userDataManager;
_channelManager = channelManager;
_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;
Expand All @@ -97,23 +104,6 @@ public string GetEmbyTvActiveRecordingPath(string 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)
{
var timerId = e.Argument;
Expand Down Expand Up @@ -1454,12 +1444,6 @@ public async Task<QueryResult<SeriesTimerInfoDto>> GetSeriesTimers(SeriesTimerQu
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)
{
var now = DateTime.UtcNow;
Expand Down Expand Up @@ -1925,16 +1909,6 @@ public Task<List<ChannelInfo>> GetChannelsFromListingsProviderData(string id, Ca
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 />
public Task<BaseItem[]> GetRecordingFoldersAsync(User user)
=> GetRecordingFoldersAsync(user, false);
Expand Down

0 comments on commit 956bf29

Please sign in to comment.