reduce hls segmenter disk use (#806)
This commit is contained in:
@@ -4,6 +4,8 @@ All notable changes to this project will be documented in this file.
|
|||||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
### Added
|
||||||
|
- Clean transcode cache folder on startup and after `HLS Segmenter` session terminates for any reason
|
||||||
|
|
||||||
## [0.5.7-beta] - 2022-05-14
|
## [0.5.7-beta] - 2022-05-14
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ public class HlsSessionWorker : IHlsSessionWorker
|
|||||||
private static readonly SemaphoreSlim Slim = new(1, 1);
|
private static readonly SemaphoreSlim Slim = new(1, 1);
|
||||||
private static int _workAheadCount;
|
private static int _workAheadCount;
|
||||||
private readonly IHlsPlaylistFilter _hlsPlaylistFilter;
|
private readonly IHlsPlaylistFilter _hlsPlaylistFilter;
|
||||||
|
private readonly ILocalFileSystem _localFileSystem;
|
||||||
private readonly ILogger<HlsSessionWorker> _logger;
|
private readonly ILogger<HlsSessionWorker> _logger;
|
||||||
private readonly IServiceScopeFactory _serviceScopeFactory;
|
private readonly IServiceScopeFactory _serviceScopeFactory;
|
||||||
private readonly object _sync = new();
|
private readonly object _sync = new();
|
||||||
@@ -34,10 +35,12 @@ public class HlsSessionWorker : IHlsSessionWorker
|
|||||||
public HlsSessionWorker(
|
public HlsSessionWorker(
|
||||||
IHlsPlaylistFilter hlsPlaylistFilter,
|
IHlsPlaylistFilter hlsPlaylistFilter,
|
||||||
IServiceScopeFactory serviceScopeFactory,
|
IServiceScopeFactory serviceScopeFactory,
|
||||||
|
ILocalFileSystem localFileSystem,
|
||||||
ILogger<HlsSessionWorker> logger)
|
ILogger<HlsSessionWorker> logger)
|
||||||
{
|
{
|
||||||
_hlsPlaylistFilter = hlsPlaylistFilter;
|
_hlsPlaylistFilter = hlsPlaylistFilter;
|
||||||
_serviceScopeFactory = serviceScopeFactory;
|
_serviceScopeFactory = serviceScopeFactory;
|
||||||
|
_localFileSystem = localFileSystem;
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -153,6 +156,15 @@ public class HlsSessionWorker : IHlsSessionWorker
|
|||||||
{
|
{
|
||||||
_timer.Elapsed -= Cancel;
|
_timer.Elapsed -= Cancel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
_localFileSystem.EmptyFolder(Path.Combine(FileSystemLayout.TranscodeFolder, _channelNumber));
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
// do nothing
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -23,8 +23,9 @@ public class CacheCleanerService : IHostedService
|
|||||||
{
|
{
|
||||||
using IServiceScope scope = _serviceScopeFactory.CreateScope();
|
using IServiceScope scope = _serviceScopeFactory.CreateScope();
|
||||||
await using TvContext dbContext = scope.ServiceProvider.GetRequiredService<TvContext>();
|
await using TvContext dbContext = scope.ServiceProvider.GetRequiredService<TvContext>();
|
||||||
|
ILocalFileSystem localFileSystem = scope.ServiceProvider.GetRequiredService<ILocalFileSystem>();
|
||||||
|
|
||||||
if (Directory.Exists(FileSystemLayout.LegacyImageCacheFolder))
|
if (localFileSystem.FolderExists(FileSystemLayout.LegacyImageCacheFolder))
|
||||||
{
|
{
|
||||||
_logger.LogInformation("Migrating channel logos from legacy image cache folder");
|
_logger.LogInformation("Migrating channel logos from legacy image cache folder");
|
||||||
|
|
||||||
@@ -34,13 +35,12 @@ public class CacheCleanerService : IHostedService
|
|||||||
.Map(a => a.Path)
|
.Map(a => a.Path)
|
||||||
.ToListAsync(cancellationToken);
|
.ToListAsync(cancellationToken);
|
||||||
|
|
||||||
ILocalFileSystem localFileSystem = scope.ServiceProvider.GetRequiredService<ILocalFileSystem>();
|
|
||||||
foreach (string logo in logos)
|
foreach (string logo in logos)
|
||||||
{
|
{
|
||||||
string legacyPath = Path.Combine(FileSystemLayout.LegacyImageCacheFolder, logo);
|
string legacyPath = Path.Combine(FileSystemLayout.LegacyImageCacheFolder, logo);
|
||||||
if (File.Exists(legacyPath))
|
if (localFileSystem.FileExists(legacyPath))
|
||||||
{
|
{
|
||||||
string subfolder = logo.Substring(0, 2);
|
string subfolder = logo[..2];
|
||||||
string newPath = Path.Combine(FileSystemLayout.LogoCacheFolder, subfolder, logo);
|
string newPath = Path.Combine(FileSystemLayout.LogoCacheFolder, subfolder, logo);
|
||||||
await localFileSystem.CopyFile(legacyPath, newPath);
|
await localFileSystem.CopyFile(legacyPath, newPath);
|
||||||
}
|
}
|
||||||
@@ -49,6 +49,12 @@ public class CacheCleanerService : IHostedService
|
|||||||
_logger.LogInformation("Deleting legacy image cache folder");
|
_logger.LogInformation("Deleting legacy image cache folder");
|
||||||
Directory.Delete(FileSystemLayout.LegacyImageCacheFolder, true);
|
Directory.Delete(FileSystemLayout.LegacyImageCacheFolder, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (localFileSystem.FolderExists(FileSystemLayout.TranscodeFolder))
|
||||||
|
{
|
||||||
|
_logger.LogInformation("Emptying transcode cache folder");
|
||||||
|
localFileSystem.EmptyFolder(FileSystemLayout.TranscodeFolder);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask;
|
public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask;
|
||||||
|
|||||||
Reference in New Issue
Block a user