@@ -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
202240var 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
0 commit comments