diff --git a/transcoder/README.md b/transcoder/README.md index 36d5e0d5..11733201 100644 --- a/transcoder/README.md +++ b/transcoder/README.md @@ -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) diff --git a/transcoder/main.go b/transcoder/main.go index da81cff4..68557a59 100644 --- a/transcoder/main.go +++ b/transcoder/main.go @@ -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) } diff --git a/transcoder/src/extract.go b/transcoder/src/extract.go index 6fcc7f4a..1181c6cb 100644 --- a/transcoder/src/extract.go +++ b/transcoder/src/extract.go @@ -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)() diff --git a/transcoder/src/runlock.go b/transcoder/src/runlock.go index a971815e..f1f33c5f 100644 --- a/transcoder/src/runlock.go +++ b/transcoder/src/runlock.go @@ -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 +} diff --git a/transcoder/src/thumbnails.go b/transcoder/src/thumbnails.go index 31dcfc5a..97f8887d 100644 --- a/transcoder/src/thumbnails.go +++ b/transcoder/src/thumbnails.go @@ -27,8 +27,6 @@ type Thumbnail struct { path string } -var thumbnails = NewCMap[string, *Thumbnail]() - const ThumbsVersion = 1 func getThumbGlob(sha string) string {