Updated logic for getting released work information (take 60 day period max limit into consideration).

This commit is contained in:
2026-05-04 01:52:25 -04:00
parent f6674e0382
commit abcc82437f
3 changed files with 351 additions and 12 deletions

View File

@@ -8,6 +8,8 @@ namespace JSMR.Infrastructure.Scanning;
public class ReleasedWorksProvider(IDLSiteClient dlsiteClient) : IReleasedWorksProvider
{
private const int MaxPeriodDays = 60;
public async Task<ReleasedWorksCollection> GetReleasedWorksAsync(VoiceWorkScanResult scanResult, CancellationToken cancellationToken)
{
DateOnly[] salesDates =
@@ -20,20 +22,72 @@ public class ReleasedWorksProvider(IDLSiteClient dlsiteClient) : IReleasedWorksP
if (salesDates.Length == 0)
return [];
HashSet<string> productIds = [.. scanResult.Works.Select(x => x.ProductId)];
DateOnly minDate = salesDates.Min();
DateOnly maxDate = salesDates.Max();
DateOnly requestDate = minDate.AddDays(-1);
DateOnly requestEndDate = maxDate.AddDays(1);
ReleasedWorksCollection collection = [];
int period = (requestEndDate.DayNumber - requestDate.DayNumber) + 1;
DateOnly chunkStart = minDate;
ReleasedWorksRequest releasedWorksRequest = new(
Locale: Locale.English,
Date: requestEndDate,
Period: period
);
while (chunkStart <= maxDate)
{
int endDayNumber = Math.Min(chunkStart.DayNumber + MaxPeriodDays - 1, maxDate.DayNumber);
DateOnly chunkEnd = DateOnly.FromDayNumber(endDayNumber);
return await dlsiteClient.GetReleasedWorksAsync(releasedWorksRequest, cancellationToken);
int period = chunkEnd.DayNumber - chunkStart.DayNumber + 1;
ReleasedWorksRequest request = new(
Locale: Locale.English,
Date: chunkEnd,
Period: period);
ReleasedWorksCollection chunk = await dlsiteClient.GetReleasedWorksAsync(request, cancellationToken);
foreach (string productId in chunk.Keys)
{
if (productIds.Contains(productId) == false)
continue;
if (collection.ContainsKey(productId))
continue;
collection.Add(productId, chunk[productId]);
}
chunkStart = chunkEnd.AddDays(1);
}
return collection;
}
//public async Task<ReleasedWorksCollection> GetReleasedWorksAsync(VoiceWorkScanResult scanResult, CancellationToken cancellationToken)
//{
// DateOnly[] salesDates =
// [
// .. scanResult.Works
// .Where(x => x.SalesDate.HasValue)
// .Select(x => x.SalesDate!.Value)
// ];
// if (salesDates.Length == 0)
// return [];
// DateOnly minDate = salesDates.Min();
// DateOnly maxDate = salesDates.Max();
// DateOnly requestDate = minDate.AddDays(-1);
// DateOnly requestEndDate = maxDate.AddDays(1);
// int period = (requestEndDate.DayNumber - requestDate.DayNumber) + 1;
// ReleasedWorksRequest releasedWorksRequest = new(
// Locale: Locale.English,
// Date: requestEndDate,
// Period: period
// );
// return await dlsiteClient.GetReleasedWorksAsync(releasedWorksRequest, cancellationToken);
//}
}