summaryrefslogtreecommitdiff
path: root/internal/iotools
diff options
context:
space:
mode:
authorLibravatar tobi <31960611+tsmethurst@users.noreply.github.com>2023-01-16 16:19:17 +0100
committerLibravatar GitHub <noreply@github.com>2023-01-16 16:19:17 +0100
commitd4cddf460a5145965b398e167f3cea24b5e3e436 (patch)
tree913fb17d42b2585e0420d5d3578cd5dc0b302eec /internal/iotools
parent[chore]: Bump github.com/minio/minio-go/v7 from 7.0.44 to 7.0.47 (#1348) (diff)
downloadgotosocial-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.go33
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
+}