|
|
|
@ -10,54 +10,65 @@ import (
@@ -10,54 +10,65 @@ import (
|
|
|
|
|
"github.com/owncast/owncast/config" |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
// Cleanup will delete old files off disk that are no longer being referenced
|
|
|
|
|
// CleanupOldContent will delete old files from the private dir that are no longer being referenced
|
|
|
|
|
// in the stream.
|
|
|
|
|
func Cleanup(directoryPath string) { |
|
|
|
|
func CleanupOldContent(baseDirectory string) { |
|
|
|
|
// Determine how many files we should keep on disk
|
|
|
|
|
maxNumber := config.Config.GetMaxNumberOfReferencedSegmentsInPlaylist() |
|
|
|
|
buffer := 10 |
|
|
|
|
|
|
|
|
|
files, err := getSegmentFiles(directoryPath) |
|
|
|
|
files, err := getAllFilesRecursive(baseDirectory) |
|
|
|
|
if err != nil { |
|
|
|
|
log.Fatal(err) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if len(files) < maxNumber+buffer { |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
// Delete old private HLS files on disk
|
|
|
|
|
for directory := range files { |
|
|
|
|
files := files[directory] |
|
|
|
|
if len(files) < maxNumber+buffer { |
|
|
|
|
continue |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Delete old files on disk
|
|
|
|
|
filesToDelete := files[maxNumber+buffer:] |
|
|
|
|
for _, file := range filesToDelete { |
|
|
|
|
os.Remove(filepath.Join(directoryPath, file.Name())) |
|
|
|
|
filesToDelete := files[maxNumber+buffer:] |
|
|
|
|
log.Traceln("Deleting", len(filesToDelete), "old files from", baseDirectory, "for video variant", directory) |
|
|
|
|
|
|
|
|
|
for _, file := range filesToDelete { |
|
|
|
|
fileToDelete := filepath.Join(baseDirectory, directory, file.Name()) |
|
|
|
|
err := os.Remove(fileToDelete) |
|
|
|
|
if err != nil { |
|
|
|
|
log.Errorln(err) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
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 |
|
|
|
|
} |
|
|
|
|
func getAllFilesRecursive(baseDirectory string) (map[string][]os.FileInfo, error) { |
|
|
|
|
var files = make(map[string][]os.FileInfo) |
|
|
|
|
|
|
|
|
|
filteredList := make([]os.FileInfo, 0) |
|
|
|
|
var directory string |
|
|
|
|
filepath.Walk(baseDirectory, func(path string, info os.FileInfo, err error) error { |
|
|
|
|
if err != nil { |
|
|
|
|
log.Fatalf(err.Error()) |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Filter out playlists because we don't want to clean them up
|
|
|
|
|
for _, file := range list { |
|
|
|
|
if filepath.Ext(file.Name()) == ".m3u8" { |
|
|
|
|
continue |
|
|
|
|
if info.IsDir() { |
|
|
|
|
directory = info.Name() |
|
|
|
|
} |
|
|
|
|
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() |
|
|
|
|
if filepath.Ext(info.Name()) == ".ts" { |
|
|
|
|
files[directory] = append(files[directory], info) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return nil |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
return filteredList, nil |
|
|
|
|
// Sort by date so we can delete old files
|
|
|
|
|
for directory := range files { |
|
|
|
|
sort.Slice(files[directory], func(i, j int) bool { |
|
|
|
|
return files[directory][i].ModTime().UnixNano() > files[directory][j].ModTime().UnixNano() |
|
|
|
|
}) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return files, nil |
|
|
|
|
} |
|
|
|
|