mirror of
https://github.com/kilyabin/psysonic.git
synced 2026-07-24 15:35:41 +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.
26 lines
920 B
TypeScript
26 lines
920 B
TypeScript
import { getAlbum, getArtist } from '../api/subsonic';
|
||
import { shuffleArray, songToTrack, usePlayerStore } from '../store/playerStore';
|
||
|
||
/**
|
||
* All tracks from the artist’s albums, shuffled — same idea as Artist page “shuffle play”.
|
||
*/
|
||
export async function playArtistShuffled(artistId: string): Promise<void> {
|
||
const { albums } = await getArtist(artistId);
|
||
if (albums.length === 0) {
|
||
throw new Error('play_artist_no_tracks');
|
||
}
|
||
|
||
const results = await Promise.all(albums.map(a => getAlbum(a.id)));
|
||
const sorted = [...results].sort((a, b) => (a.album.year ?? 0) - (b.album.year ?? 0));
|
||
const tracks = sorted.flatMap(r =>
|
||
[...r.songs].sort((a, b) => (a.track ?? 0) - (b.track ?? 0)).map(songToTrack),
|
||
);
|
||
|
||
if (tracks.length === 0) {
|
||
throw new Error('play_artist_no_tracks');
|
||
}
|
||
|
||
const shuffled = shuffleArray(tracks);
|
||
usePlayerStore.getState().playTrack(shuffled[0], shuffled);
|
||
}
|