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.
88 lines
2.1 KiB
Go
88 lines
2.1 KiB
Go
package convertor
|
|
|
|
import (
|
|
"bufio"
|
|
"git.kor-elf.net/kor-elf/gui-for-ffmpeg/internal/application/convertor/encoder"
|
|
"git.kor-elf.net/kor-elf/gui-for-ffmpeg/internal/ffmpeg"
|
|
"io"
|
|
"os/exec"
|
|
"strings"
|
|
)
|
|
|
|
type ConvertorContract interface {
|
|
RunConvert(setting ffmpeg.ConvertSetting, progress ffmpeg.ProgressContract) error
|
|
GetSupportFormats() (encoder.ConvertorFormatsContract, error)
|
|
GetRunningProcesses() map[int]*exec.Cmd
|
|
}
|
|
|
|
type runningProcesses struct {
|
|
items map[int]*exec.Cmd
|
|
numberOfStarts int
|
|
}
|
|
|
|
type convertor struct {
|
|
ffmpegService ffmpeg.UtilitiesContract
|
|
runningProcesses *runningProcesses
|
|
}
|
|
|
|
func NewConvertor(
|
|
ffmpegService ffmpeg.UtilitiesContract,
|
|
) ConvertorContract {
|
|
return &convertor{
|
|
ffmpegService: ffmpegService,
|
|
runningProcesses: &runningProcesses{items: map[int]*exec.Cmd{}, numberOfStarts: 0},
|
|
}
|
|
}
|
|
|
|
func (c *convertor) RunConvert(setting ffmpeg.ConvertSetting, progress ffmpeg.ProgressContract) error {
|
|
ffmpegService, err := c.ffmpegService.GetFFmpeg()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
index := c.runningProcesses.numberOfStarts
|
|
beforeWait := func(cmd *exec.Cmd) {
|
|
c.runningProcesses.numberOfStarts++
|
|
c.runningProcesses.items[index] = cmd
|
|
}
|
|
|
|
afterWait := func(cmd *exec.Cmd) {
|
|
delete(c.runningProcesses.items, index)
|
|
}
|
|
|
|
return ffmpegService.RunConvert(setting, progress, beforeWait, afterWait)
|
|
}
|
|
|
|
func (c *convertor) GetSupportFormats() (encoder.ConvertorFormatsContract, error) {
|
|
var err error
|
|
|
|
formats := encoder.NewConvertorFormats()
|
|
ffmpeg, err := c.ffmpegService.GetFFmpeg()
|
|
if err != nil {
|
|
return formats, err
|
|
}
|
|
err = ffmpeg.GetEncoders(func(scanner *bufio.Reader) {
|
|
for {
|
|
line, _, err := scanner.ReadLine()
|
|
if err != nil {
|
|
if err == io.EOF {
|
|
break
|
|
}
|
|
continue
|
|
}
|
|
text := strings.Split(strings.TrimSpace(string(line)), " ")
|
|
encoderType := string(text[0][0])
|
|
if len(text) < 2 || (encoderType != "V" && encoderType != "A") {
|
|
continue
|
|
}
|
|
formats.NewEncoder(text[1])
|
|
}
|
|
})
|
|
|
|
return formats, err
|
|
}
|
|
|
|
func (c *convertor) GetRunningProcesses() map[int]*exec.Cmd {
|
|
return c.runningProcesses.items
|
|
}
|