diff --git a/stream/telnet/telnet.go b/stream/telnet/telnet.go index 874fff1..b955f5c 100644 --- a/stream/telnet/telnet.go +++ b/stream/telnet/telnet.go @@ -5,6 +5,7 @@ import ( "io" "log" "net" + "strings" "time" ) @@ -12,7 +13,7 @@ var ( // TODO Config should not be exported // Cfg contains the different options of the telnet package, see below Cfg *Options - currentMessage *string + currentMessage map[string]string ) // Options holds telnet package configuration @@ -32,14 +33,14 @@ func Serve(config *Options) { return } + currentMessage = make(map[string]string) + listener, err := net.Listen("tcp", Cfg.ListenAddress) if err != nil { log.Printf("Error while listening to the address %s: %s", Cfg.ListenAddress, err) return } - currentMessage = new(string) - go func() { for { s, err := listener.Accept() @@ -47,9 +48,51 @@ func Serve(config *Options) { log.Printf("Error while accepting TCP socket: %s", s) continue } + go func(s net.Conn) { + streamID := "" + // Request for stream ID for { - n, err := s.Write([]byte(*currentMessage)) + _, _ = s.Write([]byte("[GHOSTREAM]\n")) + _, err = s.Write([]byte("Enter stream ID: ")) + if err != nil { + log.Println("Error while requesting stream ID to telnet client") + _ = s.Close() + return + } + buff := make([]byte, 255) + n, err := s.Read(buff) + if err != nil { + log.Println("Error while requesting stream ID to telnet client") + _ = s.Close() + return + } + + streamID = string(buff[:n]) + streamID = strings.Replace(streamID, "\r", "", -1) + streamID = strings.Replace(streamID, "\n", "", -1) + + if len(streamID) > 0 { + if strings.ToLower(streamID) == "exit" { + _, _ = s.Write([]byte("Goodbye!\n")) + _ = s.Close() + return + } + if _, ok := currentMessage[streamID]; !ok { + _, err = s.Write([]byte("Unknown stream ID.\n")) + if err != nil { + log.Println("Error while requesting stream ID to telnet client") + _ = s.Close() + return + } + continue + } + break + } + } + + for { + n, err := s.Write([]byte(currentMessage[streamID])) if err != nil { log.Printf("Error while sending TCP data: %s", err) _ = s.Close() @@ -70,11 +113,11 @@ func Serve(config *Options) { func asciiChar(pixel byte) string { asciiChars := []string{"@", "#", "$", "%", "?", "*", "+", ";", ":", ",", ".", " "} - return asciiChars[(255-pixel)/23] + return asciiChars[(255-pixel)/22] } // ServeAsciiArt send all packets received by ffmpeg as ASCII Art to telnet clients -func ServeAsciiArt(reader io.ReadCloser) { +func ServeAsciiArt(streamID string, reader io.ReadCloser) { if !Cfg.Enabled { _ = reader.Close() return @@ -95,6 +138,6 @@ func ServeAsciiArt(reader io.ReadCloser) { } imageStr += "\n" } - *currentMessage = header + imageStr + currentMessage[streamID] = header + imageStr } } diff --git a/stream/webrtc/ingest.go b/stream/webrtc/ingest.go index bab9b34..37c4654 100644 --- a/stream/webrtc/ingest.go +++ b/stream/webrtc/ingest.go @@ -73,6 +73,15 @@ func ingestFrom(inputChannel chan srt.Packet) { panic(err) } + // Receive raw video output and convert it to ASCII art, then forward it TCP + if telnet.Cfg.Enabled { + output, err := ffmpeg.StdoutPipe() + if err != nil { + panic(err) + } + go telnet.ServeAsciiArt(srtPacket.StreamName, output) + } + if err := ffmpeg.Start(); err != nil { panic(err) } @@ -109,15 +118,6 @@ func ingestFrom(inputChannel chan srt.Packet) { } }() - // Receive raw video output and convert it to ASCII art, then forward it TCP - if telnet.Cfg.Enabled { - output, err := ffmpeg.StdoutPipe() - if err != nil { - panic(err) - } - go telnet.ServeAsciiArt(output) - } - // Receive audio go func() { for {