diff --git a/cmd/videnc/main.go b/cmd/videnc/main.go index 6b8e71a..eb90b2c 100644 --- a/cmd/videnc/main.go +++ b/cmd/videnc/main.go @@ -129,6 +129,7 @@ func processFile(ctx context.Context, inputPath string, cfg *types.Config, enc * if err != nil { log.ErrorFile(inputPath, "Getting stream languages", err.Error()) } + tracker.SetStreams(toStatusStreams(streamLangs)) mediaType := metadata.ParseMediaType(filename) if mediaType == "" { @@ -176,6 +177,16 @@ func processFile(ctx context.Context, inputPath string, cfg *types.Config, enc * } meta.OriginalMedia = mediaType + tracker.SetMeta(status.JobMeta{ + IsSeries: meta.IsSeries, + Title: meta.Title, + Collection: meta.Collection, + Season: meta.Season, + Episode: meta.Episode, + DateReleased: meta.DateReleased, + MediaType: string(mediaType), + }) + job := &types.Job{ InputPath: inputPath, MediaType: mediaType, @@ -241,6 +252,21 @@ func failToFailed(path, failedDir string, log *logger.Logger) { } } +// toStatusStreams maps probed source streams to the display shape, keeping only +// audio and subtitle streams (the video stream isn't shown). +func toStatusStreams(streams []encoder.StreamMetadata) []status.Stream { + var out []status.Stream + for _, s := range streams { + switch s.CodecType { + case "audio": + out = append(out, status.Stream{Kind: "audio", Language: s.Language, Codec: s.CodecName, Channels: s.Channels, Title: s.Title}) + case "subtitle": + out = append(out, status.Stream{Kind: "subtitle", Language: s.Language, Codec: s.CodecName, Title: s.Title}) + } + } + return out +} + func generateRandomString(length int) string { bytes := make([]byte, length/2+1) rand.Read(bytes) diff --git a/internal/encoder/encoder.go b/internal/encoder/encoder.go index 7383afb..00f71cd 100644 --- a/internal/encoder/encoder.go +++ b/internal/encoder/encoder.go @@ -45,6 +45,7 @@ type StreamMetadata struct { Index int `json:"index"` CodecType string `json:"codec_type"` CodecName string `json:"codec_name"` + Channels int `json:"channels"` Language string `json:"tags"` Title string `json:"title"` } @@ -177,6 +178,7 @@ func (e *Encoder) GetStreamLanguages(ctx context.Context, path string) ([]Stream Index int `json:"index"` CodecType string `json:"codec_type"` CodecName string `json:"codec_name"` + Channels int `json:"channels"` Tags map[string]string `json:"tags"` } `json:"streams"` } @@ -196,6 +198,7 @@ func (e *Encoder) GetStreamLanguages(ctx context.Context, path string) ([]Stream Index: s.Index, CodecType: s.CodecType, CodecName: s.CodecName, + Channels: s.Channels, Language: lang, Title: title, }) diff --git a/internal/server/index.html b/internal/server/index.html index 5d62250..91abfcf 100644 --- a/internal/server/index.html +++ b/internal/server/index.html @@ -75,6 +75,23 @@ .ev time { font-family:var(--mono); font-size:.7rem; color:var(--dim); white-space:nowrap; padding-top:.1rem; } .ev .msg { color:var(--text); word-break:break-word; } .ev.error .msg { color:var(--red); } + .day { text-align:center; font-family:var(--mono); font-size:.64rem; letter-spacing:.12em; text-transform:uppercase; color:var(--dim); margin:.8rem 0 .2rem; } + .day:first-child { margin-top:0; } + + /* job metadata */ + .meta { margin-top:1.1rem; padding-top:1.1rem; border-top:1px solid var(--line); } + .meta .mtitle { font-size:1.1rem; color:#e7edf4; font-weight:600; word-break:break-word; } + .meta .msub { color:var(--amber-soft); font-size:.92rem; margin-top:.15rem; } + .meta .mrow { color:var(--muted); font-size:.85rem; margin-top:.3rem; } + .meta .mrow b { color:var(--text); font-weight:500; } + + /* stream chips */ + .streams { display:flex; flex-direction:column; gap:.5rem; margin-top:1rem; } + .srow { display:flex; align-items:baseline; gap:.5rem; flex-wrap:wrap; } + .srow .lab { font-family:var(--mono); font-size:.64rem; letter-spacing:.1em; text-transform:uppercase; color:var(--dim); width:4rem; flex:none; padding-top:.25rem; } + .chip { font-family:var(--mono); font-size:.74rem; padding:.2rem .5rem; border-radius:5px; background:var(--panel-2); border:1px solid var(--line); color:var(--text); } + .chip .ch { color:var(--amber); } + .chip .cd { color:var(--dim); }
@@ -103,6 +120,13 @@