Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions OpenAIChatGPTBlazor/Components/App.razor
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
<script src="lib/prism/plugins/toolbar/prism-toolbar.min.js"></script>
<script src="lib/prism/plugins/copy-to-clipboard/prism-copy-to-clipboard.min.js"></script>

<script src="js/video-utils.js"></script>
<script src="_framework/blazor.web.js"></script>
</body>

Expand Down
66 changes: 66 additions & 0 deletions OpenAIChatGPTBlazor/Components/GenerateVideoOptions.razor
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
@using OpenAIChatGPTBlazor.Services.Models

<EditForm Model="@this">
<div class="form-group">
<div class="row g-2 align-items-center">
<div class="col-auto">
<label for="resolution" class="col-form-label">Resolution</label>
</div>
<div class="col-auto">
<select id="resolution" class="form-select form-select-sm" style="min-width: 180px;" @onchange="OnResolutionChange">
<option value="720x1280" selected="@(Width == 720 && Height == 1280)">720x1280 (Vertical HD)</option>
<option value="1280x720" selected="@(Width == 1280 && Height == 720)">1280x720 (HD Landscape)</option>
<option value="1080x1920" selected="@(Width == 1080 && Height == 1920)">1080x1920 (Vertical FHD)</option>
<option value="1920x1080" selected="@(Width == 1920 && Height == 1080)">1920x1080 (Full HD)</option>
<option value="1024x1024" selected="@(Width == 1024 && Height == 1024)">1024x1024 (Square)</option>
</select>
</div>
<div class="col-auto">
<label for="nSeconds" class="col-form-label">Duration</label>
</div>
<div class="col-auto">
<select id="nSeconds" class="form-select form-select-sm" style="min-width: 120px;" @onchange="OnNSecondsChange">
<option value="4" selected="@(NSeconds == 4)">4 seconds</option>
<option value="8" selected="@(NSeconds == 8)">8 seconds</option>
<option value="12" selected="@(NSeconds == 12)">12 seconds</option>
</select>
</div>
</div>
</div>
</EditForm>

@code {
[Parameter] public int Width { get; set; }
[Parameter] public EventCallback<int> WidthChanged { get; set; }

[Parameter] public int Height { get; set; }
[Parameter] public EventCallback<int> HeightChanged { get; set; }

[Parameter] public int NSeconds { get; set; }
[Parameter] public EventCallback<int> NSecondsChanged { get; set; }

private async Task OnResolutionChange(ChangeEventArgs e)
{
var resolution = e.Value?.ToString();
if (!string.IsNullOrEmpty(resolution))
{
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);
}
}
}

private async Task OnNSecondsChange(ChangeEventArgs e)
{
if (int.TryParse(e.Value?.ToString(), out var nSeconds))
{
NSeconds = nSeconds;
await NSecondsChanged.InvokeAsync(NSeconds);
}
}
}
5 changes: 5 additions & 0 deletions OpenAIChatGPTBlazor/Components/Layout/NavMenu.razor
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,11 @@
<i class="bi fas fa-edit" aria-hidden="true"></i> Image Edit
</NavLink>
</div>
<div class="nav-item px-3">
<NavLink class="nav-link" href="GenerateVideo" Match="NavLinkMatch.All">
<i class="bi fas fa-video" aria-hidden="true"></i> Video Gen
</NavLink>
</div>
</nav>
</div>

106 changes: 106 additions & 0 deletions OpenAIChatGPTBlazor/Components/Pages/GenerateVideo.razor
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
@page "/GenerateVideo"
@rendermode InteractiveServer
@using OpenAIChatGPTBlazor.Services
@using OpenAIChatGPTBlazor.Services.Models
@using Microsoft.FeatureManagement
@inject IJSRuntime JS
@inject IFeatureManager FeatureManager

<PageTitle>Video Generation</PageTitle>

<article>
<div class="top-row p-4 header justify-content-between">
<h4>
Welcome to my Video Generation using OpenAI Sora-2
</h4>
</div>
<div class="row main align-content-start p-4 video-container">

@if (_loading)
{
<br />
<div class="loader"></div>
<p>... please wait ...</p>
@if (!string.IsNullOrEmpty(_currentJobId))
{
<p>Job ID: @_currentJobId</p>
<p>Status: @_jobStatus</p>
@if (_jobProgress > 0)
{
<div class="progress mb-3">
<div class="progress-bar" role="progressbar" style="width: @(_jobProgress)%"
aria-valuenow="@_jobProgress" aria-valuemin="0" aria-valuemax="100">
@_jobProgress%
</div>
</div>
}
}
}

@if (_warningMessage.Length > 0)
{
<div class="alert alert-warning">
<strong>Warning!</strong> @_warningMessage.
</div>
}

@if (_successMessage.Length > 0)
{
<div class="alert alert-success">
<strong>Success!</strong> @_successMessage.
</div>
}

@if (_videoBytes != null && _videoBytes.Any())
{
<div class="row w-100 g-3">
@for (int i = 0; i < _videoBytes.Count; i++)
{
var base64 = System.Convert.ToBase64String(_videoBytes[i]);
<div class="col-12 col-md-6 d-flex flex-column justify-content-center align-items-center">
<video controls class="generated-video" style="width:100%; max-width:100%; max-height:80vh;" preload="metadata" controlslist="noplaybackrate" download>
<source src="data:video/mp4;base64,@base64" type="video/mp4">
Your browser does not support the video tag.
</video>
<div class="video-info mt-2">
@if (i < _videoResults.Count)
{
var video = _videoResults[i];
<small class="text-muted">
Duration: @video.Duration.ToString("F1")s | Resolution: @video.Resolution | Format: @video.Format
</small>
}
else
{
<small class="text-muted">Video @(i + 1)</small>
}
</div>
</div>
}
</div>
}
</div>
<hr />
<div class="row footer">
<div class="col-sm-8">
<textarea type="text" class="form-control" id="videoPromptArea" placeholder="CTRL+Enter to submit video generation"
@bind="_prompt" @bind:event="oninput" @onkeydown="OnPromptKeydown" rows="3">
</textarea>
<small class="form-text text-muted">Describe the video you want to generate. Be specific about actions, scenes, and style.</small>
</div>
<br />
<div class="col-sm-2">
<button id="submitBtn" class="btn btn-success" @onclick="OnSubmitClick" type="submit" disabled=@_loading>
<i class="fas fa-video"></i> Generate
</button>
<button class="btn btn-danger" @onclick="OnAbortClick" type="submit" disabled="@(!_loading)">
<i class="fas fa-stop"></i> Abort
</button>
</div>
<div class="col-12 mb-2">
<GenerateVideoOptions @bind-Width="_width"
@bind-Height="_height"
@bind-NSeconds="_nSeconds" />
</div>
</div>
</article>
Loading
Loading