collection.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. package movies
  2. import (
  3. "encoding/json"
  4. "io/ioutil"
  5. "sync"
  6. )
  7. type Collection struct {
  8. Movies []*Movie
  9. mutex sync.RWMutex
  10. hasChanged bool
  11. movieMap map[string]*Movie
  12. }
  13. func Import(filename string) (*Collection, error) {
  14. b, err := ioutil.ReadFile(filename)
  15. if err != nil {
  16. return nil, err
  17. }
  18. var c Collection
  19. if err := json.Unmarshal(b, &c); err != nil {
  20. return nil, err
  21. }
  22. c.movieMap = make(map[string]*Movie)
  23. for _, m := range c.Movies {
  24. m.FillFromOMDB()
  25. c.movieMap[m.IMDBID] = m
  26. }
  27. return &c, nil
  28. }
  29. func (c *Collection) Export(filename string) error {
  30. c.mutex.RLock()
  31. defer c.mutex.RUnlock()
  32. b, err := json.Marshal(c)
  33. if err != nil {
  34. return err
  35. }
  36. err = ioutil.WriteFile(filename, b, 0644)
  37. if err != nil {
  38. return err
  39. }
  40. c.hasChanged = false
  41. return nil
  42. }
  43. func (c *Collection) Add(m *Movie) {
  44. c.mutex.Lock()
  45. defer c.mutex.Unlock()
  46. for _, present := range c.Movies {
  47. if m.IMDBID == present.IMDBID {
  48. return
  49. }
  50. }
  51. c.Movies = append(c.Movies, m)
  52. c.movieMap[m.IMDBID] = m
  53. c.hasChanged = true
  54. }
  55. func (c *Collection) HasChanged() bool {
  56. return c.hasChanged
  57. }
  58. func (c *Collection) Get(imdbID string) (*Movie, bool) {
  59. c.mutex.RLock()
  60. defer c.mutex.RUnlock()
  61. m, ok := c.movieMap[imdbID]
  62. return m, ok
  63. }
  64. func (c *Collection) Update(m *Movie) {
  65. c.mutex.Lock()
  66. defer c.mutex.Unlock()
  67. c.movieMap[m.IMDBID] = m
  68. found := false
  69. for i := range c.Movies {
  70. if c.Movies[i].IMDBID == m.IMDBID {
  71. c.Movies[i] = m
  72. found = true
  73. break
  74. }
  75. }
  76. if !found {
  77. c.Movies = append(c.Movies, m)
  78. }
  79. c.hasChanged = true
  80. }