Fix short write in metadata injector.

master
Icedream 2018-07-02 08:09:47 +02:00
parent 69147a81b3
commit 78f280e743
Signed by: icedream
GPG Key ID: 1573F6D8EFE4D0CF
2 changed files with 20 additions and 7 deletions

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

@ -73,11 +73,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 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) _, err := io.Copy(nw, sr)
if err != nil { if err != nil {
log.Println(err) log.Println("copying stream to output failed:", err)
} }
}) })