Browse Source

remove folderexists

pull/2655/head
Jason Dove 8 months ago
parent
commit
9a78d34571
No known key found for this signature in database
  1. 8
      ErsatzTV.Core.Tests/Fakes/FakeFileEntry.cs
  2. 3
      ErsatzTV.Core.Tests/Fakes/FakeFolderEntry.cs
  3. 89
      ErsatzTV.Core.Tests/Fakes/FakeLocalFileSystem.cs
  4. 1
      ErsatzTV.Core/Interfaces/Metadata/ILocalFileSystem.cs
  5. 2
      ErsatzTV.Core/Metadata/LocalFileSystem.cs
  6. 46
      ErsatzTV.Infrastructure/Data/Repositories/LibraryRepository.cs
  7. 1
      ErsatzTV.Scanner.Tests/Core/Fakes/FakeLocalFileSystem.cs
  8. 6
      ErsatzTV/Services/RunOnce/CacheCleanerService.cs

8
ErsatzTV.Core.Tests/Fakes/FakeFileEntry.cs

@ -1,8 +0,0 @@ @@ -1,8 +0,0 @@
namespace ErsatzTV.Core.Tests.Fakes;
public record FakeFileEntry(string Path)
{
public DateTime LastWriteTime { get; set; } = SystemTime.MinValueUtc;
public string Contents { get; set; }
}

3
ErsatzTV.Core.Tests/Fakes/FakeFolderEntry.cs

@ -1,3 +0,0 @@ @@ -1,3 +0,0 @@
namespace ErsatzTV.Core.Tests.Fakes;
public record FakeFolderEntry(string Path);

89
ErsatzTV.Core.Tests/Fakes/FakeLocalFileSystem.cs

@ -1,89 +0,0 @@ @@ -1,89 +0,0 @@
using ErsatzTV.Core.Interfaces.Metadata;
namespace ErsatzTV.Core.Tests.Fakes;
public class FakeLocalFileSystem : ILocalFileSystem
{
private readonly List<FakeFileEntry> _files;
private readonly List<FakeFolderEntry> _folders;
public FakeLocalFileSystem(List<FakeFileEntry> files) : this(files, new List<FakeFolderEntry>())
{
}
public FakeLocalFileSystem(List<FakeFileEntry> files, List<FakeFolderEntry> folders)
{
_files = files;
var allFolders = new List<string>(folders.Map(f => f.Path));
foreach (FakeFileEntry file in _files)
{
List<DirectoryInfo> moreFolders =
Split(new DirectoryInfo(Path.GetDirectoryName(file.Path) ?? string.Empty));
allFolders.AddRange(moreFolders.Map(i => i.FullName));
}
_folders = allFolders.Distinct().Map(f => new FakeFolderEntry(f)).ToList();
}
public Unit EnsureFolderExists(string folder) => Unit.Default;
public DateTime GetLastWriteTime(string path) =>
Optional(_files.SingleOrDefault(f => f.Path == path))
.Map(f => f.LastWriteTime)
.IfNone(SystemTime.MinValueUtc);
public IEnumerable<string> ListSubdirectories(string folder) =>
_folders.Map(f => f.Path).Filter(f => f.StartsWith(folder) && Directory.GetParent(f)?.FullName == folder);
public IEnumerable<string> ListFiles(string folder) =>
_files.Map(f => f.Path).Filter(f => Path.GetDirectoryName(f) == folder);
// TODO: this isn't accurate, need to use search pattern
public IEnumerable<string> ListFiles(string folder, string searchPattern) =>
_files.Map(f => f.Path).Filter(f => Path.GetDirectoryName(f) == folder);
public IEnumerable<string> ListFiles(string folder, params string[] searchPatterns) =>
_files.Map(f => f.Path).Filter(f => Path.GetDirectoryName(f) == folder);
public bool FileExists(string path) => _files.Any(f => f.Path == path);
public bool FolderExists(string folder) => false;
public Task<Either<BaseError, Unit>> CopyFile(string source, string destination) =>
Task.FromResult(Right<BaseError, Unit>(Unit.Default));
public Unit EmptyFolder(string folder) => Unit.Default;
public async Task<string[]> ReadAllLines(string path) => await _files
.Filter(f => f.Path == path)
.HeadOrNone()
.Select(f => f.Contents)
.IfNoneAsync(string.Empty)
.Map(s => s.Split(Environment.NewLine));
public Task<byte[]> GetHash(string path) => throw new NotSupportedException();
public string GetCustomOrDefaultFile(string folder, string file)
{
string path = Path.Combine(folder, file);
return FileExists(path) ? path : Path.Combine(folder, $"_{file}");
}
private static List<DirectoryInfo> Split(DirectoryInfo path)
{
var result = new List<DirectoryInfo>();
if (path == null || string.IsNullOrWhiteSpace(path.FullName))
{
return result;
}
if (path.Parent != null)
{
result.AddRange(Split(path.Parent));
}
result.Add(path);
return result;
}
}

1
ErsatzTV.Core/Interfaces/Metadata/ILocalFileSystem.cs

@ -8,7 +8,6 @@ public interface ILocalFileSystem @@ -8,7 +8,6 @@ public interface ILocalFileSystem
IEnumerable<string> ListFiles(string folder);
IEnumerable<string> ListFiles(string folder, string searchPattern);
IEnumerable<string> ListFiles(string folder, params string[] searchPatterns);
bool FolderExists(string folder);
Task<Either<BaseError, Unit>> CopyFile(string source, string destination);
Unit EmptyFolder(string folder);
Task<string[]> ReadAllLines(string path);

2
ErsatzTV.Core/Metadata/LocalFileSystem.cs

@ -133,8 +133,6 @@ public class LocalFileSystem(IFileSystem fileSystem, IClient client, ILogger<Loc @@ -133,8 +133,6 @@ public class LocalFileSystem(IFileSystem fileSystem, IClient client, ILogger<Loc
return new List<string>();
}
public bool FolderExists(string folder) => Directory.Exists(folder);
public async Task<Either<BaseError, Unit>> CopyFile(string source, string destination)
{
try

46
ErsatzTV.Infrastructure/Data/Repositories/LibraryRepository.cs

@ -1,26 +1,18 @@ @@ -1,26 +1,18 @@
using Dapper;
using System.IO.Abstractions;
using Dapper;
using ErsatzTV.Core.Domain;
using ErsatzTV.Core.Interfaces.Metadata;
using ErsatzTV.Core.Interfaces.Repositories;
using ErsatzTV.Infrastructure.Extensions;
using Microsoft.EntityFrameworkCore;
namespace ErsatzTV.Infrastructure.Data.Repositories;
public class LibraryRepository : ILibraryRepository
public class LibraryRepository(IFileSystem fileSystem, IDbContextFactory<TvContext> dbContextFactory)
: ILibraryRepository
{
private readonly IDbContextFactory<TvContext> _dbContextFactory;
private readonly ILocalFileSystem _localFileSystem;
public LibraryRepository(ILocalFileSystem localFileSystem, IDbContextFactory<TvContext> dbContextFactory)
{
_localFileSystem = localFileSystem;
_dbContextFactory = dbContextFactory;
}
public async Task<LibraryPath> Add(LibraryPath libraryPath)
{
await using TvContext dbContext = await _dbContextFactory.CreateDbContextAsync();
await using TvContext dbContext = await dbContextFactory.CreateDbContextAsync();
await dbContext.LibraryPaths.AddAsync(libraryPath);
await dbContext.SaveChangesAsync();
return libraryPath;
@ -28,7 +20,7 @@ public class LibraryRepository : ILibraryRepository @@ -28,7 +20,7 @@ public class LibraryRepository : ILibraryRepository
public async Task<Option<Library>> GetLibrary(int libraryId)
{
await using TvContext dbContext = await _dbContextFactory.CreateDbContextAsync();
await using TvContext dbContext = await dbContextFactory.CreateDbContextAsync();
return await dbContext.Libraries
.Include(l => l.Paths)
.ThenInclude(p => p.LibraryFolders)
@ -40,7 +32,7 @@ public class LibraryRepository : ILibraryRepository @@ -40,7 +32,7 @@ public class LibraryRepository : ILibraryRepository
public async Task<Option<LocalLibrary>> GetLocal(int libraryId)
{
await using TvContext dbContext = await _dbContextFactory.CreateDbContextAsync();
await using TvContext dbContext = await dbContextFactory.CreateDbContextAsync();
return await dbContext.LocalLibraries
.OrderBy(l => l.Id)
.SingleOrDefaultAsync(l => l.Id == libraryId)
@ -49,7 +41,7 @@ public class LibraryRepository : ILibraryRepository @@ -49,7 +41,7 @@ public class LibraryRepository : ILibraryRepository
public async Task<List<Library>> GetAll()
{
await using TvContext dbContext = await _dbContextFactory.CreateDbContextAsync();
await using TvContext dbContext = await dbContextFactory.CreateDbContextAsync();
return await dbContext.Libraries
.AsNoTracking()
.Include(l => l.MediaSource)
@ -59,7 +51,7 @@ public class LibraryRepository : ILibraryRepository @@ -59,7 +51,7 @@ public class LibraryRepository : ILibraryRepository
public async Task<Unit> UpdateLastScan(Library library)
{
await using TvContext dbContext = await _dbContextFactory.CreateDbContextAsync();
await using TvContext dbContext = await dbContextFactory.CreateDbContextAsync();
return await dbContext.Connection.ExecuteAsync(
"UPDATE Library SET LastScan = @LastScan WHERE Id = @Id",
new { library.LastScan, library.Id }).ToUnit();
@ -67,7 +59,7 @@ public class LibraryRepository : ILibraryRepository @@ -67,7 +59,7 @@ public class LibraryRepository : ILibraryRepository
public async Task<Unit> UpdateLastScan(LibraryPath libraryPath)
{
await using TvContext dbContext = await _dbContextFactory.CreateDbContextAsync();
await using TvContext dbContext = await dbContextFactory.CreateDbContextAsync();
return await dbContext.Connection.ExecuteAsync(
"UPDATE LibraryPath SET LastScan = @LastScan WHERE Id = @Id",
new { libraryPath.LastScan, libraryPath.Id }).ToUnit();
@ -75,7 +67,7 @@ public class LibraryRepository : ILibraryRepository @@ -75,7 +67,7 @@ public class LibraryRepository : ILibraryRepository
public async Task<List<LibraryPath>> GetLocalPaths(int libraryId)
{
await using TvContext dbContext = await _dbContextFactory.CreateDbContextAsync();
await using TvContext dbContext = await dbContextFactory.CreateDbContextAsync();
return await dbContext.LocalLibraries
.Include(l => l.Paths)
.OrderBy(l => l.Id)
@ -86,7 +78,7 @@ public class LibraryRepository : ILibraryRepository @@ -86,7 +78,7 @@ public class LibraryRepository : ILibraryRepository
public async Task<int> CountMediaItemsByPath(int libraryPathId)
{
await using TvContext dbContext = await _dbContextFactory.CreateDbContextAsync();
await using TvContext dbContext = await dbContextFactory.CreateDbContextAsync();
return await dbContext.Connection.QuerySingleAsync<int>(
@"SELECT COUNT(*) FROM MediaItem WHERE LibraryPathId = @LibraryPathId",
new { LibraryPathId = libraryPathId });
@ -98,7 +90,7 @@ public class LibraryRepository : ILibraryRepository @@ -98,7 +90,7 @@ public class LibraryRepository : ILibraryRepository
string path,
string etag)
{
await using TvContext dbContext = await _dbContextFactory.CreateDbContextAsync();
await using TvContext dbContext = await dbContextFactory.CreateDbContextAsync();
foreach (LibraryFolder folder in knownFolder)
{
@ -123,10 +115,10 @@ public class LibraryRepository : ILibraryRepository @@ -123,10 +115,10 @@ public class LibraryRepository : ILibraryRepository
public async Task CleanEtagsForLibraryPath(LibraryPath libraryPath)
{
await using TvContext dbContext = await _dbContextFactory.CreateDbContextAsync();
await using TvContext dbContext = await dbContextFactory.CreateDbContextAsync();
IOrderedEnumerable<LibraryFolder> orderedFolders = libraryPath.LibraryFolders
.Where(f => !_localFileSystem.FolderExists(f.Path))
.Where(f => !fileSystem.Directory.Exists(f.Path))
.OrderByDescending(lp => lp.Path.Length);
foreach (LibraryFolder folder in orderedFolders)
@ -152,7 +144,7 @@ public class LibraryRepository : ILibraryRepository @@ -152,7 +144,7 @@ public class LibraryRepository : ILibraryRepository
return Option<int>.None;
}
await using TvContext dbContext = await _dbContextFactory.CreateDbContextAsync(cancellationToken);
await using TvContext dbContext = await dbContextFactory.CreateDbContextAsync(cancellationToken);
return await dbContext.LibraryFolders
.AsNoTracking()
@ -166,7 +158,7 @@ public class LibraryRepository : ILibraryRepository @@ -166,7 +158,7 @@ public class LibraryRepository : ILibraryRepository
Option<int> maybeParentFolder,
string folder)
{
await using TvContext dbContext = await _dbContextFactory.CreateDbContextAsync();
await using TvContext dbContext = await dbContextFactory.CreateDbContextAsync();
// load from db or create new folder
LibraryFolder knownFolder = await libraryPath.LibraryFolders
@ -199,7 +191,7 @@ public class LibraryRepository : ILibraryRepository @@ -199,7 +191,7 @@ public class LibraryRepository : ILibraryRepository
public async Task UpdateLibraryFolderId(MediaFile mediaFile, int libraryFolderId)
{
await using TvContext dbContext = await _dbContextFactory.CreateDbContextAsync();
await using TvContext dbContext = await dbContextFactory.CreateDbContextAsync();
mediaFile.LibraryFolderId = libraryFolderId;
await dbContext.Connection.ExecuteAsync(
"UPDATE MediaFile SET LibraryFolderId = @LibraryFolderId WHERE Id = @Id",
@ -208,7 +200,7 @@ public class LibraryRepository : ILibraryRepository @@ -208,7 +200,7 @@ public class LibraryRepository : ILibraryRepository
public async Task UpdatePath(LibraryPath libraryPath, string normalizedLibraryPath)
{
await using TvContext dbContext = await _dbContextFactory.CreateDbContextAsync();
await using TvContext dbContext = await dbContextFactory.CreateDbContextAsync();
libraryPath.Path = normalizedLibraryPath;
await dbContext.Connection.ExecuteAsync(
"UPDATE LibraryPath SET Path = @Path WHERE Id = @Id",

1
ErsatzTV.Scanner.Tests/Core/Fakes/FakeLocalFileSystem.cs

@ -48,7 +48,6 @@ public class FakeLocalFileSystem : ILocalFileSystem @@ -48,7 +48,6 @@ public class FakeLocalFileSystem : ILocalFileSystem
_files.Map(f => f.Path).Filter(f => Path.GetDirectoryName(f) == folder);
public bool FileExists(string path) => _files.Any(f => f.Path == path);
public bool FolderExists(string folder) => false;
public Task<Either<BaseError, Unit>> CopyFile(string source, string destination) =>
Task.FromResult(Right<BaseError, Unit>(Unit.Default));

6
ErsatzTV/Services/RunOnce/CacheCleanerService.cs

@ -28,7 +28,7 @@ public class CacheCleanerService( @@ -28,7 +28,7 @@ public class CacheCleanerService(
ILocalFileSystem localFileSystem = scope.ServiceProvider.GetRequiredService<ILocalFileSystem>();
IFileSystem fileSystem = scope.ServiceProvider.GetRequiredService<IFileSystem>();
if (localFileSystem.FolderExists(FileSystemLayout.LegacyImageCacheFolder))
if (fileSystem.Directory.Exists(FileSystemLayout.LegacyImageCacheFolder))
{
logger.LogInformation("Migrating channel logos from legacy image cache folder");
@ -54,14 +54,14 @@ public class CacheCleanerService( @@ -54,14 +54,14 @@ public class CacheCleanerService(
Directory.Delete(FileSystemLayout.LegacyImageCacheFolder, true);
}
if (localFileSystem.FolderExists(FileSystemLayout.TranscodeFolder))
if (fileSystem.Directory.Exists(FileSystemLayout.TranscodeFolder))
{
logger.LogInformation("Emptying transcode cache folder");
localFileSystem.EmptyFolder(FileSystemLayout.TranscodeFolder);
logger.LogInformation("Done emptying transcode cache folder");
}
if (localFileSystem.FolderExists(FileSystemLayout.ChannelGuideCacheFolder))
if (fileSystem.Directory.Exists(FileSystemLayout.ChannelGuideCacheFolder))
{
logger.LogInformation("Cleaning channel cache");

Loading…
Cancel
Save