83 lines
1.9 KiB
TypeScript
83 lines
1.9 KiB
TypeScript
|
|
export interface NowPlayingResponse {
|
||
|
|
success: boolean;
|
||
|
|
nowPlaying: string;
|
||
|
|
isPaused: boolean;
|
||
|
|
volume: number;
|
||
|
|
isIdle: boolean;
|
||
|
|
currentFile: string;
|
||
|
|
}
|
||
|
|
|
||
|
|
export interface PlaylistItem {
|
||
|
|
filename: string;
|
||
|
|
title: string | null;
|
||
|
|
id: number;
|
||
|
|
playing: boolean | null;
|
||
|
|
}
|
||
|
|
|
||
|
|
export const API = {
|
||
|
|
async getPlaylist(): Promise<PlaylistItem[]> {
|
||
|
|
const response = await fetch('/api/playlist');
|
||
|
|
return response.json();
|
||
|
|
},
|
||
|
|
|
||
|
|
async addToPlaylist(url: string): Promise<void> {
|
||
|
|
await fetch('/api/playlist', {
|
||
|
|
method: 'POST',
|
||
|
|
headers: {
|
||
|
|
'Content-Type': 'application/json',
|
||
|
|
},
|
||
|
|
body: JSON.stringify({ url }),
|
||
|
|
});
|
||
|
|
},
|
||
|
|
|
||
|
|
async removeFromPlaylist(index: number): Promise<void> {
|
||
|
|
await fetch(`/api/playlist/${index}`, {
|
||
|
|
method: 'DELETE',
|
||
|
|
});
|
||
|
|
},
|
||
|
|
|
||
|
|
async play(): Promise<void> {
|
||
|
|
await fetch('/api/play', { method: 'POST' });
|
||
|
|
},
|
||
|
|
|
||
|
|
async pause(): Promise<void> {
|
||
|
|
await fetch('/api/pause', { method: 'POST' });
|
||
|
|
},
|
||
|
|
|
||
|
|
async skip(): Promise<void> {
|
||
|
|
await fetch('/api/skip', { method: 'POST' });
|
||
|
|
},
|
||
|
|
|
||
|
|
async skipTo(index: number): Promise<void> {
|
||
|
|
await fetch(`/api/skip/${index}`, { method: 'POST' });
|
||
|
|
},
|
||
|
|
|
||
|
|
async previous(): Promise<void> {
|
||
|
|
await fetch('/api/previous', { method: 'POST' });
|
||
|
|
},
|
||
|
|
|
||
|
|
async getNowPlaying(): Promise<NowPlayingResponse> {
|
||
|
|
const response = await fetch('/api/nowplaying');
|
||
|
|
return response.json();
|
||
|
|
},
|
||
|
|
|
||
|
|
async setVolume(volume: number): Promise<void> {
|
||
|
|
await fetch('/api/volume', {
|
||
|
|
method: 'POST',
|
||
|
|
headers: {
|
||
|
|
'Content-Type': 'application/json',
|
||
|
|
},
|
||
|
|
body: JSON.stringify({ volume }),
|
||
|
|
});
|
||
|
|
},
|
||
|
|
|
||
|
|
subscribeToEvents(onMessage: (event: any) => void): WebSocket {
|
||
|
|
const ws = new WebSocket(`ws://${window.location.host}/api/events`);
|
||
|
|
ws.onmessage = (event) => {
|
||
|
|
onMessage(JSON.parse(event.data));
|
||
|
|
};
|
||
|
|
|
||
|
|
return ws;
|
||
|
|
}
|
||
|
|
};
|