50 lines
1.7 KiB
TypeScript
50 lines
1.7 KiB
TypeScript
import axios from 'axios'
|
|
import type { Album, Artist, SearchResult, Track, TrackDetail } from './types'
|
|
|
|
const API_BASE = import.meta.env.VITE_API_BASE_URL ?? ''
|
|
export const API_ROOT = `${API_BASE}/api`
|
|
|
|
const API_KEY = import.meta.env.VITE_API_KEY
|
|
|
|
export const furumiApi = axios.create({
|
|
baseURL: API_ROOT,
|
|
headers: API_KEY ? { 'x-api-key': API_KEY } : {},
|
|
})
|
|
|
|
export async function getArtists(): Promise<Artist[] | null> {
|
|
const res = await furumiApi.get<Artist[]>('/artists').catch(() => null)
|
|
return res?.data ?? null
|
|
}
|
|
|
|
export async function getArtistAlbums(artistSlug: string): Promise<Album[] | null> {
|
|
const res = await furumiApi.get<Album[]>(`/artists/${artistSlug}/albums`).catch(() => null)
|
|
return res?.data ?? null
|
|
}
|
|
|
|
export async function getAlbumTracks(albumSlug: string): Promise<Track[] | null> {
|
|
const res = await furumiApi.get<Track[]>(`/albums/${albumSlug}`).catch(() => null)
|
|
return res?.data ?? null
|
|
}
|
|
|
|
export async function getArtistTracks(artistSlug: string): Promise<Track[] | null> {
|
|
const res = await furumiApi.get<Track[]>(`/artists/${artistSlug}/tracks`).catch(() => null)
|
|
return res?.data ?? null
|
|
}
|
|
|
|
export async function searchTracks(query: string): Promise<SearchResult[] | null> {
|
|
const res = await furumiApi
|
|
.get<SearchResult[]>(`/search?q=${encodeURIComponent(query)}`)
|
|
.catch(() => null)
|
|
return res?.data ?? null
|
|
}
|
|
|
|
export async function getTrackInfo(trackSlug: string): Promise<TrackDetail | null> {
|
|
const res = await furumiApi.get<TrackDetail>(`/tracks/${trackSlug}`).catch(() => null)
|
|
return res?.data ?? null
|
|
}
|
|
|
|
export async function preloadStream(trackSlug: string) {
|
|
return await furumiApi.get(`/stream/${trackSlug}`, { responseType: 'blob' }).catch(() => null)
|
|
}
|
|
|