Refactor metadata retrieval
This commit is contained in:
parent
42a430345f
commit
92dbdedf0c
|
@ -1,6 +1,7 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
@ -95,7 +96,34 @@ func resolveM3U8(target string) (out []string, err error) {
|
||||||
return out, nil
|
return out, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
var pathRE = regexp.MustCompile("^/(.*?)/(.*?)/(.*?)$")
|
func metaProc(ctx context.Context, name string, out chan<- string) {
|
||||||
|
var current, last string
|
||||||
|
var interval time.Duration
|
||||||
|
for {
|
||||||
|
meta, err := getMeta(name)
|
||||||
|
if err != nil {
|
||||||
|
current = "Error: " + err.Error()
|
||||||
|
interval = 30 * time.Second
|
||||||
|
} else {
|
||||||
|
current = meta.title
|
||||||
|
interval = time.Duration(meta.timeout)
|
||||||
|
}
|
||||||
|
// TODO: select on the send? Can't close it in the main proc.
|
||||||
|
// Also see https://blog.golang.org/pipelines
|
||||||
|
if current != last {
|
||||||
|
out <- current
|
||||||
|
last = current
|
||||||
|
}
|
||||||
|
|
||||||
|
select {
|
||||||
|
case <-time.After(time.Duration(interval) * time.Millisecond):
|
||||||
|
case <-ctx.Done():
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var pathRE = regexp.MustCompile(`^/(.*?)/(.*?)/(.*?)$`)
|
||||||
|
|
||||||
func proxy(w http.ResponseWriter, req *http.Request) {
|
func proxy(w http.ResponseWriter, req *http.Request) {
|
||||||
const targetURI = "http://a.files.bbci.co.uk/media/live/manifesto/" +
|
const targetURI = "http://a.files.bbci.co.uk/media/live/manifesto/" +
|
||||||
|
@ -153,32 +181,8 @@ func proxy(w http.ResponseWriter, req *http.Request) {
|
||||||
}
|
}
|
||||||
fmt.Fprintf(bufrw, "\r\n")
|
fmt.Fprintf(bufrw, "\r\n")
|
||||||
|
|
||||||
// TODO: move to a normal function
|
|
||||||
metaChan := make(chan string)
|
metaChan := make(chan string)
|
||||||
go func() {
|
go metaProc(req.Context(), name, metaChan)
|
||||||
var current, last string
|
|
||||||
var interval time.Duration
|
|
||||||
for {
|
|
||||||
meta, err := getMeta(name)
|
|
||||||
if err != nil {
|
|
||||||
current = "Error: " + err.Error()
|
|
||||||
interval = 30 * time.Second
|
|
||||||
} else {
|
|
||||||
current = meta.title
|
|
||||||
interval = time.Duration(meta.timeout)
|
|
||||||
}
|
|
||||||
if current != last {
|
|
||||||
metaChan <- current
|
|
||||||
last = current
|
|
||||||
}
|
|
||||||
|
|
||||||
select {
|
|
||||||
case <-time.After(time.Duration(interval) * time.Millisecond):
|
|
||||||
case <-req.Context().Done():
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
|
|
||||||
// TODO: move to a normal function
|
// TODO: move to a normal function
|
||||||
// FIXME: this will load a few seconds (one URL) and die
|
// FIXME: this will load a few seconds (one URL) and die
|
||||||
|
|
Loading…
Reference in New Issue