Initial implementation of voice works scanning.

This commit is contained in:
2025-09-11 00:07:49 -04:00
parent f250276a99
commit 3c0a39b324
50 changed files with 1351 additions and 88 deletions

View File

@@ -1,15 +1,13 @@
using JSMR.Application.Integrations.DLSite.Models;
using JSMR.Application.Common;
using JSMR.Application.Integrations.DLSite.Models;
using JSMR.Infrastructure.Http;
using JSMR.Infrastructure.Integrations.DLSite;
using JSMR.Infrastructure.Integrations.DLSite.Mapping;
using JSMR.Infrastructure.Integrations.DLSite.Models;
using JSMR.Infrastructure.Integrations.DLSite.Serialization;
using JSMR.Tests.Utilities;
using Microsoft.Extensions.Logging;
using NSubstitute;
using Shouldly;
using System.Net;
using System.Net.Http;
using System.Text.Json;
namespace JSMR.Tests.Integrations.DLSite;
@@ -25,26 +23,25 @@ public class DLSiteClientTests
{
string productInfoJson = await ReadJsonResourceAsync("Product-Info.json");
HttpResponseMessage response = new()
{
Content = new StringContent(productInfoJson),
StatusCode = HttpStatusCode.OK
};
IHttpService httpService = Substitute.For<IHttpService>();
HttpClient httpClient = Substitute.For<HttpClient>();
httpClient.BaseAddress = new Uri("https://fake.site.com/");
//{ BaseAddress = new Uri("https://www.dlsite.com/") };
httpClient.SendAsync(Arg.Any<HttpRequestMessage>(), Arg.Any<HttpCompletionOption>(), CancellationToken.None)
.Returns(Task.FromResult(response));
httpService.GetStringAsync(Arg.Any<string>(), CancellationToken.None)
.Returns(Task.FromResult(productInfoJson));
var logger = Substitute.For<ILogger<DLSiteClient>>();
var client = new DLSiteClient(httpClient, logger);
var client = new DLSiteClient(httpService, logger);
var result = await client.GetVoiceWorkDetailsAsync(["RJ01230163"], CancellationToken.None);
result.Count.ShouldBe(1);
result.ShouldContainKey("RJ01230163");
result["RJ01230163"].HasTrial.ShouldBeTrue();
result["RJ01230163"].HasDLPlay.ShouldBeTrue();
result["RJ01230163"].HasReviews.ShouldBeTrue();
result["RJ01230163"].SupportedLanguages.ShouldBe([Language.English]);
result["RJ01230163"].DownloadCount.ShouldBe(659);
result["RJ01230163"].WishlistCount.ShouldBe(380);
}
[Fact]

View File

@@ -0,0 +1,79 @@
using JSMR.Infrastructure.Scanning;
using Shouldly;
namespace JSMR.Tests.Unit;
public class DLSiteSearchFilterBuilderTests
{
[Fact]
public void Build_Simple_Query()
{
var filterBuilder = new DLSiteSearchFilterBuilder()
.UseDefaultLocale()
.IncludeJapaneseSupportedLanguage();
string url = filterBuilder.BuildSearchQuery(1, 100);
using var writer = new StringWriter();
writer.Write($"https://www.dlsite.com/maniax/");
writer.Write($"fsr/=/language/jp/");
writer.Write("sex_category[0]/male/");
writer.Write("ana_flg/all/");
writer.Write("work_category[0]/doujin/");
writer.Write("order[0]/release_d/");
writer.Write("work_type_category[0]/audio/");
writer.Write("work_type_category_name[0]/ボイス・ASMR/");
writer.Write("options_and_or/and/");
writer.Write($"options[0]/JPN/");
writer.Write($"per_page/100/");
writer.Write($"page/1/");
writer.Write("show_type/1/");
writer.Write($"?locale=ja_JP");
url.ShouldBe(writer.ToString());
}
[Fact]
public void Build_Advanced_Query()
{
var filterBuilder = new DLSiteSearchFilterBuilder()
.UseEnglishLocale()
.IncludeJapaneseSupportedLanguage()
.IncludeEnglishSupportedLanguage()
.ExcludeMakers(["RG0000001", "RG0000002", "", "RG0000001"])
.ExcludePartiallyAIGeneratedWorks()
.ExcludeAIGeneratedWorks();
string url = filterBuilder.BuildSearchQuery(1, 100);
using var writer = new StringWriter();
writer.Write($"https://www.dlsite.com/maniax/");
writer.Write($"fsr/=/language/en/");
writer.Write("sex_category[0]/male/");
writer.Write("ana_flg/all/");
writer.Write("work_category[0]/doujin/");
writer.Write("order[0]/release_d/");
writer.Write("work_type_category[0]/audio/");
writer.Write("work_type_category_name[0]/ボイス・ASMR/");
writer.Write("options_and_or/and/");
writer.Write($"options[0]/JPN/");
writer.Write($"options[1]/ENG/");
writer.Write($"keyword_maker_name/-RG0000001+-RG0000002/");
writer.Write($"options_not[0]/AIP/");
writer.Write($"options_not[1]/AIG/");
writer.Write($"per_page/100/");
writer.Write($"page/1/");
writer.Write("show_type/1/");
writer.Write($"?locale=en_US");
url.ShouldBe(writer.ToString());
}
}

View File

@@ -10,15 +10,15 @@ public class MySqlBooleanQueryTests
{
string normalizedValue = MySqlBooleanQuery.Normalize("value1 value2|value3 -value4 \"value 5\"");
normalizedValue.ShouldBe("+value1 +(value2|value3) -value4 +\"value 5\"");
normalizedValue.ShouldBe("+value1 +(value2 value3) -value4 +\"value 5\"");
}
[Fact]
public void Normalize_Unusual_Usage()
{
string normalizedValue = MySqlBooleanQuery.Normalize("+value1 +(value2|value3) -value4 +\"value 5\"");
string normalizedValue = MySqlBooleanQuery.Normalize("+value1 +(value2 value3) -value4 +\"value 5\"");
normalizedValue.ShouldBe("+value1 +(value2|value3) -value4 +\"value 5\"");
normalizedValue.ShouldBe("+value1 +(value2 value3) -value4 +\"value 5\"");
}
[Fact]
@@ -28,4 +28,12 @@ public class MySqlBooleanQueryTests
normalizedValue.ShouldBe("+value1 +value2 +value3");
}
[Fact]
public void Normalize_Bad_Or_Data()
{
string normalizedValue = MySqlBooleanQuery.Normalize("value1 | value2");
normalizedValue.ShouldBe("+value1 +value2");
}
}