parent
d77d28b101
commit
7704281b49
28
README.md
28
README.md
@ -22,6 +22,9 @@ The lib is under MIT but be sure you are familiar with [Discogs API Terms of Use
|
||||
* Folder
|
||||
* Collection Items by Folder
|
||||
* Collection Items by Release
|
||||
* [Marketplace](#marketplace)
|
||||
* Price Suggestions
|
||||
* Release Statistics
|
||||
|
||||
Install
|
||||
--------
|
||||
@ -84,7 +87,6 @@ type SearchRequest struct {
|
||||
}
|
||||
```
|
||||
|
||||
Example
|
||||
```go
|
||||
request := discogs.SearchRequest{Artist: "reggaenauts", ReleaseTitle: "river rock", Page: 0, PerPage: 1}
|
||||
search, _ := client.Search(request)
|
||||
@ -99,22 +101,38 @@ Example
|
||||
Query a users [collection](https://www.discogs.com/developers#page:user-collection).
|
||||
|
||||
##### Collection Folders
|
||||
Example
|
||||
```go
|
||||
collection, err := client.CollectionFolders("my_user")
|
||||
```
|
||||
##### Folder
|
||||
Example
|
||||
```go
|
||||
folder, err := client.Folder("my_user", 0)
|
||||
```
|
||||
##### Collection Items by Folder
|
||||
Example
|
||||
```go
|
||||
items, err := client.CollectionItemsByFolder("my_user", 0, &Pagination{Sort: "artist", SortOrder: "desc", PerPage: 2})
|
||||
```
|
||||
##### Collection Items by Release
|
||||
Example
|
||||
```go
|
||||
items, err := client.CollectionItemsByRelease("my_user", 12934893)
|
||||
```
|
||||
|
||||
#### Marketplace
|
||||
|
||||
Query a user's [marketplace](https://www.discogs.com/developers/#page:marketplace)
|
||||
|
||||
##### Price Suggestions
|
||||
|
||||
Retrieve price suggestions for the provided Release ID
|
||||
|
||||
```go
|
||||
suggestions, err := client.PriceSuggestions(12345)
|
||||
```
|
||||
|
||||
##### Release Statistics
|
||||
|
||||
Retrieve marketplace statistics for the provided Release ID
|
||||
|
||||
```go
|
||||
stats, err := client.ReleaseStatisctics(12345)
|
||||
```
|
@ -28,6 +28,7 @@ type Options struct {
|
||||
type Discogs interface {
|
||||
CollectionService
|
||||
DatabaseService
|
||||
MarketPlaceService
|
||||
SearchService
|
||||
}
|
||||
|
||||
@ -35,6 +36,7 @@ type discogs struct {
|
||||
CollectionService
|
||||
DatabaseService
|
||||
SearchService
|
||||
MarketPlaceService
|
||||
}
|
||||
|
||||
var header *http.Header
|
||||
@ -67,6 +69,7 @@ func New(o *Options) (Discogs, error) {
|
||||
newCollectionService(o.URL + "/users"),
|
||||
newDatabaseService(o.URL, cur),
|
||||
newSearchService(o.URL + "/database/search"),
|
||||
newMarketPlaceService(o.URL+"/marketplace", cur),
|
||||
}, nil
|
||||
}
|
||||
|
||||
|
72
marketplace.go
Normal file
72
marketplace.go
Normal file
@ -0,0 +1,72 @@
|
||||
package discogs
|
||||
|
||||
import (
|
||||
"net/url"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
const (
|
||||
priceSuggestionsURI = "/price_suggestions/"
|
||||
releaseStatsURI = "/stats/"
|
||||
)
|
||||
|
||||
type marketPlaceService struct {
|
||||
url string
|
||||
currency string
|
||||
}
|
||||
|
||||
type MarketPlaceService interface {
|
||||
// The best price suggestions according to grading
|
||||
// Authentication is required.
|
||||
PriceSuggestions(releaseID int) (*PriceListing, error)
|
||||
// Short summary of marketplace listings
|
||||
// Authentication is optional.
|
||||
ReleaseStatistics(releaseID int) (*Stats, error)
|
||||
}
|
||||
|
||||
func newMarketPlaceService(url string, currency string) MarketPlaceService {
|
||||
return &marketPlaceService{
|
||||
url: url,
|
||||
currency: currency,
|
||||
}
|
||||
}
|
||||
|
||||
// Listing is a marketplace listing with the user's currency and a price value
|
||||
type Listing struct {
|
||||
Currency string `json:"currency"`
|
||||
Value float64 `json:"value"`
|
||||
}
|
||||
|
||||
// PriceListings are Listings per grading quality
|
||||
type PriceListing struct {
|
||||
VeryGood *Listing `json:"Very Good (VG),omitempty"`
|
||||
GoodPlus *Listing `json:"Good Plus (G+),omitempty"`
|
||||
NearMint *Listing `json:"Near Mint (NM or M-)"`
|
||||
Good *Listing `json:"Good (G),omitempty"`
|
||||
VeryGoodPlus *Listing `json:"Very Good Plus (VG+),omitempty"`
|
||||
Mint *Listing `json:"Mint (M),omitempty"`
|
||||
Fair *Listing `json:"Fair (F),omitempty"`
|
||||
Poor *Listing `json:"Poor (P),omitempty"`
|
||||
}
|
||||
|
||||
// Stats returns the marketplace stats summary for a release containing
|
||||
type Stats struct {
|
||||
LowestPrice *Listing `json:"lowest_price"`
|
||||
ForSale int `json:"num_for_sale"`
|
||||
Blocked bool `json:"blocked_from_sale"`
|
||||
}
|
||||
|
||||
func (s *marketPlaceService) ReleaseStatistics(releaseID int) (*Stats, error) {
|
||||
params := url.Values{}
|
||||
params.Set("curr_abbr", s.currency)
|
||||
|
||||
var stats *Stats
|
||||
err := request(s.url+releaseStatsURI+strconv.Itoa(releaseID), params, &stats)
|
||||
return stats, err
|
||||
}
|
||||
|
||||
func (s *marketPlaceService) PriceSuggestions(releaseID int) (*PriceListing, error) {
|
||||
var listings *PriceListing
|
||||
err := request(s.url+priceSuggestionsURI+strconv.Itoa(releaseID), nil, &listings)
|
||||
return listings, err
|
||||
}
|
76
marketplace_test.go
Normal file
76
marketplace_test.go
Normal file
@ -0,0 +1,76 @@
|
||||
package discogs
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"io"
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"strconv"
|
||||
"testing"
|
||||
)
|
||||
|
||||
const testReleaseID = 9893847
|
||||
|
||||
func MarketplaceServer(w http.ResponseWriter, r *http.Request) {
|
||||
if r.Method != "GET" {
|
||||
w.WriteHeader(http.StatusMethodNotAllowed)
|
||||
return
|
||||
}
|
||||
|
||||
switch r.URL.Path {
|
||||
case "/marketplace" + priceSuggestionsURI + strconv.Itoa(testReleaseID):
|
||||
w.WriteHeader(http.StatusOK)
|
||||
if _, err := io.WriteString(w, priceSuggestionJson); err != nil {
|
||||
w.WriteHeader(http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
|
||||
case "/marketplace" + releaseStatsURI + strconv.Itoa(testReleaseID):
|
||||
w.WriteHeader(http.StatusOK)
|
||||
if _, err := io.WriteString(w, releaseStatsJson); err != nil {
|
||||
w.WriteHeader(http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
|
||||
default:
|
||||
w.WriteHeader(http.StatusMethodNotAllowed)
|
||||
}
|
||||
}
|
||||
|
||||
func TestMarketplacePriceSuggestions(t *testing.T) {
|
||||
ts := httptest.NewServer(http.HandlerFunc(MarketplaceServer))
|
||||
defer ts.Close()
|
||||
|
||||
d := initDiscogsClient(t, &Options{URL: ts.URL})
|
||||
|
||||
suggestion, err := d.PriceSuggestions(testReleaseID)
|
||||
if err != nil {
|
||||
t.Fatalf("failed to get price suggestion: %s", err)
|
||||
}
|
||||
|
||||
json, err := json.Marshal(suggestion)
|
||||
if err != nil {
|
||||
t.Fatalf("failed to marshal folder: %s", err)
|
||||
}
|
||||
|
||||
compareJson(t, string(json), priceSuggestionJson)
|
||||
}
|
||||
|
||||
func TestMarketplaceReleaseStatistics(t *testing.T) {
|
||||
ts := httptest.NewServer(http.HandlerFunc(MarketplaceServer))
|
||||
defer ts.Close()
|
||||
|
||||
d := initDiscogsClient(t, &Options{URL: ts.URL})
|
||||
|
||||
stats, err := d.ReleaseStatistics(testReleaseID)
|
||||
if err != nil {
|
||||
t.Fatalf("failed to get price suggestion: %s", err)
|
||||
}
|
||||
|
||||
json, err := json.Marshal(stats)
|
||||
if err != nil {
|
||||
t.Fatalf("failed to marshal folder: %s", err)
|
||||
}
|
||||
|
||||
compareJson(t, string(json), releaseStatsJson)
|
||||
}
|
@ -15,3 +15,7 @@ const collectionJson = `{"folders": [{"id": 0, "name": "All", "count": 95, "reso
|
||||
const collectionItemsByFolderJson = `{"pagination": {"page": 1, "pages": 48, "per_page": 2, "items": 95, "urls": {"last": "https://api.discogs.com/users/test_user/collection/folders/0/releases?sort=artist&sort_order=desc&per_page=2&page=48", "next": "https://api.discogs.com/users/test_user/collection/folders/0/releases?sort=artist&sort_order=desc&per_page=2&page=2"}}, "releases": [{"id": 12934893, "instance_id": 431009995, "date_added": "2020-01-19T14:19:11-08:00", "rating": 0, "basic_information": {"id": 12934893, "master_id": 0, "master_url": null, "resource_url": "https://api.discogs.com/releases/12934893", "thumb": "", "cover_image": "", "title": "Zonk", "year": 2018, "formats": [{"name": "Vinyl", "qty": "1", "text": "Purple", "descriptions": ["LP", "Album"]}], "labels": [{"name": "Permanent Record", "catno": "PR014", "entity_type": "1", "entity_type_name": "Label", "id": 833694, "resource_url": "https://api.discogs.com/labels/833694"}], "artists": [{"name": "Zoo Lake", "anv": "", "join": "", "role": "", "tracks": "", "id": 6868154, "resource_url": "https://api.discogs.com/artists/6868154"}], "genres": ["Rock"], "styles": ["Post-Punk", "Shoegaze", "Psychedelic Rock", "Noise", "Garage Rock", "Lo-Fi"]}}, {"id": 4825435, "instance_id": 146424864, "date_added": "2015-11-08T14:42:02-08:00", "rating": 0, "basic_information": {"id": 4825435, "master_id": 17200, "master_url": "https://api.discogs.com/masters/17200", "resource_url": "https://api.discogs.com/releases/4825435", "thumb": "", "cover_image": "", "title": "You And Me Both", "year": 1983, "formats": [{"name": "Vinyl", "qty": "1", "descriptions": ["LP", "Album"]}], "labels": [{"name": "Mute", "catno": "STUMM 12", "entity_type": "1", "entity_type_name": "Label", "id": 26391, "resource_url": "https://api.discogs.com/labels/26391"}, {"name": "CBS", "catno": "DNW 2885", "entity_type": "1", "entity_type_name": "Label", "id": 3072, "resource_url": "https://api.discogs.com/labels/3072"}], "artists": [{"name": "Yazoo", "anv": "", "join": "", "role": "", "tracks": "", "id": 2713, "resource_url": "https://api.discogs.com/artists/2713"}], "genres": ["Electronic"], "styles": ["Synth-pop"]}}]}`
|
||||
|
||||
const collectionItemsByRelease = `{"pagination": {"page": 1, "pages": 1, "per_page": 50, "items": 1, "urls": {}}, "releases": [{"id": 12934893, "instance_id": 431009995, "date_added": "2020-01-19T14:19:11-08:00", "rating": 0, "basic_information": {"id": 12934893, "master_id": 0, "master_url": null, "resource_url": "https://api.discogs.com/releases/12934893", "thumb": "", "cover_image": "", "title": "Zonk", "year": 2018, "formats": [{"name": "Vinyl", "qty": "1", "text": "Purple", "descriptions": ["LP", "Album"]}], "labels": [{"name": "Permanent Record", "catno": "PR014", "entity_type": "1", "entity_type_name": "Label", "id": 833694, "resource_url": "https://api.discogs.com/labels/833694"}], "artists": [{"name": "Zoo Lake", "anv": "", "join": "", "role": "", "tracks": "", "id": 6868154, "resource_url": "https://api.discogs.com/artists/6868154"}], "genres": ["Rock"], "styles": ["Post-Punk", "Shoegaze", "Psychedelic Rock", "Noise", "Garage Rock", "Lo-Fi"]}}]}`
|
||||
|
||||
const priceSuggestionJson = `{"Mint (M)": {"currency": "EUR", "value": 16.625}, "Near Mint (NM or M-)": {"currency": "EUR", "value": 14.875000000000002}, "Very Good Plus (VG+)": {"currency": "EUR", "value": 11.375000000000002}, "Very Good (VG)": {"currency": "EUR", "value": 7.875000000000001}, "Good Plus (G+)": {"currency": "EUR", "value": 4.375}, "Good (G)": {"currency": "EUR", "value": 2.625}, "Fair (F)": {"currency": "EUR", "value": 1.7500000000000002}, "Poor (P)": {"currency": "EUR", "value": 0.8750000000000001}}`
|
||||
|
||||
const releaseStatsJson = `{"num_for_sale": 4, "lowest_price": {"value": 18.07, "currency": "USD"}, "blocked_from_sale": false}`
|
||||
|
Reference in New Issue
Block a user