Improve snippet progress reporting and speed up striped bars
This commit is contained in:
parent
ac424543d8
commit
b826c02660
|
|
@ -51,12 +51,12 @@ func (s *stripedProgress) CreateRenderer() fyne.WidgetRenderer {
|
||||||
fillRect := canvas.NewRectangle(applyAlpha(s.color, 200))
|
fillRect := canvas.NewRectangle(applyAlpha(s.color, 200))
|
||||||
stripes := canvas.NewRaster(func(w, h int) image.Image {
|
stripes := canvas.NewRaster(func(w, h int) image.Image {
|
||||||
img := image.NewRGBA(image.Rect(0, 0, w, h))
|
img := image.NewRGBA(image.Rect(0, 0, w, h))
|
||||||
light := applyAlpha(s.color, 60)
|
light := applyAlpha(s.color, 80)
|
||||||
dark := applyAlpha(s.color, 200)
|
dark := applyAlpha(s.color, 220)
|
||||||
for y := 0; y < h; y++ {
|
for y := 0; y < h; y++ {
|
||||||
for x := 0; x < w; x++ {
|
for x := 0; x < w; x++ {
|
||||||
// animate diagonal stripes using offset
|
// animate diagonal stripes using offset
|
||||||
if (((x + y) + int(s.offset)) / 6 % 2) == 0 {
|
if (((x + y) + int(s.offset)) / 4 % 2) == 0 {
|
||||||
img.Set(x, y, light)
|
img.Set(x, y, light)
|
||||||
} else {
|
} else {
|
||||||
img.Set(x, y, dark)
|
img.Set(x, y, dark)
|
||||||
|
|
@ -106,9 +106,10 @@ func (r *stripedProgressRenderer) MinSize() fyne.Size {
|
||||||
|
|
||||||
func (r *stripedProgressRenderer) Refresh() {
|
func (r *stripedProgressRenderer) Refresh() {
|
||||||
// small drift to animate stripes
|
// small drift to animate stripes
|
||||||
r.bar.offset += 1
|
r.bar.offset += 2
|
||||||
r.Layout(r.bg.Size())
|
r.Layout(r.bg.Size())
|
||||||
canvas.Refresh(r.bg)
|
canvas.Refresh(r.bg)
|
||||||
|
canvas.Refresh(r.stripes)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *stripedProgressRenderer) BackgroundColor() color.Color { return color.Transparent }
|
func (r *stripedProgressRenderer) BackgroundColor() color.Color { return color.Transparent }
|
||||||
|
|
|
||||||
58
main.go
58
main.go
|
|
@ -3712,10 +3712,6 @@ func (s *appState) executeSnippetJob(ctx context.Context, job *queue.Job, progre
|
||||||
center := math.Max(0, src.Duration/2-halfLength)
|
center := math.Max(0, src.Duration/2-halfLength)
|
||||||
start := fmt.Sprintf("%.2f", center)
|
start := fmt.Sprintf("%.2f", center)
|
||||||
|
|
||||||
if progressCallback != nil {
|
|
||||||
progressCallback(0)
|
|
||||||
}
|
|
||||||
|
|
||||||
var args []string
|
var args []string
|
||||||
|
|
||||||
if useSourceFormat {
|
if useSourceFormat {
|
||||||
|
|
@ -3780,7 +3776,7 @@ func (s *appState) executeSnippetJob(ctx context.Context, job *queue.Job, progre
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
args = append(args, "-y", "-hide_banner", "-loglevel", "error", outputPath)
|
args = append(args, "-y", "-hide_banner", "-loglevel", "error")
|
||||||
} else {
|
} else {
|
||||||
// Conversion format mode: Use configured conversion settings
|
// Conversion format mode: Use configured conversion settings
|
||||||
// This allows previewing what the final converted output will look like
|
// This allows previewing what the final converted output will look like
|
||||||
|
|
@ -3876,20 +3872,62 @@ func (s *appState) executeSnippetJob(ctx context.Context, job *queue.Job, progre
|
||||||
args = append(args, "-c:a", "aac", "-b:a", "192k")
|
args = append(args, "-c:a", "aac", "-b:a", "192k")
|
||||||
}
|
}
|
||||||
|
|
||||||
args = append(args, outputPath)
|
// Common args appended after progress flags
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add progress output for live updates (stdout) and finish with output path
|
||||||
|
args = append(args, "-progress", "pipe:1", "-nostats", outputPath)
|
||||||
|
|
||||||
|
if progressCallback != nil {
|
||||||
|
progressCallback(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
logFile, logPath, _ := createConversionLog(inputPath, outputPath, args)
|
logFile, logPath, _ := createConversionLog(inputPath, outputPath, args)
|
||||||
cmd := exec.CommandContext(ctx, platformConfig.FFmpegPath, args...)
|
cmd := exec.CommandContext(ctx, platformConfig.FFmpegPath, args...)
|
||||||
utils.ApplyNoWindow(cmd)
|
utils.ApplyNoWindow(cmd)
|
||||||
|
|
||||||
out, err := cmd.CombinedOutput()
|
stdout, err := cmd.StdoutPipe()
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("snippet stdout pipe: %w", err)
|
||||||
|
}
|
||||||
|
var stderr bytes.Buffer
|
||||||
|
cmd.Stderr = &stderr
|
||||||
|
|
||||||
|
if err := cmd.Start(); err != nil {
|
||||||
|
return fmt.Errorf("snippet start failed: %w (%s)", err, strings.TrimSpace(stderr.String()))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Track progress based on snippet length
|
||||||
|
go func() {
|
||||||
|
scanner := bufio.NewScanner(stdout)
|
||||||
|
for scanner.Scan() {
|
||||||
|
line := scanner.Text()
|
||||||
|
if logFile != nil {
|
||||||
|
fmt.Fprintln(logFile, line)
|
||||||
|
}
|
||||||
|
if strings.HasPrefix(line, "out_time_ms=") && snippetLength > 0 {
|
||||||
|
val := strings.TrimPrefix(line, "out_time_ms=")
|
||||||
|
if ms, err := strconv.ParseFloat(val, 64); err == nil {
|
||||||
|
currentSec := ms / 1_000_000.0
|
||||||
|
pct := (currentSec / float64(snippetLength)) * 100.0
|
||||||
|
if pct > 100 {
|
||||||
|
pct = 100
|
||||||
|
}
|
||||||
|
if progressCallback != nil {
|
||||||
|
progressCallback(pct)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
err = cmd.Wait()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if logFile != nil {
|
if logFile != nil {
|
||||||
fmt.Fprintf(logFile, "\nStatus: failed at %s\nError: %v\nFFmpeg output:\n%s\n", time.Now().Format(time.RFC3339), err, string(out))
|
fmt.Fprintf(logFile, "\nStatus: failed at %s\nError: %v\nFFmpeg stderr:\n%s\n", time.Now().Format(time.RFC3339), err, strings.TrimSpace(stderr.String()))
|
||||||
_ = logFile.Close()
|
_ = logFile.Close()
|
||||||
}
|
}
|
||||||
return fmt.Errorf("snippet failed: %w\nffmpeg output:\n%s", err, string(out))
|
return fmt.Errorf("snippet failed: %w\nFFmpeg stderr:\n%s", err, strings.TrimSpace(stderr.String()))
|
||||||
}
|
}
|
||||||
if logFile != nil {
|
if logFile != nil {
|
||||||
fmt.Fprintf(logFile, "\nStatus: completed at %s\n", time.Now().Format(time.RFC3339))
|
fmt.Fprintf(logFile, "\nStatus: completed at %s\n", time.Now().Format(time.RFC3339))
|
||||||
|
|
@ -3897,7 +3935,7 @@ func (s *appState) executeSnippetJob(ctx context.Context, job *queue.Job, progre
|
||||||
job.LogPath = logPath
|
job.LogPath = logPath
|
||||||
}
|
}
|
||||||
if progressCallback != nil {
|
if progressCallback != nil {
|
||||||
progressCallback(1)
|
progressCallback(100)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user