Bug #16 1
This commit is contained in:
210
src/buffer.go
210
src/buffer.go
@@ -219,163 +219,169 @@ func bufferingStream(playlistID, streamingURL, channelName string, w http.Respon
|
|||||||
|
|
||||||
for { // Loop 1: Warten bis das erste Segment durch den Buffer heruntergeladen wurde
|
for { // Loop 1: Warten bis das erste Segment durch den Buffer heruntergeladen wurde
|
||||||
|
|
||||||
if stream, ok := playlist.Streams[streamID]; ok {
|
if p, ok := BufferInformation.Load(playlistID); ok {
|
||||||
|
|
||||||
if stream.Status == false {
|
var playlist = p.(Playlist)
|
||||||
|
|
||||||
timeOut++
|
if stream, ok := playlist.Streams[streamID]; ok {
|
||||||
|
|
||||||
time.Sleep(time.Duration(100) * time.Millisecond)
|
if stream.Status == false {
|
||||||
|
|
||||||
if c, ok := BufferClients.Load(playlistID + stream.MD5); ok {
|
timeOut++
|
||||||
|
|
||||||
var clients = c.(ClientConnection)
|
time.Sleep(time.Duration(100) * time.Millisecond)
|
||||||
|
|
||||||
if clients.Error != nil || timeOut > 200 {
|
if c, ok := BufferClients.Load(playlistID + stream.MD5); ok {
|
||||||
killClientConnection(streamID, stream.PlaylistID, false)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
var clients = c.(ClientConnection)
|
||||||
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
var oldSegments []string
|
|
||||||
|
|
||||||
for { // Loop 2: Temporäre Datein sind vorhanden, Daten können zum Client gesendet werden
|
|
||||||
// HTTP Clientverbindung überwachen
|
|
||||||
cn, ok := w.(http.CloseNotifier)
|
|
||||||
if ok {
|
|
||||||
|
|
||||||
select {
|
|
||||||
|
|
||||||
case <-cn.CloseNotify():
|
|
||||||
killClientConnection(streamID, playlistID, false)
|
|
||||||
return
|
|
||||||
|
|
||||||
default:
|
|
||||||
if c, ok := BufferClients.Load(playlistID + stream.MD5); ok {
|
|
||||||
|
|
||||||
var clients = c.(ClientConnection)
|
|
||||||
if clients.Error != nil {
|
|
||||||
ShowError(clients.Error, 0)
|
|
||||||
killClientConnection(streamID, playlistID, false)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
|
if clients.Error != nil || timeOut > 200 {
|
||||||
|
killClientConnection(streamID, stream.PlaylistID, false)
|
||||||
return
|
return
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, err := os.Stat(stream.Folder); os.IsNotExist(err) {
|
var oldSegments []string
|
||||||
killClientConnection(streamID, playlistID, false)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
var tmpFiles = getTmpFiles(&stream)
|
for { // Loop 2: Temporäre Datein sind vorhanden, Daten können zum Client gesendet werden
|
||||||
//fmt.Println("Buffer Loop:", stream.Connection)
|
// HTTP Clientverbindung überwachen
|
||||||
|
cn, ok := w.(http.CloseNotifier)
|
||||||
|
if ok {
|
||||||
|
|
||||||
for _, f := range tmpFiles {
|
select {
|
||||||
|
|
||||||
|
case <-cn.CloseNotify():
|
||||||
|
killClientConnection(streamID, playlistID, false)
|
||||||
|
return
|
||||||
|
|
||||||
|
default:
|
||||||
|
if c, ok := BufferClients.Load(playlistID + stream.MD5); ok {
|
||||||
|
|
||||||
|
var clients = c.(ClientConnection)
|
||||||
|
if clients.Error != nil {
|
||||||
|
ShowError(clients.Error, 0)
|
||||||
|
killClientConnection(streamID, playlistID, false)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
if _, err := os.Stat(stream.Folder); os.IsNotExist(err) {
|
if _, err := os.Stat(stream.Folder); os.IsNotExist(err) {
|
||||||
killClientConnection(streamID, playlistID, false)
|
killClientConnection(streamID, playlistID, false)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
oldSegments = append(oldSegments, f)
|
var tmpFiles = getTmpFiles(&stream)
|
||||||
|
//fmt.Println("Buffer Loop:", stream.Connection)
|
||||||
|
|
||||||
var fileName = stream.Folder + f
|
for _, f := range tmpFiles {
|
||||||
|
|
||||||
file, err := os.Open(fileName)
|
if _, err := os.Stat(stream.Folder); os.IsNotExist(err) {
|
||||||
defer file.Close()
|
killClientConnection(streamID, playlistID, false)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
if err == nil {
|
oldSegments = append(oldSegments, f)
|
||||||
|
|
||||||
|
var fileName = stream.Folder + f
|
||||||
|
|
||||||
|
file, err := os.Open(fileName)
|
||||||
|
defer file.Close()
|
||||||
|
|
||||||
l, err := file.Stat()
|
|
||||||
if err == nil {
|
if err == nil {
|
||||||
|
|
||||||
debug = fmt.Sprintf("Buffer Status:Send to client (%s)", fileName)
|
l, err := file.Stat()
|
||||||
showDebug(debug, 2)
|
|
||||||
|
|
||||||
var buffer = make([]byte, int(l.Size()))
|
|
||||||
_, err = file.Read(buffer)
|
|
||||||
|
|
||||||
if err == nil {
|
if err == nil {
|
||||||
|
|
||||||
file.Seek(0, 0)
|
debug = fmt.Sprintf("Buffer Status:Send to client (%s)", fileName)
|
||||||
|
showDebug(debug, 2)
|
||||||
|
|
||||||
if streaming == false {
|
var buffer = make([]byte, int(l.Size()))
|
||||||
|
_, err = file.Read(buffer)
|
||||||
|
|
||||||
contentType := http.DetectContentType(buffer)
|
if err == nil {
|
||||||
_ = contentType
|
|
||||||
//w.Header().Set("Content-type", "video/mpeg")
|
|
||||||
w.Header().Set("Content-type", contentType)
|
|
||||||
w.Header().Set("Content-Length", "0")
|
|
||||||
w.Header().Set("Connection", "close")
|
|
||||||
|
|
||||||
}
|
file.Seek(0, 0)
|
||||||
|
|
||||||
/*
|
if streaming == false {
|
||||||
// HDHR Header
|
|
||||||
w.Header().Set("Cache-Control", "no-cache")
|
|
||||||
w.Header().Set("Pragma", "no-cache")
|
|
||||||
w.Header().Set("transferMode.dlna.org", "Streaming")
|
|
||||||
*/
|
|
||||||
|
|
||||||
_, err := w.Write(buffer)
|
contentType := http.DetectContentType(buffer)
|
||||||
|
_ = contentType
|
||||||
|
//w.Header().Set("Content-type", "video/mpeg")
|
||||||
|
w.Header().Set("Content-type", contentType)
|
||||||
|
w.Header().Set("Content-Length", "0")
|
||||||
|
w.Header().Set("Connection", "close")
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
// HDHR Header
|
||||||
|
w.Header().Set("Cache-Control", "no-cache")
|
||||||
|
w.Header().Set("Pragma", "no-cache")
|
||||||
|
w.Header().Set("transferMode.dlna.org", "Streaming")
|
||||||
|
*/
|
||||||
|
|
||||||
|
_, err := w.Write(buffer)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
file.Close()
|
||||||
|
killClientConnection(streamID, playlistID, false)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
file.Close()
|
file.Close()
|
||||||
killClientConnection(streamID, playlistID, false)
|
streaming = true
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
file.Close()
|
file.Close()
|
||||||
streaming = true
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
file.Close()
|
var n = indexOfString(f, oldSegments)
|
||||||
|
|
||||||
|
if n > 20 {
|
||||||
|
|
||||||
|
var fileToRemove = stream.Folder + oldSegments[0]
|
||||||
|
os.RemoveAll(getPlatformFile(fileToRemove))
|
||||||
|
oldSegments = append(oldSegments[:0], oldSegments[0+1:]...)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var n = indexOfString(f, oldSegments)
|
file.Close()
|
||||||
|
|
||||||
if n > 20 {
|
|
||||||
|
|
||||||
var fileToRemove = stream.Folder + oldSegments[0]
|
|
||||||
os.RemoveAll(getPlatformFile(fileToRemove))
|
|
||||||
oldSegments = append(oldSegments[:0], oldSegments[0+1:]...)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
file.Close()
|
if len(tmpFiles) == 0 {
|
||||||
|
time.Sleep(time.Duration(100) * time.Millisecond)
|
||||||
|
}
|
||||||
|
|
||||||
}
|
} // Ende Loop 2
|
||||||
|
|
||||||
if len(tmpFiles) == 0 {
|
} else {
|
||||||
time.Sleep(time.Duration(100) * time.Millisecond)
|
|
||||||
}
|
|
||||||
|
|
||||||
} // Ende Loop 2
|
// Stream nicht vorhanden
|
||||||
|
killClientConnection(streamID, stream.PlaylistID, false)
|
||||||
|
showInfo(fmt.Sprintf("Streaming Status:Playlist: %s - Tuner: %d / %d", playlist.PlaylistName, len(playlist.Streams), playlist.Tuner))
|
||||||
|
return
|
||||||
|
|
||||||
} else {
|
}
|
||||||
|
|
||||||
// Stream nicht vorhanden
|
} // Ende BufferInformation
|
||||||
killClientConnection(streamID, stream.PlaylistID, false)
|
|
||||||
showInfo(fmt.Sprintf("Streaming Status:Playlist: %s - Tuner: %d / %d", playlist.PlaylistName, len(playlist.Streams), playlist.Tuner))
|
|
||||||
return
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
} // Ende Loop 1
|
} // Ende Loop 1
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user