Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

73 lines
1.3KB

  1. package recorder
  2. import (
  3. "os"
  4. "path/filepath"
  5. "sort"
  6. )
  7. type recInfo struct {
  8. id string
  9. path string
  10. start int64
  11. size int64
  12. }
  13. func enforceQuota(root string, maxMB int) {
  14. if maxMB <= 0 {
  15. return
  16. }
  17. maxBytes := int64(maxMB) * 1024 * 1024
  18. infos, total := scanRecordings(root)
  19. if total <= maxBytes {
  20. return
  21. }
  22. // oldest first
  23. sort.Slice(infos, func(i, j int) bool { return infos[i].start < infos[j].start })
  24. for _, info := range infos {
  25. if total <= maxBytes {
  26. break
  27. }
  28. _ = os.RemoveAll(info.path)
  29. total -= info.size
  30. }
  31. }
  32. func scanRecordings(root string) ([]recInfo, int64) {
  33. entries, err := os.ReadDir(root)
  34. if err != nil {
  35. return nil, 0
  36. }
  37. infos := make([]recInfo, 0, len(entries))
  38. var total int64
  39. for _, e := range entries {
  40. if !e.IsDir() {
  41. continue
  42. }
  43. id := e.Name()
  44. path := filepath.Join(root, id)
  45. size := dirSize(path)
  46. start := int64(0)
  47. if meta, err := ReadMeta(filepath.Join(path, "meta.json")); err == nil {
  48. start = meta.Start.UnixMilli()
  49. }
  50. infos = append(infos, recInfo{id: id, path: path, start: start, size: size})
  51. total += size
  52. }
  53. return infos, total
  54. }
  55. func dirSize(path string) int64 {
  56. var size int64
  57. _ = filepath.Walk(path, func(_ string, info os.FileInfo, err error) error {
  58. if err != nil {
  59. return nil
  60. }
  61. if !info.IsDir() {
  62. size += info.Size()
  63. }
  64. return nil
  65. })
  66. return size
  67. }