Skip to content

Commit 40be5e2

Browse files
committed
cache ffmpeg checks, bump refyne
1 parent 4e917a1 commit 40be5e2

6 files changed

Lines changed: 57 additions & 17 deletions

File tree

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ go 1.26
55
require (
66
github.com/alexballas/fyne-tooltip v0.0.0-20260528093432-da161b5c8cac
77
github.com/alexballas/go-ssdp v0.0.4-0.20260524181453-a1b7428979ab
8-
github.com/alexballas/refyne/v2 v2.0.0-20260701235304-1e2f596eee45
8+
github.com/alexballas/refyne/v2 v2.0.0-20260702092501-1bf007f28541
99
github.com/alexballas/xfilepicker v0.0.0-20260615164249-3b661a1044b9
1010
github.com/buger/jsonparser v1.2.0
1111
github.com/charmbracelet/bubbletea v1.3.10

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ github.com/alexballas/fyne-tooltip v0.0.0-20260528093432-da161b5c8cac h1:P+Mync0
66
github.com/alexballas/fyne-tooltip v0.0.0-20260528093432-da161b5c8cac/go.mod h1:ahMS3ktoYdWFIzqbQFJ4TyqdFQpMRSAepNwjKc0Y4/o=
77
github.com/alexballas/go-ssdp v0.0.4-0.20260524181453-a1b7428979ab h1:IicL/N9O22AchM2bp5mwCtvzVpRqCzvPiy9g1FbFLS8=
88
github.com/alexballas/go-ssdp v0.0.4-0.20260524181453-a1b7428979ab/go.mod h1:bvfmHkfGgEntZVIbSzazSp6zSxD68BJGsLVASpcEHxI=
9-
github.com/alexballas/refyne/v2 v2.0.0-20260701235304-1e2f596eee45 h1:vvog6Smo30c8JcX1IPrbOJ93ZzgmVGNfUpfx7w9Vj6Q=
10-
github.com/alexballas/refyne/v2 v2.0.0-20260701235304-1e2f596eee45/go.mod h1:A5ylOSbXKGDIq5nyq92kjxq6Z43H4UQBugJPnN5SqPk=
9+
github.com/alexballas/refyne/v2 v2.0.0-20260702092501-1bf007f28541 h1:R23Aa8CNVIDw4gzmc7iausEQCfBQiGUnwbWn0frkj/M=
10+
github.com/alexballas/refyne/v2 v2.0.0-20260702092501-1bf007f28541/go.mod h1:A5ylOSbXKGDIq5nyq92kjxq6Z43H4UQBugJPnN5SqPk=
1111
github.com/alexballas/xfilepicker v0.0.0-20260615164249-3b661a1044b9 h1:SIRuLmH+VFevJBzb0lxOCrpQyLxLu18zWIhY4lXdi2E=
1212
github.com/alexballas/xfilepicker v0.0.0-20260615164249-3b661a1044b9/go.mod h1:5xgikLIG/bdiSLLJaiF7TamQ0sch9AIVxsDoBdv8Ar8=
1313
github.com/anthonynsimon/bild v0.16.0 h1:LB69jaZEFAzzKx8ZDXV4L3pjGsB5sCuC8HjFC4ubyPw=

internal/gui/actions.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -892,7 +892,7 @@ func playAction(screen *FyneScreen) {
892892
}
893893

894894
func startChromecastScreencast(screen *FyneScreen) (string, string, context.Context, error) {
895-
if err := utils.CheckFFmpeg(screen.ffmpegPath); err != nil {
895+
if err := screen.validateFFmpeg(); err != nil {
896896
return "", "", nil, errors.New(lang.L("ffmpeg is required for screencast"))
897897
}
898898

@@ -2476,7 +2476,7 @@ func resetRTMPUI(screen *FyneScreen) {
24762476
}
24772477

24782478
screen.ClearMedia.Enable()
2479-
if err := utils.CheckFFmpeg(screen.ffmpegPath); err == nil {
2479+
if err := screen.ffmpegStatus(); err == nil {
24802480
if !screen.Screencast {
24812481
screen.TranscodeCheckBox.Enable()
24822482
}

internal/gui/gui.go

Lines changed: 47 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,10 @@ type FyneScreen struct {
9898
muError sync.RWMutex
9999
mu sync.RWMutex
100100
ffmpegPathChanged bool
101+
ffmpegCheckPath string
102+
ffmpegCheckErr error
103+
ffmpegCheckValid bool
104+
ffmpegCheckDirty bool
101105
Medialoop bool
102106
sliderActive bool
103107
dlnaSeekRestart bool
@@ -179,7 +183,7 @@ func (s *FyneScreen) updateFFmpegDependentCheckTooltips() {
179183
return
180184
}
181185

182-
ffmpegMissing := utils.CheckFFmpeg(s.ffmpegPath) != nil
186+
ffmpegMissing := s.ffmpegCheckValid && !s.ffmpegCheckDirty && s.ffmpegCheckPath == s.ffmpegPath && s.ffmpegCheckErr != nil
183187
toolTipMsg := lang.L("ffmpeg is required. install it or update ffmpeg path in Settings")
184188

185189
setToolTip := func(ttCheck *ttwidget.Check, baseCheck *widget.Check) {
@@ -198,6 +202,40 @@ func (s *FyneScreen) updateFFmpegDependentCheckTooltips() {
198202
setToolTip(s.rtmpServerToolTipCheck, s.rtmpServerCheck)
199203
}
200204

205+
func (s *FyneScreen) markFFmpegPathChanged() {
206+
if s == nil {
207+
return
208+
}
209+
210+
s.ffmpegPathChanged = true
211+
s.ffmpegCheckDirty = true
212+
}
213+
214+
func (s *FyneScreen) ffmpegStatus() error {
215+
if s == nil {
216+
return nil
217+
}
218+
219+
if !s.ffmpegCheckValid || s.ffmpegCheckDirty || s.ffmpegCheckPath != s.ffmpegPath {
220+
return s.validateFFmpeg()
221+
}
222+
223+
return s.ffmpegCheckErr
224+
}
225+
226+
func (s *FyneScreen) validateFFmpeg() error {
227+
if s == nil {
228+
return nil
229+
}
230+
231+
err := utils.CheckFFmpeg(s.ffmpegPath)
232+
s.ffmpegCheckPath = s.ffmpegPath
233+
s.ffmpegCheckErr = err
234+
s.ffmpegCheckValid = true
235+
s.ffmpegCheckDirty = false
236+
return err
237+
}
238+
201239
//go:embed translations
202240
var translations embed.FS
203241

@@ -240,7 +278,7 @@ func Start(ctx context.Context, s *FyneScreen) {
240278
s.TranscodeCheckBox.Disable()
241279
}
242280

243-
ffmpegErr := utils.CheckFFmpeg(s.ffmpegPath)
281+
ffmpegErr := s.ffmpegStatus()
244282
if ffmpegErr != nil {
245283
s.TranscodeCheckBox.SetChecked(false)
246284
s.TranscodeCheckBox.Disable()
@@ -262,9 +300,11 @@ func Start(ctx context.Context, s *FyneScreen) {
262300
s.updateFFmpegDependentCheckTooltips()
263301

264302
if s.ffmpegPathChanged {
265-
furi, err := storage.ParseURI("file://" + s.mediafile)
266-
if err == nil {
267-
selectMediaFile(s, furi)
303+
if ffmpegErr == nil && s.mediafile != "" {
304+
furi, err := storage.ParseURI("file://" + s.mediafile)
305+
if err == nil {
306+
selectMediaFile(s, furi)
307+
}
268308
}
269309
s.ffmpegPathChanged = false
270310
}
@@ -276,7 +316,7 @@ func Start(ctx context.Context, s *FyneScreen) {
276316

277317
s.ffmpegPathChanged = false
278318

279-
if err := utils.CheckFFmpeg(s.ffmpegPath); err != nil {
319+
if err := s.ffmpegStatus(); err != nil {
280320
s.TranscodeCheckBox.Disable()
281321
if s.ScreencastCheckBox != nil {
282322
s.ScreencastCheckBox.Disable()
@@ -709,7 +749,7 @@ func (p *FyneScreen) checkChromecastCompatibility() {
709749
if p.chromecastCheckedFile == p.mediafile {
710750
return
711751
}
712-
if err := utils.CheckFFmpeg(p.ffmpegPath); err != nil {
752+
if err := p.ffmpegStatus(); err != nil {
713753
return // Can't transcode anyway
714754
}
715755

internal/gui/main.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -517,7 +517,7 @@ func mainWindow(s *FyneScreen) fyne.CanvasObject {
517517
s.transcodeToolTipCheck = transcode
518518
s.screencastToolTipCheck = screencast
519519
s.rtmpServerToolTipCheck = rtmpServerCheck
520-
if err := utils.CheckFFmpeg(s.ffmpegPath); err != nil {
520+
if err := s.ffmpegStatus(); err != nil {
521521
s.rtmpServerCheck.Disable()
522522
screencast.Disable()
523523
}
@@ -717,7 +717,7 @@ func mainWindow(s *FyneScreen) fyne.CanvasObject {
717717

718718
screencast.OnChanged = func(b bool) {
719719
if b {
720-
if err := utils.CheckFFmpeg(s.ffmpegPath); err != nil {
720+
if err := s.validateFFmpeg(); err != nil {
721721
check(s, errors.New(lang.L("ffmpeg is required for screencast")))
722722
screencast.SetChecked(false)
723723
return
@@ -761,7 +761,7 @@ func mainWindow(s *FyneScreen) fyne.CanvasObject {
761761

762762
s.Screencast = false
763763
go stopScreencastSession(s)
764-
if err := utils.CheckFFmpeg(s.ffmpegPath); err == nil && s.rtmpServer == nil {
764+
if err := s.ffmpegStatus(); err == nil && s.rtmpServer == nil {
765765
transcode.Enable()
766766
externalmedia.Enable()
767767
sfilecheck.Enable()

internal/gui/settings.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ func settingsWindow(s *FyneScreen) fyne.CanvasObject {
138138
ffmpegTextEntry.SetText(path)
139139
updatingFFmpegEntry = false
140140
s.ffmpegPath, _ = utils.ResolveFFmpegPath("")
141-
s.ffmpegPathChanged = true
141+
s.markFFmpegPathChanged()
142142
})
143143

144144
ffmpegFolderSelect := widget.NewButtonWithIcon("", theme.FolderOpenIcon(), func() {
@@ -195,7 +195,7 @@ func settingsWindow(s *FyneScreen) fyne.CanvasObject {
195195
s.ffmpegPath = update
196196
}
197197
fyne.CurrentApp().Preferences().SetString("ffmpeg", update)
198-
s.ffmpegPathChanged = true
198+
s.markFFmpegPathChanged()
199199
}
200200

201201
debugExport := widget.NewButton(lang.L("Export Diagnostics"), func() {

0 commit comments

Comments
 (0)