LANCommander/LANCommander.Server.ImportExport/Exporters/MediaExporter.cs
2026-07-02 18:09:14 -05:00

66 lines
No EOL
2.1 KiB
C#

using LANCommander.SDK.Enums;
using LANCommander.SDK.Models.Manifest;
using LANCommander.Server.ImportExport.Exceptions;
using LANCommander.Server.ImportExport.Models;
using LANCommander.Server.Services;
using LANCommander.Server.Services.Mappers;
namespace LANCommander.Server.ImportExport.Exporters;
public class MediaExporter(
ManifestMapper manifestMapper,
MediaService mediaService) : BaseExporter<Media, Data.Models.Media>
{
public override async Task<ExportItemInfo> GetExportInfoAsync(Data.Models.Media record)
{
var mediaPath = await mediaService.GetMediaPathAsync(record.Id);
var info = new ExportItemInfo
{
Id = record.Id,
Type = ImportExportRecordType.Media,
Name = String.IsNullOrWhiteSpace(record.Name) ? record.Type.ToString() : $"{record.Type} - {record.Name}",
};
if (File.Exists(mediaPath))
{
var fileInfo = new FileInfo(mediaPath);
if (fileInfo.Exists)
info.Size = fileInfo.Length;
}
return info;
}
public override bool CanExport(Media record) => ExportContext.DataRecord is Data.Models.Game;
public override async Task<Media> ExportAsync(Guid id)
{
var entity = await mediaService.GetAsync(id);
try
{
var path = await mediaService.GetMediaPathAsync(id);
var fileInfo = new FileInfo(path);
if (fileInfo.Exists)
{
var mediaEntry = ExportContext.Archive.CreateEntry($"Media/{entity.Id}");
using (var mediaEntryStream = mediaEntry.Open())
using (var mediaFileStream = new FileStream(path, FileMode.Open))
{
await mediaFileStream.CopyToAsync(mediaEntryStream);
}
}
return await mediaService.GetAsync(id, manifestMapper.ProjectToManifestMedia);
}
catch (Exception ex)
{
throw new ExportSkippedException<Data.Models.Media>(entity, "Could not add media to export file", ex);
}
}
}