Skip to content
This repository was archived by the owner on Jan 29, 2025. It is now read-only.

Commit 862e117

Browse files
author
Florian Freikowski
authored
feat: use new monstercat api (#2)
1 parent cae619c commit 862e117

File tree

10 files changed

+175
-200
lines changed

10 files changed

+175
-200
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,11 +65,11 @@ import (
6565

6666
func main() {
6767
client := monstercat.NewClient()
68-
releases, err := client.Releases("mix contest", "podcast", 5, 0)
68+
catalog, err := client.GetCatalog("mix contest", "podcast", 5, 0)
6969
if err != nil {
7070
fmt.Printf("error: %s", err)
7171
os.Exit(1)
7272
}
73-
fmt.Printf("releases: %+v", releases)
73+
fmt.Printf("catalog: %+v", catalog)
7474
}
7575
```

cmd/releases.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ var releasesCmd = &cobra.Command{
2929
Use: "releases",
3030
Short: "releases returns a set of the most recent Monstercat releases",
3131
Run: func(cmd *cobra.Command, args []string) {
32-
releases, err := monstercat.NewClient().Releases(releasesSearch, releasesType, releasesLimit, releasesOffset)
32+
releases, err := monstercat.NewClient().GetCatalog(releasesSearch, releasesType, releasesLimit, releasesOffset)
3333
if err != nil {
3434
fmt.Printf("error fetching releases: %s", err)
3535
os.Exit(1)
@@ -38,10 +38,10 @@ var releasesCmd = &cobra.Command{
3838
table := tablewriter.NewWriter(os.Stdout)
3939
table.SetAutoWrapText(false)
4040
table.SetHeader([]string{"Catalog ID", "Title", "Artist", "Type", "Release Date"})
41-
table.SetCaption(true, fmt.Sprintf("%d of %d results", len(releases.Results), releases.Total))
41+
table.SetCaption(true, fmt.Sprintf("%d of %d results", len(releases.Data), releases.Total))
4242

43-
for _, release := range releases.Results {
44-
table.Append([]string{release.CatalogID, release.Title, release.Artist, string(release.Type), release.ReleaseDate.Format("2006-01-02")})
43+
for _, release := range releases.Data {
44+
table.Append([]string{release.Release.CatalogID, release.Title, release.ArtistsTitle, string(release.Release.Type), release.DebutDate.Format("2006-01-02")})
4545
}
4646
table.Render()
4747
},

monstercat/catalog.go

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package monstercat
2+
3+
import (
4+
"encoding/json"
5+
"fmt"
6+
"io"
7+
"net/http"
8+
"net/url"
9+
)
10+
11+
// Catalog represents a list of releases from Monstercat API
12+
type Catalog struct {
13+
Data []CatalogItem `json:"Data"`
14+
Total int `json:"Total"`
15+
Limit int `json:"Limit"`
16+
Offset int `json:"Offset"`
17+
}
18+
19+
// GetCatalog returns a set of releases containing the given search query, matching the given release type and being within the given range.
20+
// While limit and offset are required, you may leave search and releaseType empty to ignore those filters.
21+
func (client Client) GetCatalog(search string, releaseType string, limit int, offset int) (Catalog, error) {
22+
catalog := Catalog{}
23+
24+
urlParameters := url.Values{}
25+
urlParameters.Add("search", search)
26+
urlParameters.Add("types[]", releaseType)
27+
urlParameters.Add("limit", fmt.Sprintf("%d", limit))
28+
urlParameters.Add("offset", fmt.Sprintf("%d", offset))
29+
30+
request, err := http.NewRequest("GET", fmt.Sprintf("%s?%s", endpointCatalog, urlParameters.Encode()), http.NoBody)
31+
if err != nil {
32+
return catalog, err
33+
}
34+
if client.IsLoggedIn() {
35+
request.Header.Set("Cookie", fmt.Sprintf("%s=%s", authenticationCookieName, client.authenticationCookie))
36+
}
37+
38+
httpClient := &http.Client{}
39+
response, err := httpClient.Do(request)
40+
if err != nil {
41+
return catalog, err
42+
}
43+
defer response.Body.Close()
44+
45+
if response.StatusCode != http.StatusOK {
46+
message, err := io.ReadAll(response.Body)
47+
if err != nil {
48+
return catalog, fmt.Errorf("http error %d", response.StatusCode)
49+
}
50+
return catalog, fmt.Errorf("http error %d: %s", response.StatusCode, message)
51+
}
52+
53+
err = json.NewDecoder(response.Body).Decode(&catalog)
54+
if err != nil {
55+
return catalog, err
56+
}
57+
58+
return catalog, nil
59+
}
60+
61+
// HasNextPage returns true if the release list contains more pages, false otherwise.
62+
func (catalog Catalog) HasNextPage() bool {
63+
return (catalog.Offset + catalog.Limit) < catalog.Total
64+
}

monstercat/catalog_test.go

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
package monstercat
2+
3+
import (
4+
"testing"
5+
6+
"github.com/stretchr/testify/assert"
7+
)
8+
9+
func TestCatalog(t *testing.T) {
10+
client := NewClient()
11+
12+
catalog, err := client.GetCatalog("", "", 10, 0)
13+
assert.NoError(t, err)
14+
assert.NotEmpty(t, catalog.Data)
15+
assert.NotEqual(t, 0, catalog.Total)
16+
assert.True(t, catalog.HasNextPage())
17+
}
18+
19+
func TestCatalog_Search(t *testing.T) {
20+
client := NewClient()
21+
22+
catalog, err := client.GetCatalog("mix", "", 10, 0)
23+
assert.NoError(t, err)
24+
assert.NotEmpty(t, catalog.Data)
25+
assert.NotEqual(t, 0, catalog.Total)
26+
assert.True(t, catalog.HasNextPage())
27+
}
28+
29+
func TestCatalog_Search_NoResults(t *testing.T) {
30+
client := NewClient()
31+
32+
catalog, err := client.GetCatalog("xxx not found xxx", "", 10, 0)
33+
assert.NoError(t, err)
34+
assert.Empty(t, catalog.Data)
35+
assert.Equal(t, 0, catalog.Total)
36+
assert.False(t, catalog.HasNextPage())
37+
}
38+
39+
func TestCatalog_Type(t *testing.T) {
40+
client := NewClient()
41+
42+
catalog, err := client.GetCatalog("", string(ReleaseTypeSingle), 10, 0)
43+
assert.NoError(t, err)
44+
assert.NotEmpty(t, catalog.Data)
45+
assert.NotEqual(t, 0, catalog.Total)
46+
assert.True(t, catalog.HasNextPage())
47+
}
48+
49+
func TestCatalog_Type_NoResults(t *testing.T) {
50+
client := NewClient()
51+
52+
catalog, err := client.GetCatalog("", "xxx not found", 10, 0)
53+
assert.NoError(t, err)
54+
assert.Empty(t, catalog.Data)
55+
assert.Equal(t, 0, catalog.Total)
56+
assert.False(t, catalog.HasNextPage())
57+
}
58+
59+
func TestCatalog_Search_Type(t *testing.T) {
60+
client := NewClient()
61+
62+
catalog, err := client.GetCatalog("mix", string(ReleaseTypeCompilation), 5, 0)
63+
assert.NoError(t, err)
64+
assert.NotEmpty(t, catalog.Data)
65+
assert.NotEqual(t, 0, catalog.Total)
66+
assert.True(t, catalog.HasNextPage())
67+
}
68+
69+
func TestCatalogUntilEnd(t *testing.T) {
70+
client := NewClient()
71+
72+
catalog, err := client.GetCatalog("", "", 100, 0)
73+
assert.NoError(t, err)
74+
75+
for catalog.HasNextPage() {
76+
catalog, err = client.GetCatalog("", "", catalog.Limit, catalog.Offset+catalog.Limit)
77+
assert.NoError(t, err)
78+
}
79+
}

monstercat/login.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ import (
1010
// Login performs a login request into your Monstercat account and stores the created authentication cookie on success for further requests
1111
func (client *Client) Login(email string, password string) error {
1212
payload, err := json.Marshal(map[string]string{
13-
"email": email,
14-
"password": password,
13+
"Email": email,
14+
"Password": password,
1515
})
1616
if err != nil {
1717
return err

monstercat/monstercat.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ package monstercat
33
import "fmt"
44

55
const (
6-
endpointLogin = "https://connect.monstercat.com/v2/signin"
7-
endpointReleaseList = "https://connect.monstercat.com/v2/releases"
8-
endpointReleaseDownload = "https://connect.monstercat.com/v2/release/%s/download?format=%s"
6+
endpointLogin = "https://www.monstercat.com/api/sign-in"
7+
endpointCatalog = "https://www.monstercat.com/api/catalog/browse"
8+
endpointReleaseDownload = "https://www.monstercat.com/api/release/%s/download?format=%s"
99

1010
authenticationCookieName = "cid"
1111
)

monstercat/release.go

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -21,21 +21,26 @@ const (
2121
ReleaseTypeSingle ReleaseType = "Single"
2222
)
2323

24-
// Release represents a single release from Monstercat API
25-
type Release struct {
26-
ID string `json:"id"`
27-
Title string `json:"title"`
28-
Artist string `json:"artistsTitle"`
29-
CatalogID string `json:"catalogId"`
30-
ReleaseDate time.Time `json:"releaseDate"`
31-
Type ReleaseType `json:"type"`
24+
// CatalogItem represents a single release from Monstercat API
25+
type CatalogItem struct {
26+
ID string `json:"Id"`
27+
Title string `json:"Title"`
28+
ArtistsTitle string `json:"ArtistsTitle"`
29+
DebutDate time.Time `json:"DebutDate"`
30+
Release Release `json:"Release"`
31+
32+
GenrePrimary string `json:"GenrePrimary"`
33+
GenreSecondary string `json:"GenreSecondary"`
3234

33-
GenrePrimary string `json:"genrePrimary"`
34-
GenreSecondary string `json:"genreSecondary"`
35+
Downloadable bool `json:"Downloadable"`
36+
InEarlyAccess bool `json:"InEarlyAccess"`
37+
Streamable bool `json:"Streamable"`
38+
}
3539

36-
Downloadable bool `json:"downloadable"`
37-
InEarlyAccess bool `json:"inEarlyAccess"`
38-
Streamable bool `json:"streamable"`
40+
type Release struct {
41+
CatalogID string `json:"CatalogId"`
42+
ReleaseDate time.Time `json:"ReleaseDate"`
43+
Type ReleaseType `json:"Type"`
3944
}
4045

4146
// DownloadFormat describes in what kind of formats we can download a release
@@ -49,12 +54,12 @@ const (
4954
)
5055

5156
// DownloadRelease downloads the given release as ZIP file in the requested format and stores it at the given path
52-
func (client Client) DownloadRelease(release Release, downloadFormat DownloadFormat, downloadPath string) error {
57+
func (client Client) DownloadRelease(catalogItem CatalogItem, downloadFormat DownloadFormat, downloadPath string) error {
5358
if !client.IsLoggedIn() {
5459
return ErrorClientNotLoggedIn
5560
}
5661

57-
request, err := http.NewRequest("GET", fmt.Sprintf(endpointReleaseDownload, release.ID, downloadFormat), http.NoBody)
62+
request, err := http.NewRequest("GET", fmt.Sprintf(endpointReleaseDownload, catalogItem.ID, downloadFormat), http.NoBody)
5863
if err != nil {
5964
return err
6065
}

monstercat/release_list.go

Lines changed: 0 additions & 76 deletions
This file was deleted.

0 commit comments

Comments
 (0)