js_ts_discogs_api_v2_library
Version:
TS / JS Library for Discogs API v2 Access.
413 lines • 15.9 kB
JavaScript
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const dotenv_1 = __importDefault(require("dotenv"));
const node_fetch_1 = __importDefault(require("node-fetch"));
const debug_1 = require("./utils/debug");
dotenv_1.default.config();
(0, debug_1.info)('JS TS Discogs API v2 Library Version 0.0.3');
(0, debug_1.info)('© Dex Vinyl 2022');
(0, debug_1.info)('Released under MIT License');
class Client {
constructor({ host, port, userAgent, token, key, secret, discogsUserName, }) {
this.protocol = 'https';
this.defaults = {
host: 'api.discogs.com',
port: 443,
userAgent: 'JSTSDiscogsAPIV2Library',
apiVersion: 'v2',
outputFormat: 'discogs',
requestLimit: 25,
requestLimitAuth: 60,
requestLimitInterval: 60000,
discogsUserName: ' ',
perPage: '50',
};
this.discogsUserName = process.env.DISCOGS_USER_NAME || this.defaults.discogsUserName;
this.host = host || this.defaults.host;
this.port = port || this.defaults.port;
this.userAgent = userAgent || this.defaults.userAgent;
this.auth = this.createAuthString({ token, key, secret });
this.ratelimit = {
ratelimit: 25,
remaining: 25,
used: 0,
};
this.perPage = process.env.DISCOGS_PER_PAGE || this.defaults.perPage;
}
createAuthString({ token, key, secret, }) {
let authString;
let discogsToken = token || process.env.DISCOGS_API_TOKEN;
let discogsKey = key || process.env.DISCOGS_API_KEY;
let discogsSecret = secret || process.env.DISCOGS_API_SECRET;
if (discogsToken) {
authString = `token=${(discogsToken)}`;
}
else if ((discogsKey) && (discogsSecret)) {
authString = `key=${(discogsKey)}, secret=${(discogsSecret)}`;
}
return authString || null;
}
request(path, method = 'GET', body) {
return __awaiter(this, void 0, void 0, function* () {
const requestHeaders = {
'User-Agent': this.userAgent,
};
if (this.auth) {
requestHeaders['Authorization'] = `Discogs ${this.auth}`;
}
while (true) {
try {
const fetchObject = {
method,
headers: requestHeaders,
};
if (body) {
if (typeof body == 'object') {
fetchObject.body = JSON.stringify(body);
fetchObject.headers['Content-Type'] = 'application/json';
}
else {
fetchObject.body = body;
}
}
const response = yield (0, node_fetch_1.default)(`${this.protocol}://${this.host}/${path}`, fetchObject);
const responseHeaders = response.headers;
const data = yield response.json();
this.ratelimit = {
ratelimit: Number(responseHeaders.get('x-discogs-ratelimit')),
remaining: Number(responseHeaders.get('x-discogs-ratelimit-remaining')),
used: Number(responseHeaders.get('x-discogs-ratelimit-used'))
};
return {
data,
headers: responseHeaders,
};
}
catch (error) {
console.error(error);
// @ts-ignore
if (theError.type == "invalid-json") {
(0, debug_1.log)("Invalid JSON Received Waiting 5 Seconds Before Retry");
yield this.delay(5000);
(0, debug_1.debug)("Trying Again");
}
}
}
});
}
getRatelimit() {
return this.ratelimit;
}
// Helper Functions
getRequest(path) {
return __awaiter(this, void 0, void 0, function* () {
return this.request(path, 'GET');
});
}
deleteRequest(path) {
return __awaiter(this, void 0, void 0, function* () {
return this.request(path, 'DELETE');
});
}
postRequest(path, body) {
return __awaiter(this, void 0, void 0, function* () {
return this.request(path, 'POST', body);
});
}
putRequest(path, body) {
return __awaiter(this, void 0, void 0, function* () {
return this.request(path, 'PUT', body);
});
}
//
// HAVE A NAP
//
delay(ms) {
return __awaiter(this, void 0, void 0, function* () {
return new Promise(resolve => setTimeout(resolve, ms));
});
}
//
// CALCULATE RATE LIMIT
//
calculateRateLimitRemaining() {
return __awaiter(this, void 0, void 0, function* () {
let rateRemaining = this.getRatelimit().remaining;
let rateBarrier = 2; //this.getRatelimit().ratelimit/5;
(0, debug_1.log)("You Have " + rateRemaining + " Requests Remaining");
if (rateRemaining <= rateBarrier) {
(0, debug_1.log)("Generating Random Wait Time");
const rngWaitTime = Math.floor(Math.random() * (55 - 15 + 1)) + 15;
(0, debug_1.log)("You've Used ALL You API Rate Allowance, Waiting for " + rngWaitTime + " Seconds");
(0, debug_1.log)("The Threshold is " + rateBarrier + " Requests");
(0, debug_1.log)(new Date());
let rngWaitTimeMS = rngWaitTime * 1000;
yield this.delay(rngWaitTimeMS);
(0, debug_1.log)("Ok I Waited " + rngWaitTime + " Seconds, Continuing... ");
(0, debug_1.log)(new Date());
yield this.delay(1000);
}
});
}
//
// USER SPECIFIC ENDPOINTS
//
getUser() {
return __awaiter(this, void 0, void 0, function* () {
return this.getRequest(`users/${this.discogsUserName}`);
});
}
deleteUser() {
return __awaiter(this, void 0, void 0, function* () {
return this.deleteRequest(`users/${this.discogsUserName}`);
});
}
getUserCollection(pageNumber, sort, sortOrder) {
return __awaiter(this, void 0, void 0, function* () {
yield this.calculateRateLimitRemaining();
if (!pageNumber) {
pageNumber = "1";
}
if (!sortOrder) {
sortOrder = "desc";
}
if (!sort) {
sort = "added";
}
else if (sort == "year") { }
else if (sort == "artist") { }
else if (sort == "title") { }
else if (sort == "catno") { }
else if (sort == "format") { }
else if (sort == "rating") { }
else {
sort = "added";
}
return this.getRequest(`users/${this.discogsUserName}/collection?sort=${sort}&sort_order=${sortOrder}&per_page=${this.perPage}&page=${pageNumber}`);
});
}
getUserWantlist(pageNumber, sort, sortOrder) {
return __awaiter(this, void 0, void 0, function* () {
yield this.calculateRateLimitRemaining();
if (!pageNumber) {
pageNumber = "1";
}
if (!sortOrder) {
sortOrder = "desc";
}
if (!sort) {
sort = "added";
}
else if (sort == "year") { }
else if (sort == "artist") { }
else if (sort == "title") { }
else if (sort == "catno") { }
else if (sort == "format") { }
else if (sort == "rating") { }
else {
sort = "added";
}
return this.getRequest(`users/${this.discogsUserName}/wants?sort=${sort}&sort_order=${sortOrder}&per_page=${this.perPage}&page=${pageNumber}`);
});
}
getUserFolders() {
return __awaiter(this, void 0, void 0, function* () {
yield this.calculateRateLimitRemaining();
return this.getRequest(`users/${this.discogsUserName}/collection/folders`);
});
}
getUserFolderContents(folder, pageNumber, sort, sortOrder) {
return __awaiter(this, void 0, void 0, function* () {
yield this.calculateRateLimitRemaining();
if (!pageNumber) {
pageNumber = "1";
}
if (!sortOrder) {
sortOrder = "desc";
}
if (!sort) {
sort = "added";
}
else if (sort == "year") { }
else if (sort == "artist") { }
else if (sort == "title") { }
else if (sort == "catno") { }
else if (sort == "format") { }
else if (sort == "rating") { }
else {
sort = "added";
}
return this.getRequest(`users/${this.discogsUserName}/collection/folders/${folder}/releases?sort=${sort}&sort_order=${sortOrder}&per_page=${this.perPage}&page=${pageNumber}`);
});
}
getUserCollectionValue() {
return __awaiter(this, void 0, void 0, function* () {
yield this.calculateRateLimitRemaining();
return this.getRequest(`users/${this.discogsUserName}/collection/value`);
});
}
//
// RELEASE ENDPOINTS
//
getRelease(releaseId) {
return __awaiter(this, void 0, void 0, function* () {
yield this.calculateRateLimitRemaining();
return this.getRequest(`releases/${releaseId}`);
});
}
getReleaseUserRating(releaseId) {
return __awaiter(this, void 0, void 0, function* () {
yield this.calculateRateLimitRemaining();
return this.getRequest(`releases/${releaseId}/rating/${this.discogsUserName}`);
});
}
getReleaseCommunityRating(releaseId) {
return __awaiter(this, void 0, void 0, function* () {
yield this.calculateRateLimitRemaining();
return this.getRequest(`releases/${releaseId}/rating`);
});
}
getReleaseStats(releaseId) {
return __awaiter(this, void 0, void 0, function* () {
yield this.calculateRateLimitRemaining();
return this.getRequest(`releases/${releaseId}/stats`);
});
}
getMasterRelease(masterId) {
return __awaiter(this, void 0, void 0, function* () {
yield this.calculateRateLimitRemaining();
return this.getRequest(`masters/${masterId}`);
});
}
getMasterReleaseVersions(masterId) {
return __awaiter(this, void 0, void 0, function* () {
yield this.calculateRateLimitRemaining();
return this.getRequest(`masters/${masterId}/versions`); // takes parameters, needs adding
});
}
//
// ARTIST ENDPOINTS
//
getArtistDetails(ArtistId) {
return __awaiter(this, void 0, void 0, function* () {
yield this.calculateRateLimitRemaining();
return this.getRequest(`artists/${ArtistId}`);
});
}
getArtistReleases(ArtistId, pageNumber, sort, sortOrder) {
return __awaiter(this, void 0, void 0, function* () {
yield this.calculateRateLimitRemaining();
if (!pageNumber) {
pageNumber = "1";
}
if (!sortOrder) {
sortOrder = "desc";
}
if (!sort) {
sort = "title";
}
else if (sort == "year") { }
else if (sort == "format") { }
else {
sort = "title";
}
return this.getRequest(`artists/${ArtistId}/releases?sort=${sort}&sort_order=${sortOrder}&per_page=${this.perPage}&page=${pageNumber}`); // takes parameters, needs adding
});
}
//
// LABEL ENDPOINTS
//
getLabelDetails(LabelId) {
return __awaiter(this, void 0, void 0, function* () {
yield this.calculateRateLimitRemaining();
return this.getRequest(`labels/${LabelId}`);
});
}
getLabelReleases(LabelId, pageNumber, sort, sortOrder) {
return __awaiter(this, void 0, void 0, function* () {
yield this.calculateRateLimitRemaining();
if (!pageNumber) {
pageNumber = "1";
}
if (!sortOrder) {
sortOrder = "desc";
}
if (!sort) {
sort = "title";
}
else if (sort == "year") { }
else if (sort == "artist") { }
else if (sort == "catno") { }
else if (sort == "format") { }
else {
sort = "added";
}
return this.getRequest(`labels/${LabelId}/releases?sort=${sort}&sort_order=${sortOrder}&per_page=${this.perPage}&page=${pageNumber}`); // takes parameters, needs adding
});
}
//
// SEARCH ENDPOINTS
//
getSearch(query, pageNumber) {
if (!pageNumber) {
pageNumber = "1";
}
return this.request(`database/search?q=${query}&page=${pageNumber}`);
}
getSearchArtist(query, pageNumber) {
if (!pageNumber) {
pageNumber = "1";
}
return this.request(`database/search?q=${query}&type=artist&page=${pageNumber}`);
}
getSearchReleaseId(query, pageNumber) {
if (!pageNumber) {
pageNumber = "1";
}
return this.request(`database/search?release_id=${query}&type=release&page=${pageNumber}`);
}
getSearchCatalogueNumber(query, pageNumber) {
if (!pageNumber) {
pageNumber = "1";
}
return this.request(`database/search?catno=${query}&type=release&page=${pageNumber}`);
}
getSearchReleaseTitle(query, pageNumber) {
if (!pageNumber) {
pageNumber = "1";
}
return this.request(`database/search?release_title=${query}&type=release&page=${pageNumber}`);
}
getSearchTrackTitle(query, pageNumber) {
if (!pageNumber) {
pageNumber = "1";
}
return this.request(`database/search?track=${query}&type=release&page=${pageNumber}`);
}
getSearchLabelReleases(query, pageNumber) {
if (!pageNumber) {
pageNumber = "1";
}
return this.request(`database/search?label=${query}&type=release&page=${pageNumber}`);
}
getSearchLabel(query, pageNumber) {
if (!pageNumber) {
pageNumber = "1";
}
return this.request(`database/search?q=${query}&type=label&page=${pageNumber}`);
}
}
exports.default = Client;
//# sourceMappingURL=index.js.map