code: func (c *Client) BestMoviesByHashes(hashes []uint64) ([]*Movie, error) {
  	hashStrings := make([]string, len(hashes))
  	for i, hash := range hashes {
  		hashStrings[i] = hashString(hash)
  	}
  
  	params := []interface{}{c.Token, hashStrings}
  	res := struct {
  		Status string                 `xmlrpc:"status"`
  		Data   map[string]interface{} `xmlrpc:"data"`
  	}{}
  
  	if err := c.Call("CheckMovieHash", params, &res); err != nil {
  		return nil, err
  	}
  
  	if res.Status != StatusSuccess {
  		return nil, fmt.Errorf("CheckMovieHash error: %s", res.Status)
  	}
  
  	movies := make([]*Movie, len(hashes))
  	for i, hashString := range hashStrings {
  		switch v := res.Data[hashString].(type) {
  		case []interface{}:
  			// this works around a bug (feature?) in the opensubtitles API:
  			// when a hash is missing in the database, the API returns
  			// an empty array instead of a null value or an empty map
  			movies[i] = nil
  		case map[string]interface{}:
  			// this is probably a movie
  			movie, err := movieFromMap(v)
  			if err != nil {
  				return nil, fmt.Errorf(
  					"CheckMovieHash returned malformed data: %s", err,
  				)
  			}
  			movies[i] = movie
  		default:
  			return nil, fmt.Errorf("CheckMovieHash returned unknown data")
  		}
  	}
  
  	return movies, nil
  }
docs: // BestMoviesByHashes searches for the best matching movies for each
  // of the hashes (only for <200). This returns incomplete Movies, with
  // the following fields only: ID, Title and Year.