Skip to content

Commit 2f349b6

Browse files
committed
Restore concise transcode lifecycle logs
1 parent 69a4bf9 commit 2f349b6

4 files changed

Lines changed: 42 additions & 4 deletions

File tree

internal/proxy/server.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,8 @@ func (s *Server) observePlaybackCheckIn(kind string, r *http.Request) {
135135
switch kind {
136136
case "stopped":
137137
stopped := s.transcodeManager.StopPlayback(event)
138-
logging.Debugf("playback stopped item=%s play_session=%s stopped_sessions=%d", event.ItemID, event.PlaySessionID, stopped)
138+
logging.Infof("playback stopped item=%s stopped_sessions=%d", event.ItemID, stopped)
139+
logging.Debugf("playback stopped detail item=%s play_session=%s stopped_sessions=%d", event.ItemID, event.PlaySessionID, stopped)
139140
case "playing", "progress":
140141
updated := s.transcodeManager.RecordProgress(event)
141142
logging.Debugf("playback %s item=%s play_session=%s position_ticks=%d paused=%t updated_sessions=%d", kind, event.ItemID, event.PlaySessionID, event.PositionTicks, event.IsPaused, updated)

internal/transcode/ffmpeg_args_test.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,3 +153,12 @@ func TestNewManagerFallsBackToSoftwareDecodeWhenHardwareProbeFails(t *testing.T)
153153
t.Fatalf("expected runner to use software decode, options = %+v", runner.Options)
154154
}
155155
}
156+
157+
func TestFFmpegOptionsSummaryLabelsDecodeMode(t *testing.T) {
158+
if got := ffmpegOptionsSummary(FFmpegOptions{}); got != "software" {
159+
t.Fatalf("software summary = %q", got)
160+
}
161+
if got := ffmpegOptionsSummary(FFmpegOptions{HardwareDecode: "vaapi", HardwareDevice: "/dev/dri/renderD128"}); got != "vaapi:/dev/dri/renderD128" {
162+
t.Fatalf("vaapi summary = %q", got)
163+
}
164+
}

internal/transcode/handler.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,11 @@ func (h Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
4646
var session *Session
4747
var ok bool
4848
if name == "master.m3u8" {
49+
logging.Infof("playlist request id=%s start_ticks=%d", id, startTimeTicksFromRawQuery(r.URL.RawQuery))
4950
traceSwitch("playlist_request id=%s start_ticks=%d query=%s elapsed=%s", id, startTimeTicksFromRawQuery(r.URL.RawQuery), redactURLString("?"+r.URL.RawQuery), time.Since(requestStarted))
5051
if info, known := h.Manager.MediaInfo(id); known {
5152
if playlist, ready := VirtualVODPlaylist(info, defaultSegmentTicks, r.URL.RawQuery); ready {
53+
logging.Infof("playlist virtual id=%s duration=%s", id, formatTicks(info.RunTimeTicks))
5254
traceSwitch("playlist_virtual id=%s duration=%s start_ticks=%d query=%s media=%s elapsed=%s", id, formatTicks(info.RunTimeTicks), startTimeTicksFromRawQuery(r.URL.RawQuery), redactURLString("?"+r.URL.RawQuery), info.Summary(), time.Since(requestStarted))
5355
w.Header().Set("Content-Type", "application/vnd.apple.mpegurl")
5456
w.Header().Set("Cache-Control", "no-store")
@@ -71,6 +73,7 @@ func (h Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
7173
http.Error(w, err.Error(), http.StatusBadGateway)
7274
return
7375
}
76+
logging.Infof("playlist session id=%s elapsed=%s", id, time.Since(requestStarted))
7477
traceSwitch("playlist_session_ready id=%s dir=%s input=%s elapsed=%s", id, session.Dir, redactURLString(inputURL), time.Since(requestStarted))
7578
} else if segmentIndex, isSegment := segmentIndexFromName(name); isSegment {
7679
var err error

internal/transcode/manager.go

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -764,8 +764,8 @@ func (r FFmpegRunner) Start(ctx context.Context, session *Session, request Reque
764764
args := buildFFmpegArgs(session, request, r.Options)
765765
playlist := filepath.Join(session.Dir, "master.m3u8")
766766
logPath := filepath.Join(session.Dir, "ffmpeg.log")
767-
logging.Infof("transcode start id=%s segment=%d", session.ID, session.SegmentStartIndex)
768-
logging.Debugf("ffmpeg start id=%s item=%s media_source=%s start_ticks=%d segment_start=%d path=%s input=%s playlist=%s media=%s", session.ID, session.ItemID, session.MediaSourceID, session.StartTimeTicks, session.SegmentStartIndex, r.Path, redactURLString(request.InputURL), playlist, session.Media.Summary())
767+
logging.Infof("transcode start id=%s segment=%d decode=%s audio=optional-aac log=%s", session.ID, session.SegmentStartIndex, ffmpegOptionsSummary(r.Options), logPath)
768+
logging.Debugf("ffmpeg start id=%s item=%s media_source=%s start_ticks=%d segment_start=%d path=%s input=%s playlist=%s media=%s args=%s", session.ID, session.ItemID, session.MediaSourceID, session.StartTimeTicks, session.SegmentStartIndex, r.Path, redactURLString(request.InputURL), playlist, session.Media.Summary(), redactFFmpegArgs(args))
769769
cmd := exec.CommandContext(ctx, r.Path, args...)
770770
stdin, err := cmd.StdinPipe()
771771
if err != nil {
@@ -781,7 +781,7 @@ func (r FFmpegRunner) Start(ctx context.Context, session *Session, request Reque
781781
_ = logFile.Close()
782782
return nil, fmt.Errorf("start ffmpeg: %w", err)
783783
}
784-
logging.Debugf("ffmpeg started id=%s pid=%d", session.ID, cmd.Process.Pid)
784+
logging.Infof("ffmpeg started id=%s pid=%d decode=%s", session.ID, cmd.Process.Pid, ffmpegOptionsSummary(r.Options))
785785
process := &execProcess{cmd: cmd, logFile: logFile, stdin: stdin, doneCh: make(chan struct{})}
786786
go func() {
787787
err := cmd.Wait()
@@ -799,6 +799,31 @@ func (r FFmpegRunner) Start(ctx context.Context, session *Session, request Reque
799799
return process, nil
800800
}
801801

802+
func ffmpegOptionsSummary(options FFmpegOptions) string {
803+
mode := strings.ToLower(strings.TrimSpace(options.HardwareDecode))
804+
if mode == "" || mode == "none" || mode == "off" || mode == "false" {
805+
return "software"
806+
}
807+
device := strings.TrimSpace(options.HardwareDevice)
808+
if device == "" {
809+
return mode
810+
}
811+
return mode + ":" + device
812+
}
813+
814+
func redactFFmpegArgs(args []string) string {
815+
redacted := append([]string(nil), args...)
816+
for i := 0; i < len(redacted)-1; i++ {
817+
switch redacted[i] {
818+
case "-i":
819+
redacted[i+1] = redactURLString(redacted[i+1])
820+
case "-headers":
821+
redacted[i+1] = "REDACTED"
822+
}
823+
}
824+
return strings.Join(redacted, " ")
825+
}
826+
802827
func buildFFmpegArgs(session *Session, request Request, options ...FFmpegOptions) []string {
803828
playlist := filepath.Join(session.Dir, "master.m3u8")
804829
segmentPattern := filepath.Join(session.Dir, "segment_%05d.ts")

0 commit comments

Comments
 (0)