mirror of
https://github.com/kilyabin/psysonic.git
synced 2026-07-21 22:15:40 +00:00
ab5c8e0b48
Lucky Mix targets ~50 tracks in one run: pick seeds from your most-played artists/albums and 4+ rated songs, add similar tracks, then fill the mix with random library picks, skipping anything you rated 1–2. On start it trims the old “upcoming” tail so the queue does not show stale next tracks, starts playback on the first viable seed, routes to Now Playing, and can emit structured steps to the backend debug log.
68 lines
2.3 KiB
TypeScript
68 lines
2.3 KiB
TypeScript
import { ALL_NAV_ITEMS } from '../config/navItems';
|
|
import type { SidebarItemConfig } from '../store/sidebarStore';
|
|
|
|
export type SidebarNavSection = 'library' | 'system';
|
|
|
|
export type SidebarNavDropTarget = {
|
|
idx: number;
|
|
before: boolean;
|
|
section: SidebarNavSection;
|
|
};
|
|
|
|
export function getLibraryItemsForReorder(
|
|
items: SidebarItemConfig[],
|
|
randomNavMode: 'hub' | 'separate',
|
|
): SidebarItemConfig[] {
|
|
return items.filter(cfg => {
|
|
if (!ALL_NAV_ITEMS[cfg.id] || ALL_NAV_ITEMS[cfg.id].section !== 'library') return false;
|
|
if (randomNavMode === 'hub' && (cfg.id === 'randomMix' || cfg.id === 'randomAlbums' || cfg.id === 'luckyMix')) return false;
|
|
if (randomNavMode === 'separate' && cfg.id === 'randomPicker') return false;
|
|
return true;
|
|
});
|
|
}
|
|
|
|
export function getSystemItemsForReorder(items: SidebarItemConfig[]): SidebarItemConfig[] {
|
|
return items.filter(cfg => ALL_NAV_ITEMS[cfg.id]?.section === 'system');
|
|
}
|
|
|
|
/** Same entries as in Settings toggles — safe to hide via drag-out. */
|
|
export function isSidebarNavItemUserHideable(id: string): boolean {
|
|
return Boolean(ALL_NAV_ITEMS[id]);
|
|
}
|
|
|
|
/**
|
|
* Reorders one sidebar section (library or system) like the Settings customizer.
|
|
* Returns a new `items` array, or null if nothing changes.
|
|
*/
|
|
export function applySidebarDropReorder(
|
|
allItems: SidebarItemConfig[],
|
|
section: SidebarNavSection,
|
|
fromIdx: number,
|
|
target: SidebarNavDropTarget | null,
|
|
randomNavMode: 'hub' | 'separate',
|
|
): SidebarItemConfig[] | null {
|
|
if (!target || target.section !== section) return null;
|
|
|
|
const sectionItems =
|
|
section === 'library'
|
|
? [...getLibraryItemsForReorder(allItems, randomNavMode)]
|
|
: [...getSystemItemsForReorder(allItems)];
|
|
|
|
const insertBefore = target.before ? target.idx : target.idx + 1;
|
|
if (insertBefore === fromIdx || insertBefore === fromIdx + 1) return null;
|
|
|
|
const [moved] = sectionItems.splice(fromIdx, 1);
|
|
sectionItems.splice(insertBefore > fromIdx ? insertBefore - 1 : insertBefore, 0, moved);
|
|
|
|
const visibleIds = new Set(sectionItems.map(c => c.id));
|
|
const next = [...allItems];
|
|
const positions = next
|
|
.map((cfg, i) => ({ cfg, i }))
|
|
.filter(({ cfg }) => visibleIds.has(cfg.id))
|
|
.map(({ i }) => i);
|
|
positions.forEach((pos, i) => {
|
|
next[pos] = sectionItems[i];
|
|
});
|
|
return next;
|
|
}
|