Fix SchedulesDirect image limit recognition

This commit is contained in:
Shadowghost
2026-07-15 17:43:27 +02:00
parent f8771b52ec
commit 2bac9a8f0c
3 changed files with 43 additions and 0 deletions
@@ -491,6 +491,12 @@ namespace Jellyfin.LiveTv.Listings
var results = new List<ShowImagesDto>();
for (int i = 0; i < programIds.Count; i += BatchSize)
{
// The daily image limit may be surfaced mid-batch.
if (IsImageDailyLimitActive())
{
break;
}
var batch = programIds.Skip(i).Take(BatchSize);
using var message = new HttpRequestMessage(HttpMethod.Post, ApiUrl + "/metadata/programs/");
@@ -511,6 +517,18 @@ namespace Jellyfin.LiveTv.Listings
entry.ProgramId,
entry.Code,
entry.Message);
// The image download limit can be reported per-entry inside an
// otherwise successful (HTTP 200) response when the limit is hit
// mid-batch. Back off so we stop requesting images until SD resets.
if (entry.Code is (int)SdErrorCode.MaxImageDownloads or (int)SdErrorCode.MaxImageDownloadsTrial)
{
_logger.LogError(
"Schedules Direct image download limit hit (code {Code}). Disabling image acquisition until SD reset.",
entry.Code);
SetImageLimitHit();
}
continue;
}
@@ -175,6 +175,30 @@ namespace Jellyfin.LiveTv.Tests.SchedulesDirect
Assert.Equal("Series", showImagesDtos[0].Data[0].Tier);
}
/// <summary>
/// /metadata/programs response where the daily image limit is hit mid-batch,
/// so individual entries carry an error code inside an otherwise successful response.
/// </summary>
[Fact]
public void Deserialize_Metadata_Programs_Image_Limit_Response_Success()
{
var bytes = File.ReadAllBytes("Test Data/SchedulesDirect/metadata_programs_image_limit_response.json");
var showImagesDtos = JsonSerializer.Deserialize<IReadOnlyList<ShowImagesDto>>(bytes, _jsonOptions);
Assert.NotNull(showImagesDtos);
Assert.Equal(2, showImagesDtos!.Count);
// First entry is a normal result with image data and no error code.
Assert.Equal("SH00712240", showImagesDtos[0].ProgramId);
Assert.Null(showImagesDtos[0].Code);
Assert.Single(showImagesDtos[0].Data);
// Second entry is a per-entry trial image download limit error (SD code 5003).
Assert.Equal("SH00712241", showImagesDtos[1].ProgramId);
Assert.Equal((int)SdErrorCode.MaxImageDownloadsTrial, showImagesDtos[1].Code);
Assert.Empty(showImagesDtos[1].Data);
}
/// <summary>
/// /headends response.
/// </summary>
@@ -0,0 +1 @@
[{"programID":"SH00712240","data":[{"width":"135","height":"180","uri":"assets/p282288_b_v2_aa.jpg","size":"Sm","aspect":"3x4","category":"Banner-L3","text":"yes","primary":"true","tier":"Series"}]},{"programID":"SH00712241","code":5003,"message":"Image download limit exceeded. Try again tomorrow."}]