More rich metadata with NowPlaying

This commit is contained in:
2025-02-15 22:15:59 -08:00
parent d465dbf6fb
commit a3801f6698
7 changed files with 72 additions and 26 deletions

View File

@@ -14,6 +14,15 @@ interface LinkMetadata {
siteName?: string;
}
interface PlaylistItem {
id: number;
filename: string;
title?: string;
playing?: boolean;
current?: boolean;
metadata?: LinkMetadata;
}
export class MediaPlayer {
private playerProcess: ChildProcess;
private socket: Socket;
@@ -46,23 +55,43 @@ export class MediaPlayer {
});
}
public async getPlaylist(): Promise<any> {
public async getPlaylist(): Promise<PlaylistItem[]> {
return this.writeCommand("get_property", ["playlist"])
.then((response) => {
// Enhance playlist items with metadata
const playlist = response.data;
return playlist.map((item: any) => ({
const playlist = response.data as PlaylistItem[];
return playlist.map((item: PlaylistItem) => ({
...item,
metadata: this.metadata.get(item.filename) || {}
}));
});
}
public async getNowPlaying(): Promise<string> {
return this.writeCommand("get_property", ["media-title"])
.then((response) => {
return response.data;
});
public async getNowPlaying(): Promise<PlaylistItem> {
const playlist = await this.getPlaylist();
const currentlyPlayingSong = playlist.find((item: PlaylistItem) => item.current);
const fetchMediaTitle = async (): Promise<string> => {
return (await this.writeCommand("get_property", ["media-title"])).data;
};
if (currentlyPlayingSong !== undefined) {
// Use media title if we don't have a title
if (currentlyPlayingSong.title === undefined && currentlyPlayingSong.metadata?.title === undefined) {
return {
...currentlyPlayingSong,
title: await fetchMediaTitle()
};
}
return currentlyPlayingSong;
}
const mediaTitle = await fetchMediaTitle();
return {
id: 0,
filename: mediaTitle,
title: mediaTitle
};
}
public async getCurrentFile(): Promise<string> {

View File

@@ -63,7 +63,7 @@ apiRouter.post("/previous", withErrorHandling(async (req, res) => {
}));
apiRouter.get("/nowplaying", withErrorHandling(async (req, res) => {
const nowPlaying = await mediaPlayer.getNowPlaying();
const playingItem = await mediaPlayer.getNowPlaying();
const currentFile = await mediaPlayer.getCurrentFile();
const pauseState = await mediaPlayer.getPauseState();
const volume = await mediaPlayer.getVolume();
@@ -71,7 +71,7 @@ apiRouter.get("/nowplaying", withErrorHandling(async (req, res) => {
res.send(JSON.stringify({
success: true,
nowPlaying: nowPlaying,
playingItem: playingItem,
isPaused: pauseState,
volume: volume,
isIdle: idle,