collection.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. package movies
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "io/ioutil"
  6. "sync"
  7. )
  8. type Collection struct {
  9. Movies []*Movie
  10. movieMap map[string]*Movie
  11. Lists []*List
  12. listMap map[string]*List
  13. mutex sync.RWMutex
  14. hasChanged bool
  15. }
  16. func Import(filename string) (*Collection, error) {
  17. b, err := ioutil.ReadFile(filename)
  18. if err != nil {
  19. return nil, err
  20. }
  21. var c Collection
  22. if err := json.Unmarshal(b, &c); err != nil {
  23. return nil, err
  24. }
  25. c.movieMap = make(map[string]*Movie)
  26. for _, m := range c.Movies {
  27. m.FillFromOMDB()
  28. c.movieMap[m.IMDBID] = m
  29. }
  30. c.listMap = make(map[string]*List)
  31. for _, l := range c.Lists {
  32. c.listMap[l.ID] = l
  33. }
  34. return &c, nil
  35. }
  36. func (c *Collection) Export(filename string) error {
  37. c.mutex.RLock()
  38. defer c.mutex.RUnlock()
  39. b, err := json.Marshal(c)
  40. if err != nil {
  41. return err
  42. }
  43. err = ioutil.WriteFile(filename, b, 0644)
  44. if err != nil {
  45. return err
  46. }
  47. c.hasChanged = false
  48. return nil
  49. }
  50. func (c *Collection) Add(m *Movie) {
  51. c.mutex.Lock()
  52. defer c.mutex.Unlock()
  53. c.hasChanged = true
  54. for _, present := range c.Movies {
  55. if m.IMDBID == present.IMDBID {
  56. present.OMDB = m.OMDB
  57. present.FillFromOMDB()
  58. return
  59. }
  60. }
  61. c.Movies = append(c.Movies, m)
  62. c.movieMap[m.IMDBID] = m
  63. }
  64. func (c *Collection) HasChanged() bool {
  65. return c.hasChanged
  66. }
  67. func (c *Collection) Get(imdbID string) (*Movie, bool) {
  68. c.mutex.RLock()
  69. defer c.mutex.RUnlock()
  70. m, ok := c.movieMap[imdbID]
  71. return m, ok
  72. }
  73. func (c *Collection) Update(m *Movie) {
  74. c.mutex.Lock()
  75. defer c.mutex.Unlock()
  76. c.movieMap[m.IMDBID] = m
  77. found := false
  78. for i := range c.Movies {
  79. if c.Movies[i].IMDBID == m.IMDBID {
  80. c.Movies[i] = m
  81. found = true
  82. break
  83. }
  84. }
  85. if !found {
  86. c.Movies = append(c.Movies, m)
  87. }
  88. c.hasChanged = true
  89. }
  90. func (c *Collection) GetList(listID string) (*List, bool) {
  91. c.mutex.RLock()
  92. defer c.mutex.RUnlock()
  93. l, ok := c.listMap[listID]
  94. return l, ok
  95. }
  96. func (c *Collection) AddList(id, title string) error {
  97. c.mutex.Lock()
  98. defer c.mutex.Unlock()
  99. c.hasChanged = true
  100. for _, present := range c.Lists {
  101. if id == present.ID {
  102. return fmt.Errorf("there is already a list with id %q", id)
  103. }
  104. }
  105. l := &List{
  106. ID: id,
  107. Title: title,
  108. }
  109. c.Lists = append(c.Lists, l)
  110. c.listMap[l.ID] = l
  111. return nil
  112. }
  113. func (c *Collection) UpdateList(l *List) {
  114. c.mutex.Lock()
  115. defer c.mutex.Unlock()
  116. c.listMap[l.ID] = l
  117. found := false
  118. for i := range c.Lists {
  119. if c.Lists[i].ID == l.ID {
  120. c.Lists[i] = l
  121. found = true
  122. break
  123. }
  124. }
  125. if !found {
  126. c.Lists = append(c.Lists, l)
  127. }
  128. c.hasChanged = true
  129. }