Browse Source

limit library scan interval (#1073)

* limit library scan interval

* fix condition
pull/1075/head
Jason Dove 3 years ago committed by GitHub
parent
commit
0f817308a8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 3
      CHANGELOG.md
  2. 4
      ErsatzTV.Application/Configuration/Commands/UpdateLibraryRefreshIntervalHandler.cs
  3. 4
      ErsatzTV.Application/Emby/Commands/SynchronizeEmbyLibraryByIdHandler.cs
  4. 4
      ErsatzTV.Application/Jellyfin/Commands/SynchronizeJellyfinLibraryByIdHandler.cs
  5. 4
      ErsatzTV.Application/MediaSources/Commands/ScanLocalLibraryHandler.cs
  6. 4
      ErsatzTV.Application/Plex/Commands/SynchronizePlexLibraryByIdHandler.cs
  7. 8
      ErsatzTV/Pages/Settings.razor
  8. 2
      ErsatzTV/Services/SchedulerService.cs

3
CHANGELOG.md

@ -11,6 +11,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
### Changed ### Changed
- Upgrade to dotnet 7 - Upgrade to dotnet 7
- Upgrade all docker images to ubuntu jammy and ffmpeg 5.1.2 - Upgrade all docker images to ubuntu jammy and ffmpeg 5.1.2
- Limit library scan interval between 0 and 1,000,000
- 0 means do not automatically scan libraries
- 1 to 999,999 means scan if it has been that many hours since the last scan
## [0.7.0-beta] - 2022-12-11 ## [0.7.0-beta] - 2022-12-11
### Fixed ### Fixed

4
ErsatzTV.Application/Configuration/Commands/UpdateLibraryRefreshIntervalHandler.cs

@ -24,8 +24,8 @@ public class UpdateLibraryRefreshIntervalHandler :
private static Task<Validation<BaseError, Unit>> Validate(UpdateLibraryRefreshInterval request) => private static Task<Validation<BaseError, Unit>> Validate(UpdateLibraryRefreshInterval request) =>
Optional(request.LibraryRefreshInterval) Optional(request.LibraryRefreshInterval)
.Where(lri => lri > 0) .Where(lri => lri is >= 0 and < 1_000_000)
.Map(_ => Unit.Default) .Map(_ => Unit.Default)
.ToValidation<BaseError>("Tuner count must be greater than zero") .ToValidation<BaseError>("Library refresh interval must be zero or greated")
.AsTask(); .AsTask();
} }

4
ErsatzTV.Application/Emby/Commands/SynchronizeEmbyLibraryByIdHandler.cs

@ -72,7 +72,7 @@ public class SynchronizeEmbyLibraryByIdHandler :
{ {
var lastScan = new DateTimeOffset(parameters.Library.LastScan ?? SystemTime.MinValueUtc, TimeSpan.Zero); var lastScan = new DateTimeOffset(parameters.Library.LastScan ?? SystemTime.MinValueUtc, TimeSpan.Zero);
DateTimeOffset nextScan = lastScan + TimeSpan.FromHours(parameters.LibraryRefreshInterval); DateTimeOffset nextScan = lastScan + TimeSpan.FromHours(parameters.LibraryRefreshInterval);
if (parameters.ForceScan || nextScan < DateTimeOffset.Now) if (parameters.ForceScan || (parameters.LibraryRefreshInterval > 0 && nextScan < DateTimeOffset.Now))
{ {
Either<BaseError, Unit> result = parameters.Library.MediaKind switch Either<BaseError, Unit> result = parameters.Library.MediaKind switch
{ {
@ -173,7 +173,7 @@ public class SynchronizeEmbyLibraryByIdHandler :
private Task<Validation<BaseError, int>> ValidateLibraryRefreshInterval() => private Task<Validation<BaseError, int>> ValidateLibraryRefreshInterval() =>
_configElementRepository.GetValue<int>(ConfigElementKey.LibraryRefreshInterval) _configElementRepository.GetValue<int>(ConfigElementKey.LibraryRefreshInterval)
.FilterT(lri => lri > 0) .FilterT(lri => lri is >= 0 and < 1_000_000)
.Map(lri => lri.ToValidation<BaseError>("Library refresh interval is invalid")); .Map(lri => lri.ToValidation<BaseError>("Library refresh interval is invalid"));
private Task<Validation<BaseError, string>> ValidateFFmpegPath() => private Task<Validation<BaseError, string>> ValidateFFmpegPath() =>

4
ErsatzTV.Application/Jellyfin/Commands/SynchronizeJellyfinLibraryByIdHandler.cs

@ -72,7 +72,7 @@ public class SynchronizeJellyfinLibraryByIdHandler :
{ {
var lastScan = new DateTimeOffset(parameters.Library.LastScan ?? SystemTime.MinValueUtc, TimeSpan.Zero); var lastScan = new DateTimeOffset(parameters.Library.LastScan ?? SystemTime.MinValueUtc, TimeSpan.Zero);
DateTimeOffset nextScan = lastScan + TimeSpan.FromHours(parameters.LibraryRefreshInterval); DateTimeOffset nextScan = lastScan + TimeSpan.FromHours(parameters.LibraryRefreshInterval);
if (parameters.ForceScan || nextScan < DateTimeOffset.Now) if (parameters.ForceScan || (parameters.LibraryRefreshInterval > 0 && nextScan < DateTimeOffset.Now))
{ {
Either<BaseError, Unit> result = parameters.Library.MediaKind switch Either<BaseError, Unit> result = parameters.Library.MediaKind switch
{ {
@ -173,7 +173,7 @@ public class SynchronizeJellyfinLibraryByIdHandler :
private Task<Validation<BaseError, int>> ValidateLibraryRefreshInterval() => private Task<Validation<BaseError, int>> ValidateLibraryRefreshInterval() =>
_configElementRepository.GetValue<int>(ConfigElementKey.LibraryRefreshInterval) _configElementRepository.GetValue<int>(ConfigElementKey.LibraryRefreshInterval)
.FilterT(lri => lri > 0) .FilterT(lri => lri is >= 0 and < 1_000_000)
.Map(lri => lri.ToValidation<BaseError>("Library refresh interval is invalid")); .Map(lri => lri.ToValidation<BaseError>("Library refresh interval is invalid"));
private Task<Validation<BaseError, string>> ValidateFFmpegPath() => private Task<Validation<BaseError, string>> ValidateFFmpegPath() =>

4
ErsatzTV.Application/MediaSources/Commands/ScanLocalLibraryHandler.cs

@ -82,7 +82,7 @@ public class ScanLocalLibraryHandler : IRequestHandler<ForceScanLocalLibrary, Ei
var lastScan = new DateTimeOffset(libraryPath.LastScan ?? SystemTime.MinValueUtc, TimeSpan.Zero); var lastScan = new DateTimeOffset(libraryPath.LastScan ?? SystemTime.MinValueUtc, TimeSpan.Zero);
DateTimeOffset nextScan = lastScan + TimeSpan.FromHours(libraryRefreshInterval); DateTimeOffset nextScan = lastScan + TimeSpan.FromHours(libraryRefreshInterval);
if (forceScan || nextScan < DateTimeOffset.Now) if (forceScan || (libraryRefreshInterval > 0 && nextScan < DateTimeOffset.Now))
{ {
scanned = true; scanned = true;
@ -220,7 +220,7 @@ public class ScanLocalLibraryHandler : IRequestHandler<ForceScanLocalLibrary, Ei
private Task<Validation<BaseError, int>> ValidateLibraryRefreshInterval() => private Task<Validation<BaseError, int>> ValidateLibraryRefreshInterval() =>
_configElementRepository.GetValue<int>(ConfigElementKey.LibraryRefreshInterval) _configElementRepository.GetValue<int>(ConfigElementKey.LibraryRefreshInterval)
.FilterT(lri => lri > 0) .FilterT(lri => lri is >= 0 and < 1_000_000)
.Map(lri => lri.ToValidation<BaseError>("Library refresh interval is invalid")); .Map(lri => lri.ToValidation<BaseError>("Library refresh interval is invalid"));
private record RequestParameters( private record RequestParameters(

4
ErsatzTV.Application/Plex/Commands/SynchronizePlexLibraryByIdHandler.cs

@ -66,7 +66,7 @@ public class
{ {
var lastScan = new DateTimeOffset(parameters.Library.LastScan ?? SystemTime.MinValueUtc, TimeSpan.Zero); var lastScan = new DateTimeOffset(parameters.Library.LastScan ?? SystemTime.MinValueUtc, TimeSpan.Zero);
DateTimeOffset nextScan = lastScan + TimeSpan.FromHours(parameters.LibraryRefreshInterval); DateTimeOffset nextScan = lastScan + TimeSpan.FromHours(parameters.LibraryRefreshInterval);
if (parameters.ForceScan || nextScan < DateTimeOffset.Now) if (parameters.ForceScan || (parameters.LibraryRefreshInterval > 0 && nextScan < DateTimeOffset.Now))
{ {
Either<BaseError, Unit> result = parameters.Library.MediaKind switch Either<BaseError, Unit> result = parameters.Library.MediaKind switch
{ {
@ -167,7 +167,7 @@ public class
private Task<Validation<BaseError, int>> ValidateLibraryRefreshInterval() => private Task<Validation<BaseError, int>> ValidateLibraryRefreshInterval() =>
_configElementRepository.GetValue<int>(ConfigElementKey.LibraryRefreshInterval) _configElementRepository.GetValue<int>(ConfigElementKey.LibraryRefreshInterval)
.FilterT(lri => lri > 0) .FilterT(lri => lri is >= 0 and < 1_000_000)
.Map(lri => lri.ToValidation<BaseError>("Library refresh interval is invalid")); .Map(lri => lri.ToValidation<BaseError>("Library refresh interval is invalid"));
private Task<Validation<BaseError, string>> ValidateFFmpegPath() => private Task<Validation<BaseError, string>> ValidateFFmpegPath() =>

8
ErsatzTV/Pages/Settings.razor

@ -231,7 +231,7 @@
_tunerCount = await _mediator.Send(new GetHDHRTunerCount(), _cts.Token); _tunerCount = await _mediator.Send(new GetHDHRTunerCount(), _cts.Token);
_hdhrSuccess = string.IsNullOrWhiteSpace(ValidateTunerCount(_tunerCount)); _hdhrSuccess = string.IsNullOrWhiteSpace(ValidateTunerCount(_tunerCount));
_libraryRefreshInterval = await _mediator.Send(new GetLibraryRefreshInterval(), _cts.Token); _libraryRefreshInterval = await _mediator.Send(new GetLibraryRefreshInterval(), _cts.Token);
_scannerSuccess = _libraryRefreshInterval > 0; _scannerSuccess = _libraryRefreshInterval is >= 0 and < 1_000_000;
_playoutSettings = await _mediator.Send(new GetPlayoutSettings(), _cts.Token); _playoutSettings = await _mediator.Send(new GetPlayoutSettings(), _cts.Token);
_playoutSuccess = _playoutSettings.DaysToBuild > 0; _playoutSuccess = _playoutSettings.DaysToBuild > 0;
_generalSettings = await _mediator.Send(new GetGeneralSettings(), _cts.Token); _generalSettings = await _mediator.Send(new GetGeneralSettings(), _cts.Token);
@ -241,7 +241,11 @@
private static string ValidateTunerCount(int tunerCount) => tunerCount <= 0 ? "Tuner count must be greater than zero" : null; private static string ValidateTunerCount(int tunerCount) => tunerCount <= 0 ? "Tuner count must be greater than zero" : null;
private static string ValidateLibraryRefreshInterval(int libraryRefreshInterval) => libraryRefreshInterval <= 0 ? "Library refresh interval must be greater than zero" : null; private static string ValidateLibraryRefreshInterval(int libraryRefreshInterval) => libraryRefreshInterval switch {
<= -1 => "Library refresh interval must be 0 (do not refresh) or greater than zero",
>= 1_000_000 => "Library refresh interval must be less than 1,000,000. Use 0 to disable automatic refresh",
_ => null
};
private static string ValidatePlayoutDaysToBuild(int daysToBuild) => daysToBuild <= 0 ? "Days to build must be greater than zero" : null; private static string ValidatePlayoutDaysToBuild(int daysToBuild) => daysToBuild <= 0 ? "Days to build must be greater than zero" : null;

2
ErsatzTV/Services/SchedulerService.cs

@ -93,7 +93,7 @@ public class SchedulerService : BackgroundService
{ {
await DeleteOrphanedArtwork(cancellationToken); await DeleteOrphanedArtwork(cancellationToken);
await BuildPlayouts(cancellationToken); await BuildPlayouts(cancellationToken);
#if !DEBUG_NO_SYNC #if !DEBUG_NO_SYNC
await ScanLocalMediaSources(cancellationToken); await ScanLocalMediaSources(cancellationToken);
await ScanPlexMediaSources(cancellationToken); await ScanPlexMediaSources(cancellationToken);
await ScanJellyfinMediaSources(cancellationToken); await ScanJellyfinMediaSources(cancellationToken);

Loading…
Cancel
Save