using ErsatzTV.Core.Domain; using ErsatzTV.Core.Extensions; using ErsatzTV.Core.Interfaces.Emby; using ErsatzTV.Core.Interfaces.Metadata; using ErsatzTV.Core.Interfaces.Repositories; using ErsatzTV.Core.Interfaces.Repositories.Caching; using ErsatzTV.Core.Interfaces.Search; using ErsatzTV.Core.Metadata; using MediatR; using Microsoft.Extensions.Logging; namespace ErsatzTV.Core.Emby; public class EmbyTelevisionLibraryScanner : MediaServerTelevisionLibraryScanner, IEmbyTelevisionLibraryScanner { private readonly IEmbyApiClient _embyApiClient; private readonly IMediaSourceRepository _mediaSourceRepository; private readonly IEmbyPathReplacementService _pathReplacementService; private readonly IEmbyTelevisionRepository _televisionRepository; public EmbyTelevisionLibraryScanner( IEmbyApiClient embyApiClient, IMediaSourceRepository mediaSourceRepository, IEmbyTelevisionRepository televisionRepository, ISearchIndex searchIndex, ICachingSearchRepository searchRepository, IFallbackMetadataProvider fallbackMetadataProvider, IEmbyPathReplacementService pathReplacementService, ILocalFileSystem localFileSystem, ILocalStatisticsProvider localStatisticsProvider, ILocalSubtitlesProvider localSubtitlesProvider, IMediator mediator, ILogger logger) : base( localStatisticsProvider, localSubtitlesProvider, localFileSystem, searchRepository, searchIndex, fallbackMetadataProvider, mediator, logger) { _embyApiClient = embyApiClient; _mediaSourceRepository = mediaSourceRepository; _televisionRepository = televisionRepository; _pathReplacementService = pathReplacementService; } public async Task> ScanLibrary( string address, string apiKey, EmbyLibrary library, string ffmpegPath, string ffprobePath, CancellationToken cancellationToken) { List pathReplacements = await _mediaSourceRepository.GetEmbyPathReplacements(library.MediaSourceId); string GetLocalPath(EmbyEpisode episode) { return _pathReplacementService.GetReplacementEmbyPath( pathReplacements, episode.GetHeadVersion().MediaFiles.Head().Path, false); } return await ScanLibrary( _televisionRepository, new EmbyConnectionParameters(address, apiKey), library, GetLocalPath, ffmpegPath, ffprobePath, false, cancellationToken); } protected override Task> CountShowLibraryItems( EmbyConnectionParameters connectionParameters, EmbyLibrary library) => _embyApiClient.GetLibraryItemCount( connectionParameters.Address, connectionParameters.ApiKey, library.ItemId, EmbyItemType.Show); protected override IAsyncEnumerable GetShowLibraryItems( EmbyConnectionParameters connectionParameters, EmbyLibrary library) => _embyApiClient.GetShowLibraryItems(connectionParameters.Address, connectionParameters.ApiKey, library); protected override string MediaServerItemId(EmbyShow show) => show.ItemId; protected override string MediaServerItemId(EmbySeason season) => season.ItemId; protected override string MediaServerItemId(EmbyEpisode episode) => episode.ItemId; protected override string MediaServerEtag(EmbyShow show) => show.Etag; protected override string MediaServerEtag(EmbySeason season) => season.Etag; protected override string MediaServerEtag(EmbyEpisode episode) => episode.Etag; protected override Task> CountSeasonLibraryItems( EmbyConnectionParameters connectionParameters, EmbyLibrary library, EmbyShow show) => _embyApiClient.GetLibraryItemCount( connectionParameters.Address, connectionParameters.ApiKey, show.ItemId, EmbyItemType.Season); protected override IAsyncEnumerable GetSeasonLibraryItems( EmbyLibrary library, EmbyConnectionParameters connectionParameters, EmbyShow show) => _embyApiClient.GetSeasonLibraryItems( connectionParameters.Address, connectionParameters.ApiKey, library, show.ItemId); protected override Task> CountEpisodeLibraryItems( EmbyConnectionParameters connectionParameters, EmbyLibrary library, EmbySeason season) => _embyApiClient.GetLibraryItemCount( connectionParameters.Address, connectionParameters.ApiKey, season.ItemId, EmbyItemType.Episode); protected override IAsyncEnumerable GetEpisodeLibraryItems( EmbyLibrary library, EmbyConnectionParameters connectionParameters, EmbyShow show, EmbySeason season) => _embyApiClient.GetEpisodeLibraryItems( connectionParameters.Address, connectionParameters.ApiKey, library, show.ItemId, season.ItemId); protected override Task> GetFullMetadata( EmbyConnectionParameters connectionParameters, EmbyLibrary library, MediaItemScanResult result, EmbyShow incoming, bool deepScan) => Task.FromResult(Option.None); protected override Task> GetFullMetadata( EmbyConnectionParameters connectionParameters, EmbyLibrary library, MediaItemScanResult result, EmbySeason incoming, bool deepScan) => Task.FromResult(Option.None); protected override Task> GetFullMetadata( EmbyConnectionParameters connectionParameters, EmbyLibrary library, MediaItemScanResult result, EmbyEpisode incoming, bool deepScan) => Task.FromResult(Option.None); protected override Task>> UpdateMetadata( MediaItemScanResult result, ShowMetadata fullMetadata) => Task.FromResult>>(result); protected override Task>> UpdateMetadata( MediaItemScanResult result, SeasonMetadata fullMetadata) => Task.FromResult>>(result); protected override Task>> UpdateMetadata( MediaItemScanResult result, EpisodeMetadata fullMetadata) => Task.FromResult>>(result); }