Browse Source

first pass at refresh-all-metadata by source

pull/24/head
Jason Dove 6 years ago
parent
commit
eae8617178
  1. 2
      ErsatzTV.Application/MediaSources/Commands/ScanLocalMediaSource.cs
  2. 2
      ErsatzTV.Application/MediaSources/Commands/ScanLocalMediaSourceHandler.cs
  3. 2
      ErsatzTV.Core/Interfaces/Metadata/ILocalMediaScanner.cs
  4. 23
      ErsatzTV.Core/Metadata/LocalMediaScanner.cs
  5. 2
      ErsatzTV/Pages/LocalMediaSourceEditor.razor
  6. 2
      ErsatzTV/Services/SchedulerService.cs
  7. 19
      ErsatzTV/Shared/LocalMediaSources.razor

2
ErsatzTV.Application/MediaSources/Commands/ScanLocalMediaSource.cs

@ -4,6 +4,6 @@ using MediatR;
namespace ErsatzTV.Application.MediaSources.Commands namespace ErsatzTV.Application.MediaSources.Commands
{ {
public record ScanLocalMediaSource(int MediaSourceId) : IRequest<Either<BaseError, string>>, public record ScanLocalMediaSource(int MediaSourceId, bool RefreshAllMetadata) : IRequest<Either<BaseError, string>>,
IBackgroundServiceRequest; IBackgroundServiceRequest;
} }

2
ErsatzTV.Application/MediaSources/Commands/ScanLocalMediaSourceHandler.cs

@ -30,7 +30,7 @@ namespace ErsatzTV.Application.MediaSources.Commands
Handle(ScanLocalMediaSource request, CancellationToken cancellationToken) => Handle(ScanLocalMediaSource request, CancellationToken cancellationToken) =>
Validate(request) Validate(request)
.MapT( .MapT(
p => _localMediaScanner.ScanLocalMediaSource(p.LocalMediaSource, p.FFprobePath) p => _localMediaScanner.ScanLocalMediaSource(p.LocalMediaSource, p.FFprobePath, request.RefreshAllMetadata)
.Map(_ => p.LocalMediaSource.Folder)) .Map(_ => p.LocalMediaSource.Folder))
.Bind(v => v.ToEitherAsync()); .Bind(v => v.ToEitherAsync());

2
ErsatzTV.Core/Interfaces/Metadata/ILocalMediaScanner.cs

@ -6,6 +6,6 @@ namespace ErsatzTV.Core.Interfaces.Metadata
{ {
public interface ILocalMediaScanner public interface ILocalMediaScanner
{ {
Task<Unit> ScanLocalMediaSource(LocalMediaSource localMediaSource, string ffprobePath); Task<Unit> ScanLocalMediaSource(LocalMediaSource localMediaSource, string ffprobePath, bool refreshAllMetadata);
} }
} }

23
ErsatzTV.Core/Metadata/LocalMediaScanner.cs

@ -44,7 +44,10 @@ namespace ErsatzTV.Core.Metadata
_logger = logger; _logger = logger;
} }
public async Task<Unit> ScanLocalMediaSource(LocalMediaSource localMediaSource, string ffprobePath) public async Task<Unit> ScanLocalMediaSource(
LocalMediaSource localMediaSource,
string ffprobePath,
bool refreshAllMetadata)
{ {
if (!Directory.Exists(localMediaSource.Folder)) if (!Directory.Exists(localMediaSource.Folder))
{ {
@ -97,14 +100,16 @@ namespace ErsatzTV.Core.Metadata
// if exists, check if the file was modified // if exists, check if the file was modified
// also, try to re-categorize incorrect media types by refreshing metadata // also, try to re-categorize incorrect media types by refreshing metadata
Seq<MediaItem> modifiedMediaItems = existingMediaItems.Filter( Seq<MediaItem> modifiedMediaItems = refreshAllMetadata
mediaItem => ? existingMediaItems
{ : existingMediaItems.Filter(
DateTime lastWrite = File.GetLastWriteTimeUtc(mediaItem.Path); mediaItem =>
bool modified = lastWrite > mediaItem.LastWriteTime.IfNone(DateTime.MinValue); {
return modified || mediaItem.Metadata == null || DateTime lastWrite = File.GetLastWriteTimeUtc(mediaItem.Path);
mediaItem.Metadata.MediaType != localMediaSource.MediaType; bool modified = lastWrite > mediaItem.LastWriteTime.IfNone(DateTime.MinValue);
}); return modified || mediaItem.Metadata == null ||
mediaItem.Metadata.MediaType != localMediaSource.MediaType;
});
modifiedPlayoutIds.AddRange(await _playoutRepository.GetPlayoutIdsForMediaItems(modifiedMediaItems)); modifiedPlayoutIds.AddRange(await _playoutRepository.GetPlayoutIdsForMediaItems(modifiedMediaItems));
foreach (MediaItem mediaItem in modifiedMediaItems) foreach (MediaItem mediaItem in modifiedMediaItems)
{ {

2
ErsatzTV/Pages/LocalMediaSourceEditor.razor

@ -84,7 +84,7 @@
}, },
Right: async vm => Right: async vm =>
{ {
await Channel.WriteAsync(new ScanLocalMediaSource(vm.Id)); await Channel.WriteAsync(new ScanLocalMediaSource(vm.Id, false));
NavigationManager.NavigateTo("/media/sources"); NavigationManager.NavigateTo("/media/sources");
}); });
} }

2
ErsatzTV/Services/SchedulerService.cs

@ -75,7 +75,7 @@ namespace ErsatzTV.Services
foreach (int mediaSourceId in localMediaSourceIds) foreach (int mediaSourceId in localMediaSourceIds)
{ {
await _channel.WriteAsync(new ScanLocalMediaSource(mediaSourceId), cancellationToken); await _channel.WriteAsync(new ScanLocalMediaSource(mediaSourceId, false), cancellationToken);
} }
} }
} }

19
ErsatzTV/Shared/LocalMediaSources.razor

@ -3,6 +3,7 @@
@using ErsatzTV.Application.MediaSources.Queries @using ErsatzTV.Application.MediaSources.Queries
@inject IDialogService Dialog @inject IDialogService Dialog
@inject IMediator Mediator @inject IMediator Mediator
@inject ChannelWriter<IBackgroundServiceRequest> Channel
<MudTable Hover="true" Items="_mediaSources"> <MudTable Hover="true" Items="_mediaSources">
<ToolBarContent> <ToolBarContent>
@ -10,7 +11,7 @@
</ToolBarContent> </ToolBarContent>
<ColGroup> <ColGroup>
<col/> <col/>
<col style="width: 60px;"/> <col style="width: 120px;"/>
</ColGroup> </ColGroup>
<HeaderContent> <HeaderContent>
<MudTh>Folder</MudTh> <MudTh>Folder</MudTh>
@ -19,7 +20,14 @@
<RowTemplate> <RowTemplate>
<MudTd DataLabel="Folder">@context.Folder</MudTd> <MudTd DataLabel="Folder">@context.Folder</MudTd>
<MudTd> <MudTd>
<MudIconButton Icon="@Icons.Material.Filled.Delete" OnClick="@(_ => DeleteMediaSource(context))"></MudIconButton> <div style="display: flex">
<MudTooltip Text="Refresh All Metadata">
<MudIconButton Icon="@Icons.Material.Filled.Refresh" Disabled="@_refreshing" OnClick="@(_ => RefreshAllMetadata(context))"></MudIconButton>
</MudTooltip>
<MudTooltip Text="Delete Media Source">
<MudIconButton Icon="@Icons.Material.Filled.Delete" OnClick="@(_ => DeleteMediaSource(context))"></MudIconButton>
</MudTooltip>
</div>
</MudTd> </MudTd>
</RowTemplate> </RowTemplate>
</MudTable> </MudTable>
@ -29,6 +37,7 @@
@code { @code {
private IList<LocalMediaSourceViewModel> _mediaSources; private IList<LocalMediaSourceViewModel> _mediaSources;
private bool _refreshing = false;
protected override async Task OnParametersSetAsync() => await LoadMediaSources(); 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));
}
} }
Loading…
Cancel
Save