DISCOGS-2 Search implementation
This commit is contained in:
parent
20710e3f3e
commit
d5292c30c9
63
README.md
63
README.md
@ -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
|
||||||
|
@ -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)
|
||||||
|
11
discogs.go
11
discogs.go
@ -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()),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
32
labels.go
32
labels.go
@ -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)
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
@ -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)
|
||||||
|
@ -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)
|
||||||
|
53
search.go
53
search.go
@ -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)
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user