Wait for extraction to finish before returninrg attachments

This commit is contained in:
Zoe Roux 2024-08-08 21:44:53 +02:00
parent f9623089a2
commit 6aac9d1f26
5 changed files with 42 additions and 7 deletions

View File

@ -22,6 +22,10 @@ Projects using gocoder:
- [Blee](https://github.com/Arthi-chaud/Blee)
- Add your own?
## How does this work?
I did a blog post explaining the core idea, you can find it at [zoriya.dev/blogs/transcoder](https://zoriya.dev/blogs/transcoder).
## TODO:
- Add a swagger
- Add configurable JWT authorization (v5 of kyoo)

View File

@ -1,7 +1,6 @@
package main
import (
"fmt"
"net/http"
"strconv"
@ -213,7 +212,10 @@ func (h *Handler) GetAttachment(c echo.Context) error {
return err
}
ret := fmt.Sprintf("%s/%s/att/%s", src.Settings.Metadata, sha, name)
ret, err := h.metadata.GetAttachmentPath(sha, false, name)
if err != nil {
return err
}
return c.File(ret)
}
@ -232,7 +234,10 @@ func (h *Handler) GetSubtitle(c echo.Context) error {
return err
}
ret := fmt.Sprintf("%s/%s/sub/%s", src.Settings.Metadata, sha, name)
ret, err := h.metadata.GetAttachmentPath(sha, true, name)
if err != nil {
return err
}
return c.File(ret)
}

View File

@ -7,8 +7,6 @@ import (
"os/exec"
)
var extracted = NewCMap[string, <-chan struct{}]()
const ExtractVersion = 1
func (s *MetadataService) ExtractSubs(info *MediaInfo) (interface{}, error) {
@ -25,6 +23,18 @@ func (s *MetadataService) ExtractSubs(info *MediaInfo) (interface{}, error) {
return set(nil, err)
}
func (s *MetadataService) GetAttachmentPath(sha string, is_sub bool, name string) (string, error) {
_, err := s.extractLock.WaitFor(sha)
if err != nil {
return "", err
}
dir := "att"
if is_sub {
dir = "sub"
}
return fmt.Sprintf("%s/%s/%s/%s", Settings.Metadata, sha, dir, name), nil
}
func extractSubs(info *MediaInfo) error {
defer printExecTime("extraction of %s", info.Path)()

View File

@ -61,3 +61,21 @@ func (r *RunLock[K, V]) Start(key K) (func() (V, error), func(val V, err error)
return val, err
}
}
func (r *RunLock[K, V]) WaitFor(key K) (V, error) {
r.lock.Lock()
task, ok := r.running[key]
if !ok {
r.lock.Unlock()
var val V
return val, nil
}
ret := make(chan Result[V])
task.listeners = append(task.listeners, ret)
r.lock.Unlock()
res := <-ret
return res.ok, res.err
}

View File

@ -27,8 +27,6 @@ type Thumbnail struct {
path string
}
var thumbnails = NewCMap[string, *Thumbnail]()
const ThumbsVersion = 1
func getThumbGlob(sha string) string {