package movies import ( "encoding/json" "strconv" "strings" ) type Movie struct { Title string Director string Poster string Rating *Rating IMDBID string Country string Year string Runtime string Files []string OMDB OMDBMovie } type Rating struct { Note float64 Votes int64 } type OMDBMovie struct { Title string Year string Rated string Released string Runtime string Genre string Director string Writer string Actors string Plot string Language string Country string Awards string Poster string Ratings []OMDBRating Metascore string IMDBRating string `json: "imdbRating"` IMDBVotes string `json: "imdbVotes"` IMDBID string `json: "imdbID"` Type string DVD string BoxOffice string Production string Website string Response string } type OMDBRating struct { Source, Value string } func Unmarshal(b []byte) (*Movie, error) { var omdb OMDBMovie if err := json.Unmarshal(b, &omdb); err != nil { return nil, err } m := &Movie{ OMDB: omdb, } if err := m.FillFromOMDB(); err != nil { return nil, err } return m, nil } func (m *Movie) FillFromOMDB() error { if m.Title == "" { m.Title = m.OMDB.Title } if m.Director == "" { m.Director = m.OMDB.Director } if m.Poster == "" { m.Poster = m.OMDB.Poster } if m.IMDBID == "" { m.IMDBID = m.OMDB.IMDBID } if m.Country == "" { m.Country = m.OMDB.Country } if m.Year == "" { m.Year = m.OMDB.Year } if m.Runtime == "" { m.Runtime = m.OMDB.Runtime } if m.Rating == nil { m.Rating = &Rating{} if note, err := strconv.ParseFloat(m.OMDB.IMDBRating, 64); err == nil { m.Rating.Note = note } if votes, err := strconv.ParseInt(strings.ReplaceAll(m.OMDB.IMDBVotes, ",", ""), 10, 64); err == nil { m.Rating.Votes = votes } } return nil }