using System.Text.Json.Serialization; namespace SaasMediaWorker.Models; /// /// Redis kuyruğundan alınan video üretim job payload'ı. /// NestJS VideoGenerationProducer tarafından JSON olarak yazılır. /// public class VideoGenerationJob { [JsonPropertyName("jobId")] public string JobId { get; set; } = string.Empty; [JsonPropertyName("projectId")] public string ProjectId { get; set; } = string.Empty; [JsonPropertyName("renderJobId")] public string RenderJobId { get; set; } = string.Empty; [JsonPropertyName("scriptJson")] public ScriptPayload? ScriptJson { get; set; } [JsonPropertyName("language")] public string Language { get; set; } = "tr"; [JsonPropertyName("aspectRatio")] public string AspectRatio { get; set; } = "PORTRAIT_9_16"; [JsonPropertyName("videoStyle")] public string VideoStyle { get; set; } = "CINEMATIC"; [JsonPropertyName("targetDuration")] public int TargetDuration { get; set; } = 60; [JsonPropertyName("scenes")] public List Scenes { get; set; } = new(); [JsonPropertyName("timestamp")] public string Timestamp { get; set; } = string.Empty; } public class ScriptPayload { [JsonPropertyName("metadata")] public ScriptMetadata? Metadata { get; set; } [JsonPropertyName("scenes")] public List Scenes { get; set; } = new(); [JsonPropertyName("musicPrompt")] public string MusicPrompt { get; set; } = string.Empty; [JsonPropertyName("musicStyle")] public string MusicStyle { get; set; } = string.Empty; [JsonPropertyName("musicTechnical")] public MusicTechnicalPayload? MusicTechnical { get; set; } [JsonPropertyName("ambientSoundPrompts")] public List AmbientSoundPrompts { get; set; } = new(); [JsonPropertyName("voiceStyle")] public string VoiceStyle { get; set; } = string.Empty; } public class MusicTechnicalPayload { [JsonPropertyName("bpm")] public int Bpm { get; set; } [JsonPropertyName("key")] public string? Key { get; set; } [JsonPropertyName("instruments")] public List Instruments { get; set; } = new(); [JsonPropertyName("emotionalArc")] public string EmotionalArc { get; set; } = string.Empty; } public class ScriptMetadata { [JsonPropertyName("title")] public string Title { get; set; } = string.Empty; [JsonPropertyName("description")] public string Description { get; set; } = string.Empty; [JsonPropertyName("totalDurationSeconds")] public double TotalDurationSeconds { get; set; } [JsonPropertyName("language")] public string Language { get; set; } = string.Empty; [JsonPropertyName("hashtags")] public List Hashtags { get; set; } = new(); } public class ScriptScene { [JsonPropertyName("order")] public int Order { get; set; } [JsonPropertyName("title")] public string? Title { get; set; } [JsonPropertyName("narrationText")] public string NarrationText { get; set; } = string.Empty; [JsonPropertyName("visualPrompt")] public string VisualPrompt { get; set; } = string.Empty; [JsonPropertyName("subtitleText")] public string SubtitleText { get; set; } = string.Empty; [JsonPropertyName("durationSeconds")] public double DurationSeconds { get; set; } [JsonPropertyName("transitionType")] public string TransitionType { get; set; } = "CUT"; } public class ScenePayload { [JsonPropertyName("id")] public string Id { get; set; } = string.Empty; [JsonPropertyName("order")] public int Order { get; set; } [JsonPropertyName("narrationText")] public string NarrationText { get; set; } = string.Empty; [JsonPropertyName("visualPrompt")] public string VisualPrompt { get; set; } = string.Empty; [JsonPropertyName("subtitleText")] public string SubtitleText { get; set; } = string.Empty; [JsonPropertyName("duration")] public double Duration { get; set; } [JsonPropertyName("transitionType")] public string TransitionType { get; set; } = "CUT"; [JsonPropertyName("ambientSoundPrompt")] public string? AmbientSoundPrompt { get; set; } } /// /// Render pipeline'ının ürettiği medya dosyası referansı. /// public class GeneratedMediaFile { public string SceneId { get; set; } = string.Empty; public int SceneOrder { get; set; } public MediaFileType Type { get; set; } public string LocalPath { get; set; } = string.Empty; public string? S3Url { get; set; } public string? S3Key { get; set; } public long FileSizeBytes { get; set; } public double? DurationSeconds { get; set; } public string MimeType { get; set; } = string.Empty; public string? AiProvider { get; set; } } public enum MediaFileType { VideoClip, AudioNarration, AudioMusic, AudioAmbient, Subtitle, Thumbnail, FinalVideo }