DISCOGS-2 Search implementation

This commit is contained in:
irlndts 2017-02-14 22:01:50 +03:00
parent 20710e3f3e
commit d5292c30c9
10 changed files with 135 additions and 51 deletions

View File

@ -1,20 +1,24 @@
# REST API 2.0 Discogs.com client # 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 ### Feauteres
* Database * Database
* Releases * [Releases](#releases)
* Master Releases * Master Releases
* Release Versions * Release Versions
* Artists * Artists
* Artist Releases * Artist Releases
* Label * Label
* All Label Releases * All Label Releases
* [Search](#search)
#### ToDo
- Search
Install 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" import "github.com/irlndts/go-discogs"
``` ```
```go ```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 #### 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. etc.
More examples - soon More examples - soon

View File

@ -8,7 +8,7 @@ import (
func TestArtistService_Artist(t *testing.T) { func TestArtistService_Artist(t *testing.T) {
expectedId := 1000 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"}) artist, _, err := d.Artist.Artist(&ArtistParams{Artist_id: "1000"})
check(t, err) check(t, err)
@ -18,7 +18,7 @@ func TestArtistService_Artist(t *testing.T) {
func TestArtistService_Releases(t *testing.T) { func TestArtistService_Releases(t *testing.T) {
expectedArtist := "Dave Clarke" 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"}) releases, _, err := d.Artist.Releases(&ArtistParams{Artist_id: "1000", Sort: "year", Sort_order: "desc"})
check(t, err) check(t, err)

View File

@ -7,10 +7,7 @@ import (
) )
const ( const (
libVeresion = "0.1" discogsAPI = "https://api.discogs.com/"
discogsAPI = "https://api.discogs.com/"
useragent = "irlndts/go-discogs/0.1"
token = "oQTQKAprakIQfWOkAxTdYyDpgUqahHtdbHTuYkIy"
) )
// Client is a Discogs client for making Discogs API requests. // Client is a Discogs client for making Discogs API requests.
@ -24,8 +21,8 @@ type Client struct {
} }
// NewClient returns a new Client. // NewClient returns a new Client.
func NewClient() *Client { func NewClient(useragent, token string) *Client {
base := apirequest.New().Client(&http.Client{}).Base(discogsAPI).Add("User-Agent", useragent) //.Add("Authorization", "Discogs token="+token) base := apirequest.New().Client(&http.Client{}).Base(discogsAPI).Add("User-Agent", useragent).Add("Authorization", "Discogs token="+token)
return &Client{ return &Client{
api: base, api: base,
@ -33,7 +30,7 @@ func NewClient() *Client {
Label: newLabelService(base.New()), Label: newLabelService(base.New()),
Master: newMasterService(base.New()), Master: newMasterService(base.New()),
Release: newReleaseService(base.New()), Release: newReleaseService(base.New()),
Search: newSearchService(base), Search: newSearchService(base.New()),
} }
} }

View File

@ -4,6 +4,11 @@ import (
"testing" "testing"
) )
const (
testUserAgent = "UnitTestClient/0.0.2 +https://github.com/irlndts/go-discogs"
testToken = ""
)
func check(t *testing.T, e error) { func check(t *testing.T, e error) {
if e != nil { if e != nil {
t.Error(e) t.Error(e)

View File

@ -7,10 +7,10 @@ import (
) )
func main() { func main() {
d := discogs.NewClient().UserAgent("TestDiscogsClient/0.0.1 +http://irlndts.moscow").Token("") d := discogs.NewClient("TestDiscogsClient/0.0.1 +http://irlndts.moscow", "")
params := &discogs.SearchRequest{Release_title: "nevermind", Artist: "nirvana"} request := &discogs.SearchRequest{Q: "The Reggaenauts - River Rock / Thursday Kick-off", Page: 0, Per_page: 1}
search, _, err := d.Search.Search(params) search, _, err := d.Search.Search(request)
if err != nil { if err != nil {
fmt.Println(err) fmt.Println(err)
@ -18,6 +18,6 @@ func main() {
} }
for _, r := range search.Results { for _, r := range search.Results {
fmt.Println(r) fmt.Println(r.Id, r.Title)
} }
} }

View File

@ -11,23 +11,23 @@ type LabelService struct {
} }
type LabelParams struct { type LabelParams struct {
LabelID string Label_id string
Page int Page int
PerPage int Per_Page int
} }
type Label struct { type Label struct {
Profile string `json:"profile"` Profile string `json:"profile"`
ReleasesUrl string `json:"releases_url"` Releases_url string `json:"releases_url"`
Name string `json:"name"` Name string `json:"name"`
ContactInfo string `json:"contact_info"` Contact_info string `json:"contact_info"`
Uri string `json:"uri"` Uri string `json:"uri"`
Sublabels []Sublable `json:"sublabels"` Sublabels []Sublable `json:"sublabels"`
Urls []string `json:"urls"` Urls []string `json:"urls"`
Images []Image `json:"images"` Images []Image `json:"images"`
ResourceUrl string `json:"resource_url"` Resource_url string `json:"resource_url"`
Id int `json:"id"` Id int `json:"id"`
DataQuality string `json:"data_quality"` Data_quality string `json:"data_quality"`
} }
type LabelReleases struct { type LabelReleases struct {
@ -45,7 +45,7 @@ func (self *LabelService) Label(params *LabelParams) (*Label, *http.Response, er
label := new(Label) label := new(Label)
apiError := new(APIError) apiError := new(APIError)
resp, err := self.api.New().Get(params.LabelID).Receive(label, apiError) resp, err := self.api.New().Get(params.Label_id).Receive(label, apiError)
return label, resp, relevantError(err, *apiError) return label, resp, relevantError(err, *apiError)
} }
@ -53,6 +53,6 @@ func (self *LabelService) Releases(params *LabelParams) (*LabelReleases, *http.R
releases := new(LabelReleases) releases := new(LabelReleases)
apiError := new(APIError) apiError := new(APIError)
resp, err := self.api.New().Get(params.LabelID+"/releases").QueryStruct(params).Receive(releases, apiError) resp, err := self.api.New().Get(params.Label_id+"/releases").QueryStruct(params).Receive(releases, apiError)
return releases, resp, relevantError(err, *apiError) return releases, resp, relevantError(err, *apiError)
} }

View File

@ -8,7 +8,7 @@ import (
func TestLabelService_Label(t *testing.T) { func TestLabelService_Label(t *testing.T) {
expectedId := 1000 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"}) label, _, err := d.Label.Label(&LabelParams{Label_id: "1000"})
check(t, err) check(t, err)
@ -18,7 +18,7 @@ func TestLabelService_Label(t *testing.T) {
func TestLabelService_Releases(t *testing.T) { func TestLabelService_Releases(t *testing.T) {
expectedId := "Cha Cha Twist" 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"}) label, _, err := d.Label.Releases(&LabelParams{Label_id: "1000"})
check(t, err) check(t, err)

View File

@ -8,7 +8,7 @@ import (
func TestMasterService_Master(t *testing.T) { func TestMasterService_Master(t *testing.T) {
expectedTitle := "Elephant Riddim" 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"}) master, _, err := d.Master.Master(&MasterParams{Master_id: "960657"})
check(t, err) check(t, err)
@ -18,7 +18,7 @@ func TestMasterService_Master(t *testing.T) {
func TestMasterService_Versions(t *testing.T) { func TestMasterService_Versions(t *testing.T) {
expectedTitle := "Stardiver" 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}) versions, _, err := d.Master.Versions(&MasterVersionParams{Master_id: "1000", Page: 1, Per_page: 1})
check(t, err) check(t, err)

View File

@ -8,7 +8,7 @@ import (
func TestReleaseService_Release(t *testing.T) { func TestReleaseService_Release(t *testing.T) {
expectedTitle := "Elephant Riddim" 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"}) release, _, err := d.Release.Release(&ReleaseParams{Release_id: "8138518"})
check(t, err) check(t, err)

View File

@ -6,21 +6,54 @@ import (
"github.com/irlndts/go-apirequest" "github.com/irlndts/go-apirequest"
) )
type SearchRequest struct { type SearchService struct {
Release_title string api *apirequest.API
Artist string }
Page int type SearchRequest struct {
PerPage int 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 { type Search struct {
Pagination Page `json:"pagination"` Pagination Page `json:"pagination"`
Results []interface{} `json:"results"` Results []Result `json:"results"`
} }
type SearchService struct { type Result struct {
api *apirequest.API 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 { func newSearchService(api *apirequest.API) *SearchService {
@ -33,6 +66,6 @@ func (self *SearchService) Search(params *SearchRequest) (*Search, *http.Respons
search := new(Search) search := new(Search)
apiError := new(APIError) apiError := new(APIError)
resp, err := self.api.QueryStruct(params).Receive(search, apiError) resp, err := self.api.New().QueryStruct(params).Receive(search, apiError)
return search, resp, relevantError(err, *apiError) return search, resp, relevantError(err, *apiError)
} }