Unify metadata formatting between vide and animated image previews

This commit is contained in:
Kovid Goyal 2025-11-24 20:02:20 +05:30
parent 914631b049
commit 158ebee92c
No known key found for this signature in database
GPG key ID: 06BC317B515ACE7C
2 changed files with 23 additions and 12 deletions

View file

@ -22,9 +22,6 @@ import (
var _ = fmt.Print
// ffmpeg -y -i bath.mp4 -t 5 -vf "fps=10,scale=320:-1:flags=lanczos" -c:v
// libwebp -lossless 0 -compression_level 0 -q:v 75 -loop 0 output_quality.webp
const FFMPEG_METADATA_KEY = "ffmpeg-metadata.json"
type ffmpeg_renderer int
@ -146,13 +143,8 @@ func (c ffmpeg_renderer) ShowMetadata(h *Handler, s ShowData) (offset int) {
}
ext := filepath.Ext(s.abspath)
text := fmt.Sprintf("%s: %s", ext, humanize.Bytes(uint64(s.metadata.Size())))
icon := icons.IconForPath(s.abspath)
w(icon+" "+text, true)
r := s.custom_metadata.custom.(*FFMpegMetadata)
if d, perr := strconv.ParseFloat(r.Format.Duration, 64); perr == nil {
duration := time.Duration(d * float64(time.Second))
w("Duration: "+durafmt.Parse(duration).LimitFirstN(1).String(), false)
}
icon := icons.IconForPath(s.abspath)
var width, height int
for _, s := range r.Streams {
if s.Width > 0 && s.Height > 0 {
@ -160,9 +152,14 @@ func (c ffmpeg_renderer) ShowMetadata(h *Handler, s ShowData) (offset int) {
break
}
}
if width*height > 0 {
w(fmt.Sprintf("Resolution: %dx%d", width, height), false)
text += fmt.Sprintf(" %dx%d", width, height)
w(icon+" "+text, true)
st := humanize.Time(s.metadata.ModTime())
if d, perr := strconv.ParseFloat(r.Format.Duration, 64); perr == nil {
duration := time.Duration(d * float64(time.Second))
st += fmt.Sprintf(", %s", durafmt.Parse(duration).LimitFirstN(1).String())
}
w(st, true)
return
}

View file

@ -9,7 +9,9 @@ import (
"strconv"
"sync"
"sync/atomic"
"time"
"github.com/hako/durafmt"
"github.com/kovidgoyal/go-parallel"
"github.com/kovidgoyal/kitty/tools/disk_cache"
"github.com/kovidgoyal/kitty/tools/icons"
@ -248,7 +250,19 @@ func (p ImagePreviewRenderer) ShowMetadata(h *Handler, s ShowData) int {
text = icon + " " + text
offset += h.render_wrapped_text_in_region(text, s.x, s.y, s.width, s.height, true)
}
offset += h.render_wrapped_text_in_region(humanize.Time(s.metadata.ModTime()), s.x, s.y+offset, s.width, s.height-offset, true)
st := humanize.Time(s.metadata.ModTime())
if s.custom_metadata.image != nil && len(s.custom_metadata.image.Frames) > 0 {
var d time.Duration
for _, f := range s.custom_metadata.image.Frames {
if f.Delay_ms > 0 {
d += time.Duration(time.Duration(f.Delay_ms) * time.Millisecond)
}
}
if d > 0 {
st += fmt.Sprintf(", %s", durafmt.Parse(d).LimitFirstN(1).String())
}
}
offset += h.render_wrapped_text_in_region(st, s.x, s.y+offset, s.width, s.height-offset, true)
return offset
}