Extracting release dates from figures

This commit is contained in:
2025-05-21 22:08:43 +02:00
parent 4ec4a27b89
commit b9ad8fe0ac
5 changed files with 162 additions and 10 deletions

31
.idea/workspace.xml generated
View File

@@ -5,7 +5,11 @@
</component>
<component name="ChangeListManager">
<list default="true" id="899cd61a-5136-49cb-8f5d-42c8fa021b17" name="Changes" comment="">
<change beforePath="$PROJECT_DIR$/pyproject.toml" beforeDir="false" afterPath="$PROJECT_DIR$/pyproject.toml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/tests/test_release.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/hpoi/models/figure.py" beforeDir="false" afterPath="$PROJECT_DIR$/src/hpoi/models/figure.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/hpoi/models/release.py" beforeDir="false" afterPath="$PROJECT_DIR$/src/hpoi/models/release.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/tests/test_data/figures.json" beforeDir="false" afterPath="$PROJECT_DIR$/tests/test_data/figures.json" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
@@ -37,6 +41,7 @@
"Python tests.Python tests for test_figures.test_miku_nendoroid_15_anniversary.executor": "Run",
"Python tests.pytest for test_figures.test_figures.executor": "Run",
"Python tests.pytest for test_utils.test_get_price_from_text.executor": "Run",
"Python tests.pytest in test_release.py.executor": "Run",
"Python.generate_test_data.executor": "Run",
"RunOnceActivity.ShowReadmeOnStart": "true",
"git-widget-placeholder": "main",
@@ -125,9 +130,28 @@
<option name="_new_targetType" value="&quot;PYTHON&quot;" />
<method v="2" />
</configuration>
<configuration name="pytest in test_release.py" type="tests" factoryName="py.test" temporary="true" nameIsGenerated="true">
<module name="hpoi" />
<option name="ENV_FILES" value="" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/tests" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
<option name="_new_keywords" value="&quot;&quot;" />
<option name="_new_parameters" value="&quot;&quot;" />
<option name="_new_additionalArguments" value="&quot;&quot;" />
<option name="_new_target" value="&quot;$PROJECT_DIR$/tests/test_release.py&quot;" />
<option name="_new_targetType" value="&quot;PATH&quot;" />
<method v="2" />
</configuration>
<recent_temporary>
<list>
<item itemvalue="Python.generate_test_data" />
<item itemvalue="Python tests.pytest in test_release.py" />
<item itemvalue="Python tests.pytest for test_figures.test_figures" />
<item itemvalue="Python tests.pytest for test_utils.test_get_price_from_text" />
<item itemvalue="Python tests.Python tests for test_figures.test_miku_nendoroid_15_anniversary" />
@@ -150,7 +174,7 @@
<option name="presentableId" value="Default" />
<updated>1747813041813</updated>
<workItem from="1747813042896" duration="411000" />
<workItem from="1747813474316" duration="10655000" />
<workItem from="1747813474316" duration="14469000" />
</task>
<servers />
</component>
@@ -159,8 +183,9 @@
</component>
<component name="com.intellij.coverage.CoverageDataManagerImpl">
<SUITE FILE_PATH="coverage/hpoi$.coverage" NAME=" Coverage Results" MODIFIED="1747818304683" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/tests" />
<SUITE FILE_PATH="coverage/hpoi$generate_test_data.coverage" NAME="generate_test_data Coverage Results" MODIFIED="1747836427933" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/tests/test_data" />
<SUITE FILE_PATH="coverage/hpoi$generate_test_data.coverage" NAME="generate_test_data Coverage Results" MODIFIED="1747858057684" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/tests/test_data" />
<SUITE FILE_PATH="coverage/hpoi$pytest_for_test_figures_test_figures.coverage" NAME="pytest for test_figures.test_figures Coverage Results" MODIFIED="1747820902835" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/tests" />
<SUITE FILE_PATH="coverage/hpoi$pytest_for_test_utils_test_get_price_from_text.coverage" NAME="pytest for test_utils.test_get_price_from_text Coverage Results" MODIFIED="1747820435956" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/tests" />
<SUITE FILE_PATH="coverage/hpoi$pytest_in_test_release_py.coverage" NAME="pytest in test_release.py Coverage Results" MODIFIED="1747857799700" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/tests" />
</component>
</project>

View File

@@ -69,6 +69,20 @@ class Figure:
if info_list_item_size:
self.size = info_list_item_size.p.string.strip()
info_list_item_releases = info_list_items.get("发售")
if info_list_item_releases:
for x in info_list_item_releases.find_all("p"):
release = Release.from_string(x.get_text().strip())
if release:
self.release.append(release)
info_list_item_releases = info_list_items.get("出货日")
if info_list_item_releases:
for x in info_list_item_releases.find_all("p"):
release = Release.from_string(x.get_text().strip())
if release:
self.release.append(release)
self.images = [
re.sub(
r"^https://r\.hpoi\.net/gk/pic/s/(\d{4})/(\d{2})/([\w\d]{32})\.(\w+)(?:\?.*)?",

View File

@@ -1,3 +1,4 @@
import re
from dataclasses import dataclass
from typing import Optional, Dict
@@ -6,8 +7,45 @@ from hpoi.models.currency import Currency
@dataclass
class Release:
year: Optional[int]
month: Optional[int]
day: Optional[int]
price: Optional[Dict[Currency, int]]
full_text: str
full_text: str
year: Optional[int] = None
month: Optional[int] = None
day: Optional[int] = None
price: Optional[tuple[Currency, int]] = None
@classmethod
def from_string(cls, text) -> Optional["Release"]:
if text == "未知":
return None
self = cls(full_text=text)
text = text.replace(",", "")
full_date = re.search(r"(\d{4})/(\d{1,2})/(\d{1,2})", text)
if full_date:
self.year = int(full_date.group(1))
self.month = int(full_date.group(2))
self.day = int(full_date.group(3))
else:
year_match = re.search(r"(\d{4})年", text)
if year_match:
self.year = int(year_match.group(1))
month_match = re.search(r"(\d{1,2})月", text)
if month_match:
self.month = int(month_match.group(1))
day_match = re.search(r"(\d{1,2})日", text)
if day_match:
self.day = int(day_match.group(1))
cny_regex = re.search(r"(\d+)人民币", text)
if cny_regex:
self.price = (Currency.CNY, int(cny_regex.group(1)))
jpy_regex = re.search(r"(\d+)日元", text)
if jpy_regex:
self.price = (Currency.JPY, int(jpy_regex.group(1)))
return self

View File

@@ -26,7 +26,28 @@
"JPY": 9400,
"CNY": 465
},
"release": [],
"release": [
{
"full_text": "2023/2/15 , 9,400日元",
"year": 2023,
"month": 2,
"day": 15,
"price": [
"JPY",
9400
]
},
{
"full_text": "2022/8/6 , 9,400日元 , Smile Fest 2022 先行贩售",
"year": 2022,
"month": 8,
"day": 6,
"price": [
"JPY",
9400
]
}
],
"scale": null,
"size": "H=100mm",
"mfc_id": null,
@@ -66,7 +87,15 @@
"value": {
"CNY": 1999
},
"release": [],
"release": [
{
"full_text": "2022年10月",
"year": 2022,
"month": 10,
"day": null,
"price": null
}
],
"scale": "1/3",
"size": "H=270mm L=335mm D=355mm",
"mfc_id": null,

46
tests/test_release.py Normal file
View File

@@ -0,0 +1,46 @@
from hpoi.models.currency import Currency
from hpoi.models.release import Release
def test_unknown():
assert Release.from_string("未知") is None
def test_chinese_year():
release = Release.from_string("2025年")
assert release.year == 2025
assert release.month is None
assert release.day is None
assert release.price is None
def test_chinese_year_month():
release = Release.from_string("2022年10月")
assert release.year == 2022
assert release.month == 10
assert release.day is None
assert release.price is None
def test_chinese_full_date():
release = Release.from_string("2025年5月28日")
assert release.year == 2025
assert release.month == 5
assert release.day == 28
assert release.price is None
def test_full_date_japanese_yen():
release = Release.from_string("2023/2/15 , 9,400日元")
assert release.year == 2023
assert release.month == 2
assert release.day == 15
assert release.price == (Currency.JPY, 9400)
def test_full_date_chinese_yuan():
release = Release.from_string("2025/5/7 , 369人民币 , 预售优惠价")
assert release.year == 2025
assert release.month == 5
assert release.day == 7
assert release.price == (Currency.CNY, 369)