check_media.go RawHistoryFolder
1// Package usecase contains application business logic.
2package usecase
3
4import (
5 "context"
6 "fmt"
7
8 "github.com/bnema/dumber/internal/application/port"
9 "github.com/bnema/dumber/internal/logging"
10)
11
12// CheckMediaUseCase validates media playback requirements and exposes the
13// detailed diagnostics used by the doctor command.
14type CheckMediaUseCase struct {
15 diagnostics port.MediaDiagnostics
16}
17
18// NewCheckMediaUseCase creates a new CheckMediaUseCase.
19func NewCheckMediaUseCase(diagnostics port.MediaDiagnostics) *CheckMediaUseCase {
20 return &CheckMediaUseCase{
21 diagnostics: diagnostics,
22 }
23}
24
25// CheckMediaInput contains options for the media check.
26type CheckMediaInput struct {
27 ShowDiagnostics bool // Log diagnostics warnings
28}
29
30// CheckMediaOutput contains the result of the media check.
31type CheckMediaOutput struct {
32 GStreamerAvailable bool
33 HWAccelAvailable bool
34 AV1HWAvailable bool
35 Warnings []string
36}
37
38// Diagnose returns the full media diagnostics report. It never returns nil.
39func (uc *CheckMediaUseCase) Diagnose(ctx context.Context) *port.MediaDiagnosticsResult {
40 if result := uc.diagnostics.RunDiagnostics(ctx); result != nil {
41 return result
42 }
43 return &port.MediaDiagnosticsResult{}
44}
45
46// Execute checks media playback requirements.
47// Returns error if GStreamer is not installed (fatal).
48// Returns warnings for missing hardware acceleration (non-fatal).
49func (uc *CheckMediaUseCase) Execute(ctx context.Context, input CheckMediaInput) (*CheckMediaOutput, error) {
50 log := logging.FromContext(ctx)
51
52 result := uc.Diagnose(ctx)
53
54 // GStreamer is required - fail early if not installed
55 if !result.GStreamerAvailable {
56 return nil, fmt.Errorf(
57 "GStreamer not installed - video playback requires GStreamer. Install: %s",
58 "gst-plugins-base gst-plugins-good gst-plugins-bad gst-plugins-ugly gst-libav",
59 )
60 }
61
62 // Log warnings if requested
63 if input.ShowDiagnostics {
64 for _, warning := range result.Warnings {
65 log.Warn().Str("component", "media").Msg(warning)
66 }
67 if result.AV1HWAvailable {
68 log.Info().Str("component", "media").Msg("AV1 hardware decoding available (preferred codec)")
69 }
70 }
71
72 return &CheckMediaOutput{
73 GStreamerAvailable: result.GStreamerAvailable,
74 HWAccelAvailable: result.HWAccelAvailable,
75 AV1HWAvailable: result.AV1HWAvailable,
76 Warnings: result.Warnings,
77 }, nil
78}