diff --git a/ErsatzTV.Application/MediaSources/Commands/ScanLocalMediaSource.cs b/ErsatzTV.Application/MediaSources/Commands/ScanLocalMediaSource.cs index 0e08d61da..d04458786 100644 --- a/ErsatzTV.Application/MediaSources/Commands/ScanLocalMediaSource.cs +++ b/ErsatzTV.Application/MediaSources/Commands/ScanLocalMediaSource.cs @@ -4,6 +4,6 @@ using MediatR; namespace ErsatzTV.Application.MediaSources.Commands { - public record ScanLocalMediaSource(int MediaSourceId) : IRequest>, + public record ScanLocalMediaSource(int MediaSourceId, bool RefreshAllMetadata) : IRequest>, IBackgroundServiceRequest; } diff --git a/ErsatzTV.Application/MediaSources/Commands/ScanLocalMediaSourceHandler.cs b/ErsatzTV.Application/MediaSources/Commands/ScanLocalMediaSourceHandler.cs index 968f456cf..e6d67e6d1 100644 --- a/ErsatzTV.Application/MediaSources/Commands/ScanLocalMediaSourceHandler.cs +++ b/ErsatzTV.Application/MediaSources/Commands/ScanLocalMediaSourceHandler.cs @@ -30,7 +30,7 @@ namespace ErsatzTV.Application.MediaSources.Commands Handle(ScanLocalMediaSource request, CancellationToken cancellationToken) => Validate(request) .MapT( - p => _localMediaScanner.ScanLocalMediaSource(p.LocalMediaSource, p.FFprobePath) + p => _localMediaScanner.ScanLocalMediaSource(p.LocalMediaSource, p.FFprobePath, request.RefreshAllMetadata) .Map(_ => p.LocalMediaSource.Folder)) .Bind(v => v.ToEitherAsync()); diff --git a/ErsatzTV.Core/Interfaces/Metadata/ILocalMediaScanner.cs b/ErsatzTV.Core/Interfaces/Metadata/ILocalMediaScanner.cs index c0d87b6b8..160e20d03 100644 --- a/ErsatzTV.Core/Interfaces/Metadata/ILocalMediaScanner.cs +++ b/ErsatzTV.Core/Interfaces/Metadata/ILocalMediaScanner.cs @@ -6,6 +6,6 @@ namespace ErsatzTV.Core.Interfaces.Metadata { public interface ILocalMediaScanner { - Task ScanLocalMediaSource(LocalMediaSource localMediaSource, string ffprobePath); + Task ScanLocalMediaSource(LocalMediaSource localMediaSource, string ffprobePath, bool refreshAllMetadata); } } diff --git a/ErsatzTV.Core/Metadata/LocalMediaScanner.cs b/ErsatzTV.Core/Metadata/LocalMediaScanner.cs index 3841ade71..07b812b1e 100644 --- a/ErsatzTV.Core/Metadata/LocalMediaScanner.cs +++ b/ErsatzTV.Core/Metadata/LocalMediaScanner.cs @@ -44,7 +44,10 @@ namespace ErsatzTV.Core.Metadata _logger = logger; } - public async Task ScanLocalMediaSource(LocalMediaSource localMediaSource, string ffprobePath) + public async Task ScanLocalMediaSource( + LocalMediaSource localMediaSource, + string ffprobePath, + bool refreshAllMetadata) { if (!Directory.Exists(localMediaSource.Folder)) { @@ -97,14 +100,16 @@ namespace ErsatzTV.Core.Metadata // if exists, check if the file was modified // also, try to re-categorize incorrect media types by refreshing metadata - Seq modifiedMediaItems = existingMediaItems.Filter( - mediaItem => - { - DateTime lastWrite = File.GetLastWriteTimeUtc(mediaItem.Path); - bool modified = lastWrite > mediaItem.LastWriteTime.IfNone(DateTime.MinValue); - return modified || mediaItem.Metadata == null || - mediaItem.Metadata.MediaType != localMediaSource.MediaType; - }); + Seq modifiedMediaItems = refreshAllMetadata + ? existingMediaItems + : existingMediaItems.Filter( + mediaItem => + { + DateTime lastWrite = File.GetLastWriteTimeUtc(mediaItem.Path); + bool modified = lastWrite > mediaItem.LastWriteTime.IfNone(DateTime.MinValue); + return modified || mediaItem.Metadata == null || + mediaItem.Metadata.MediaType != localMediaSource.MediaType; + }); modifiedPlayoutIds.AddRange(await _playoutRepository.GetPlayoutIdsForMediaItems(modifiedMediaItems)); foreach (MediaItem mediaItem in modifiedMediaItems) { diff --git a/ErsatzTV/Pages/LocalMediaSourceEditor.razor b/ErsatzTV/Pages/LocalMediaSourceEditor.razor index db61326b3..ad72d8fd9 100644 --- a/ErsatzTV/Pages/LocalMediaSourceEditor.razor +++ b/ErsatzTV/Pages/LocalMediaSourceEditor.razor @@ -84,7 +84,7 @@ }, Right: async vm => { - await Channel.WriteAsync(new ScanLocalMediaSource(vm.Id)); + await Channel.WriteAsync(new ScanLocalMediaSource(vm.Id, false)); NavigationManager.NavigateTo("/media/sources"); }); } diff --git a/ErsatzTV/Services/SchedulerService.cs b/ErsatzTV/Services/SchedulerService.cs index 86e9cd1a4..57d00e13c 100644 --- a/ErsatzTV/Services/SchedulerService.cs +++ b/ErsatzTV/Services/SchedulerService.cs @@ -75,7 +75,7 @@ namespace ErsatzTV.Services foreach (int mediaSourceId in localMediaSourceIds) { - await _channel.WriteAsync(new ScanLocalMediaSource(mediaSourceId), cancellationToken); + await _channel.WriteAsync(new ScanLocalMediaSource(mediaSourceId, false), cancellationToken); } } } diff --git a/ErsatzTV/Shared/LocalMediaSources.razor b/ErsatzTV/Shared/LocalMediaSources.razor index f486ec440..b9820c7f1 100644 --- a/ErsatzTV/Shared/LocalMediaSources.razor +++ b/ErsatzTV/Shared/LocalMediaSources.razor @@ -3,6 +3,7 @@ @using ErsatzTV.Application.MediaSources.Queries @inject IDialogService Dialog @inject IMediator Mediator +@inject ChannelWriter Channel @@ -10,7 +11,7 @@ - + Folder @@ -19,7 +20,14 @@ @context.Folder - +
+ + + + + + +
@@ -29,6 +37,7 @@ @code { private IList _mediaSources; + private bool _refreshing = false; protected override async Task OnParametersSetAsync() => await LoadMediaSources(); @@ -57,4 +66,10 @@ } } + private async Task RefreshAllMetadata(LocalMediaSourceViewModel mediaSource) + { + _refreshing = true; + await Channel.WriteAsync(new ScanLocalMediaSource(mediaSource.Id, true)); + } + } \ No newline at end of file