Browse Source

Do not add to collection a movies that is already here

Gildas Chabot 4 years ago
parent
commit
2d31813c65
2 changed files with 49 additions and 15 deletions
  1. 10 0
      collection.go
  2. 39 15
      movies.go

+ 10 - 0
collection.go

@@ -24,6 +24,10 @@ func Import(filename string) (*Collection, error) {
24 24
 		return nil, err
25 25
 	}
26 26
 
27
+	for _, m := range c.Movies {
28
+		m.FillFromOMDB()
29
+	}
30
+
27 31
 	return &c, nil
28 32
 }
29 33
 
@@ -49,6 +53,12 @@ func (c *Collection) Add(m *Movie) {
49 53
 	c.mutex.Lock()
50 54
 	defer c.mutex.Unlock()
51 55
 
56
+	for _, present := range c.Movies {
57
+		if m.IMDBID == present.IMDBID {
58
+			return
59
+		}
60
+	}
61
+
52 62
 	c.Movies = append(c.Movies, m)
53 63
 	c.hasChanged = true
54 64
 }

+ 39 - 15
movies.go

@@ -11,7 +11,8 @@ type Movie struct {
11 11
 	Title    string
12 12
 	Director string
13 13
 	Poster   string
14
-	Rating   Rating
14
+	Rating   *Rating
15
+	IMDBID   string
15 16
 
16 17
 	OMDB OMDBMovie
17 18
 }
@@ -59,24 +60,47 @@ func Unmarshal(b []byte) (*Movie, error) {
59 60
 		return nil, err
60 61
 	}
61 62
 
62
-	note, err := strconv.ParseFloat(omdb.IMDBRating, 64)
63
-	if err != nil {
64
-		return nil, fmt.Errorf("cannot convert %q to float64: %w", omdb.IMDBRating, err)
63
+	m := &Movie{
64
+		OMDB: omdb,
65
+	}
66
+
67
+	if err := m.FillFromOMDB(); err != nil {
68
+		return nil, err
65 69
 	}
66 70
 
67
-	votes, err := strconv.ParseInt(strings.ReplaceAll(omdb.IMDBVotes, ",", ""), 10, 64)
68
-	if err != nil {
69
-		return nil, fmt.Errorf("cannot convert %q to int: %w", omdb.IMDBVotes, err)
71
+	return m, nil
72
+}
73
+
74
+func (m *Movie) FillFromOMDB() error {
75
+	if m.Title == "" {
76
+		m.Title = m.OMDB.Title
77
+	}
78
+	if m.Director == "" {
79
+		m.Director = m.OMDB.Director
70 80
 	}
81
+	if m.Poster == "" {
82
+		m.Poster = m.OMDB.Poster
83
+	}
84
+	if m.IMDBID == "" {
85
+		m.IMDBID = m.OMDB.IMDBID
86
+	}
87
+
88
+	if m.Rating == nil {
89
+		note, err := strconv.ParseFloat(m.OMDB.IMDBRating, 64)
90
+		if err != nil {
91
+			return fmt.Errorf("cannot convert %q to float64: %w", m.OMDB.IMDBRating, err)
92
+		}
93
+
94
+		votes, err := strconv.ParseInt(strings.ReplaceAll(m.OMDB.IMDBVotes, ",", ""), 10, 64)
95
+		if err != nil {
96
+			return fmt.Errorf("cannot convert %q to int: %w", m.OMDB.IMDBVotes, err)
97
+		}
71 98
 
72
-	return &Movie{
73
-		Title:    omdb.Title,
74
-		Director: omdb.Director,
75
-		Poster:   omdb.Poster,
76
-		Rating: Rating{
99
+		m.Rating = &Rating{
77 100
 			Note:  note,
78 101
 			Votes: votes,
79
-		},
80
-		OMDB: omdb,
81
-	}, nil
102
+		}
103
+	}
104
+
105
+	return nil
82 106
 }