mirror of
https://github.com/Psychotoxical/psysonic.git
synced 2026-07-22 07:15:47 +00:00
9606a99efb
Seven domain-eng splits peel ~200 LOC of read endpoints out of `api/subsonic.ts`: - `subsonicStreamUrl.ts` — `buildStreamUrl`, `coverArtCacheKey`, `buildCoverArtUrl`, `buildDownloadUrl` (token-signed URL builders for the four /rest endpoints we hand to the browser). - `subsonicStarRating.ts` — `getStarred`, `star`, `unstar`, `setRating`, `probeEntityRatingSupport`. `setRating` still triggers the lazy `navidromeBrowse` cache invalidation; the same-folder lazy import path is preserved. - `subsonicSearch.ts` — `search`, `searchSongsPaged`. - `subsonicScrobble.ts` — `scrobbleSong`, `reportNowPlaying`, `getNowPlaying`. - `subsonicAlbumInfo.ts` — `getAlbumInfo2`. - `subsonicLyrics.ts` — `getLyricsBySongId`. - `subsonicGenres.ts` — `getGenres`, `getAlbumsByGenre`. 63 external call sites migrated to direct imports. Four `vi.mock` targets in the store-level tests pointed at `../api/subsonic` and were updated to the new module paths. Pure code-move. subsonic.ts: 762 → 561 LOC (−201).
38 lines
1.5 KiB
TypeScript
38 lines
1.5 KiB
TypeScript
import { setRating } from '../api/subsonicStarRating';
|
|
import type { Track } from './playerStoreTypes';
|
|
import { useAuthStore } from './authStore';
|
|
import { usePlayerStore } from './playerStore';
|
|
/**
|
|
* Skip → 1★ behaviour: every user-initiated `next()` on an unrated track
|
|
* counts in `authStore.skipStarManualSkipCountsByKey` (persisted). Once the
|
|
* configured threshold is crossed, the track is auto-rated 1★ — both on the
|
|
* Subsonic server and in local Zustand state (queue + currentTrack + the
|
|
* override map that QueuePanel reads).
|
|
*
|
|
* Natural track end (incl. gapless advance) does NOT count; it clears the
|
|
* threshold counter elsewhere. Already-rated tracks are skipped silently.
|
|
*/
|
|
export function applySkipStarOnManualNext(skippedTrack: Track | null, manual: boolean): void {
|
|
if (!manual || !skippedTrack) return;
|
|
const id = skippedTrack.id;
|
|
const adv = useAuthStore.getState().recordSkipStarManualAdvance(id);
|
|
if (!adv?.crossedThreshold) return;
|
|
const live = usePlayerStore.getState();
|
|
const fromQueue = live.queue.find(t => t.id === id);
|
|
const cur =
|
|
live.userRatingOverrides[id] ??
|
|
fromQueue?.userRating ??
|
|
skippedTrack.userRating ??
|
|
0;
|
|
if (cur >= 1) return;
|
|
setRating(id, 1)
|
|
.then(() => {
|
|
usePlayerStore.setState(s => ({
|
|
queue: s.queue.map(t => (t.id === id ? { ...t, userRating: 1 } : t)),
|
|
currentTrack: s.currentTrack?.id === id ? { ...s.currentTrack, userRating: 1 } : s.currentTrack,
|
|
userRatingOverrides: { ...s.userRatingOverrides, [id]: 1 },
|
|
}));
|
|
})
|
|
.catch(() => {});
|
|
}
|