Compare commits

...

4 Commits

2 changed files with 16 additions and 13 deletions

View File

@ -2,7 +2,9 @@ bbc-on-ice
========== ==========
'bbc-on-ice' is a SHOUTcast (ICY protocol) bridge for BBC radio streams. 'bbc-on-ice' is a SHOUTcast (ICY protocol) bridge for BBC radio streams.
It adds metadata to the stream so that media players can display it. It adds metadata to the stream so that media players can display it. There are
some inherent technical limitations to how accurate the information can be
but it's definitely better to have an approximate title than nothing.
Packages Packages
-------- --------

25
main.go
View File

@ -122,21 +122,22 @@ func resolveM3U8(target string) (out []string, err error) {
func metaProc(ctx context.Context, name string, out chan<- string) { func metaProc(ctx context.Context, name string, out chan<- string) {
defer close(out) defer close(out)
// "polling_timeout" seems to normally be 25 seconds, which is a lot,
// especially considering all the possible additional buffering.
const maxInterval = 5 * time.Second
var current, last string var current, last string
var interval time.Duration var interval time.Duration
for { for {
meta, err := getMeta(name) meta, err := getMeta(name)
if err != nil { if err != nil {
current = "Error: " + err.Error() current = name + " - " + err.Error()
interval = 30 * time.Second interval = maxInterval
} else { } else {
current = meta.title current = meta.title
interval = time.Duration(meta.timeout) interval = time.Duration(meta.timeout) * time.Millisecond
if interval > maxInterval {
// It seems to normally use 25 seconds which is a lot, interval = maxInterval
// especially considering all the possible additional buffering.
if interval > 5000 {
interval = 5000
} }
} }
if current != last { if current != last {
@ -149,7 +150,7 @@ func metaProc(ctx context.Context, name string, out chan<- string) {
} }
select { select {
case <-time.After(time.Duration(interval) * time.Millisecond): case <-time.After(interval):
case <-ctx.Done(): case <-ctx.Done():
return return
} }
@ -179,9 +180,9 @@ func urlProc(ctx context.Context, playlistURL string, out chan<- string) {
return return
} }
} }
// I expect this to be mainly driven by the buffered channel but // Media players will happily buffer the whole playlist at once,
// a small (less than target duration) additional pause will not hurt. // a small (less than target duration) additional pause is appropriate.
time.Sleep(1 * time.Second) time.Sleep(3 * time.Second)
} }
} }