diff --git a/soundcloudapi.go b/soundcloudapi.go index 88f196e..5265a60 100644 --- a/soundcloudapi.go +++ b/soundcloudapi.go @@ -133,53 +133,48 @@ func (sc *API) GetUser(options GetUserOptions) (User, error) { // If the track has a publicly available download link, that link will be preferred and the streamType parameter will be ignored. // streamType can be either "hls" or "progressive", defaults to "progressive" func (sc *API) GetDownloadURL(url string, streamType string) (string, error) { - url, err := sc.prepareURL(url) + track, err := sc.getTrack(url) if err != nil { return "", err } - streamType = strings.ToLower(streamType) - if streamType == "" { - streamType = "progressive" - } - - if IsURL(url, false, false) && !IsPlaylistURL(url) { - info, err := sc.client.getTrackInfo(GetTrackInfoOptions{ - URL: url, - }) + if track.Downloadable && track.HasDownloadsLeft { + downloadURL, err := sc.client.getDownloadURL(track.ID) if err != nil { return "", err } + return downloadURL, nil + } - if len(info) == 0 { - return "", errors.New("Could not find a track with that URL") - } + return sc.GetStreamURL(url, streamType) +} + +func (sc *API) GetStreamURL(url string, streamType string) (string, error) { + track, err := sc.getTrack(url) + if err != nil { + return "", err + } + + streamType = strings.ToLower(streamType) + if streamType == "" { + streamType = "progressive" + } - if info[0].Downloadable && info[0].HasDownloadsLeft { - downloadURL, err := sc.client.getDownloadURL(info[0].ID) + for _, transcoding := range track.Media.Transcodings { + if strings.ToLower(transcoding.Format.Protocol) == streamType { + mediaURL, err := sc.client.getMediaURL(transcoding.URL) if err != nil { return "", err } - return downloadURL, nil - } - - for _, transcoding := range info[0].Media.Transcodings { - if strings.ToLower(transcoding.Format.Protocol) == streamType { - mediaURL, err := sc.client.getMediaURL(transcoding.URL) - if err != nil { - return "", err - } - return mediaURL, nil - } + return mediaURL, nil } + } - mediaURL, err := sc.client.getMediaURL(info[0].Media.Transcodings[0].URL) - if err != nil { - return "", err - } - return mediaURL, nil + mediaURL, err := sc.client.getMediaURL(track.Media.Transcodings[0].URL) + if err != nil { + return "", err } - return "", errors.New("URL is not a track URL") + return mediaURL, nil } func (sc *API) prepareURL(url string) (string, error) { @@ -210,6 +205,29 @@ func (sc *API) prepareURL(url string) (string, error) { return url, nil } +func (sc *API) getTrack(url string) (Track, error) { + url, err := sc.prepareURL(url) + if err != nil { + return Track{}, err + } + + if IsURL(url, false, false) && !IsPlaylistURL(url) { + info, err := sc.client.getTrackInfo(GetTrackInfoOptions{ + URL: url, + }) + + if err != nil { + return Track{}, err + } + + if len(info) == 1 { + return info[0], nil + } + } + + return Track{}, errors.New("Could not find a track with that URL") +} + func (sc *API) ConvertNewMobileURL(url string) (string, error) { client := new(http.Client) type urlResp struct { diff --git a/soundcloudapi_test/get_download_url_test.go b/soundcloudapi_test/get_download_url_test.go index 69ad853..b6c508c 100644 --- a/soundcloudapi_test/get_download_url_test.go +++ b/soundcloudapi_test/get_download_url_test.go @@ -45,6 +45,18 @@ func TestGetDownloadURLPublic(t *testing.T) { } } +func TestGetStreamURL(t *testing.T) { + dlURL, err := api.GetStreamURL("https://soundcloud.com/taliya-jenkins/double-cheese-burger-hold-the", "progressive") + if err != nil { + t.Error(err.Error()) + return + } + + if !strings.Contains(dlURL, "sndcdn.com/") { + t.Errorf("Invalid download URL returned, received: (%s)", dlURL) + } +} + func TestGetDownloadURLNewLink(t *testing.T) { // This track has a public download URL link trackInfo, err := api.GetTrackInfo(soundcloudapi.GetTrackInfoOptions{