Web-based Winamp controller for CarPC � Go backend, mobile-first UI
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

94 lines
1.9KB

  1. // Package killist maintains a persistent list of track titles that should
  2. // be automatically skipped during playback — a direct port of the Delphi
  3. // KillList / KillFile feature.
  4. package killist
  5. import (
  6. "bufio"
  7. "os"
  8. "strings"
  9. "sync"
  10. )
  11. // KillList is a thread-safe set of track titles to skip.
  12. type KillList struct {
  13. mu sync.RWMutex
  14. titles map[string]struct{}
  15. filepath string
  16. }
  17. // Load reads the kill list from disk (creates an empty list if the file
  18. // does not exist yet).
  19. func Load(path string) (*KillList, error) {
  20. kl := &KillList{
  21. titles: make(map[string]struct{}),
  22. filepath: path,
  23. }
  24. f, err := os.Open(path)
  25. if os.IsNotExist(err) {
  26. return kl, nil
  27. }
  28. if err != nil {
  29. return nil, err
  30. }
  31. defer f.Close()
  32. sc := bufio.NewScanner(f)
  33. for sc.Scan() {
  34. line := strings.TrimSpace(sc.Text())
  35. if line != "" {
  36. kl.titles[line] = struct{}{}
  37. }
  38. }
  39. return kl, sc.Err()
  40. }
  41. // Contains reports whether the given title is on the kill list.
  42. func (kl *KillList) Contains(title string) bool {
  43. kl.mu.RLock()
  44. defer kl.mu.RUnlock()
  45. _, ok := kl.titles[title]
  46. return ok
  47. }
  48. // Add appends a title and persists the list.
  49. func (kl *KillList) Add(title string) error {
  50. kl.mu.Lock()
  51. defer kl.mu.Unlock()
  52. kl.titles[title] = struct{}{}
  53. return kl.save()
  54. }
  55. // Remove removes a title and persists the list.
  56. func (kl *KillList) Remove(title string) error {
  57. kl.mu.Lock()
  58. defer kl.mu.Unlock()
  59. delete(kl.titles, title)
  60. return kl.save()
  61. }
  62. // List returns all titles currently on the kill list.
  63. func (kl *KillList) List() []string {
  64. kl.mu.RLock()
  65. defer kl.mu.RUnlock()
  66. out := make([]string, 0, len(kl.titles))
  67. for t := range kl.titles {
  68. out = append(out, t)
  69. }
  70. return out
  71. }
  72. func (kl *KillList) save() error {
  73. f, err := os.Create(kl.filepath)
  74. if err != nil {
  75. return err
  76. }
  77. defer f.Close()
  78. w := bufio.NewWriter(f)
  79. for t := range kl.titles {
  80. w.WriteString(t + "\n")
  81. }
  82. return w.Flush()
  83. }