diff --git a/apps/web/src/pages/Videos.tsx b/apps/web/src/pages/Videos.tsx index 09478d6..31f3918 100644 --- a/apps/web/src/pages/Videos.tsx +++ b/apps/web/src/pages/Videos.tsx @@ -41,6 +41,16 @@ const formatSize = (bytes?: number) => { return `${size.toFixed(2)} ${units[i]}`; }; +const getExtFromUrl = (url: string): string => { + try { + const pathname = new URL(url).pathname; + const ext = pathname.split('.').pop(); + return ext && ext.length <= 5 ? ext : 'mp4'; + } catch { + return 'mp4'; + } +}; + export default function VideosPage() { const user = useAuthStore((state) => state.user); const [videos, setVideos] = useState([]); @@ -115,40 +125,40 @@ export default function VideosPage() { } }; + const [downloadResults, setDownloadResults] = useState([]); + const [downloadModalOpen, setDownloadModalOpen] = useState(false); + const handleBatchDownload = async () => { const ids = selectedRows.map((v) => v.videoId); try { const results = await batchDownload(ids); const valid = results.filter((r) => r.urls.length > 0); - showDownloadResults(valid); + setDownloadResults(valid); + setDownloadModalOpen(true); setSelectedRows([]); } catch (error) { message.error('获取下载地址失败'); } }; - const showDownloadResults = (results: DownloadResult[]) => { - Modal.info({ - title: '批量下载地址', - width: 800, - content: ( -
- {results.map((item) => ( -
- {item.title || item.videoId} -
    - {item.urls.map((url, idx) => ( -
  • - {url.url} - {url.definition} -
  • - ))} -
-
- ))} -
- ), + const startDownloads = () => { + let count = 0; + downloadResults.forEach((item) => { + item.urls.forEach((urlInfo) => { + const link = document.createElement('a'); + link.href = urlInfo.url; + link.target = '_blank'; + link.rel = 'noreferrer'; + link.download = `${item.title || item.videoId}_${urlInfo.definition}.${getExtFromUrl(urlInfo.url)}`; + document.body.appendChild(link); + setTimeout(() => { + link.click(); + document.body.removeChild(link); + }, count * 300); + count++; + }); }); + message.success(`已尝试触发 ${count} 个下载任务`); }; const handleRowClick = (record: VideoItem) => { @@ -284,6 +294,37 @@ export default function VideosPage() { }} /> + setDownloadModalOpen(false)} + footer={[ + , + , + ]} + > +
+ {downloadResults.map((item) => ( +
+ {item.title || item.videoId} +
    + {item.urls.map((url, idx) => ( +
  • + {url.url} + {url.definition} +
  • + ))} +
+
+ ))} +
+
+