1 Commits

Author SHA1 Message Date
ecenshu 9836ccf81b Skip Snapshot Addition if hash and path exists
ci / build_linux (push) Successful in 8m50s
2025-12-14 11:36:37 +10:30
4 changed files with 38 additions and 14 deletions
+1
View File
@@ -10,3 +10,4 @@ data/*
TinfoilVibeServer/config/prod.keys
TinfoilVibeServer/data/*
!TinfoilVibeServer/data/.gitkeep
.vs/
+16 -9
View File
@@ -7,6 +7,7 @@ using SharpCompress.Archives;
using SharpCompress.Archives.Rar;
using SharpCompress.Archives.SevenZip;
using SharpCompress.Common;
using SharpCompress.Readers;
using TinfoilVibeServer.Models;
using TinfoilVibeServer.Utilities;
using ZipArchive = SharpCompress.Archives.Zip.ZipArchive;
@@ -151,6 +152,10 @@ public sealed class ArchiveHandler : IArchiveHandler
{
_logger.LogError("Failed to extract title info from archive {Archive}: {Exception}", path, e.Message);
}
else if (e.Message.StartsWith("Unable to decrypt NCA section"))
{
_logger.LogError("Unable to decrypt NCA section, try updating prod.keys");
}
else
{
throw;
@@ -171,17 +176,19 @@ public sealed class ArchiveHandler : IArchiveHandler
_logger.LogInformation(
"Failed to open archive with SharpCompress, falling back to SharpSevenZip {Exception}",
exception.Message);
using var archive = SevenZipArchive.Open(path);
using var archive = SevenZipArchive.Open(path, new ReaderOptions { LeaveStreamOpen = false });
foreach (var entry in archive.Entries)
{
if (entry is { IsDirectory: false, Key: not null } && IsRomArchive(entry.Key))
{
var temp = Path.GetTempFileName();
entry.WriteToFile(temp);
var title = _nspExtractor.ExtractFromFile(temp); // instance call
File.Delete(temp);
if (title != null) titles.Add((entry.Key, entry.Size, title));
}
if (entry is not { IsDirectory: false, Key: not null } || !IsRomArchive(entry.Key)) continue;
var temp = Path.GetTempFileName();
entry.WriteToFile(temp);
var title = _nspExtractor.ExtractFromFile(temp); // instance call
File.Delete(temp);
if (title == null) continue;
_logger.LogInformation("Extracted title {Key} using SharpSevenZip", entry.Key);
titles.Add((entry.Key, entry.Size, title));
}
}
+11 -3
View File
@@ -317,9 +317,12 @@ public sealed class SnapshotService : IDisposable, ISnapshotService, IHostedServ
return;
}
var lastModified = File.GetLastWriteTimeUtc(entry.Path.Contains(ArchivePathSeparator) ? entry.Path.Split(ArchivePathSeparator)[0] : entry.Path);
var cacheUpdated = _cache.ContainsKey(entry.Path);
var hashMatch = _hashCache.ContainsKey(entry.Hash) && _hashCache[entry.Hash] == entry.Path;
if (cacheUpdated && hashMatch) return;
var lastModified = File.GetLastWriteTimeUtc(entry.Path.Contains(ArchivePathSeparator) ? entry.Path.Split(ArchivePathSeparator)[0] : entry.Path);
_cache[entry.Path] = new SnapshotEntry(entry.Path, entry.Hash, entry.Size, lastModified, entry.Titles);
_hashCache[entry.Hash] = entry.Path;
_sizeLookup[entry.Hash] = entry.Size;
@@ -858,12 +861,13 @@ public sealed class SnapshotService : IDisposable, ISnapshotService, IHostedServ
try
{
var ext = Path.GetExtension(filePath).ToLowerInvariant();
var multiPartBasePathWithExtension = $"{MultiPartRarHelper.GetBaseNameForRarVolume(filePath)}{ext}";
if (string.CompareOrdinal(multiPartBasePathWithExtension, filePath) != 0)
{
filePath = multiPartBasePathWithExtension;
}
if (FileLockHelper.IsFileLocked(filePath))
{
throw new IOException("File is locked");
@@ -907,6 +911,10 @@ public sealed class SnapshotService : IDisposable, ISnapshotService, IHostedServ
_logger.LogWarning("Load {Path} failed after {retries} attempts", filePath, attempt + 1);
return null;
}
catch (Exception exception)
{
_logger.LogError(exception, "Unknown exception: {exception}", exception.Message);
}
}
return string.Empty;
@@ -67,7 +67,8 @@ public sealed class RewindableStream : Stream
get
{
EnsureLengthAsync(CancellationToken.None).GetAwaiter().GetResult();
return _length.Value;
if (_length != null) return _length.Value;
return -1;
}
}
@@ -139,7 +140,14 @@ public sealed class RewindableStream : Stream
{
// We need the length first.
EnsureLengthAsync(CancellationToken.None).GetAwaiter().GetResult();
newPos = _length.Value + offset;
if (_length != null)
{
newPos = _length.Value + offset;
}
else
{
throw new NullReferenceException(nameof(_length));
}
}
else
{