Compare commits

..

3 Commits

3 changed files with 28 additions and 7 deletions

View File

@ -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 {

View File

@ -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

View File

@ -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)
} }
}) })