From 78f280e743e564d73aa35cf9304356d5ee8da6c0 Mon Sep 17 00:00:00 2001 From: Carl Kittelberger Date: Mon, 2 Jul 2018 08:09:47 +0200 Subject: [PATCH] Fix short write in metadata injector. --- app/streams/metadata_injector.go | 13 +++++++------ plugins/icecast/output/instance.go | 14 +++++++++++++- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/app/streams/metadata_injector.go b/app/streams/metadata_injector.go index 793f739..682e125 100644 --- a/app/streams/metadata_injector.go +++ b/app/streams/metadata_injector.go @@ -39,22 +39,23 @@ func (mi *MetadataInjector) writeMetadata() (n int, err error) { func (mi *MetadataInjector) Write(data []byte) (n int, err error) { for n < len(data) { + restLen := len(data) - n toWrite := mi.MetadataInterval - mi.offset + if toWrite > restLen { + toWrite = restLen + } if toWrite <= 0 { - _, cerr := mi.writeMetadata() - //n += cn - if cerr != nil { - err = cerr + _, err = mi.writeMetadata() + if err != nil { return } mi.offset = 0 - // toWrite = mi.MetadataInterval continue } outBytes := make([]byte, toWrite) - copy(outBytes, data[mi.offset:mi.offset+toWrite]) + copy(outBytes, data[n:n+toWrite]) cn, cerr := mi.Writer.Write(outBytes) n += cn mi.offset += cn diff --git a/plugins/icecast/output/instance.go b/plugins/icecast/output/instance.go index e04aa77..d8a37be 100644 --- a/plugins/icecast/output/instance.go +++ b/plugins/icecast/output/instance.go @@ -73,11 +73,23 @@ func (instance *pluginInstance) Init() { if sendMetadata { mw = streams.NewMetadataInjector(w, metaInt) nw = mw + + metadataChan := channel.Metadata() + defer close(metadataChan) + 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) if err != nil { - log.Println(err) + log.Println("copying stream to output failed:", err) } })