diff options
| author | 2023-01-16 16:19:17 +0100 | |
|---|---|---|
| committer | 2023-01-16 16:19:17 +0100 | |
| commit | d4cddf460a5145965b398e167f3cea24b5e3e436 (patch) | |
| tree | 913fb17d42b2585e0420d5d3578cd5dc0b302eec /internal/iotools | |
| parent | [chore]: Bump github.com/minio/minio-go/v7 from 7.0.44 to 7.0.47 (#1348) (diff) | |
| download | gotosocial-d4cddf460a5145965b398e167f3cea24b5e3e436.tar.xz | |
[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
Diffstat (limited to 'internal/iotools')
| -rw-r--r-- | internal/iotools/io.go | 33 | 
1 files changed, 33 insertions, 0 deletions
| 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 +} | 
