diff --git a/src/app/admin/page.tsx b/src/app/admin/page.tsx
index 3f616e3..ef36899 100644
--- a/src/app/admin/page.tsx
+++ b/src/app/admin/page.tsx
@@ -3718,6 +3718,8 @@ const NetDiskConfigComponent = ({
const [ucCookie, setUcCookie] = useState('');
const [ucToken, setUcToken] = useState('');
const [ucSavePath, setUcSavePath] = useState('/');
+ const [pan115Enabled, setPan115Enabled] = useState(false);
+ const [pan115Cookie, setPan115Cookie] = useState('');
useEffect(() => {
const quark = config?.NetDiskConfig?.Quark;
@@ -3739,6 +3741,8 @@ const NetDiskConfigComponent = ({
setUcCookie(config?.NetDiskConfig?.UC?.Cookie || '');
setUcToken(config?.NetDiskConfig?.UC?.Token || '');
setUcSavePath(config?.NetDiskConfig?.UC?.SavePath || '/');
+ setPan115Enabled(config?.NetDiskConfig?.Pan115?.Enabled || false);
+ setPan115Cookie(config?.NetDiskConfig?.Pan115?.Cookie || '');
}, [config]);
const handleSave = async () => {
@@ -3777,6 +3781,10 @@ const NetDiskConfigComponent = ({
Token: ucToken,
SavePath: ucSavePath,
},
+ Pan115: {
+ Enabled: pan115Enabled,
+ Cookie: pan115Cookie,
+ },
}),
});
@@ -3962,6 +3970,34 @@ const NetDiskConfigComponent = ({
});
};
+ const handleValidatePan115 = async () => {
+ await withLoading('validatePan115NetDisk', async () => {
+ try {
+ const response = await fetch('/api/admin/netdisk', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({
+ action: 'validate',
+ provider: 'pan115',
+ Pan115: {
+ Cookie: pan115Cookie,
+ },
+ }),
+ });
+
+ const data = await response.json();
+ if (!response.ok) {
+ throw new Error(data.error || '校验失败');
+ }
+
+ showSuccess(data.message || '115 Cookie 格式正常', showAlert);
+ } catch (error) {
+ showError(error instanceof Error ? error.message : '校验失败', showAlert);
+ throw error;
+ }
+ });
+ };
+
return (
@@ -4386,6 +4422,64 @@ const NetDiskConfigComponent = ({
+
+
+ 115网盘
+
+
+
+
+
+ 启用115网盘
+
+
+ 开启后,网盘搜索中的115网盘资源会显示“立即播放”按钮
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{
+ const parsed = parseVideoFileName(file.name);
+ return {
+ ...file,
+ originalIndex: index,
+ sortEpisode: parsed.episode || index + 1,
+ isOVA: parsed.isOVA,
+ displayTitle: formatNetdiskEpisodeTitle(parsed, file.name),
+ };
+ })
+ .sort((a, b) => {
+ if (a.isOVA && !b.isOVA) return 1;
+ if (!a.isOVA && b.isOVA) return -1;
+ return a.sortEpisode !== b.sortEpisode
+ ? a.sortEpisode - b.sortEpisode
+ : a.name.localeCompare(b.name, 'zh-Hans-CN', { numeric: true, sensitivity: 'base' });
+ });
+
+ return NextResponse.json({
+ source: NETDISK_115_SOURCE,
+ source_name: '115网盘',
+ id: pan115Session.id,
+ title: title || pan115Session.title,
+ poster: '',
+ year: '',
+ douban_id: 0,
+ desc: `115网盘分享:${pan115Session.shareUrl}`,
+ episodes: parsedFiles.map((file) => (
+ `/api/netdisk/115/play?id=${encodeURIComponent(pan115Session.id)}&episodeIndex=${file.originalIndex}`
+ )),
+ episodes_titles: parsedFiles.map((file) => file.displayTitle),
+ proxyMode: false,
+ });
+ } catch (error) {
+ return NextResponse.json(
+ { error: (error as Error).message },
+ { status: 500 }
+ );
+ }
+ }
+
if (sourceCode === NETDISK_QUARK_SOURCE || sourceCode === LEGACY_QUARK_TEMP_SOURCE) {
try {
const config = await getConfig();
diff --git a/src/app/page.tsx b/src/app/page.tsx
index 303e758..a15eb01 100644
--- a/src/app/page.tsx
+++ b/src/app/page.tsx
@@ -72,7 +72,7 @@ function HomeClient() {
const [toast, setToast] = useState(null);
const detectNetdiskLink = (url: string): {
- provider: 'quark' | 'mobile' | 'baidu' | 'tianyi' | '123' | 'uc';
+ provider: 'quark' | 'mobile' | 'baidu' | 'tianyi' | '123' | 'uc' | '115';
shareUrl: string;
passcode?: string;
} | null => {
@@ -146,6 +146,17 @@ function HomeClient() {
return { provider: 'mobile', shareUrl: trimmed };
}
+ if (/https:\/\/(?:115|anxia|115cdn)\.com\/s\//i.test(trimmed)) {
+ return {
+ provider: '115',
+ shareUrl: trimmed,
+ passcode: pickPasscode(
+ trimmed.match(/[?&](?:password|pwd|passcode)=([^&]+)/i)?.[1],
+ inlinePasscode(trimmed)
+ ),
+ };
+ }
+
return null;
};
@@ -168,6 +179,8 @@ function HomeClient() {
? 'netdisk-baidu'
: netdisk.provider === 'tianyi'
? 'netdisk-tianyi'
+ : netdisk.provider === '115'
+ ? 'netdisk-115'
: netdisk.provider === 'uc'
? 'netdisk-uc'
: netdisk.provider === '123'
@@ -860,7 +873,7 @@ function HomeClient() {
请输入可直接播放的视频链接。
- 支持夸克、UC、百度、天翼、移动、123 网盘在线播放。
+ 支持夸克、UC、百度、天翼、移动、123、115 网盘在线播放。
);
})()}
- {(cloudType === 'quark' || cloudType === 'mobile' || cloudType === 'baidu' || cloudType === 'tianyi' || cloudType === '123' || cloudType === 'uc') && (
+ {(cloudType === 'quark' || cloudType === 'mobile' || cloudType === 'baidu' || cloudType === 'tianyi' || cloudType === '123' || cloudType === 'uc' || cloudType === '115') && (
<>