mirror of
https://github.com/Psychotoxical/psysonic.git
synced 2026-07-22 15:25:46 +00:00
6533991e7d
Add CLI commands for stop, shuffle, repeat, mute, star, rating, reload, server list/switch, and Subsonic search; publish extra snapshot fields and server/search JSON for tooling. Single `play <id>` resolves track, album, or artist; artists play a shuffled full discography. Guard Linux tray creation with catch_unwind when Ayatana/AppIndicator .so is missing. Harden bash completion against zsh sourcing (compopt). Narrow AudioEngine field visibility to silence private_interfaces warnings.
36 lines
900 B
TypeScript
36 lines
900 B
TypeScript
import { getAlbum, getSong } from '../api/subsonic';
|
|
import { playAlbum } from './playAlbum';
|
|
import { playArtistShuffled } from './playArtistShuffled';
|
|
import { songToTrack, usePlayerStore } from '../store/playerStore';
|
|
|
|
/**
|
|
* `getSong` → `getAlbum` → `getArtist`: one opaque Subsonic id may refer to a track,
|
|
* album, or artist depending on the server.
|
|
*/
|
|
export async function playByOpaqueId(id: string): Promise<void> {
|
|
const trimmed = id.trim();
|
|
if (!trimmed) return;
|
|
|
|
const song = await getSong(trimmed);
|
|
if (song) {
|
|
usePlayerStore.getState().playTrack(songToTrack(song));
|
|
return;
|
|
}
|
|
|
|
try {
|
|
const { songs } = await getAlbum(trimmed);
|
|
if (songs.length > 0) {
|
|
await playAlbum(trimmed);
|
|
return;
|
|
}
|
|
} catch {
|
|
/* not an album */
|
|
}
|
|
|
|
try {
|
|
await playArtistShuffled(trimmed);
|
|
} catch {
|
|
throw new Error('play_by_id_not_found');
|
|
}
|
|
}
|