From d4cddf460a5145965b398e167f3cea24b5e3e436 Mon Sep 17 00:00:00 2001 From: tobi <31960611+tsmethurst@users.noreply.github.com> Date: Mon, 16 Jan 2023 16:19:17 +0100 Subject: [bugfix] Parse video metadata more accurately; allow Range in fileserver (#1342) * don't serve unused fields for video attachments * parse video bitrate + duration more accurately * use ServeContent where appropriate to respect Range * abstract temp file seeker into its own function --- internal/iotools/io.go | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) (limited to 'internal/iotools/io.go') diff --git a/internal/iotools/io.go b/internal/iotools/io.go index 5f0c4b72c..f62777b3f 100644 --- a/internal/iotools/io.go +++ b/internal/iotools/io.go @@ -20,6 +20,7 @@ package iotools import ( "io" + "os" ) // ReadFnCloser takes an io.Reader and wraps it to use the provided function to implement io.Closer. @@ -157,3 +158,35 @@ func StreamWriteFunc(write func(io.Writer) error) io.Reader { return pr } + +type tempFileSeeker struct { + io.Reader + io.Seeker + tmp *os.File +} + +func (tfs *tempFileSeeker) Close() error { + tfs.tmp.Close() + return os.Remove(tfs.tmp.Name()) +} + +// TempFileSeeker converts the provided Reader into a ReadSeekCloser +// by using an underlying temporary file. Callers should call the Close +// function when they're done with the TempFileSeeker, to release + +// clean up the temporary file. +func TempFileSeeker(r io.Reader) (io.ReadSeekCloser, error) { + tmp, err := os.CreateTemp(os.TempDir(), "gotosocial-") + if err != nil { + return nil, err + } + + if _, err := io.Copy(tmp, r); err != nil { + return nil, err + } + + return &tempFileSeeker{ + Reader: tmp, + Seeker: tmp, + tmp: tmp, + }, nil +} -- cgit v1.2.3