Mikal S 1 month ago committed by GitHub
commit 4d594ddc1f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -39,7 +39,7 @@ namespace Emby.Server.Implementations.Library
item.GetParents().Any(i => i.IsLocked); item.GetParents().Any(i => i.IsLocked);
// Make sure DateCreated and DateModified have values // Make sure DateCreated and DateModified have values
var fileInfo = directoryService.GetFile(item.Path); var fileInfo = directoryService.GetFileSystemEntry(item.Path);
if (fileInfo is null) if (fileInfo is null)
{ {
return false; return false;

@ -28,6 +28,21 @@ namespace MediaBrowser.Controller.Providers
return _cache.GetOrAdd(path, static (p, fileSystem) => fileSystem.GetFileSystemEntries(p).ToArray(), _fileSystem); return _cache.GetOrAdd(path, static (p, fileSystem) => fileSystem.GetFileSystemEntries(p).ToArray(), _fileSystem);
} }
public FileSystemMetadata? GetFileSystemEntry(string path)
{
if (!_fileCache.TryGetValue(path, out var result))
{
var file = _fileSystem.GetFileSystemInfo(path);
if (file?.Exists ?? false)
{
result = file;
_fileCache.TryAdd(path, result);
}
}
return result;
}
public List<FileSystemMetadata> GetFiles(string path) public List<FileSystemMetadata> GetFiles(string path)
{ {
var list = new List<FileSystemMetadata>(); var list = new List<FileSystemMetadata>();
@ -46,17 +61,30 @@ namespace MediaBrowser.Controller.Providers
public FileSystemMetadata? GetFile(string path) public FileSystemMetadata? GetFile(string path)
{ {
if (!_fileCache.TryGetValue(path, out var result)) var entry = GetFileSystemEntry(path);
return entry != null && !entry.IsDirectory ? entry : null;
}
public List<FileSystemMetadata> GetDirectories(string path)
{
var list = new List<FileSystemMetadata>();
var items = GetFileSystemEntries(path);
for (var i = 0; i < items.Length; i++)
{ {
var file = _fileSystem.GetFileInfo(path); var item = items[i];
if (file.Exists) if (item.IsDirectory)
{ {
result = file; list.Add(item);
_fileCache.TryAdd(path, result);
} }
} }
return result; return list;
}
public FileSystemMetadata? GetDirectory(string path)
{
var entry = GetFileSystemEntry(path);
return entry != null && entry.IsDirectory ? entry : null;
} }
public IReadOnlyList<string> GetFilePaths(string path) public IReadOnlyList<string> GetFilePaths(string path)

@ -9,10 +9,16 @@ namespace MediaBrowser.Controller.Providers
{ {
FileSystemMetadata[] GetFileSystemEntries(string path); FileSystemMetadata[] GetFileSystemEntries(string path);
FileSystemMetadata? GetFileSystemEntry(string path);
List<FileSystemMetadata> GetFiles(string path); List<FileSystemMetadata> GetFiles(string path);
FileSystemMetadata? GetFile(string path); FileSystemMetadata? GetFile(string path);
List<FileSystemMetadata> GetDirectories(string path);
FileSystemMetadata? GetDirectory(string path);
IReadOnlyList<string> GetFilePaths(string path); IReadOnlyList<string> GetFilePaths(string path);
IReadOnlyList<string> GetFilePaths(string path, bool clearCache, bool sort = false); IReadOnlyList<string> GetFilePaths(string path, bool clearCache, bool sort = false);

@ -79,6 +79,21 @@ namespace Jellyfin.Controller.Tests
Assert.Equal(_lowerCaseFileSystemMetadata.Where(f => !f.IsDirectory), lowerCaseResult); Assert.Equal(_lowerCaseFileSystemMetadata.Where(f => !f.IsDirectory), lowerCaseResult);
} }
[Fact]
public void GetDirectories_GivenPathsWithDifferentCasing_ReturnsCorrectDirectories()
{
var fileSystemMock = new Mock<IFileSystem>();
fileSystemMock.Setup(f => f.GetFileSystemEntries(It.Is<string>(x => x == UpperCasePath), false)).Returns(_upperCaseFileSystemMetadata);
fileSystemMock.Setup(f => f.GetFileSystemEntries(It.Is<string>(x => x == LowerCasePath), false)).Returns(_lowerCaseFileSystemMetadata);
var directoryService = new DirectoryService(fileSystemMock.Object);
var upperCaseResult = directoryService.GetDirectories(UpperCasePath);
var lowerCaseResult = directoryService.GetDirectories(LowerCasePath);
Assert.Equal(_upperCaseFileSystemMetadata.Where(f => f.IsDirectory), upperCaseResult);
Assert.Equal(_lowerCaseFileSystemMetadata.Where(f => f.IsDirectory), lowerCaseResult);
}
[Fact] [Fact]
public void GetFile_GivenFilePathsWithDifferentCasing_ReturnsCorrectFile() public void GetFile_GivenFilePathsWithDifferentCasing_ReturnsCorrectFile()
{ {
@ -95,15 +110,52 @@ namespace Jellyfin.Controller.Tests
Exists = false Exists = false
}; };
var fileSystemMock = new Mock<IFileSystem>(); var fileSystemMock = new Mock<IFileSystem>();
fileSystemMock.Setup(f => f.GetFileInfo(It.Is<string>(x => x == upperCasePath))).Returns(upperCaseFileSystemMetadata); fileSystemMock.Setup(f => f.GetFileSystemInfo(It.Is<string>(x => x == upperCasePath))).Returns(upperCaseFileSystemMetadata);
fileSystemMock.Setup(f => f.GetFileInfo(It.Is<string>(x => x == lowerCasePath))).Returns(lowerCaseFileSystemMetadata); fileSystemMock.Setup(f => f.GetFileSystemInfo(It.Is<string>(x => x == lowerCasePath))).Returns(lowerCaseFileSystemMetadata);
var directoryService = new DirectoryService(fileSystemMock.Object);
var lowerCaseDirResult = directoryService.GetDirectory(lowerCasePath);
var lowerCaseFileResult = directoryService.GetFile(lowerCasePath);
var upperCaseDirResult = directoryService.GetDirectory(upperCasePath);
var upperCaseFileResult = directoryService.GetFile(upperCasePath);
Assert.Null(lowerCaseDirResult);
Assert.Equal(lowerCaseFileSystemMetadata, lowerCaseFileResult);
Assert.Null(upperCaseDirResult);
Assert.Null(upperCaseFileResult);
}
[Fact]
public void GetDirectory_GivenFilePathsWithDifferentCasing_ReturnsCorrectDirectory()
{
const string lowerCasePath = "/music/someartist/Lyrics";
var lowerCaseFileSystemMetadata = new FileSystemMetadata
{
FullName = lowerCasePath,
IsDirectory = true,
Exists = true
};
const string upperCasePath = "/music/SOMEARTIST/LYRICS";
var upperCaseFileSystemMetadata = new FileSystemMetadata
{
FullName = upperCasePath,
IsDirectory = true,
Exists = false
};
var fileSystemMock = new Mock<IFileSystem>();
fileSystemMock.Setup(f => f.GetFileSystemInfo(It.Is<string>(x => x == upperCasePath))).Returns(upperCaseFileSystemMetadata);
fileSystemMock.Setup(f => f.GetFileSystemInfo(It.Is<string>(x => x == lowerCasePath))).Returns(lowerCaseFileSystemMetadata);
var directoryService = new DirectoryService(fileSystemMock.Object); var directoryService = new DirectoryService(fileSystemMock.Object);
var lowerCaseResult = directoryService.GetFile(lowerCasePath); var lowerCaseDirResult = directoryService.GetDirectory(lowerCasePath);
var upperCaseResult = directoryService.GetFile(upperCasePath); var lowerCaseFileResult = directoryService.GetFile(lowerCasePath);
var upperCaseDirResult = directoryService.GetDirectory(upperCasePath);
var upperCaseFileResult = directoryService.GetFile(upperCasePath);
Assert.Equal(lowerCaseFileSystemMetadata, lowerCaseResult); Assert.Equal(lowerCaseFileSystemMetadata, lowerCaseDirResult);
Assert.Null(upperCaseResult); Assert.Null(lowerCaseFileResult);
Assert.Null(upperCaseDirResult);
Assert.Null(upperCaseFileResult);
} }
[Fact] [Fact]
@ -122,11 +174,11 @@ namespace Jellyfin.Controller.Tests
}; };
var fileSystemMock = new Mock<IFileSystem>(); var fileSystemMock = new Mock<IFileSystem>();
fileSystemMock.Setup(f => f.GetFileInfo(It.Is<string>(x => x == path))).Returns(cachedFileSystemMetadata); fileSystemMock.Setup(f => f.GetFileSystemInfo(It.Is<string>(x => x == path))).Returns(cachedFileSystemMetadata);
var directoryService = new DirectoryService(fileSystemMock.Object); var directoryService = new DirectoryService(fileSystemMock.Object);
var result = directoryService.GetFile(path); var result = directoryService.GetFile(path);
fileSystemMock.Setup(f => f.GetFileInfo(It.Is<string>(x => x == path))).Returns(newFileSystemMetadata); fileSystemMock.Setup(f => f.GetFileSystemInfo(It.Is<string>(x => x == path))).Returns(newFileSystemMetadata);
var secondResult = directoryService.GetFile(path); var secondResult = directoryService.GetFile(path);
Assert.Equal(cachedFileSystemMetadata, result); Assert.Equal(cachedFileSystemMetadata, result);

Loading…
Cancel
Save