| // src/api/torrent.js | |
| import { api } from './auth'; // 复用已有的axios实例 | |
| /** | |
| * 创建并上传一个种子 | |
| * @param {File} file 种子文件 (.torrent) | |
| * @param {Object} bodyObj 包含种子信息的对象,格式如下: | |
| * { | |
| * torrentName: "测试下载", | |
| * description: "A high-quality 1080p version of Example Movie.", | |
| * category: "电影", | |
| * region: "USA", | |
| * resolution: "1080p", | |
| * subtitle: "English", | |
| * filePath: "D:/大学/大三_下/torrentFrom/[电影天堂www.dytt89.com]两杆大烟枪BD中英双字.mp4.torrent" | |
| * } | |
| */ | |
| export async function createTorrent(file, bodyObj) { | |
| const formData = new FormData(); | |
| formData.append('file', file); | |
| // 关键修改:将JSON字符串转换为Blob对象,并设置正确的Content-Type | |
| formData.append('body', new Blob([JSON.stringify(bodyObj)], { | |
| type: 'application/json' | |
| })); | |
| try { | |
| const response = await api.post('/torrent', formData, { | |
| headers: { | |
| } | |
| }); | |
| return response.data; | |
| } catch (error) { | |
| console.error('上传种子失败:', error); | |
| throw error; | |
| } | |
| }; | |
| /** | |
| * 下载种子文件 | |
| * @param {number} torrentId 种子ID | |
| * @param {string} downloadPath 下载路径 | |
| */ | |
| export async function downloadTorrent(torrentId, downloadPath) { | |
| try { | |
| const response = await api.get(`/torrent/downloadTorrent`, { | |
| params: { | |
| id: torrentId, | |
| downloadPath: downloadPath | |
| } | |
| }); | |
| return response.data; | |
| } catch (error) { | |
| console.error('下载种子失败:', error); | |
| throw error; | |
| } | |
| } | |
| /** | |
| * 获取下载进度 | |
| */ | |
| export async function getDownloadProgress() { | |
| try { | |
| const response = await api.get('/torrent/getProgress'); | |
| return response.data; | |
| } catch (error) { | |
| console.error('获取下载进度失败:', error); | |
| throw error; | |
| } | |
| } | |
| export const getTorrents = (page = 1, size = 5) => { | |
| return api.get('/torrent', { | |
| params: { page, size } | |
| }); | |
| }; | |
| export const getTorrentDetail = (torrentId) => { | |
| return api.get(`/torrent/${torrentId}`).then(response => { | |
| // 确保数据结构一致 | |
| if (response.data && response.data.data) { | |
| return { | |
| ...response, | |
| data: { | |
| ...response.data, | |
| data: { | |
| torrent: response.data.data.torrent, // 直接使用后端返回的格式化数据 | |
| comments: response.data.data.comments || [] | |
| } | |
| } | |
| }; | |
| } | |
| return response; | |
| }); | |
| }; | |
| export const likeTorrent = (torrentId) => { | |
| return api.post(`/torrent/${torrentId}/like`); | |
| }; | |
| export const addTorrentComment = (torrentId, commentData) => { | |
| return api.post(`/torrent/${torrentId}/comments`, commentData); | |
| }; | |
| export const deleteTorrent = (torrentId) => { | |
| return api.delete(`/torrent/deleteTorrent/${torrentId}`); | |
| }; | |
| // // 上传种子接口 | |
| // export const uploadTorrent = async (torrentFile, torrentData, onProgress) => { | |
| // // 1. 基础验证 | |
| // if (!torrentFile || !torrentFile.name.endsWith('.torrent')) { | |
| // throw new Error('请选择有效的.torrent文件'); | |
| // } | |
| // // 2. 构建FormData | |
| // const formData = new FormData(); | |
| // formData.append('file', torrentFile); | |
| // // 确保JSON内容使用正确的Content-Type | |
| // const metadataBlob = new Blob( | |
| // [JSON.stringify(torrentData)], | |
| // { type: 'application/json' } | |
| // ); | |
| // formData.append('body', metadataBlob); | |
| // // 3. 获取认证token(根据你的实际存储方式调整) | |
| // const token = localStorage.getItem('token') || ''; | |
| // try { | |
| // const response = await api.post('/api/torrents', formData, { | |
| // headers: { | |
| // 'Authorization': `Bearer ${token}`, | |
| // }, | |
| // onUploadProgress: (progressEvent) => { | |
| // if (onProgress && progressEvent.total) { | |
| // const percent = Math.round((progressEvent.loaded * 100) / progressEvent.total); | |
| // onProgress(percent); | |
| // } | |
| // } | |
| // }); | |
| // return response.data; | |
| // } catch (error) { | |
| // console.error('上传失败:', error); | |
| // // 增强错误处理 | |
| // let errorMessage = '上传失败'; | |
| // if (error.response) { | |
| // errorMessage = error.response.data?.message || | |
| // `服务器错误: ${error.response.status}`; | |
| // } else if (error.request) { | |
| // errorMessage = '网络错误,请检查连接'; | |
| // } | |
| // throw new Error(errorMessage); | |
| // } | |
| // }; | |
| export const searchTorrents = (keyword, page = 1, size = 5) => { | |
| return api.get('/torrent/search', { | |
| params: { keyword, page, size } | |
| }); | |
| }; |