// API 基地址:Tauri 生产环境使用绝对路径,浏览器环境使用相对路径 // 导出供 SSE、媒体文件等非 fetch 场景使用 const BASE = window.location.protocol === 'http:' || window.location.protocol === 'https:' ? '' // 浏览器环境 — 同源请求 : 'http://localhost:10801'; // Tauri 生产环境 (tauri://) export const API_BASE = BASE; async function request(url, options = {}) { const res = await fetch(`${BASE}${url}`, { headers: { 'Content-Type': 'application/json' }, ...options, }); return res.json(); } function formEncode(data) { return Object.entries(data) .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`) .join('&'); } // ============ Auth ============ export async function login(username, password) { const res = await fetch(`${BASE}/api/login`, { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: formEncode({ username, password }), }); return res.json(); } // ============ Settings ============ export async function getSettings() { const res = await fetch(`${BASE}/api/settings`); return res.json(); } export async function updateSettings(data) { return request('/api/settings', { method: 'POST', body: JSON.stringify(data), }); } // ============ Media Files ============ export async function getMediaFiles() { const res = await fetch(`${BASE}/media`); return res.json(); } export async function uploadFiles(files) { for (const file of files) { const fd = new FormData(); fd.append('file', file); await fetch(`${BASE}/upload`, { method: 'POST', body: fd }); } } export async function addUrlMedia(url) { return request('/api/media/add-url', { method: 'POST', body: JSON.stringify({ url }), }); } export async function deleteMedia(path) { return request('/api/delete', { method: 'POST', body: JSON.stringify({ path }), }); } // ============ Playlist ============ export async function getPlaylist() { const res = await fetch(`${BASE}/api/playlist`); return res.json(); } export async function addToPlaylist(path) { return request('/api/playlist/add', { method: 'POST', body: JSON.stringify({ path }), }); } export async function removeFromPlaylist(path) { return request('/api/playlist/remove', { method: 'POST', body: JSON.stringify({ path }), }); } // ============ Playback Control ============ export async function sendControl(action) { return request('/api/control', { method: 'POST', body: JSON.stringify({ action }), }); } export async function getState() { const res = await fetch(`${BASE}/api/state`); return res.json(); } export async function updateState(state) { return request('/api/state', { method: 'POST', body: JSON.stringify({ state }), }); }