Skip to content

Commit

Permalink
Warm up system playlists if they report themselves unavailable on the…
Browse files Browse the repository at this point in the history
… first request (#855)
  • Loading branch information
Tyrrrz authored Dec 30, 2024
1 parent 30ba3f2 commit 8ba5671
Showing 1 changed file with 21 additions and 2 deletions.
23 changes: 21 additions & 2 deletions YoutubeExplode/Playlists/PlaylistController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,8 @@ public async ValueTask<PlaylistNextResponse> GetPlaylistNextResponseAsync(
CancellationToken cancellationToken = default
)
{
for (var retriesRemaining = 5; ; retriesRemaining--)
const int retriesCount = 5;
for (var retriesRemaining = retriesCount; ; retriesRemaining--)
{
using var request = new HttpRequestMessage(
HttpMethod.Post,
Expand Down Expand Up @@ -99,10 +100,28 @@ await response.Content.ReadAsStringAsync(cancellationToken)
if (!playlistResponse.IsAvailable)
{
// Retry if this is not the first request, meaning that the previous requests were successful,
// and that the playlist is probably not actually unavailable.
// indicating that it's most likely a transient error.
if (index > 0 && !string.IsNullOrWhiteSpace(visitorData) && retriesRemaining > 0)
continue;

// Some system playlists are unavailable through this endpoint until their page is opened by
// at least one user. If this is the first request, and we haven't retried yet, attempt to
// warm up the playlist by opening its page, and then retry.
if (index <= 0 && string.IsNullOrWhiteSpace(visitorData) && retriesRemaining >= retriesCount)
{
using (
await http.GetAsync(
$"https://youtube.com/playlist?list={playlistId}",
cancellationToken
)
)
{
// We don't actually care about the outcome of this request
}

continue;
}

throw new PlaylistUnavailableException(
$"Playlist '{playlistId}' is not available."
);
Expand Down

0 comments on commit 8ba5671

Please sign in to comment.