Introduce progress bar updates and queue processing logic

Implemented progress bar integration with `ProgressBarContract` for real-time conversion tracking and status updates. Added queue management functionality to process files sequentially with error and completion handling. Extended `ConvertorContract` and `FFmpegContract` to support tracking of running processes and conversion progress.
This commit is contained in:
2025-06-08 22:19:28 +05:00
parent 1b1cdd5c22
commit 2909ef7cea
4 changed files with 251 additions and 4 deletions

View File

@@ -5,6 +5,7 @@ import (
"git.kor-elf.net/kor-elf/gui-for-ffmpeg/internal/application/convertor"
"git.kor-elf.net/kor-elf/gui-for-ffmpeg/internal/application/setting"
"git.kor-elf.net/kor-elf/gui-for-ffmpeg/internal/ffmpeg"
"time"
)
type AppContract interface {
@@ -16,6 +17,8 @@ type AppContract interface {
GetItemsToConvert() convertor.ItemsToConvertContract
GetQueueService() convertor.QueueListContract
Run()
AfterClosing()
RunConvertor()
}
type application struct {
@@ -79,3 +82,56 @@ func (a *application) GetConvertorService() convertor.ConvertorContract {
func (a *application) Run() {
a.fyneApp.Run()
}
func (a *application) RunConvertor() {
go func() {
for {
time.Sleep(time.Millisecond * 3000)
queueId, queue := a.queueService.Next()
if queue == nil {
continue
}
queue.Status = convertor.StatusType(convertor.InProgress)
a.queueService.EventChangeQueue(queueId, queue)
if a.progressBarService.GetContainer().Hidden {
a.progressBarService.GetContainer().Show()
}
totalDuration := float64(0)
ffprobe, err := a.ffmpegService.GetFFprobe()
if err == nil {
totalDuration, err = ffprobe.GetTotalDuration(&queue.Setting.FileInput)
if err != nil {
totalDuration = float64(0)
}
}
progress := a.progressBarService.GetProgressbar(
totalDuration,
queue.Setting.FileInput.Path,
)
err = a.convertorService.RunConvert(*queue.Setting, progress)
if err != nil {
queue.Status = convertor.StatusType(convertor.Error)
queue.Error = err
a.queueService.EventChangeQueue(queueId, queue)
a.progressBarService.ProcessEndedWithError(err.Error())
continue
}
queue.Status = convertor.StatusType(convertor.Completed)
a.queueService.EventChangeQueue(queueId, queue)
a.progressBarService.ProcessEndedWithSuccess(&queue.Setting.FileOut)
}
}()
}
func (a *application) AfterClosing() {
for _, cmd := range a.convertorService.GetRunningProcesses() {
_ = cmd.Process.Kill()
}
}