collection.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  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. c.hasChanged = true
  47. for _, present := range c.Movies {
  48. if m.IMDBID == present.IMDBID {
  49. present.OMDB = m.OMDB
  50. present.FillFromOMDB()
  51. return
  52. }
  53. }
  54. c.Movies = append(c.Movies, m)
  55. c.movieMap[m.IMDBID] = m
  56. }
  57. func (c *Collection) HasChanged() bool {
  58. return c.hasChanged
  59. }
  60. func (c *Collection) Get(imdbID string) (*Movie, bool) {
  61. c.mutex.RLock()
  62. defer c.mutex.RUnlock()
  63. m, ok := c.movieMap[imdbID]
  64. return m, ok
  65. }
  66. func (c *Collection) Update(m *Movie) {
  67. c.mutex.Lock()
  68. defer c.mutex.Unlock()
  69. c.movieMap[m.IMDBID] = m
  70. found := false
  71. for i := range c.Movies {
  72. if c.Movies[i].IMDBID == m.IMDBID {
  73. c.Movies[i] = m
  74. found = true
  75. break
  76. }
  77. }
  78. if !found {
  79. c.Movies = append(c.Movies, m)
  80. }
  81. c.hasChanged = true
  82. }