Merge pull request #3 from irlndts/DISCOGS-2
Discogs-2 Search Implementation
This commit is contained in:
commit
4e7c6c065a
63
README.md
63
README.md
@ -1,20 +1,24 @@
|
||||
# REST API 2.0 Discogs.com client
|
||||
|
||||
go-discogs is a Go client library for the [Discogs API](https://www.discogs.com/developers/). Check the usage section or try the examples to see how to access the Discogs API.
|
||||
go-discogs is a Go client library for the [Discogs API](https://www.discogs.com/developers/). Check the usage section to see how to access the Discogs API.
|
||||
|
||||
### Changelog
|
||||
```
|
||||
14.02.2017
|
||||
- search is implemented
|
||||
- minor improvements
|
||||
```
|
||||
|
||||
### Feauteres
|
||||
* Database
|
||||
* Releases
|
||||
* [Releases](#releases)
|
||||
* Master Releases
|
||||
* Release Versions
|
||||
* Artists
|
||||
* Artist Releases
|
||||
* Label
|
||||
* All Label Releases
|
||||
|
||||
#### ToDo
|
||||
- Search
|
||||
|
||||
* [Search](#search)
|
||||
|
||||
Install
|
||||
--------
|
||||
@ -28,7 +32,11 @@ First of all import library and init client variable. According to discogs api d
|
||||
import "github.com/irlndts/go-discogs"
|
||||
```
|
||||
```go
|
||||
client := discogs.NewClient().UserAgent("TestDiscogsClient/0.0.1 +example.com")
|
||||
client := discogs.NewClient("TestDiscogsClient/0.0.1 +example.com", "")
|
||||
```
|
||||
Some requests require authentication (as any user). According to [Discogs](https://www.discogs.com/developers/#page:authentication,header:authentication-discogs-auth-flow), to send requests with Discogs Auth, you have two options: sending your credentials in the query string with key and secret parameters or a token parameter. Key-secret doesn't implemented yet, but token is yes.
|
||||
```go
|
||||
client := discogs.NewClient("TestDiscogsClient/0.0.1 +example.com", "sometoken")
|
||||
```
|
||||
|
||||
#### Releases
|
||||
@ -55,5 +63,46 @@ client := discogs.NewClient().UserAgent("TestDiscogsClient/0.0.1 +example.com")
|
||||
*/
|
||||
```
|
||||
|
||||
#### Search
|
||||
Issue a search query to discogs database. This endpoint accepts pagination parameters
|
||||
Authentication (as any user) is required.
|
||||
|
||||
Use `SearchRequest` struc to create a request
|
||||
```go
|
||||
type SearchRequest struct {
|
||||
Q string // search query (optional)
|
||||
Type string // one of release, master, artist, label (optional)
|
||||
Title string // search by combined “Artist Name - Release Title” title field (optional)
|
||||
Release_title string // search release titles (optional)
|
||||
Credit string // search release credits (optional)
|
||||
Artist string // search artist names (optional)
|
||||
Anv string // search artist ANV (optional)
|
||||
Label string // search label names (optional)
|
||||
Genre string // search genres (optional)
|
||||
Style string // search styles (optional)
|
||||
Country string // search release country (optional)
|
||||
Year string // search release year (optional)
|
||||
Format string // search formats (optional)
|
||||
Catno string // search catalog number (optional)
|
||||
Barcode string // search barcodes (optional)
|
||||
Track string // search track titles (optional)
|
||||
Submitter string // search submitter username (optional)
|
||||
Contributer string // search contributor usernames (optional)
|
||||
|
||||
Page int // optional
|
||||
Per_page int // optional
|
||||
}
|
||||
```
|
||||
|
||||
Example
|
||||
```go
|
||||
request:= &discogs.SearchRequest{Artist: "reggaenauts", Release_title: "river rock", Page: 0, Per_page: 1}
|
||||
search, _, err := client.Search(request)
|
||||
|
||||
for _, r := range search.Results {
|
||||
fmt.Println(r.Title)
|
||||
}
|
||||
```
|
||||
|
||||
etc.
|
||||
More examples - soon
|
||||
|
@ -8,7 +8,7 @@ import (
|
||||
func TestArtistService_Artist(t *testing.T) {
|
||||
expectedId := 1000
|
||||
|
||||
d := NewClient().UserAgent("UnitTestClient/0.0.1 +https://github.com/irlndts/go-discogs")
|
||||
d := NewClient(testUserAgent, testToken)
|
||||
artist, _, err := d.Artist.Artist(&ArtistParams{Artist_id: "1000"})
|
||||
|
||||
check(t, err)
|
||||
@ -18,7 +18,7 @@ func TestArtistService_Artist(t *testing.T) {
|
||||
func TestArtistService_Releases(t *testing.T) {
|
||||
expectedArtist := "Dave Clarke"
|
||||
|
||||
d := NewClient().UserAgent("UnitTestClient/0.0.1 +https://github.com/irlndts/go-discogs")
|
||||
d := NewClient(testUserAgent, testToken)
|
||||
releases, _, err := d.Artist.Releases(&ArtistParams{Artist_id: "1000", Sort: "year", Sort_order: "desc"})
|
||||
|
||||
check(t, err)
|
||||
|
23
discogs.go
23
discogs.go
@ -1,13 +1,13 @@
|
||||
package discogs
|
||||
|
||||
import (
|
||||
"github.com/irlndts/go-apirequest"
|
||||
"net/http"
|
||||
|
||||
"github.com/irlndts/go-apirequest"
|
||||
)
|
||||
|
||||
const (
|
||||
discogsAPI = "https://api.discogs.com/"
|
||||
useragent = "Test UserAgent"
|
||||
)
|
||||
|
||||
// Client is a Discogs client for making Discogs API requests.
|
||||
@ -17,23 +17,32 @@ type Client struct {
|
||||
Master *MasterService
|
||||
Artist *ArtistService
|
||||
Label *LabelService
|
||||
Search *SearchService
|
||||
}
|
||||
|
||||
// NewClient returns a new Client.
|
||||
func NewClient() *Client {
|
||||
base := apirequest.New().Client(&http.Client{}).Base(discogsAPI).Add("User-Agent", useragent)
|
||||
func NewClient(useragent, token string) *Client {
|
||||
base := apirequest.New().Client(&http.Client{}).Base(discogsAPI).Add("User-Agent", useragent).Add("Authorization", "Discogs token="+token)
|
||||
|
||||
return &Client{
|
||||
api: base,
|
||||
Release: newReleaseService(base.New()),
|
||||
Master: newMasterService(base.New()),
|
||||
Artist: newArtistService(base.New()),
|
||||
Label: newLabelService(base.New()),
|
||||
Master: newMasterService(base.New()),
|
||||
Release: newReleaseService(base.New()),
|
||||
Search: newSearchService(base.New()),
|
||||
}
|
||||
}
|
||||
|
||||
// discogs require specified user agent
|
||||
// UserAgent sets specified user agent
|
||||
// Discogs required it
|
||||
func (c *Client) UserAgent(useragent string) *Client {
|
||||
c.api.Set("User-Agent", useragent)
|
||||
return c
|
||||
}
|
||||
|
||||
// Token sets tokens, it's required for some queries like search
|
||||
func (c *Client) Token(token string) *Client {
|
||||
c.api.Set("Authorization", "Discogs token="+token)
|
||||
return c
|
||||
}
|
||||
|
@ -4,6 +4,11 @@ import (
|
||||
"testing"
|
||||
)
|
||||
|
||||
const (
|
||||
testUserAgent = "UnitTestClient/0.0.2 +https://github.com/irlndts/go-discogs"
|
||||
testToken = ""
|
||||
)
|
||||
|
||||
func check(t *testing.T, e error) {
|
||||
if e != nil {
|
||||
t.Error(e)
|
||||
|
@ -2,24 +2,22 @@ package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/irlndts/go-discogs"
|
||||
)
|
||||
|
||||
func main() {
|
||||
d := discogs.NewClient().UserAgent("TestDiscogsClient/0.0.1 +http://irlndts.moscow")
|
||||
d := discogs.NewClient("TestDiscogsClient/0.0.1 +http://irlndts.moscow", "")
|
||||
|
||||
/*
|
||||
params := &discogs.ReleaseParams{Release_id: "8138518"}
|
||||
release, _, err := d.Release.Release(params)
|
||||
*/
|
||||
params := &discogs.LabelParams{Label_id: "890477", Page: 2, Per_page: 3}
|
||||
label, _, err := d.Label.Releases(params)
|
||||
request := &discogs.SearchRequest{Q: "The Reggaenauts - River Rock / Thursday Kick-off", Page: 0, Per_page: 1}
|
||||
search, _, err := d.Search.Search(request)
|
||||
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
} else {
|
||||
for _, release := range label.Releases {
|
||||
fmt.Println(release.Title)
|
||||
return
|
||||
}
|
||||
|
||||
for _, r := range search.Results {
|
||||
fmt.Println(r.Id, r.Title)
|
||||
}
|
||||
}
|
||||
|
@ -1,8 +1,9 @@
|
||||
package discogs
|
||||
|
||||
import (
|
||||
"github.com/irlndts/go-apirequest"
|
||||
"net/http"
|
||||
|
||||
"github.com/irlndts/go-apirequest"
|
||||
)
|
||||
|
||||
type LabelService struct {
|
||||
@ -12,7 +13,7 @@ type LabelService struct {
|
||||
type LabelParams struct {
|
||||
Label_id string
|
||||
Page int
|
||||
Per_page int
|
||||
Per_Page int
|
||||
}
|
||||
|
||||
type Label struct {
|
||||
|
@ -8,7 +8,7 @@ import (
|
||||
func TestLabelService_Label(t *testing.T) {
|
||||
expectedId := 1000
|
||||
|
||||
d := NewClient().UserAgent("UnitTestClient/0.0.1 +https://github.com/irlndts/go-discogs")
|
||||
d := NewClient(testUserAgent, testToken)
|
||||
label, _, err := d.Label.Label(&LabelParams{Label_id: "1000"})
|
||||
|
||||
check(t, err)
|
||||
@ -18,7 +18,7 @@ func TestLabelService_Label(t *testing.T) {
|
||||
func TestLabelService_Releases(t *testing.T) {
|
||||
expectedId := "Cha Cha Twist"
|
||||
|
||||
d := NewClient().UserAgent("UnitTestClient/0.0.1 +https://github.com/irlndts/go-discogs")
|
||||
d := NewClient(testUserAgent, testToken)
|
||||
label, _, err := d.Label.Releases(&LabelParams{Label_id: "1000"})
|
||||
|
||||
check(t, err)
|
||||
|
@ -8,7 +8,7 @@ import (
|
||||
func TestMasterService_Master(t *testing.T) {
|
||||
expectedTitle := "Elephant Riddim"
|
||||
|
||||
d := NewClient().UserAgent("UnitTestClient/0.0.1 +https://github.com/irlndts/go-discogs")
|
||||
d := NewClient(testUserAgent, testToken)
|
||||
master, _, err := d.Master.Master(&MasterParams{Master_id: "960657"})
|
||||
|
||||
check(t, err)
|
||||
@ -18,7 +18,7 @@ func TestMasterService_Master(t *testing.T) {
|
||||
func TestMasterService_Versions(t *testing.T) {
|
||||
expectedTitle := "Stardiver"
|
||||
|
||||
d := NewClient().UserAgent("UnitTestClient/0.0.1 +https://github.com/irlndts/go-discogs")
|
||||
d := NewClient(testUserAgent, testToken)
|
||||
versions, _, err := d.Master.Versions(&MasterVersionParams{Master_id: "1000", Page: 1, Per_page: 1})
|
||||
|
||||
check(t, err)
|
||||
|
@ -8,7 +8,7 @@ import (
|
||||
func TestReleaseService_Release(t *testing.T) {
|
||||
expectedTitle := "Elephant Riddim"
|
||||
|
||||
d := NewClient().UserAgent("UnitTestClient/0.0.1 +https://github.com/irlndts/go-discogs")
|
||||
d := NewClient(testUserAgent, testToken)
|
||||
release, _, err := d.Release.Release(&ReleaseParams{Release_id: "8138518"})
|
||||
|
||||
check(t, err)
|
||||
|
71
search.go
Normal file
71
search.go
Normal file
@ -0,0 +1,71 @@
|
||||
package discogs
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
|
||||
"github.com/irlndts/go-apirequest"
|
||||
)
|
||||
|
||||
type SearchService struct {
|
||||
api *apirequest.API
|
||||
}
|
||||
|
||||
type SearchRequest struct {
|
||||
Q string // search query (optional)
|
||||
Type string // one of release, master, artist, label (optional)
|
||||
Title string // search by combined “Artist Name - Release Title” title field (optional)
|
||||
Release_title string // search release titles (optional)
|
||||
Credit string // search release credits (optional)
|
||||
Artist string // search artist names (optional)
|
||||
Anv string // search artist ANV (optional)
|
||||
Label string // search label names (optional)
|
||||
Genre string // search genres (optional)
|
||||
Style string // search styles (optional)
|
||||
Country string // search release country (optional)
|
||||
Year string // search release year (optional)
|
||||
Format string // search formats (optional)
|
||||
Catno string // search catalog number (optional)
|
||||
Barcode string // search barcodes (optional)
|
||||
Track string // search track titles (optional)
|
||||
Submitter string // search submitter username (optional)
|
||||
Contributer string // search contributor usernames (optional)
|
||||
|
||||
Page int // optional
|
||||
Per_page int // optional
|
||||
}
|
||||
|
||||
type Search struct {
|
||||
Pagination Page `json:"pagination"`
|
||||
Results []Result `json:"results"`
|
||||
}
|
||||
|
||||
type Result struct {
|
||||
Style []string `json:"style"`
|
||||
Thumb string `json:"thumb"`
|
||||
Title string `json:"title"`
|
||||
Country string `json:"country"`
|
||||
Format []string `json:"format"`
|
||||
Uri string `json:"uri"`
|
||||
Community Community `json:"community"`
|
||||
Label []string `json:"label"`
|
||||
Catno string `json:"catno"`
|
||||
Year string `json:"year"`
|
||||
Genre []string `json:"genre"`
|
||||
Resource_url string `json:"resource_url"`
|
||||
Type string `json:"type"`
|
||||
Id int `json:"id"`
|
||||
}
|
||||
|
||||
func newSearchService(api *apirequest.API) *SearchService {
|
||||
return &SearchService{
|
||||
api: api.Path("database/search"),
|
||||
}
|
||||
}
|
||||
|
||||
func (self *SearchService) Search(params *SearchRequest) (*Search, *http.Response, error) {
|
||||
search := new(Search)
|
||||
apiError := new(APIError)
|
||||
|
||||
resp, err := self.api.New().QueryStruct(params).Receive(search, apiError)
|
||||
return search, resp, relevantError(err, *apiError)
|
||||
}
|
Reference in New Issue
Block a user