Compare commits
4 Commits
33f7405404
...
29b1603886
Author | SHA1 | Date |
---|---|---|
Přemysl Eric Janouch | 29b1603886 | |
Přemysl Eric Janouch | 131930f45b | |
Přemysl Eric Janouch | 783fce1175 | |
Přemysl Eric Janouch | 23683424a6 |
|
@ -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
25
main.go
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue