Skip to content

Commit e3b05a1

Browse files
committed
2 parents a88ae6a + 838b568 commit e3b05a1

31 files changed

Lines changed: 4271 additions & 2142 deletions

README.md

Lines changed: 32 additions & 8 deletions
Large diffs are not rendered by default.

config/.env.example

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ YOUKU_CONCURRENCY=8
8181

8282
# ==================== 源排序配置 ====================
8383

84-
# 数据源查询顺序(可选值:360, vod, tmdb, douban, tencent, youku, iqiyi, imgo, bilibili, migu, renren, hanjutv, bahamut, dandan, sohu, leshi, xigua, maiduidui, aiyifan, hongguo, animeko, custom)
84+
# 数据源查询顺序(可选值:360, vod, tmdb, douban, tencent, youku, iqiyi, imgo, bilibili, migu, renren, hanjutv, sohu, leshi, xigua, maiduidui, aiyifan, hongguo, dandan, bahamut, animeko, custom)
8585
# 默认值:douban,360,renren,hanjutv(不包含 tencent, youku, iqiyi, imgo, bilibili, migu, sohu, leshi, xigua, maiduidui, aiyifan, hongguo 等)
8686
# 如需使用腾讯源、优酷源、爱奇艺源、芒果源、B站源、搜狐源、乐视源、西瓜源、埋堆堆源、爱壹帆源、红果源,请手动添加:SOURCE_ORDER=douban,360,tencent,youku,iqiyi,imgo,bilibili,migu,renren,hanjutv,sohu,leshi,xigua,maiduidui,aiyifan,hongguo
8787
# 如需使用巴哈姆特源,请手动添加:SOURCE_ORDER=douban,360,renren,hanjutv,bahamut
@@ -93,12 +93,12 @@ SOURCE_ORDER=douban,360,renren,hanjutv
9393

9494
# 平台优先级排序(用于自动匹配)
9595
# 默认值:空(自动匹配)
96-
# 可选值:qiyi, bilibili1, imgo, youku, qq, migu, sohu, leshi, xigua, maiduidui, aiyifan, hongguo, renren, hanjutv, bahamut, dandan, animeko, custom 或 qiyi&bilibili1&imgo,dandan&animeko
96+
# 可选值:qiyi, bilibili1, imgo, youku, qq, migu, sohu, leshi, xigua, maiduidui, aiyifan, hongguo, renren, hanjutv, dandan, bahamut, animeko, custom 或 qiyi&bilibili1&imgo,dandan&animeko
9797
# 说明:平台排序配置,可以配置自动匹配时的优选平台,当配置合并平台的时候可以指定期望的合并源
9898
# PLATFORM_ORDER=
9999

100100
# ==================== 源合并配置 ====================
101-
# 数据源合并配置(可选值:tencent, youku, iqiyi, imgo, bilibili, migu, renren, hanjutv, bahamut, dandan, sohu, leshi, xigua, maiduidui, aiyifan, hongguo, animeko)
101+
# 数据源合并配置(可选值:tencent, youku, iqiyi, imgo, bilibili, migu, renren, hanjutv, sohu, leshi, xigua, maiduidui, aiyifan, hongguo, dandan, bahamut, animeko)
102102
# 默认值:空
103103
# 说明:配置后将对应源合并同时一起获取弹幕返回,允许多组、允许同时存在、允许多源,允许填单源表示保留原结果,一组中第一个为主源其余为副源,副源往主源合并,主源如果没有结果会轮替下一个作为主源循环
104104
# 格式:源字段&源字段&源字段,源字段
@@ -126,7 +126,7 @@ SOURCE_ORDER=douban,360,renren,hanjutv
126126
# - 可以直接修改下方规则,按需增删关键词
127127
# 示例:只过滤预告和花絮
128128
# EPISODE_TITLE_FILTER=预告|花絮
129-
EPISODE_TITLE_FILTER=(特别|惊喜|纳凉)?企划(?!(书|案|部))|合伙人手记|超前(营业|vlog)?|速览|vlog|(?<!(Chain|Chemical|Nuclear|连锁|化学|核|生化|生理|应激))reaction|(?<!(单))纯享|加更(版|篇)?|抢先(看|版|集|篇)?|(?<!(被|争|谁))抢[先鲜](?!(一步|手|攻|了|告|言|机|话))|抢鲜|预告(?!(函|信|书|犯))|(?<!(死亡|恐怖|灵异|怪谈))花絮(独家)?|(?<!(一|直))直拍|(制作|拍摄|幕后|花絮|未播|独家|演员|导演|主创|杀青|探班|收官|开播|先导|彩蛋|NG|回顾|高光|个人|主创)特辑|(?<!(行动|计划|游戏|任务|危机|神秘|黄金))彩蛋|(?<!(嫌疑人|证人|家属|律师|警方|凶手|死者))专访|(?<!(证人))采访(?!(吸血鬼|鬼))|(正式|角色|先导|概念|首曝|定档|剧情|动画|宣传|主题曲|印象)[\s\.]*[PpPp][VvVv]|(?<!(退居|回归|走向|转战|隐身|藏身|的))幕后(?!(主谋|主使|黑手|真凶|玩家|老板|金主|英雄|功臣|推手|大佬|操纵|交易|策划|博弈|BOSS|真相))(故事|花絮|独家)?|直播(陪看|回顾)|未播(片段)?|衍生(?!(品|物|兽))|番外(?!(地|人))|会员(专享|加长|尊享|专属|版)?|(?<!(鸦|雪|纸|相|照|图|名|大))片花|(?<!(提取|吸收|生命|魔法|修护|美白))精华|看点|速看|解读(?!.*(密文|密码|密电|电报|档案|书信|遗书|碑文|代码|信号|暗号|讯息|谜题|人心|唇语|真相|谜团|梦境))|(?<!(案情|人生|死前|历史|世纪))回顾|影评|解说|吐槽|(?<!(年终|季度|库存|资产|物资|财务|收获|战利))盘点|拍摄花絮|制作花絮|幕后花絮|未播花絮|独家花絮|花絮特辑|先导预告|终极预告|正式预告|官方预告|彩蛋片段|删减片段|未播片段|番外彩蛋|精彩片段|精彩看点|精彩集锦|看点解析|看点预告|NG镜头|NG花絮|番外篇|番外特辑|制作特辑|拍摄特辑|幕后特辑|导演特辑|演员特辑|片尾曲|(?<!(生命|生活|情感|爱情|一段|小|意外))插曲|高光回顾|背景音乐|OST|音乐MV|歌曲MV|前季回顾|剧情回顾|往期回顾|内容总结|剧情盘点|精选合集|剪辑合集|混剪视频|独家专访|演员访谈|导演访谈|主创访谈|媒体采访|发布会采访|陪看(记)?|试看版|短剧|精编|(?<!(Love|Disney|One|C|Note|S\d+|\+|&|\s))Plus|独家版|(?<!(导演|加长|周年))特别版(?!(图|画))|短片|(?<!(新闻|紧急|临时|召开|破坏|大闹|澄清|道歉|新品|产品|事故))发布会|解忧局|走心局|火锅局|巅峰时刻|坞里都知道|福持目标坞民|福利(?!(院|会|主义|课))篇|(福利|加更|番外|彩蛋|衍生|特别|收官|游戏|整蛊|日常)篇|独家(?!(记忆|试爱|报道|秘方|占有|宠爱|恩宠))|.{2,}(?<!(市|分|警|总|省|卫|药|政|监|结|大|开|破|布|僵|困|骗|赌|胜|败|定|乱|危|迷|谜|入|搅|设|中|残|平|和|终|变|对|安|做|书|画|察|务|案|通|信|育|商|象|源|业|冰))局(?!(长|座|势|面|部|内|外|中|限|促|气))|(?<!(重症|隔离|实验|心理|审讯|单向|术后))观察室|上班那点事儿|周top|赛段|VLOG|(?<!(大案|要案|刑侦|侦查|破案|档案|风云|历史|战争|探案|自然|人文|科学|医学|地理|宇宙|赛事|世界杯|奥运))全纪录|开播|先导|总宣|展演|集锦|旅行日记|精彩分享|剧情揭秘(?!(者|人))|(?:^|】\s*|\]\s*)(?:[SC]|SP|OP|ED|PV)\d+(?:[\s::\.\-]|$)
129+
EPISODE_TITLE_FILTER=(特别|惊喜|纳凉)?企划(?!(书|案|部))|合伙人手记|超前(营业|vlog)?|速览|vlog|(?<!(Chain|Chemical|Nuclear|连锁|化学|核|生化|生理|应激))reaction|(?<!(单))纯享|加更(版|篇)?|抢先(看|版|集|篇)?|(?<!(被|争|谁))抢[先鲜](?!(一步|手|攻|了|告|言|机|话))|抢鲜|预告(?!(函|信|书|犯))|(?<!(死亡|恐怖|灵异|怪谈))花絮(独家)?|(?<!(一|直))直拍|(制作|拍摄|幕后|花絮|未播|独家|演员|导演|主创|杀青|探班|收官|开播|先导|彩蛋|NG|回顾|高光|个人|主创)特辑|(?<!(行动|计划|游戏|任务|危机|神秘|黄金))彩蛋|(?<!(嫌疑人|证人|家属|律师|警方|凶手|死者))专访|(?<!(证人))采访(?!(吸血鬼|鬼))|(正式|角色|先导|概念|首曝|定档|剧情|动画|宣传|主题曲|印象)[\s\.]*[PpPp][VvVv]|(?<!(退居|回归|走向|转战|隐身|藏身|的))幕后(?!(主谋|主使|黑手|真凶|玩家|老板|金主|英雄|功臣|推手|大佬|操纵|交易|策划|博弈|BOSS|真相))(故事|花絮|独家)?|直播(陪看|回顾)|未播(片段)?|衍生(?!(品|物|兽))|番外(?!(地|人))|会员(专享|加长|尊享|专属|版)?|(?<!(鸦|雪|纸|相|照|图|名|大))片花|(?<!(提取|吸收|生命|魔法|修护|美白))精华|看点|速看|解读(?!.*(密文|密码|密电|电报|档案|书信|遗书|碑文|代码|信号|暗号|讯息|谜题|人心|唇语|真相|谜团|梦境))|(?<!(案情|人生|死前|历史|世纪))回顾|影评|解说|(?<!(更|会|能|来|的|比|适合|擅长|比起))吐槽(?!.*(艺人|役|大会|担当))|吐槽(?!.*(艺人|役|大会|担当))|吐槽(?!.*(艺人|役|大会|担当))|吐槽(?!.*(艺人|役|大会|担当))|吐槽(?!.*(艺人|役|大会|担当))|(?<!(年终|季度|库存|资产|物资|财务|收获|战利))盘点|拍摄花絮|制作花絮|幕后花絮|未播花絮|独家花絮|花絮特辑|先导预告|终极预告|正式预告|官方预告|彩蛋片段|删减片段|未播片段|番外彩蛋|精彩片段|精彩看点|精彩集锦|看点解析|看点预告|NG镜头|NG花絮|番外篇|番外特辑|制作特辑|拍摄特辑|幕后特辑|导演特辑|演员特辑|片尾曲|(?<!(生命|生活|情感|爱情|一段|小|意外))插曲|高光回顾|背景音乐|OST|音乐MV|歌曲MV|前季回顾|剧情回顾|往期回顾|内容总结|剧情盘点|精选合集|剪辑合集|混剪视频|独家专访|演员访谈|导演访谈|主创访谈|媒体采访|发布会采访|陪看(记)?|试看版|短剧|精编|(?<!(Love|Disney|One|C|Note|S\d+|\+|&|\s))Plus|独家版|(?<!(导演|加长|周年))特别版(?!(图|画))|短片|(?<!(新闻|紧急|临时|召开|破坏|大闹|澄清|道歉|新品|产品|事故))发布会|解忧局|走心局|火锅局|巅峰时刻|坞里都知道|福持目标坞民|福利(?!(院|会|主义|课))篇|(福利|加更|番外|彩蛋|衍生|特别|收官|游戏|整蛊|日常)篇|独家(?!(记忆|试爱|报道|秘方|占有|宠爱|恩宠))|.{2,}(?<!(市|分|警|总|省|卫|药|政|监|结|大|开|破|布|僵|困|骗|赌|胜|败|定|乱|危|迷|谜|入|搅|设|中|残|平|和|终|变|对|安|做|书|画|察|务|案|通|信|育|商|象|源|业|冰))局(?!(长|座|势|面|部|内|外|中|限|促|气))|(?<!(重症|隔离|实验|心理|审讯|单向|术后))观察室|上班那点事儿|周top|赛段|VLOG|(?<!(大案|要案|刑侦|侦查|破案|档案|风云|历史|战争|探案|自然|人文|科学|医学|地理|宇宙|赛事|世界杯|奥运))全纪录|开播|先导|总宣|展演|集锦|旅行日记|精彩分享|剧情揭秘(?!(者|人))|(?:^|】\s*|\]\s*)(?:[SC]|SP|OP|ED|PV)\d+(?:[\s::\.\-]|$)
130130
# ==================== 屏蔽词配置 ====================
131131
# 屏蔽词列表(用于过滤弹幕内容)
132132
# 默认值:空
@@ -255,9 +255,9 @@ USE_BANGUMI_DATA=false
255255
# ==================== 界面配置 ====================
256256

257257
# 管理界面主题
258-
# 默认值:ocean
259-
# 可选值:ocean, forest, graphite, berry, monochrome, sunset, aurora, lavender, mist, terminal
260-
UI_THEME=ocean
258+
# 默认值:shinyo(新叶绿)
259+
# 可选值:shinyo(新叶绿)、sakura(哔哩粉)、tianyi(天依蓝)、hatsune(初音青)、sakuragi(樱木红)、violet(罗兰紫)、amber(LCL橘)、lavender(经典默认)
260+
UI_THEME=shinyo
261261

262262
# ==================== 代理配置 ====================
263263

@@ -313,6 +313,12 @@ SEARCH_CACHE_MINUTES=3
313313
# 设置为 0 表示不缓存
314314
COMMENT_CACHE_MINUTES=3
315315

316+
# 弹幕缓存最少条数
317+
# 默认值:100
318+
# 说明:缓存中的弹幕低于该数量时,无视缓存时间并重新获取最新弹幕
319+
# 设置为 0 表示关闭此机制
320+
COMMENT_CACHE_MIN_COUNT=100
321+
316322
# 红果短剧是否将所有集弹幕按剧集顺序合并为一集,默认关闭
317323
HONGGUO_MERGE_ALL_EPISODES=false
318324

danmu_api/apis/dandan-api.js

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
getSearchCache, removeEarliestAnime, resolveAnimeById, resolveAnimeByIdFromDetailStore, setPreferByAnimeId, setSearchCache, storeAnimeIdsToMap, writeCacheToFile,
1010
updateLocalCaches, setLastSearch, getLastSearch, findAnimeTitleById, findIndexById
1111
} from "../utils/cache-util.js";
12+
import { resolveFavoriteForKeyword } from "../utils/favorite-util.js";
1213
import { formatDanmuResponse, convertToDanmakuJson } from "../utils/danmu-util.js";
1314
import { resolveOffset, resolveOffsetRule, applyOffset } from "../utils/offset-util.js";
1415
import {
@@ -478,7 +479,7 @@ async function executeSourceHandlers(resultData, queryTitle, targetAnimesList, r
478479
}
479480

480481
// Extracted function for GET /api/v2/search/anime
481-
export async function searchAnime(url, preferAnimeId = null, preferSource = null, detailStore = null, targetPlatform = null) {
482+
export async function searchAnime(url, preferAnimeId = null, preferSource = null, detailStore = null, targetPlatform = null, forceRefresh = false) {
482483
let queryTitle = url.searchParams.get("keyword");
483484

484485
// 搜索词杂音清理:移除画质/配音/版本等杂音词后再提交源站搜索
@@ -512,8 +513,19 @@ export async function searchAnime(url, preferAnimeId = null, preferSource = null
512513
const requestAnimeDetailsMap = detailStore instanceof Map ? detailStore : new Map();
513514
const cacheKey = querySeason !== null ? `${queryTitle}_S${querySeason}` : queryTitle;
514515

515-
// 检查搜索缓存
516-
let cachedResults = getSearchCache(cacheKey, requestAnimeDetailsMap);
516+
// 收藏缓存命中后必须直接返回,不能因目标集数判断继续请求外部源。
517+
if (!forceRefresh && resolveFavoriteForKeyword(cacheKey)) {
518+
const favoriteResults = getSearchCache(cacheKey, requestAnimeDetailsMap) || [];
519+
return jsonResponse({
520+
errorCode: 0,
521+
success: true,
522+
errorMessage: "",
523+
animes: favoriteResults,
524+
});
525+
}
526+
527+
// 检查普通搜索缓存;刷新收藏时显式跳过所有缓存。
528+
let cachedResults = forceRefresh ? null : getSearchCache(cacheKey, requestAnimeDetailsMap);
517529

518530
// 如果带季度的特定缓存未命中,尝试获取不带季度的通用搜索缓存
519531
if (cachedResults === null && querySeason !== null) {
@@ -1828,6 +1840,13 @@ export async function matchAnime(url, req, clientIp) {
18281840
]
18291841
}
18301842

1843+
if (resData["matches"] && resData["matches"].length > 0) {
1844+
const favoriteKey = season !== null ? `${title}_S${season}` : title;
1845+
if (resolveFavoriteForKeyword(favoriteKey)) {
1846+
resData["matches"] = resData["matches"].map(m => ({ ...m, isFavorite: true }));
1847+
}
1848+
}
1849+
18311850
log("info", `[system] [match] resMatchData: ${resData}`);
18321851

18331852
// 示例返回

0 commit comments

Comments
 (0)