// NewPlaylist gathers the metadata for a YouTube playlist and returns it. func (yt YouTube) NewPlaylist(user *gumble.User, id string) ([]Song, error) { var apiResponse *jsonq.JsonQuery var songArray []Song var err error // Retrieve title of playlist url := fmt.Sprintf("https://www.googleapis.com/youtube/v3/playlists?part=snippet&id=%s&key=%s", id, dj.conf.ServiceKeys.Youtube) if apiResponse, err = PerformGetRequest(url); err != nil { return nil, err } title, _ := apiResponse.String("items", "0", "snippet", "title") playlist := &AudioPlaylist{ id: id, title: title, } maxSongs := math.MaxInt32 if dj.conf.General.MaxSongPerPlaylist > 0 { maxSongs = dj.conf.General.MaxSongPerPlaylist } pageToken := "" for len(songArray) < maxSongs { //Iterate over the pages // Retrieve items in this page of the playlist url = fmt.Sprintf("https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&maxResults=50&playlistId=%s&key=%s&pageToken=%s", id, dj.conf.ServiceKeys.Youtube, pageToken) if apiResponse, err = PerformGetRequest(url); err != nil { return nil, err } songs, _ := apiResponse.Array("items") for j := 0; j < len(songs) && len(songArray) < maxSongs; j++ { index := strconv.Itoa(j) videoID, _ := apiResponse.String("items", index, "snippet", "resourceId", "videoId") if song, err := yt.NewSong(user, videoID, "", playlist); err == nil { songArray = append(songArray, song) } } if pageToken, err = apiResponse.String("nextPageToken"); err != nil { break } } return songArray, nil }