Updated logic for getting released work information (take 60 day period max limit into consideration).
This commit is contained in:
@@ -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);
|
||||
//}
|
||||
}
|
||||
Reference in New Issue
Block a user