implement tidal’s (new?) retry-after header for rate-limiting
This commit is contained in:
@ -81,6 +81,7 @@ export class TidalPlaylistAdder extends OauthPlaylistAdder implements PlaylistAd
|
|||||||
}
|
}
|
||||||
|
|
||||||
private processTidalHeaders(headers: Headers) {
|
private processTidalHeaders(headers: Headers) {
|
||||||
|
const retryAfterHeader = headers.get('Retry-After');
|
||||||
const remainingTokens = headers.get('x-ratelimit-remaining');
|
const remainingTokens = headers.get('x-ratelimit-remaining');
|
||||||
const requiredTokens = headers.get('x-ratelimit-requested-tokens');
|
const requiredTokens = headers.get('x-ratelimit-requested-tokens');
|
||||||
const replenishRate = headers.get('x-ratelimit-replenish-rate');
|
const replenishRate = headers.get('x-ratelimit-replenish-rate');
|
||||||
@ -97,6 +98,10 @@ export class TidalPlaylistAdder extends OauthPlaylistAdder implements PlaylistAd
|
|||||||
replenishRateValue
|
replenishRateValue
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
if (retryAfterHeader) {
|
||||||
|
const retryAfter = parseInt(retryAfterHeader);
|
||||||
|
this.logger.debug('Tidal rate limit. Retry-After', retryAfter);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private async getAlbumItems(
|
private async getAlbumItems(
|
||||||
@ -284,6 +289,11 @@ export class TidalPlaylistAdder extends OauthPlaylistAdder implements PlaylistAd
|
|||||||
this.logger.info('Added to playlist', song.tidalUri, song.title);
|
this.logger.info('Added to playlist', song.tidalUri, song.title);
|
||||||
break;
|
break;
|
||||||
case 429:
|
case 429:
|
||||||
|
let secondsToWait = -1;
|
||||||
|
const retryAfterHeader = resp.headers.get('Retry-After');
|
||||||
|
if (retryAfterHeader) {
|
||||||
|
secondsToWait = parseInt(retryAfterHeader);
|
||||||
|
} else {
|
||||||
const remainingTokens = resp.headers.get('x-ratelimit-remaining');
|
const remainingTokens = resp.headers.get('x-ratelimit-remaining');
|
||||||
const requiredTokens = resp.headers.get('x-ratelimit-requested-tokens');
|
const requiredTokens = resp.headers.get('x-ratelimit-requested-tokens');
|
||||||
const replenishRate = resp.headers.get('x-ratelimit-replenish-rate');
|
const replenishRate = resp.headers.get('x-ratelimit-replenish-rate');
|
||||||
@ -292,7 +302,12 @@ export class TidalPlaylistAdder extends OauthPlaylistAdder implements PlaylistAd
|
|||||||
const requiredTokensValue = parseInt(requiredTokens);
|
const requiredTokensValue = parseInt(requiredTokens);
|
||||||
const replenishRateValue = parseInt(replenishRate);
|
const replenishRateValue = parseInt(replenishRate);
|
||||||
const needToReplenish = requiredTokensValue - remainingTokensValue;
|
const needToReplenish = requiredTokensValue - remainingTokensValue;
|
||||||
const secondsToWait = 1 + needToReplenish / replenishRateValue;
|
secondsToWait = 1 + needToReplenish / replenishRateValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (secondsToWait === -1) {
|
||||||
|
this.logger.warn('Could not read headers how long to wait', resp.headers);
|
||||||
|
} else {
|
||||||
this.logger.warn(
|
this.logger.warn(
|
||||||
'Received HTTP 429 Too Many Requests. Retrying in',
|
'Received HTTP 429 Too Many Requests. Retrying in',
|
||||||
secondsToWait,
|
secondsToWait,
|
||||||
@ -302,8 +317,6 @@ export class TidalPlaylistAdder extends OauthPlaylistAdder implements PlaylistAd
|
|||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
this.addToPlaylistRetry(song, remaning--);
|
this.addToPlaylistRetry(song, remaning--);
|
||||||
}, secondsToWait * 1000);
|
}, secondsToWait * 1000);
|
||||||
} else {
|
|
||||||
this.logger.warn('Could not read headers how long to wait', resp.headers);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
Reference in New Issue
Block a user