Implement media storage and processing features: update configuration in .env.example and appsettings files, enhance Docker setup for media storage, and add media-related services and database entities. Include ffmpeg for media handling and adjust Kestrel settings for large file uploads.

This commit is contained in:
Leonid Pershin
2026-07-24 08:33:11 +03:00
parent 1dd6991174
commit e15ecbdb29
47 changed files with 2599 additions and 1 deletions
@@ -0,0 +1,79 @@
using TeleWave.Domain.Media;
using Xunit;
namespace TeleWave.Domain.Tests.Media;
public class MediaAssetTests
{
[Fact]
public void Register_CreatesPendingAsset_WithNormalizedExtension()
{
var asset = MediaAsset.Register("Simpsons S05E01.MKV", ".MKV", MediaSource.Upload);
Assert.Equal(MediaAssetStatus.Pending, asset.Status);
Assert.Equal(".mkv", asset.OriginalExtension);
Assert.Equal("Simpsons S05E01.MKV", asset.OriginalFileName);
Assert.Equal(MediaSource.Upload, asset.Source);
Assert.NotEqual(Guid.Empty, asset.Id);
}
[Fact]
public void MarkProcessing_SetsProcessingAndClearsError()
{
var asset = MediaAsset.Register("a.mp4", ".mp4", MediaSource.Inbox);
asset.MarkFailed("boom");
asset.MarkProcessing();
Assert.Equal(MediaAssetStatus.Processing, asset.Status);
Assert.Null(asset.ErrorMessage);
}
[Fact]
public void MarkReady_StoresSegmentationMetadata()
{
var asset = MediaAsset.Register("a.mp4", ".mp4", MediaSource.Upload);
asset.MarkReady(
TimeSpan.FromSeconds(120),
segmentSeconds: 2,
segmentCount: 60,
width: 1920,
height: 1080,
videoCodec: "h264",
audioCodec: "aac",
relativePath: "assets/abc"
);
Assert.Equal(MediaAssetStatus.Ready, asset.Status);
Assert.Equal(TimeSpan.FromSeconds(120), asset.Duration);
Assert.Equal(2, asset.SegmentSeconds);
Assert.Equal(60, asset.SegmentCount);
Assert.Equal(1920, asset.Width);
Assert.Equal(1080, asset.Height);
Assert.Equal("assets/abc", asset.RelativePath);
Assert.Null(asset.ErrorMessage);
}
[Fact]
public void MarkFailed_StoresError()
{
var asset = MediaAsset.Register("a.mp4", ".mp4", MediaSource.Upload);
asset.MarkFailed("ffmpeg exited 1");
Assert.Equal(MediaAssetStatus.Failed, asset.Status);
Assert.Equal("ffmpeg exited 1", asset.ErrorMessage);
}
[Fact]
public void ResetToPending_FromProcessing_ReturnsToQueue()
{
var asset = MediaAsset.Register("a.mp4", ".mp4", MediaSource.Upload);
asset.MarkProcessing();
asset.ResetToPending();
Assert.Equal(MediaAssetStatus.Pending, asset.Status);
}
}