Skip to content

Commit

Permalink
Fix issue and enhance the buffer even more
Browse files Browse the repository at this point in the history
Signed-off-by: Marcel Goerentz <m.goerentz@t-online.de>
  • Loading branch information
marcelGoerentz committed Jan 16, 2025
1 parent efcfb43 commit c9aed3f
Show file tree
Hide file tree
Showing 7 changed files with 151 additions and 142 deletions.
2 changes: 0 additions & 2 deletions .github/workflows/manual.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,6 @@ jobs:
steps:
- name: Check out code into the Go module directory
uses: actions/checkout@v4
with:
ref: intermediat

- name: Set build number
id: set-build-number
Expand Down
84 changes: 20 additions & 64 deletions src/buffer.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,65 +4,46 @@ import (
"bufio"
"fmt"
"io"
"net"
"os"

"github.com/avfs/avfs"
)

func (b *Buffer) StartBuffer(stream *Stream, errorChan chan ErrorInfo) {
if stream.UseBackup {
UpdateStreamURLForBackup(stream)
}

func (b *Buffer) StartBuffer(stream *Stream,) {
b.Stream = stream
var err error = nil
if err = PrepareBufferFolder(b.FileSystem, stream.Folder); err != nil {
if err = b.PrepareBufferFolder(stream.Folder); err != nil {
// If something went wrong when setting up the buffer storage don't run at all
errorChan <- ErrorInfo{BufferFolderError, stream, ""}
ShowError(err, BufferFolderError)
stream.ReportError(err, BufferFolderError, "", true)
return
}

switch Settings.Buffer {
case "ffmpeg", "vlc":
err = StartThirdPartyBuffer(stream, errorChan)
err = StartThirdPartyBuffer(stream)
case "threadfin":
err = StartThreadfinBuffer(stream, errorChan)
err = StartThreadfinBuffer(stream)
default:
return
}
if err != nil {
handleBufferError(err, stream, errorChan)
}
}

/*
HandleBufferError will retry running the Buffer function with the next backup number
*/
func handleBufferError(err error, stream *Stream, errorChan chan ErrorInfo) {
ShowError(err, 4011)
if !stream.UseBackup || (stream.UseBackup && stream.BackupNumber >= 0 && stream.BackupNumber <= 3) {
stream.BackupNumber++
if stream.BackupChannel1URL != "" || stream.BackupChannel2URL != "" || stream.BackupChannel3URL != "" {
stream.UseBackup = true
stream.Buffer.StartBuffer(stream, errorChan)
}
b.Stream.handleBufferError(err)
}
}

/*
HandleByteOutput save the byte ouptut of the command or http request as files
*/
func HandleByteOutput(stdOut io.ReadCloser, stream *Stream, errorChan chan ErrorInfo) {
func (b *Buffer) HandleByteOutput(stdOut io.ReadCloser) {
TS_PACKAGE_MIN_SIZE := 188
bufferSize := Settings.BufferSize * 1024 // in bytes
buffer := make([]byte, bufferSize)
var fileSize int
init := true
tmpFolder := stream.Folder + string(os.PathSeparator)
tmpSegment := stream.LatestSegment
tmpFolder := b.Stream.Folder + string(os.PathSeparator)
tmpSegment := b.Stream.LatestSegment

var bufferVFS = stream.Buffer.FileSystem
var bufferVFS = b.FileSystem
var f avfs.File
var err error
var tmpFile string
Expand All @@ -74,7 +55,7 @@ func HandleByteOutput(stdOut io.ReadCloser, stream *Stream, errorChan chan Error
if err != nil {
f.Close()
ShowError(err, CreateFileError)
errorChan <- ErrorInfo{CreateFileError, stream, ""}
b.Stream.ReportError(err, CreateFileError, "", true)
return
}
init = false
Expand All @@ -86,23 +67,19 @@ func HandleByteOutput(stdOut io.ReadCloser, stream *Stream, errorChan chan Error
if err == io.EOF {
f.Close()
ShowDebug("Buffer reached EOF!", 3)
errorChan <- ErrorInfo{EndOfFileError, stream, ""}
b.Stream.ReportError(err, EndOfFileError, "", true)
return
}
if err != nil {
if _, ok := err.(*net.OpError); !ok || stream.Buffer.IsThirdPartyBuffer {
ShowError(err, ReadIntoBufferError)
}
f.Close()
bufferVFS.Remove(tmpFile)
errorChan <- ErrorInfo{ReadIntoBufferError, stream, ""}
b.Stream.ReportError(err, ReadIntoBufferError, "", true)
return
}
if _, err := f.Write(buffer[:n]); err != nil {
ShowError(err, WriteToBufferError)
f.Close()
bufferVFS.Remove(tmpFile)
errorChan <- ErrorInfo{WriteToBufferError, stream, ""}
b.Stream.ReportError(err, WriteToBufferError, "", true)
return
}
fileSize += n
Expand All @@ -112,48 +89,27 @@ func HandleByteOutput(stdOut io.ReadCloser, stream *Stream, errorChan chan Error
tmpFile = fmt.Sprintf("%s%d.ts", tmpFolder, tmpSegment)
// Close the current file and create a new one
f.Close()
stream.LatestSegment = tmpSegment
b.Stream.LatestSegment = tmpSegment
f, err = bufferVFS.Create(tmpFile)
if err != nil {
f.Close()
ShowError(err, CreateFileError)
errorChan <- ErrorInfo{CreateFileError, stream, ""}
b.Stream.ReportError(err, CreateFileError, "", true)
return
}
fileSize = 0
}
}
}

/*
UpdateStreamURLForBackup will set the ther stream url when a backup will be used
*/
func UpdateStreamURLForBackup(stream *Stream) {
switch stream.BackupNumber {
case 1:
stream.URL = stream.BackupChannel1URL
ShowHighlight("START OF BACKUP 1 STREAM")
ShowInfo("Backup Channel 1 URL: " + stream.URL)
case 2:
stream.URL = stream.BackupChannel2URL
ShowHighlight("START OF BACKUP 2 STREAM")
ShowInfo("Backup Channel 2 URL: " + stream.URL)
case 3:
stream.URL = stream.BackupChannel3URL
ShowHighlight("START OF BACKUP 3 STREAM")
ShowInfo("Backup Channel 3 URL: " + stream.URL)
}
}

/*
PrepareBufferFolder will clean the buffer folder and check if the folder exists
*/
func PrepareBufferFolder(bufferVFS avfs.VFS, folder string) error {
if err := bufferVFS.RemoveAll(getPlatformPath(folder)); err != nil {
func (b *Buffer) PrepareBufferFolder(folder string) error {
if err := b.FileSystem.RemoveAll(getPlatformPath(folder)); err != nil {
return fmt.Errorf("failed to remove buffer folder: %w", err)
}

if err := checkVFSFolder(folder, bufferVFS); err != nil {
if err := checkVFSFolder(folder, b.FileSystem); err != nil {
return fmt.Errorf("failed to check buffer folder: %w", err)
}

Expand Down
2 changes: 2 additions & 0 deletions src/screen.go
Original file line number Diff line number Diff line change
Expand Up @@ -385,6 +385,8 @@ func getErrMsg(errCode int) (errMsg string) {
errMsg = "Cannot stream from M3U file, please use ffmpeg or VLC"
case 4018:
errMsg = "Error while reading thirdparty stdErr"
case 4019:
errMsg = "Buffered file does not exist anymore"

// PID saving and deleting
case 4040:
Expand Down
Loading

0 comments on commit c9aed3f

Please sign in to comment.