Added audio and video transcription for chats and assistants (#856)
Build and Release / Determine run mode (push) Waiting to run
Build and Release / Read metadata (push) Blocked by required conditions
Build and Release / Sync Flatpak repo (push) Blocked by required conditions
Build and Release / Collect Flatpak artifacts (push) Blocked by required conditions
Build and Release / Build app (${{ matrix.dotnet_runtime }}) (-aarch64-apple-darwin, osx-arm64, macos-latest, aarch64-apple-darwin, dmg,app,updater, dmg) (push) Blocked by required conditions
Build and Release / Build app (${{ matrix.dotnet_runtime }}) (-aarch64-pc-windows-msvc.exe, win-arm64, windows-latest, aarch64-pc-windows-msvc, nsis,updater, nsis) (push) Blocked by required conditions
Build and Release / Build app (${{ matrix.dotnet_runtime }}) (-aarch64-unknown-linux-gnu, linux-arm64, ubuntu-22.04-arm, aarch64-unknown-linux-gnu, appimage,updater, appimage) (push) Blocked by required conditions
Build and Release / Build app (${{ matrix.dotnet_runtime }}) (-x86_64-apple-darwin, osx-x64, macos-latest, x86_64-apple-darwin, dmg,app,updater, dmg) (push) Blocked by required conditions
Build and Release / Build app (${{ matrix.dotnet_runtime }}) (-x86_64-pc-windows-msvc.exe, win-x64, windows-latest, x86_64-pc-windows-msvc, nsis,updater, nsis) (push) Blocked by required conditions
Build and Release / Build app (${{ matrix.dotnet_runtime }}) (-x86_64-unknown-linux-gnu, linux-x64, ubuntu-22.04, x86_64-unknown-linux-gnu, appimage,updater, appimage) (push) Blocked by required conditions
Build and Release / Prepare & create release (push) Blocked by required conditions
Build and Release / Publish release (push) Blocked by required conditions

This commit is contained in:
Thorsten Sommer authored and GitHub committed 2026-07-15 12:53:30 +02:00
1 parent 5dc6282908
commit aaf77b6882
83 files changed
+5985 -442

No files matched your search

@@ -0,0 +1,7 @@
namespace AIStudio.Tools.Rust;
/// <summary>Request body used to start a Rust media normalization job.</summary>
/// <param name="InputPath">Absolute source media path.</param>
/// <param name="OutputPath">Absolute operation-owned output path.</param>
/// <param name="MaxPassThroughBytes">Optional pass-through size ceiling.</param>
public sealed record CreateMediaJobRequest(string InputPath, string OutputPath, ulong? MaxPassThroughBytes = null);
@@ -0,0 +1,5 @@
namespace AIStudio.Tools.Rust;
/// <summary>Response returned after a Rust media job is registered.</summary>
/// <param name="JobId">Opaque runtime job identifier.</param>
public sealed record CreateMediaJobResponse(string JobId);
@@ -61,7 +61,7 @@ public static class FileTypes
public static readonly FileTypeFilter IMAGE = FileTypeFilter.Leaf(TB("Image"),
"jpg", "jpeg", "png", "gif", "bmp", "tiff", "svg", "webp", "heic");
public static readonly FileTypeFilter AUDIO = FileTypeFilter.Leaf(TB("Audio"),
"mp3", "wav", "wave", "aac", "flac", "ogg", "m4a", "wma", "alac", "aiff", "m4b");
"mp3", "wav", "wave", "aac", "flac", "ogg", "opus", "m4a", "m4b", "wma", "alac", "aif", "aiff", "caf");
public static readonly FileTypeFilter VIDEO = FileTypeFilter.Leaf(TB("Video"),
"mp4", "m4v", "avi", "mkv", "mov", "wmv", "flv", "webm");
@@ -0,0 +1,8 @@
namespace AIStudio.Tools.Rust;
/// <summary>
/// Runtime media error containing a stable code and an English log diagnostic.
/// </summary>
/// <param name="Code">Stable machine-readable error category.</param>
/// <param name="Message">US-English diagnostic intended for logs.</param>
public sealed record MediaJobError(MediaJobErrorCode Code, string Message);
@@ -0,0 +1,85 @@
namespace AIStudio.Tools.Rust;
/// <summary>
/// Stable failure categories returned by the Rust media pipeline.
/// </summary>
public enum MediaJobErrorCode
{
/// <summary>The runtime returned an unrecognized code.</summary>
UNKNOWN,
/// <summary>The input file does not exist.</summary>
FILE_NOT_FOUND,
/// <summary>The file type could not be identified.</summary>
UNKNOWN_FORMAT,
/// <summary>Executable input was rejected.</summary>
UNSAFE_FILE,
/// <summary>The input is not media.</summary>
NOT_MEDIA,
/// <summary>The input file could not be opened.</summary>
FILE_OPEN_FAILED,
/// <summary>The container is unsupported.</summary>
UNSUPPORTED_CONTAINER,
/// <summary>The media has no audio track.</summary>
NO_AUDIO_TRACK,
/// <summary>No audio track has a supported decoder.</summary>
UNSUPPORTED_CODEC,
/// <summary>Decoded audio parameters are absent or inconsistent.</summary>
INVALID_AUDIO_PARAMETERS,
/// <summary>The Opus identification header is invalid.</summary>
INVALID_OPUS_HEADER,
/// <summary>The Opus mapping requires unsupported multistream decoding.</summary>
UNSUPPORTED_OPUS_MAPPING,
/// <summary>The decoder could not be initialized.</summary>
DECODER_INIT_FAILED,
/// <summary>The encoder could not be initialized.</summary>
ENCODER_INIT_FAILED,
/// <summary>The stream changed unexpectedly.</summary>
STREAM_RESET,
/// <summary>The container is damaged.</summary>
DAMAGED_CONTAINER,
/// <summary>Audio decoding failed.</summary>
DECODE_FAILED,
/// <summary>Audio resampling failed.</summary>
RESAMPLE_FAILED,
/// <summary>Opus encoding failed.</summary>
ENCODE_FAILED,
/// <summary>The output directory or file could not be created.</summary>
OUTPUT_CREATE_FAILED,
/// <summary>The output could not be written.</summary>
OUTPUT_WRITE_FAILED,
/// <summary>The partial output could not be committed.</summary>
OUTPUT_COMMIT_FAILED,
/// <summary>A WebM relative timestamp overflowed.</summary>
WEBM_TIMESTAMP_OVERFLOW,
/// <summary>WebM serialization failed.</summary>
WEBM_WRITE_FAILED,
/// <summary>The job was cancelled.</summary>
CANCELLED,
/// <summary>The runtime worker failed unexpectedly.</summary>
INTERNAL_ERROR,
}
@@ -0,0 +1,12 @@
namespace AIStudio.Tools.Rust;
/// <summary>Snapshot emitted by the Rust media job event stream.</summary>
/// <param name="Phase">Current job phase.</param>
/// <param name="Progress">Optional progress fraction.</param>
/// <param name="Result">Completed result.</param>
/// <param name="Error">Failure diagnostic.</param>
public sealed record MediaJobEvent(
MediaJobPhase Phase,
double? Progress,
MediaJobResult? Result,
MediaJobError? Error);
@@ -0,0 +1,23 @@
namespace AIStudio.Tools.Rust;
/// <summary>Lifecycle phases exposed by the Rust media API.</summary>
public enum MediaJobPhase
{
/// <summary>An unknown future value received from Rust.</summary>
UNKNOWN,
/// <summary>The runtime is identifying the input and selecting audio.</summary>
PROBING,
/// <summary>The runtime is normalizing audio.</summary>
TRANSCODING,
/// <summary>The output was committed successfully.</summary>
COMPLETED,
/// <summary>The job failed.</summary>
FAILED,
/// <summary>Cancellation and temporary-output cleanup completed.</summary>
CANCELLED,
}
@@ -0,0 +1,20 @@
namespace AIStudio.Tools.Rust;
/// <summary>Successful terminal result returned by Rust media normalization.</summary>
/// <param name="OutputPath">Committed normalized output path.</param>
/// <param name="OutputFormat">Stable normalized container used for provider uploads.</param>
/// <param name="OutputCodec">Stable normalized audio codec used for provider uploads.</param>
/// <param name="DetectedFormat">Detected container diagnostic.</param>
/// <param name="DetectedCodec">Selected codec diagnostic.</param>
/// <param name="DurationMs">Normalized duration in milliseconds.</param>
/// <param name="PassThrough">Whether the source was copied unchanged.</param>
/// <param name="HasAudibleSignal">Whether the normalized audio exceeds the practical-silence threshold.</param>
public sealed record MediaJobResult(
string OutputPath,
string OutputFormat,
string OutputCodec,
string DetectedFormat,
string DetectedCodec,
ulong DurationMs,
bool PassThrough,
bool HasAudibleSignal);