From e19899b6f63355a7f24d1b7ff21dd062e400b8dd Mon Sep 17 00:00:00 2001 From: lxbdev Date: Tue, 2 Sep 2025 11:29:59 +0200 Subject: [PATCH 1/3] copilot draft for video generation (working!) --- OpenAIChatGPTBlazor/Components/App.razor | 1 + .../Components/GenerateVideoOptions.razor | 47 +++ .../Components/Layout/NavMenu.razor | 5 + .../Components/Pages/GenerateVideo.razor | 128 +++++++ .../Components/Pages/GenerateVideo.razor.cs | 271 +++++++++++++++ .../Components/Pages/GenerateVideo.razor.css | 102 ++++++ OpenAIChatGPTBlazor/Program.cs | 10 + .../Services/Models/VideoModels.cs | 234 +++++++++++++ .../Services/VideoGenerationService.cs | 321 ++++++++++++++++++ OpenAIChatGPTBlazor/wwwroot/js/video-utils.js | 47 +++ 10 files changed, 1166 insertions(+) create mode 100644 OpenAIChatGPTBlazor/Components/GenerateVideoOptions.razor create mode 100644 OpenAIChatGPTBlazor/Components/Pages/GenerateVideo.razor create mode 100644 OpenAIChatGPTBlazor/Components/Pages/GenerateVideo.razor.cs create mode 100644 OpenAIChatGPTBlazor/Components/Pages/GenerateVideo.razor.css create mode 100644 OpenAIChatGPTBlazor/Services/Models/VideoModels.cs create mode 100644 OpenAIChatGPTBlazor/Services/VideoGenerationService.cs create mode 100644 OpenAIChatGPTBlazor/wwwroot/js/video-utils.js diff --git a/OpenAIChatGPTBlazor/Components/App.razor b/OpenAIChatGPTBlazor/Components/App.razor index 6b06157..419d9d7 100644 --- a/OpenAIChatGPTBlazor/Components/App.razor +++ b/OpenAIChatGPTBlazor/Components/App.razor @@ -38,6 +38,7 @@ + diff --git a/OpenAIChatGPTBlazor/Components/GenerateVideoOptions.razor b/OpenAIChatGPTBlazor/Components/GenerateVideoOptions.razor new file mode 100644 index 0000000..dc40f0a --- /dev/null +++ b/OpenAIChatGPTBlazor/Components/GenerateVideoOptions.razor @@ -0,0 +1,47 @@ +@using OpenAIChatGPTBlazor.Services.Models + +
+
+ + +
+ +
+ + +
+ +
+ + +
+
+ +@code { + [Parameter] public int Width { get; set; } = 480; + [Parameter] public EventCallback WidthChanged { get; set; } + + [Parameter] public int Height { get; set; } = 480; + [Parameter] public EventCallback HeightChanged { get; set; } + + [Parameter] public int NSeconds { get; set; } = 5; + [Parameter] public EventCallback NSecondsChanged { get; set; } +} diff --git a/OpenAIChatGPTBlazor/Components/Layout/NavMenu.razor b/OpenAIChatGPTBlazor/Components/Layout/NavMenu.razor index aafb78d..2077150 100644 --- a/OpenAIChatGPTBlazor/Components/Layout/NavMenu.razor +++ b/OpenAIChatGPTBlazor/Components/Layout/NavMenu.razor @@ -18,6 +18,11 @@ Image Gen + diff --git a/OpenAIChatGPTBlazor/Components/Pages/GenerateVideo.razor b/OpenAIChatGPTBlazor/Components/Pages/GenerateVideo.razor index 71a4608..c374194 100644 --- a/OpenAIChatGPTBlazor/Components/Pages/GenerateVideo.razor +++ b/OpenAIChatGPTBlazor/Components/Pages/GenerateVideo.razor @@ -51,34 +51,6 @@ } - @if (_videoResults != null && _videoResults.Any()) - { -
- @for (int i = 0; i < _videoResults.Count; i++) - { - var video = _videoResults[i]; -
- -
- - Duration: @video.Duration.ToString("F1")s | Resolution: @video.Resolution | Format: @video.Format - -
- @if (!string.IsNullOrEmpty(video.VideoUrl)) - { - - } -
-
- } -
- } - @if (_videoBytes != null && _videoBytes.Any()) {
@@ -86,16 +58,22 @@ { var base64 = System.Convert.ToBase64String(_videoBytes[i]);
-
} diff --git a/OpenAIChatGPTBlazor/Components/Pages/GenerateVideo.razor.cs b/OpenAIChatGPTBlazor/Components/Pages/GenerateVideo.razor.cs index 2818a98..5fd04db 100644 --- a/OpenAIChatGPTBlazor/Components/Pages/GenerateVideo.razor.cs +++ b/OpenAIChatGPTBlazor/Components/Pages/GenerateVideo.razor.cs @@ -6,7 +6,7 @@ namespace OpenAIChatGPTBlazor.Components.Pages; -public partial class GenerateVideo +public partial class GenerateVideo : IDisposable { private CancellationTokenSource? _cancellationTokenSource; private string _warningMessage = string.Empty; @@ -238,34 +238,17 @@ private void AbortGeneration() } } - private async Task DownloadVideo(string videoUrl, int index) + public void Dispose() { - try - { - await JS.InvokeVoidAsync("downloadFile", videoUrl, $"generated-video-{index + 1}.mp4"); - } - catch (Exception ex) - { - _warningMessage = $"Error downloading video: {ex.Message}"; - } + Dispose(true); + GC.SuppressFinalize(this); } - private async Task DownloadVideoFromBytes(byte[] videoBytes, int index) + protected virtual void Dispose(bool disposing) { - try + if (disposing) { - var base64 = Convert.ToBase64String(videoBytes); - var dataUrl = $"data:video/mp4;base64,{base64}"; - await JS.InvokeVoidAsync("downloadFile", dataUrl, $"generated-video-{index + 1}.mp4"); - } - catch (Exception ex) - { - _warningMessage = $"Error downloading video: {ex.Message}"; + _cancellationTokenSource?.Dispose(); } } - - public void Dispose() - { - _cancellationTokenSource?.Dispose(); - } } diff --git a/OpenAIChatGPTBlazor/Services/VideoGenerationService.cs b/OpenAIChatGPTBlazor/Services/VideoGenerationService.cs index e47588c..3508fcc 100644 --- a/OpenAIChatGPTBlazor/Services/VideoGenerationService.cs +++ b/OpenAIChatGPTBlazor/Services/VideoGenerationService.cs @@ -88,7 +88,7 @@ IConfiguration configuration var baseUrl = endpoint ?? ExtractBaseUrlFromClient(); var useApiKey = !string.IsNullOrEmpty(key); - _logger.LogInformation( + _logger.LogDebug( "Video service configured with {AuthMethod} authentication", useApiKey ? "API Key" : "Managed Identity" ); From 8f963349032de37e7c473e90ffde355507603854 Mon Sep 17 00:00:00 2001 From: lxbdev Date: Mon, 17 Nov 2025 15:32:48 +0100 Subject: [PATCH 3/3] Sora-2 --- .../Components/GenerateVideoOptions.razor | 58 ++++----- .../Components/Pages/GenerateVideo.razor | 118 +++++++++--------- .../Components/Pages/GenerateVideo.razor.cs | 40 +++--- .../Services/Models/VideoModels.cs | 117 +++++++++++++++-- .../Services/VideoGenerationService.cs | 45 ++++--- 5 files changed, 234 insertions(+), 144 deletions(-) diff --git a/OpenAIChatGPTBlazor/Components/GenerateVideoOptions.razor b/OpenAIChatGPTBlazor/Components/GenerateVideoOptions.razor index dada3dc..ad6a3c2 100644 --- a/OpenAIChatGPTBlazor/Components/GenerateVideoOptions.razor +++ b/OpenAIChatGPTBlazor/Components/GenerateVideoOptions.razor @@ -4,27 +4,15 @@
- +
- -
-
- -
-
- + + + + +
@@ -32,11 +20,9 @@
@@ -53,21 +39,19 @@ [Parameter] public int NSeconds { get; set; } [Parameter] public EventCallback NSecondsChanged { get; set; } - private async Task OnWidthChange(ChangeEventArgs e) - { - if (int.TryParse(e.Value?.ToString(), out var width)) - { - Width = width; - await WidthChanged.InvokeAsync(Width); - } - } - - private async Task OnHeightChange(ChangeEventArgs e) + private async Task OnResolutionChange(ChangeEventArgs e) { - if (int.TryParse(e.Value?.ToString(), out var height)) + var resolution = e.Value?.ToString(); + if (!string.IsNullOrEmpty(resolution)) { - Height = height; - await HeightChanged.InvokeAsync(Height); + var parts = resolution.Split('x'); + if (parts.Length == 2 && int.TryParse(parts[0], out var width) && int.TryParse(parts[1], out var height)) + { + Width = width; + Height = height; + await WidthChanged.InvokeAsync(Width); + await HeightChanged.InvokeAsync(Height); + } } } diff --git a/OpenAIChatGPTBlazor/Components/Pages/GenerateVideo.razor b/OpenAIChatGPTBlazor/Components/Pages/GenerateVideo.razor index c374194..bac1b18 100644 --- a/OpenAIChatGPTBlazor/Components/Pages/GenerateVideo.razor +++ b/OpenAIChatGPTBlazor/Components/Pages/GenerateVideo.razor @@ -11,96 +11,96 @@

- Welcome to my Video Generation using OpenAI Sora + Welcome to my Video Generation using OpenAI Sora-2

@if (_loading) - { -
-
-

... please wait ...

+ { +
+
+

... please wait ...

@if (!string.IsNullOrEmpty(_currentJobId)) - { -

Job ID: @_currentJobId

-

Status: @_jobStatus

- @if (_jobProgress > 0) - { + { +

Job ID: @_currentJobId

+

Status: @_jobStatus

+ @if (_jobProgress > 0) + {
-
- @_jobProgress% -
-
- } - } +
+ @_jobProgress% +
+
+ } + } } @if (_warningMessage.Length > 0) - { + {
- Warning! @_warningMessage. -
+ Warning! @_warningMessage. +
} - @if (_successMessage.Length > 0) + @if (_successMessage.Length > 0) { -
- Success! @_successMessage. +
+ Success! @_successMessage.
- } + } @if (_videoBytes != null && _videoBytes.Any()) + { +
+ @for (int i = 0; i < _videoBytes.Count; i++) + { + var base64 = System.Convert.ToBase64String(_videoBytes[i]); +
+ +
+ @if (i < _videoResults.Count) + { + var video = _videoResults[i]; + + Duration: @video.Duration.ToString("F1")s | Resolution: @video.Resolution | Format: @video.Format + + } + else { -
- @for (int i = 0; i < _videoBytes.Count; i++) - { - var base64 = System.Convert.ToBase64String(_videoBytes[i]); -
- -
- @if (i < _videoResults.Count) - { - var video = _videoResults[i]; - - Duration: @video.Duration.ToString("F1")s | Resolution: @video.Resolution | Format: @video.Format - - } - else - { - Video @(i + 1) - } -
-
- } + Video @(i + 1) + } +
+
+ }
}