implement tidal’s (new?) retry-after header for rate-limiting

This commit is contained in:
2025-07-14 14:36:07 +02:00
parent 4c3689016f
commit 2308356c1b

View File

@ -81,6 +81,7 @@ export class TidalPlaylistAdder extends OauthPlaylistAdder implements PlaylistAd
}
private processTidalHeaders(headers: Headers) {
const retryAfterHeader = headers.get('Retry-After');
const remainingTokens = headers.get('x-ratelimit-remaining');
const requiredTokens = headers.get('x-ratelimit-requested-tokens');
const replenishRate = headers.get('x-ratelimit-replenish-rate');
@ -97,6 +98,10 @@ export class TidalPlaylistAdder extends OauthPlaylistAdder implements PlaylistAd
replenishRateValue
);
}
if (retryAfterHeader) {
const retryAfter = parseInt(retryAfterHeader);
this.logger.debug('Tidal rate limit. Retry-After', retryAfter);
}
}
private async getAlbumItems(
@ -284,6 +289,11 @@ export class TidalPlaylistAdder extends OauthPlaylistAdder implements PlaylistAd
this.logger.info('Added to playlist', song.tidalUri, song.title);
break;
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 requiredTokens = resp.headers.get('x-ratelimit-requested-tokens');
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 replenishRateValue = parseInt(replenishRate);
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(
'Received HTTP 429 Too Many Requests. Retrying in',
secondsToWait,
@ -302,8 +317,6 @@ export class TidalPlaylistAdder extends OauthPlaylistAdder implements PlaylistAd
setTimeout(() => {
this.addToPlaylistRetry(song, remaning--);
}, secondsToWait * 1000);
} else {
this.logger.warn('Could not read headers how long to wait', resp.headers);
}
break;
default: