hlsFilesystemCleanup.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package transcoder
  2. import (
  3. log "github.com/sirupsen/logrus"
  4. "os"
  5. "path/filepath"
  6. "sort"
  7. "github.com/owncast/owncast/core/data"
  8. )
  9. // CleanupOldContent will delete old files from the private dir that are no longer being referenced
  10. // in the stream.
  11. func CleanupOldContent(baseDirectory string) {
  12. // Determine how many files we should keep on disk
  13. maxNumber := data.GetStreamLatencyLevel().SegmentCount
  14. buffer := 10
  15. files, err := getAllFilesRecursive(baseDirectory)
  16. if err != nil {
  17. log.Debugln("Unable to cleanup old video files", err)
  18. return
  19. }
  20. // Delete old private HLS files on disk
  21. for directory := range files {
  22. files := files[directory]
  23. if len(files) < maxNumber+buffer {
  24. continue
  25. }
  26. filesToDelete := files[maxNumber+buffer:]
  27. log.Traceln("Deleting", len(filesToDelete), "old files from", baseDirectory, "for video variant", directory)
  28. for _, file := range filesToDelete {
  29. fileToDelete := filepath.Join(baseDirectory, directory, file.Name())
  30. err := os.Remove(fileToDelete)
  31. if err != nil {
  32. log.Debugln(err)
  33. }
  34. }
  35. }
  36. }
  37. func getAllFilesRecursive(baseDirectory string) (map[string][]os.FileInfo, error) {
  38. var files = make(map[string][]os.FileInfo)
  39. var directory string
  40. err := filepath.Walk(baseDirectory, func(path string, info os.FileInfo, err error) error {
  41. if err != nil {
  42. return err
  43. }
  44. if info.IsDir() {
  45. directory = info.Name()
  46. }
  47. if filepath.Ext(info.Name()) == ".ts" {
  48. files[directory] = append(files[directory], info)
  49. }
  50. return nil
  51. })
  52. if err != nil {
  53. return nil, err
  54. }
  55. // Sort by date so we can delete old files
  56. for directory := range files {
  57. sort.Slice(files[directory], func(i, j int) bool {
  58. return files[directory][i].ModTime().UnixNano() > files[directory][j].ModTime().UnixNano()
  59. })
  60. }
  61. return files, nil
  62. }