Skip to content

Commit 5970c33

Browse files
committed
Merge branch 'devel' into pure-py
2 parents ec69a23 + 1212b27 commit 5970c33

File tree

3 files changed

+63
-37
lines changed

3 files changed

+63
-37
lines changed

CHANGELOG.md

Lines changed: 37 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,17 @@
1515
# Method 3: Combined filtering (most flexible)
1616
ktoolbox sync_creator --url="https://kemono.cr/fanbox/user/32165989" --keywords="ブルアカ" --keywords_exclude="全体公開,結果発表"
1717
```
18+
- The `--keywords` and `--keywords-exclude` features for keyword filtering and exclusion can now also be set in the configuration
19+
- New configuration options:
20+
- `job.keywords`: Keyword filtering (default is empty)
21+
- `job.keywords_exclude`: Keyword exclusion (default is empty)
22+
- You can edit these configurations by running `ktoolbox config-editor` (`Job -> ...`)
23+
- Or manually edit them in the `.env` file or environment variables
24+
```dotenv
25+
KTOOLBOX_JOB__KEYWORDS='["expression", "sound effect variation"]'
26+
KTOOLBOX_JOB__KEYWORDS_EXCLUDE='["public", "result announcement"]'
27+
```
28+
- 📖More information: [Configuration-Reference-JobConfiguration](https://ktoolbox.readthedocs.io/latest/configuration/reference/#ktoolbox.configuration.JobConfiguration)
1829
- Add **year/month** **grouping** functionality for post organization - #306
1930
- You can group downloaded posts by year and month with customizable directory naming formats
2031
- New configuration options:
@@ -26,12 +37,12 @@
2637
- Or manually edit them in `.env` file or environment variables
2738
```dotenv
2839
# Environment variables (Defaults to False)
29-
export KTOOLBOX_JOB__GROUP_BY_YEAR=True
30-
export KTOOLBOX_JOB__GROUP_BY_MONTH=True
40+
KTOOLBOX_JOB__GROUP_BY_YEAR=True
41+
KTOOLBOX_JOB__GROUP_BY_MONTH=True
3142
3243
# Custom style naming
33-
export KTOOLBOX_JOB__YEAR_DIRNAME_FORMAT="Year {year}"
34-
export KTOOLBOX_JOB__MONTH_DIRNAME_FORMAT="Month {month:02d}"
44+
KTOOLBOX_JOB__YEAR_DIRNAME_FORMAT="Year {year}"
45+
KTOOLBOX_JOB__MONTH_DIRNAME_FORMAT="Month {month:02d}"
3546
```
3647
Resulting directory structure:
3748
```
@@ -48,7 +59,9 @@
4859
- 📖More information: [Configuration-Reference-JobConfiguration](https://ktoolbox.readthedocs.io/latest/configuration/reference/#ktoolbox.configuration.JobConfiguration)
4960
5061
51-
[//]: # (### 🪲 Fix)
62+
### 🪲 Fix
63+
64+
- Fixed the issue where the `--keywords` parameter could not be parsed correctly in the `sync-creator` command
5265
5366
- - -
5467
@@ -65,6 +78,17 @@
6578
# 方法3:组合筛选(最灵活)
6679
ktoolbox sync_creator --url="https://kemono.cr/fanbox/user/32165989" --keywords="ブルアカ" --keywords_exclude="全体公開,結果発表"
6780
```
81+
- 关键词筛选和关键词排除的 `--keywords``--keywords-exclude` 功能现在也可以在配置中设置
82+
- 新配置项:
83+
- `job.keywords`:关键词筛选(默认为空)
84+
- `job.keywords_exclude`:关键词排除(默认为空)
85+
- 可通过运行 `ktoolbox config-editor` 编辑这些配置(`Job -> ...`
86+
- 或手动在 `.env` 文件或环境变量中编辑
87+
```dotenv
88+
KTOOLBOX_JOB__KEYWORDS='["表情", "効果音差分"]'
89+
KTOOLBOX_JOB__KEYWORDS_EXCLUDE='["全体公開", "結果発表"]'
90+
```
91+
- 📖更多信息:[配置参考-JobConfiguration](https://ktoolbox.readthedocs.io/latest/configuration/reference/#ktoolbox.configuration.JobConfiguration)
6892
- 新增按**年份/月**分组功能用于帖子整理 - #306
6993
- 可按年份和月份分组下载的帖子,支持自定义目录命名格式
7094
- 新配置项:
@@ -75,13 +99,13 @@
7599
- 可通过运行 `ktoolbox config-editor` 编辑这些配置(`Job -> ...`)
76100
- 或手动在 `.env` 文件或环境变量中编辑
77101
```dotenv
78-
# 环境变量(默认 False)
79-
export KTOOLBOX_JOB__GROUP_BY_YEAR=True
80-
export KTOOLBOX_JOB__GROUP_BY_MONTH=True
102+
# 是否启用(默认 False)
103+
KTOOLBOX_JOB__GROUP_BY_YEAR=True
104+
KTOOLBOX_JOB__GROUP_BY_MONTH=True
81105
82106
# 自定义目录命名
83-
export KTOOLBOX_JOB__YEAR_DIRNAME_FORMAT="{year}年"
84-
export KTOOLBOX_JOB__MONTH_DIRNAME_FORMAT="{month:02d}月"
107+
KTOOLBOX_JOB__YEAR_DIRNAME_FORMAT="{year}年"
108+
KTOOLBOX_JOB__MONTH_DIRNAME_FORMAT="{month:02d}月"
85109
```
86110
目录结构示例:
87111
```
@@ -97,7 +121,9 @@
97121
```
98122
- 📖更多信息:[配置参考-JobConfiguration](https://ktoolbox.readthedocs.io/latest/configuration/reference/#ktoolbox.configuration.JobConfiguration)
99123
100-
[//]: # (### 🪲 修复)
124+
### 🪲 修复
125+
126+
- 修复 `--keywords` 参数在 `sync-creator` 命令中无法正确解析的问题
101127
102128
## Upgrade
103129

ktoolbox/cli.py

Lines changed: 22 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from datetime import datetime
22
from pathlib import Path
3-
from typing import Union, overload, Set, Optional
3+
from typing import Union, overload, Tuple
44

55
import aiofiles
66
from loguru import logger
@@ -194,34 +194,35 @@ async def download_post(
194194
)
195195
if ret:
196196
post_path = path / generate_post_path_name(ret.data.post)
197-
197+
198198
# For revision posts, create a revision subfolder
199199
if revision_id:
200200
post_path = post_path / "revision" / revision_id
201-
201+
202202
# Download the main post
203203
job_list = await create_job_from_post(
204204
post=ret.data.post,
205205
post_path=post_path,
206206
dump_post_data=dump_post_data
207207
)
208-
208+
209209
# If include_revisions is enabled and we have revisions data
210210
if (config.job.include_revisions and
211-
ret.data.props and
212-
ret.data.props.revisions and
213-
not revision_id): # Don't process revisions if we're already downloading a specific revision
214-
211+
ret.data.props and
212+
ret.data.props.revisions and
213+
not revision_id): # Don't process revisions if we're already downloading a specific revision
214+
215215
for revision_order, revision_data in ret.data.props.revisions:
216216
if revision_data.revision_id: # Only process actual revisions, not the main post
217-
revision_path = post_path / config.job.post_structure.revisions / generate_post_path_name(revision_data)
217+
revision_path = post_path / config.job.post_structure.revisions / generate_post_path_name(
218+
revision_data)
218219
revision_jobs = await create_job_from_post(
219220
post=revision_data,
220221
post_path=revision_path,
221222
dump_post_data=dump_post_data
222223
)
223224
job_list.extend(revision_jobs)
224-
225+
225226
job_runner = JobRunner(job_list=job_list)
226227
await job_runner.start()
227228
else:
@@ -271,8 +272,8 @@ async def sync_creator(
271272
end_time: str = None,
272273
offset: int = 0,
273274
length: int = None,
274-
keywords: str = None,
275-
keywords_exclude: str = None
275+
keywords: Tuple[str] = None,
276+
keywords_exclude: Tuple[str] = None
276277
):
277278
"""
278279
Sync posts from a creator
@@ -338,23 +339,18 @@ async def sync_creator(
338339
return creator_ret.message
339340

340341
creator_path = path / sanitize_filename(creator_name)
341-
342342
creator_path.mkdir(exist_ok=True)
343-
344-
# Parse keywords
345-
keyword_set: Optional[Set[str]] = None
343+
344+
keywords = [keywords] if isinstance(keywords, str) else keywords
345+
keyword_set = set(keywords) if keywords else config.job.keywords
346346
if keywords:
347-
keyword_set = set(kw.strip() for kw in keywords.split(',') if kw.strip())
348-
if keyword_set:
349-
logger.info(f"Filtering posts by keywords: {', '.join(keyword_set)}")
350-
351-
# Parse exclude keywords
352-
keyword_exclude_set: Optional[Set[str]] = None
347+
logger.info(f"Filtering posts by keywords: {', '.join(keyword_set)}")
348+
349+
keywords_exclude = [keywords_exclude] if isinstance(keywords_exclude, str) else keywords_exclude
350+
keyword_exclude_set = set(keywords_exclude) if keywords_exclude else config.job.keywords_exclude
353351
if keywords_exclude:
354-
keyword_exclude_set = set(kw.strip() for kw in keywords_exclude.split(',') if kw.strip())
355-
if keyword_exclude_set:
356-
logger.info(f"Excluding posts by keywords: {', '.join(keyword_exclude_set)}")
357-
352+
logger.info(f"Excluding posts by keywords: {', '.join(keyword_exclude_set)}")
353+
358354
ret = await create_job_from_creator(
359355
service=service,
360356
creator_id=creator_id,

ktoolbox/configuration.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,8 @@ class JobConfiguration(BaseModel):
206206
e.g. ``{year}`` > ``2024``, ``Year_{year}`` > ``Year_2024``
207207
:ivar month_dirname_format: Customize the month directory name format. Available properties: ``year``, ``month``. \
208208
e.g. ``{year}-{month}`` > ``2024-01``, ``{year}_{month}`` > ``2024_01``
209+
:ivar keywords: keywords to filter posts by title (case-insensitive)
210+
:ivar keywords_exclude: keywords to exclude posts by title (case-insensitive)
209211
"""
210212
count: int = 4
211213
include_revisions: bool = False
@@ -270,6 +272,8 @@ class JobConfiguration(BaseModel):
270272
group_by_month: bool = False
271273
year_dirname_format: str = "{year}"
272274
month_dirname_format: str = "{year}-{month:02d}"
275+
keywords: Set[str] = Field(default_factory=set)
276+
keywords_exclude: Set[str] = Field(default_factory=set)
273277

274278
@validator("allow_list", "block_list", pre=True)
275279
def allow_block_list_validator(cls, v):

0 commit comments

Comments
 (0)