updated to accept only .tar.zstd uploads

This commit is contained in:
2026-09-23 17:48:42 +02:00
parent cf337483d7
commit c6b27cd3c9
15 changed files with 556 additions and 50 deletions
@@ -6,11 +6,13 @@ namespace ParadoxSaveParser.WebAPI.BackgroundTasks;
public class BackgroundJobManager
{
private readonly ILogger _parentLogger;
private readonly Config.SaveUploadConfig _uploadConfig;
private long _lastJobId;
public BackgroundJobManager(ILogger logger)
public BackgroundJobManager(ILogger logger, Config.SaveUploadConfig uploadConfig)
{
_parentLogger = logger;
_uploadConfig = uploadConfig;
}
public SaveParsingOperation StartNewParsingOperation(
@@ -18,7 +20,8 @@ public class BackgroundJobManager
{
long nextId = Interlocked.Increment(ref _lastJobId);
var contextLogger = new ContextLogger($"BackgroundJob-{nextId}", _parentLogger);
var op = new SaveParsingOperation(nextId, meta, filter, contextLogger, ct);
var op = new SaveParsingOperation(nextId, meta, filter,
_uploadConfig.MaxSizePlainTextBytes, contextLogger, ct);
op.StartAsync();
return op;
}
@@ -1,6 +1,4 @@
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Text.Encodings.Web;
using System.Text.Json.Serialization;
using ParadoxSaveParser.WebAPI.Database;
@@ -14,6 +12,7 @@ public class SaveParsingOperation
private readonly SaveFileMetadata _meta;
private readonly ISaveDataFilter _filter;
private readonly long _maxGameDataBytes;
private readonly ContextLogger _logger;
private readonly CancellationToken _ct;
@@ -26,11 +25,12 @@ public class SaveParsingOperation
};
public SaveParsingOperation(long operationId, SaveFileMetadata meta, ISaveDataFilter filter,
ContextLogger logger, CancellationToken ct)
long maxGameDataBytes, ContextLogger logger, CancellationToken ct)
{
OperationId = operationId;
_meta = meta;
_filter = filter;
_maxGameDataBytes = maxGameDataBytes;
_logger = logger;
_ct = ct;
}
@@ -76,17 +76,10 @@ public class SaveParsingOperation
Dictionary<string, object> parsedData;
await using (var gamestateStream = PathHelper.CreateTempFile())
{
// TODO: ckeck if it is zip archive or plain text like in Search.cs
using (var zipArchive = ZipFile.Open(_meta.GetSaveFilePath().Str, ZipArchiveMode.Read))
{
var zipEntry = zipArchive.Entries.FirstOrDefault(e => e.Name == "gamestate");
if (zipEntry is null)
throw new Exception("Invalid save format: no 'gamestate' file found");
await SaveArchive.ExtractGameData(_meta.GetSaveFilePath(), _meta.game, gamestateStream,
_maxGameDataBytes, _ct);
gamestateStream.Seek(0, SeekOrigin.Begin);
await zipEntry.Open().CopyToAsync(gamestateStream, _ct);
gamestateStream.Seek(0, SeekOrigin.Begin);
}
await Program.DB.UpdateMetadataStatus(_meta, SaveFileProcessingStatus.Parsing);
var parser = new SaveParserEU4(gamestateStream, _filter.SearchExpression);
parsedData = parser.Parse();