import { ofetch } from 'ofetch' import { db } from '~/drizzle/db' import { systemSettings } from '~/drizzle/schema' import { CacheService } from './cacheService' export interface KuGouQrLoginStep1 { status?: number data?: { qr_id?: string login_id?: string qrimg?: string img?: string extra?: any } error?: string errcode?: number } export interface KuGouQrLoginStep2 { status?: number data?: { status?: number token?: string cookie?: string userinfo?: any auth_params?: any } error?: string errcode?: number message?: string } let cacheService: CacheService | null = null function getCache() { if (!cacheService) cacheService = CacheService.getInstance() return cacheService } async function readAdminSettings() { try { const c = getCache() const cached = await c.getSystemSettings?.() if (cached && (cached.kugouApiBaseUrl || cached.kugouAdminToken || cached.kugouAdminCookie)) { return cached } } catch (_) {} const rows = await db.select().from(systemSettings).limit(1) return rows[0] || null } export interface KuGouCallOptions { forceCookie?: string forceToken?: string } export async function kuGouFetch( path: string, query?: Record, options?: KuGouCallOptions, ): Promise { const settings = (await readAdminSettings()) as any const base = (options?.forceToken ? null : settings?.kugouApiBaseUrl) || process.env.KUGOU_API_BASE || '' const headers: Record = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128 Safari/537.36', } const cookie = options?.forceCookie || settings?.kugouAdminCookie if (cookie) headers.Cookie = cookie const url = base + path return await ofetch(url, { query, headers, retry: 1, timeout: 20000, onRequest({ options }) { const token = options?.forceToken || settings?.kugouAdminToken if (token && options.query) { ;(options.query as any).token = token } }, }) } export async function kuGouQrLoginCreate(platform: 'web' | 'android' | 'lite' = 'web') { return await kuGouFetch( platform === 'lite' ? '/login/qr/lite/create' : '/login/qr/create', { timestamp: Date.now() }, ) } export async function kuGouQrLoginCheck(params: { qr_id?: string; login_id?: string; key?: string; cookie?: string }) { return await kuGouFetch( '/login/qr/check', { qr_id: params.qr_id, login_id: params.login_id, key: params.key, timestamp: Date.now(), }, { forceCookie: params.cookie }, ) }