using ErsatzTV.Core.Domain; using ErsatzTV.Core.Extensions; using ErsatzTV.Core.Interfaces.Emby; using ErsatzTV.Core.Interfaces.Jellyfin; using ErsatzTV.Core.Interfaces.Plex; using ErsatzTV.Core.Interfaces.Repositories; using ErsatzTV.Infrastructure.Data; using ErsatzTV.Infrastructure.Extensions; using Microsoft.EntityFrameworkCore; using static ErsatzTV.Application.Movies.Mapper; namespace ErsatzTV.Application.Movies; public class GetMovieByIdHandler : IRequestHandler> { private readonly IDbContextFactory _dbContextFactory; private readonly IEmbyPathReplacementService _embyPathReplacementService; private readonly IJellyfinPathReplacementService _jellyfinPathReplacementService; private readonly IMediaSourceRepository _mediaSourceRepository; private readonly IMovieRepository _movieRepository; private readonly IPlexPathReplacementService _plexPathReplacementService; public GetMovieByIdHandler( IDbContextFactory dbContextFactory, IMovieRepository movieRepository, IMediaSourceRepository mediaSourceRepository, IPlexPathReplacementService plexPathReplacementService, IJellyfinPathReplacementService jellyfinPathReplacementService, IEmbyPathReplacementService embyPathReplacementService) { _dbContextFactory = dbContextFactory; _movieRepository = movieRepository; _mediaSourceRepository = mediaSourceRepository; _plexPathReplacementService = plexPathReplacementService; _jellyfinPathReplacementService = jellyfinPathReplacementService; _embyPathReplacementService = embyPathReplacementService; } public async Task> Handle( GetMovieById request, CancellationToken cancellationToken) { await using TvContext dbContext = await _dbContextFactory.CreateDbContextAsync(cancellationToken); Option maybeJellyfin = await _mediaSourceRepository.GetAllJellyfin() .Map(list => list.HeadOrNone()); Option maybeEmby = await _mediaSourceRepository.GetAllEmby() .Map(list => list.HeadOrNone()); Option maybeMovie = await _movieRepository.GetMovie(request.Id); Option maybeVersion = maybeMovie.Map(m => m.MediaVersions.HeadOrNone()).Flatten(); var languageCodes = new List(); foreach (MediaVersion version in maybeVersion) { var mediaCodes = version.Streams .Filter(ms => ms.MediaStreamKind == MediaStreamKind.Audio) .Map(ms => ms.Language) .ToList(); languageCodes.AddRange(await dbContext.LanguageCodes.GetAllLanguageCodes(mediaCodes)); } foreach (Movie movie in maybeMovie) { string localPath = await movie.GetLocalPath( _plexPathReplacementService, _jellyfinPathReplacementService, _embyPathReplacementService, false); return ProjectToViewModel(movie, localPath, languageCodes, maybeJellyfin, maybeEmby); } return None; } }