Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,19 @@ and this project adheres to [Semantic Versioning](https://semver.org/lang/zh-CN/

## [Unreleased]

## [6.5.2](../../compare/v6.5.1...v6.5.2) - 2026-10-16

### 新增

- 列表“更多筛选”新增“全部未下载”,排除屏蔽项和已下载作品,保留未下载的待鉴定、收藏和已看内容。
- 设置中的“默认显示选项卡”支持全部筛选,包括“屏蔽项”和“全部未下载”等智能筛选,下次进入列表页生效;保留原有默认设置,选项与列表共用同一份筛选定义。

### 修复

- 启用“浏览后自动移除新作品标记”后,已浏览卡片渐隐移除,后续作品按原有筛选、排序和分页规则补位;保留其他卡片及封面节点、浏览位置和选择项,避免整体刷新回到顶部。
- 新作品手动移除和状态标记移除共用局部更新逻辑;处理连续移除、动画期间翻页或切换筛选和关闭重开弹窗,避免已移除卡片重新出现、页码越界或旧回调覆盖新界面。
- 最后一页移空时回到上一页,全部移空时显示原有空状态;减少动态效果时直接完成补位。

## [6.5.1](../../compare/v6.5.0...v6.5.1) - 2026-09-25

### 修复
Expand Down
219 changes: 107 additions & 112 deletions JHS.user.js

Large diffs are not rendered by default.

21 changes: 13 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,22 +19,21 @@ JHS 将作品状态、演员收藏、新作追踪、外部检索、媒体预览

> 本项目仅提供网页信息整理与效率增强能力。请遵守所在地法律、目标网站条款及第三方服务规则,并仅处理你有权访问的内容。

## 6.5.1 更新
## 6.5.2 更新

当前正式版为 **6.5.1**(2026-09-25)。这次主要修复:
当前正式版为 **6.5.2**(2026-10-16)。这次主要更新:

- **榜单回到原生页面**:JavDB 分类影片榜(Movies)、热播(Playback)和 TOP250 各有自己的入口与筛选条件;保留原生类别、周期、年份、排名、分页和链接。旧版榜单书签会迁移到有效页面。
- **榜单操作范围更清楚**:本地排序只作用于当前榜单,恢复默认顺序会回到原生排名;TOP250 字幕按钮只过滤当前已加载卡片的中字磁链标记,批量操作也只处理当前榜单页。
- **FC2 来源分明**:JavDB 的 FC2 分类浏览与 FC2 排行榜仍是不同入口;123AV FC2 片库作为标明来源的外部目录,放在分类浏览区域。
- **WebDAV 超时修复**:每次 WebDAV 网络请求单独使用 10 秒超时,导出与加密不计入期限;备份诊断分别记录本地准备、建目录与上传耗时。延长等待期限不会提高传输速度。
- **全部未下载筛选**:“更多筛选”可以查看所有未下载且未被屏蔽的作品,包含待鉴定、收藏和已看内容。
- **默认选项卡更完整**:设置可选择全部筛选,保留“屏蔽项”,加入“全部未下载”等智能筛选,下次进入列表页生效。
- **新作品保持浏览位置**:打开作品后,已浏览卡片渐隐移除,后续作品自动补位;保留筛选、滚动位置和其他选择项。连续移除、切换筛选和关闭重开弹窗也能正确处理。

完整内容见 [6.5.1 更新记录](https://github.com/Teamper/JHS/releases/tag/v6.5.1)。
完整内容见 [6.5.2 更新记录](CHANGELOG.md#652---2026-10-16)。

## 功能概览

| 分类 | 主要能力 |
| --- | --- |
| 状态管理 | 收藏、已下载、已观看和主动屏蔽可独立组合;支持待鉴定、屏蔽项、智能筛选、跨页批量收藏和标记已下载 |
| 状态管理 | 收藏、已下载、已观看和主动屏蔽可独立组合;支持待鉴定、屏蔽项、全部未下载等智能筛选、跨页批量收藏和标记已下载 |
| 演员管理 | 收藏演员、演员黑名单、演员信息补充、收藏同步与已收藏演员高亮 |
| 新作追踪 | 按规范化番号聚合演员新作,支持搜索、类别/VR/状态/决策筛选、多选状态、忽略、暂缓、恢复及“从新作列表移除” |
| 内容过滤 | 手动屏蔽、关键词和演员规则命中的作品统一在“屏蔽项”中查看;自动过滤不会改写作品状态 |
Expand Down Expand Up @@ -87,6 +86,12 @@ JHS 将作品状态、演员收藏、新作追踪、外部检索、媒体预览

移动端可从右下角悬浮菜单访问鉴定、新作品、黑名单、排序、筛选和设置。

启用“浏览后自动移除新作品标记”后,新作品列表中的已浏览卡片会渐隐移除,并由后续作品补位,保留浏览位置、筛选和其他选择项;最后一页移空时回到上一页,全部移空时显示空状态;减少动态效果时直接完成补位。

列表“更多筛选”中的“全部未下载”显示所有未标记为已下载且未被屏蔽的作品,包括待鉴定、收藏和已看内容。

设置中的“默认显示选项卡”可选择全部筛选,包括“屏蔽项”和“全部未下载”等智能筛选,下次进入列表页生效。

批量操作前请确认提示中的范围。普通列表中的“全部”仍会隐藏屏蔽项;**跨页批量操作选择“全部”时会包含屏蔽项**,确认框会明确说明。

## 数据、备份与隐私
Expand Down
17 changes: 9 additions & 8 deletions docs/sleazyfork.zh-CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,35 +7,36 @@

JHS(JAV Helper Suite)是一款面向 JavDB、JavBus 的 Tampermonkey 用户脚本,用于整理作品状态、追踪演员新作、聚合资源与媒体信息,并提供统一离线、备份和统计工具。

> 当前稳定版本:**6.5.1**(2026-09-25)
> 当前稳定版本:**6.5.2**(2026-10-16)
>
> [GitHub 项目](https://github.com/Teamper/JHS) · [完整更新记录](https://github.com/Teamper/JHS/blob/main/CHANGELOG.md) · [问题反馈](https://github.com/Teamper/JHS/issues)

## 6.5.1 更新了什么
## 6.5.2 更新了什么

- **榜单入口分清楚了**:JavDB 的分类影片榜(Movies)、热播(Playback)和 TOP250 保留各自的原生页面、排名与筛选;旧版榜单书签会迁移到有效页面。
- **榜单筛选有明确范围**:排序和批量操作只作用于当前榜单页;TOP250 的字幕按钮只筛选当前已加载卡片是否带中字磁链标记。
- **FC2 片库标明来源**:JavDB 的 FC2 分类浏览、FC2 排行榜和外部 123AV FC2 片库分别保留各自入口。
- **WebDAV 请求可等 10 秒**:建目录、上传等网络请求分别计时,导出与加密不占用网络请求期限;备份日志可区分本地准备与网络阶段。超时调整不会提高上传速度。
- **全部未下载筛选**:“更多筛选”新增“全部未下载”,排除屏蔽项和已下载作品,保留未下载的待鉴定、收藏和已看内容。
- **默认选项卡更完整**:设置支持全部筛选,保留“屏蔽项”,加入“全部未下载”等智能筛选,下次进入列表页生效。
- **新作品保持浏览位置**:打开作品后,卡片渐隐移除,后续作品自动补位;保留筛选、浏览位置和其他选择项,连续移除、快速切换筛选和关闭重开弹窗也能正确处理。

完整版本记录见 [6.5.1 更新说明](https://github.com/Teamper/JHS/releases/tag/v6.5.1)。
完整版本记录见 [6.5.2 更新说明](../CHANGELOG.md#652---2026-10-16)。

## 主要功能

### 作品状态与列表管理

- 收藏、已下载、已观看和主动屏蔽可以独立组合,不会互相覆盖。
- 提供“待鉴定”工作流,以及收藏未下载、收藏未观看、下载未观看、最近 7 天等智能筛选。
- 提供“待鉴定”工作流,以及全部未下载、收藏未下载、收藏未观看、下载未观看、最近 7 天等智能筛选。“全部未下载”排除屏蔽项和已下载内容,保留未下载的收藏、已看和待鉴定内容。
- 手动屏蔽、关键词和演员过滤统一收入口径明确的“屏蔽项”,不会混入普通列表。
- 支持自动翻页、跨页批量收藏和标记已下载、鉴定记录、状态撤销和跨标签页同步。
- 桌面使用快捷筛选;移动端通过右下角悬浮菜单访问鉴定、筛选、排序和常用工具。
- 设置中的“默认显示选项卡”支持全部筛选,包括“屏蔽项”和“全部未下载”等智能筛选,下次进入列表页生效。

### 演员与新作品

- 收藏演员、维护演员黑名单,并在演员资料和作品卡片中显示状态。
- 定时检查收藏演员的新作品,并合并相同番号;协调多个标签页的检查任务,减少重复请求,失败后稍后重试。
- 新作品页面支持按关键词、类别、VR、作品状态和处理方式组合筛选,也可以批量标记、忽略、暂缓、恢复或移出列表。
- 搜索、筛选、排序和翻页更加流畅,封面只在翻到对应页面时加载。批量操作失败的项目会继续保持选中,方便再次处理。
- 启用“浏览后自动移除新作品标记”后,已浏览卡片会渐隐移除并由后续作品补位,保留浏览位置、筛选和其他选择项;最后一页移空时回到上一页,全部移空时显示空状态;减少动态效果时直接补位。
- 新作品、黑名单和设置面板会显示任务运行状态、上次完成时间与下次检查时间。

### 磁力、字幕与媒体
Expand Down
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "jhs-userscript",
"version": "6.5.1",
"version": "6.5.2",
"description": "JAV Helper Suite for JavDB and JavBus",
"private": true,
"license": "MIT",
Expand Down
6 changes: 2 additions & 4 deletions src/app/settings-catalog.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
* changes apply immediately through the feature owner's mount/unmount/reconfigure.
*/
import { parseBooleanSetting } from "../core/feature-helpers.js";
import { DEFAULT_QUICK_FILTER_OPTIONS } from "../features/list/list-filters.js";

/** @param {import("./settings-registry.js").SettingsRegistry} registry */
export function registerDefaultSettings(registry) {
Expand Down Expand Up @@ -68,10 +69,7 @@ export function registerDefaultSettings(registry) {
key: "defaultQuickFilterTab", owner: "ListPageFeature", label: "列表默认筛选",
description: "进入列表页时默认选中的筛选标签,修改后下次进入列表生效。",
type: "select", defaultValue: "waitCheck", effect: "nextNavigation", surfaces: ["full"],
options: Object.freeze([
{ value: "all", label: "全部" }, { value: "waitCheck", label: "待鉴定" }, { value: "favorite", label: "收藏" },
{ value: "hasDown", label: "下载" }, { value: "hasWatch", label: "已看" }, { value: "blockedItems", label: "屏蔽项" },
]),
options: DEFAULT_QUICK_FILTER_OPTIONS,
});

// ---- 详情 ----
Expand Down
8 changes: 5 additions & 3 deletions src/features/list/list-filters.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,17 @@ import { hasAnyState } from "../../core/state-model.js";

export const QUICK_FILTER_LABELS = Object.freeze({
all: "全部", waitCheck: "待鉴定", favorite: "收藏", hasDown: "下载", hasWatch: "已看",
blockedItems: "屏蔽项", favoriteUndownloaded: "收藏未下载", favoriteUnwatched: "收藏未观看",
blockedItems: "屏蔽项", undownloaded: "全部未下载", favoriteUndownloaded: "收藏未下载", favoriteUnwatched: "收藏未观看",
downloadedUnwatched: "下载未观看", recent7d: "最近 7 天"
});

/** @typedef {keyof typeof QUICK_FILTER_LABELS} QuickFilterKey */
/** @type {ReadonlyArray<QuickFilterKey>} */
export const PRIMARY_QUICK_FILTERS = Object.freeze([ "all", "waitCheck", "favorite", "hasDown", "hasWatch" ]);
/** @type {ReadonlyArray<QuickFilterKey>} */
export const SECONDARY_QUICK_FILTERS = Object.freeze([ "blockedItems", "favoriteUndownloaded", "favoriteUnwatched", "downloadedUnwatched", "recent7d" ]);
export const SECONDARY_QUICK_FILTERS = Object.freeze([ "blockedItems", "undownloaded", "favoriteUndownloaded", "favoriteUnwatched", "downloadedUnwatched", "recent7d" ]);
export const DEFAULT_QUICK_FILTER_OPTIONS = Object.freeze([ ...PRIMARY_QUICK_FILTERS, ...SECONDARY_QUICK_FILTERS ]
.map(value => Object.freeze({ value, label: QUICK_FILTER_LABELS[value] })));
const VALID_QUICK_FILTERS = new Set([ ...PRIMARY_QUICK_FILTERS, ...SECONDARY_QUICK_FILTERS ]);

/** @param {unknown} value @returns {QuickFilterKey} */
Expand All @@ -40,7 +42,7 @@ export function matchesQuickFilter(filter, flags, { visibilityReasons = {}, rece
if ("favorite" === normalizedFilter) return !!flags.favorite;
if ("hasDown" === normalizedFilter) return !!flags.downloaded;
if ("hasWatch" === normalizedFilter) return !!flags.watched;
if ("favoriteUndownloaded" === normalizedFilter) return !!flags.favorite && !flags.downloaded;
if ("undownloaded" === normalizedFilter || "favoriteUndownloaded" === normalizedFilter) return !flags.downloaded && ("undownloaded" === normalizedFilter || !!flags.favorite);
if ("favoriteUnwatched" === normalizedFilter) return !!flags.favorite && !flags.watched;
if ("downloadedUnwatched" === normalizedFilter) return !!flags.downloaded && !flags.watched;
return "recent7d" === normalizedFilter && recent;
Expand Down
2 changes: 1 addition & 1 deletion src/main.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// ==UserScript==
// @name JHS
// @namespace https://sleazyfork.org/zh-CN/scripts/578503-jhs-ya
// @version 6.5.1
// @version 6.5.2
// @author JHS Contributors
// @description JAV Helper Suite:为 JavDB / JavBus 提供浏览、收藏、筛选、资源检索、数据备份与统计增强。
// @license MIT
Expand Down
8 changes: 2 additions & 6 deletions src/plugins/backup/setting-templates.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
// @ts-check

import { L, r } from "../../core/constants.js";
import { DEFAULT_QUICK_FILTER_OPTIONS } from "../../features/list/list-filters.js";
import { buildQuickSettingsHtml } from "../../ui/settings/setting-control-renderer.js";

/**
Expand Down Expand Up @@ -134,12 +135,7 @@ export function buildSettingDialogHtml(activePanel, cacheItems) {
<span class="setting-label">默认显示选项卡:</span>
<div class="form-content">
<select id="defaultQuickFilterTab" class="jhs-select-source">
<option value="all">全部</option>
<option value="waitCheck">待鉴定</option>
<option value="favorite">收藏</option>
<option value="hasDown">下载</option>
<option value="hasWatch">已看</option>
<option value="blockedItems">屏蔽项</option>
${DEFAULT_QUICK_FILTER_OPTIONS.map(({ value, label }) => `<option value="${value}">${label}</option>`).join("")}
</select>
</div>
</div>
Expand Down
2 changes: 1 addition & 1 deletion src/plugins/backup/setting.js
Original file line number Diff line number Diff line change
Expand Up @@ -337,7 +337,7 @@ i(this, "_desktopSettingNavMounted", !1), i(this, "_settingScope", null), i(this
selector: "#defaultQuickFilterTab",
key: "defaultQuickFilterTab",
getValue: () => normalizeQuickFilterKey(root.find("#defaultQuickFilterTab").val()),
setValue: (value) => root.find("#defaultQuickFilterTab").val(String(value ?? "")),
setValue: (value) => root.find("#defaultQuickFilterTab").val(normalizeQuickFilterKey(value)),
fallback: "waitCheck",
label: "列表默认筛选",
});
Expand Down
Loading
Loading