owncast/core/ffmpeg/hlsFilesystemCleanup.go
Gabe Kangas 6ea9affce0
HLS video handling/storage/state refactor (#151)
* WIP with new transcoder progress monitor

* A whole different WIP in progress monitoring via local PUTs

* Use an actual hls playlist parser to rewrite master playlist

* Cleanup

* Private vs public path for thumbnail generation

* Allow each storage provider to make decisions of how to store different types of files

* Simplify inbound file writes

* Revert

* Split out set stream as connected/disconnected state methods

* Update videojs

* Add comment about the hls handler

* Rework of the offline stream state.  For #85

* Delete old unreferenced video segment files from disk

* Cleanup all segments and revert to a completely offline state after 5min

* Stop thumbnail generation on stream stop. Copy logo to thumbnail on cleanup.

* Update transcoder test

* Add comment

* Return http 200 on success to transcoder. Tweak how files are written to disk

* Force pixel color format in transcoder

* Add debugging info for S3 transfers. Add default ACL.

* Fix cleanup timer

* Reset session stats when we cleanup the session.

* Put log file back

* Update test

* File should not be a part of this commit

* Add centralized shared performance timer for use anywhere

* Post-rebase cleanup

* Support returning nil from storage provider save

* Updates to reflect package changes + other updates in master

* Fix storage providers being overwritten

* Do not return pointer in save. Support cache headers with S3 providers

* Split out videojs + vhs and point to specific working versions of them

* Bump vjs and vhs versions

* Fix test

* Remove unused

* Update upload warning message

* No longer valid comment

* Pin videojs and vhs versions
2020-10-14 14:07:38 -07:00

64 lines
1.4 KiB
Go

package ffmpeg
import (
log "github.com/sirupsen/logrus"
"os"
"path/filepath"
"sort"
"github.com/owncast/owncast/config"
)
// Cleanup will delete old files off disk that are no longer being referenced
// in the stream.
func Cleanup(directoryPath string) {
// Determine how many files we should keep on disk
maxNumber := config.Config.GetMaxNumberOfReferencedSegmentsInPlaylist()
buffer := 10
files, err := getSegmentFiles(directoryPath)
if err != nil {
log.Fatal(err)
}
if len(files) < maxNumber+buffer {
return
}
// Delete old files on disk
filesToDelete := files[maxNumber+buffer:]
for _, file := range filesToDelete {
os.Remove(filepath.Join(directoryPath, file.Name()))
}
}
func getSegmentFiles(dirname string) ([]os.FileInfo, error) {
f, err := os.Open(dirname)
if err != nil {
return nil, err
}
list, err := f.Readdir(-1) // -1 says to get a list of all files
f.Close()
if err != nil {
return nil, err
}
filteredList := make([]os.FileInfo, 0)
// Filter out playlists because we don't want to clean them up
for _, file := range list {
if filepath.Ext(file.Name()) == ".m3u8" {
continue
}
filteredList = append(filteredList, file)
}
// Sort by date so we can delete old files
sort.Slice(filteredList, func(i, j int) bool {
return filteredList[i].ModTime().UnixNano() > filteredList[j].ModTime().UnixNano()
})
return filteredList, nil
}