mirror of
https://github.com/truewhile/MeBox.git
synced 2026-10-07 13:56:37 +08:00
优化
This commit is contained in:
@@ -132,6 +132,7 @@ export function LibraryPage() {
|
|||||||
selectedEpisodes,
|
selectedEpisodes,
|
||||||
visibleEpisodes,
|
visibleEpisodes,
|
||||||
selectedSeriesEpisodes,
|
selectedSeriesEpisodes,
|
||||||
|
selectedSeriesAllEpisodes,
|
||||||
selectedSeriesMediaIDs,
|
selectedSeriesMediaIDs,
|
||||||
handleSeriesClick,
|
handleSeriesClick,
|
||||||
clearSelectedSeries,
|
clearSelectedSeries,
|
||||||
@@ -172,7 +173,7 @@ export function LibraryPage() {
|
|||||||
role,
|
role,
|
||||||
library,
|
library,
|
||||||
selectedSeries,
|
selectedSeries,
|
||||||
selectedSeriesEpisodes,
|
selectedSeriesEpisodes: selectedSeriesAllEpisodes,
|
||||||
reloadCurrentLibrary,
|
reloadCurrentLibrary,
|
||||||
clearSelectedSeries,
|
clearSelectedSeries,
|
||||||
setManualMovie,
|
setManualMovie,
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import { useEffect, useMemo } from 'react'
|
|||||||
|
|
||||||
import type { Media } from '../types'
|
import type { Media } from '../types'
|
||||||
import {
|
import {
|
||||||
|
expandSeriesMediaVersions,
|
||||||
getSeriesKey,
|
getSeriesKey,
|
||||||
isTheatricalFeature,
|
isTheatricalFeature,
|
||||||
seasonSortOrder,
|
seasonSortOrder,
|
||||||
@@ -77,11 +78,17 @@ export function useLibrarySeriesSelection({
|
|||||||
[selectedEpisodes],
|
[selectedEpisodes],
|
||||||
)
|
)
|
||||||
|
|
||||||
const selectedSeriesMediaIDs = useMemo(
|
// 批量/整剧操作必须覆盖被折叠进 versions 的每一行, 否则只作用到代表行。
|
||||||
() => selectedSeriesEpisodes.filter((ep) => !isTheatricalFeature(ep)).map((ep) => ep.id),
|
const selectedSeriesAllEpisodes = useMemo(
|
||||||
|
() => expandSeriesMediaVersions(selectedSeriesEpisodes),
|
||||||
[selectedSeriesEpisodes],
|
[selectedSeriesEpisodes],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const selectedSeriesMediaIDs = useMemo(
|
||||||
|
() => selectedSeriesAllEpisodes.filter((ep) => !isTheatricalFeature(ep)).map((ep) => ep.id),
|
||||||
|
[selectedSeriesAllEpisodes],
|
||||||
|
)
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (loading) return
|
if (loading) return
|
||||||
if (!isSeries) {
|
if (!isSeries) {
|
||||||
@@ -131,6 +138,7 @@ export function useLibrarySeriesSelection({
|
|||||||
selectedEpisodes,
|
selectedEpisodes,
|
||||||
visibleEpisodes,
|
visibleEpisodes,
|
||||||
selectedSeriesEpisodes,
|
selectedSeriesEpisodes,
|
||||||
|
selectedSeriesAllEpisodes,
|
||||||
selectedSeriesMediaIDs,
|
selectedSeriesMediaIDs,
|
||||||
handleSeriesClick,
|
handleSeriesClick,
|
||||||
clearSelectedSeries,
|
clearSelectedSeries,
|
||||||
|
|||||||
@@ -127,6 +127,31 @@ export function isTheatricalFeature(media: Media): boolean {
|
|||||||
return THEATRICAL_TITLE_RE.test(`${media.title || ''} ${path}`) || THEATRICAL_FOLDER_RE.test(path)
|
return THEATRICAL_TITLE_RE.test(`${media.title || ''} ${path}`) || THEATRICAL_FOLDER_RE.test(path)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 把剧集列表展开成"每一行 media"。
|
||||||
|
*
|
||||||
|
* 剧集接口会把同一集的多版本(含被误判折叠的行)合成一个 item, 真实的行放在
|
||||||
|
* `versions` 里, 顶层只保留代表行。批量操作(整剧匹配 / 整剧刮削 / 编辑整剧 /
|
||||||
|
* 删除整剧)必须作用到每一行, 否则只会更新代表行, 折叠掉的版本被漏掉。
|
||||||
|
*
|
||||||
|
* 注意 `versions` 已包含代表行本身, 因此命中 versions 时不要再额外加回 item,
|
||||||
|
* 否则会重复。仅用于「操作」而非展示——展示仍按折叠后的剧集渲染版本切换器。
|
||||||
|
*/
|
||||||
|
export function expandSeriesMediaVersions(episodes: Media[] = []): Media[] {
|
||||||
|
const out: Media[] = []
|
||||||
|
const seen = new Set<string>()
|
||||||
|
for (const ep of episodes) {
|
||||||
|
if (!ep) continue
|
||||||
|
const rows = ep.versions && ep.versions.length > 0 ? ep.versions : [ep]
|
||||||
|
for (const row of rows) {
|
||||||
|
if (!row || !row.id || seen.has(row.id)) continue
|
||||||
|
seen.add(row.id)
|
||||||
|
out.push(row)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
const SPECIAL_SECTION_PATTERNS: Array<[number, RegExp]> = [
|
const SPECIAL_SECTION_PATTERNS: Array<[number, RegExp]> = [
|
||||||
[OVA_SEASON, /(?:^|[^a-z0-9])ovas?(?:[\s._-]*\d+)?(?:[^a-z0-9]|$)/i],
|
[OVA_SEASON, /(?:^|[^a-z0-9])ovas?(?:[\s._-]*\d+)?(?:[^a-z0-9]|$)/i],
|
||||||
[OAD_SEASON, /(?:^|[^a-z0-9])oads?(?:[\s._-]*\d+)?(?:[^a-z0-9]|$)/i],
|
[OAD_SEASON, /(?:^|[^a-z0-9])oads?(?:[\s._-]*\d+)?(?:[^a-z0-9]|$)/i],
|
||||||
|
|||||||
Reference in New Issue
Block a user