Compare commits
3 Commits
69147a81b3
...
f8dce5ce9d
Author | SHA1 | Date |
---|---|---|
|
f8dce5ce9d | |
|
7f13d014b9 | |
|
78f280e743 |
|
@ -56,6 +56,7 @@ func (channel *Channel) SetMetadata(data map[string]string) {
|
||||||
func (channel *Channel) Metadata() chan map[string]string {
|
func (channel *Channel) Metadata() chan map[string]string {
|
||||||
outC := make(chan map[string]string)
|
outC := make(chan map[string]string)
|
||||||
go func() {
|
go func() {
|
||||||
|
defer close(outC)
|
||||||
c := channel.Events.Sub("metadata")
|
c := channel.Events.Sub("metadata")
|
||||||
forloop:
|
forloop:
|
||||||
for event := range c {
|
for event := range c {
|
||||||
|
|
|
@ -39,22 +39,23 @@ func (mi *MetadataInjector) writeMetadata() (n int, err error) {
|
||||||
|
|
||||||
func (mi *MetadataInjector) Write(data []byte) (n int, err error) {
|
func (mi *MetadataInjector) Write(data []byte) (n int, err error) {
|
||||||
for n < len(data) {
|
for n < len(data) {
|
||||||
|
restLen := len(data) - n
|
||||||
toWrite := mi.MetadataInterval - mi.offset
|
toWrite := mi.MetadataInterval - mi.offset
|
||||||
|
if toWrite > restLen {
|
||||||
|
toWrite = restLen
|
||||||
|
}
|
||||||
|
|
||||||
if toWrite <= 0 {
|
if toWrite <= 0 {
|
||||||
_, cerr := mi.writeMetadata()
|
_, err = mi.writeMetadata()
|
||||||
//n += cn
|
if err != nil {
|
||||||
if cerr != nil {
|
|
||||||
err = cerr
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
mi.offset = 0
|
mi.offset = 0
|
||||||
// toWrite = mi.MetadataInterval
|
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
outBytes := make([]byte, toWrite)
|
outBytes := make([]byte, toWrite)
|
||||||
copy(outBytes, data[mi.offset:mi.offset+toWrite])
|
copy(outBytes, data[n:n+toWrite])
|
||||||
cn, cerr := mi.Writer.Write(outBytes)
|
cn, cerr := mi.Writer.Write(outBytes)
|
||||||
n += cn
|
n += cn
|
||||||
mi.offset += cn
|
mi.offset += cn
|
||||||
|
|
|
@ -60,6 +60,13 @@ func (instance *pluginInstance) Init() {
|
||||||
ctx.Writer.Header().Set("icy-metadata", "1")
|
ctx.Writer.Header().Set("icy-metadata", "1")
|
||||||
ctx.Writer.Header().Set("icy-metaint", fmt.Sprintf("%d", metaInt))
|
ctx.Writer.Header().Set("icy-metaint", fmt.Sprintf("%d", metaInt))
|
||||||
}
|
}
|
||||||
|
ctx.Writer.Header().Set("icy-name", "Channel name") // TODO
|
||||||
|
ctx.Writer.Header().Set("icy-pub", "0") // TODO
|
||||||
|
ctx.Writer.Header().Set("Server", "Uplink/0.0.0; Icecast 2.4.0 compatible")
|
||||||
|
ctx.Writer.Header().Set("Cache-Control", "no-cache, no-store")
|
||||||
|
ctx.Writer.Header().Set("Access-Control-Allow-Origin", "*")
|
||||||
|
ctx.Writer.Header().Set("Access-Control-Allow-Headers", "Origin, Accept, X-Requested-With, Content-Type")
|
||||||
|
ctx.Writer.Header().Set("Access-Control-Allow-Methods", "GET, OPTIONS, HEAD")
|
||||||
ctx.Writer.WriteHeader(200)
|
ctx.Writer.WriteHeader(200)
|
||||||
|
|
||||||
w := ctx.Writer
|
w := ctx.Writer
|
||||||
|
@ -73,11 +80,23 @@ func (instance *pluginInstance) Init() {
|
||||||
if sendMetadata {
|
if sendMetadata {
|
||||||
mw = streams.NewMetadataInjector(w, metaInt)
|
mw = streams.NewMetadataInjector(w, metaInt)
|
||||||
nw = mw
|
nw = mw
|
||||||
|
|
||||||
|
metadataChan := channel.Metadata()
|
||||||
|
defer func() { metadataChan <- nil }()
|
||||||
|
go func() {
|
||||||
|
for metadata := range metadataChan {
|
||||||
|
metadataToWrite := streams.Metadata{}
|
||||||
|
if value, ok := metadata["StreamTitle"]; ok {
|
||||||
|
metadataToWrite["StreamTitle"] = value
|
||||||
|
}
|
||||||
|
mw.SetMetadata(metadataToWrite)
|
||||||
|
}
|
||||||
|
}()
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err := io.Copy(nw, sr)
|
_, err := io.Copy(nw, sr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println("copying stream to output failed:", err)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue