feat: basic player component

This commit is contained in:
2026-08-31 14:28:18 +02:00
parent 5b223875bd
commit 4d9064f5c2
11 changed files with 504 additions and 20 deletions
+100 -7
View File
@@ -1,14 +1,107 @@
import {
queue,
queueIdx,
rawQueue,
shuffle
} from '../state';
import type {
Song
} from '@/ts/dtype/playlist';
import {
queue
} from '../state';
export const addSongList = ( songs: Song[] ) => {
for ( const song of songs ) {
queue.value.push( song );
export const addSongList = ( songs: Song[], first: boolean = false ) => {
if ( first ) {
// FIXME: Needs to insert at current index in queue, but where for rawQueue?
// Probably at end if shuffled, else insert into queue, then copy
rawQueue.value = songs.concat( rawQueue.value );
queue.value = songs.concat( queue.value );
} else {
rawQueue.value = rawQueue.value.concat( songs );
queue.value = queue.value.concat( songs );
}
};
export const shuffleList = () => {};
export const clearQueue = () => {
queue.value = [];
rawQueue.value = [];
};
/**
* Remove a song from the given queue index
* @param idx - The index to remove at
* @returns True if successful, False if not
*/
export const removeSong = ( idx: number ) => {
if ( idx <= queueIdx.value ) return false;
const removed = queue.value.splice( idx, 1 )[0];
// TODO: Check that this works
for ( let i = 0; i < rawQueue.value.length; i++ ) {
if ( rawQueue.value[ i ] === removed ) {
rawQueue.value.splice( i, 1 );
}
}
return true;
};
/**
* Move a song in the queue
* @param idx - The index to move
* @param newIdx - The index to move it to
* @returns True if successful, false if constraints were violated
*/
export const moveSong = ( idx: number, newIdx: number ) => {
if ( idx === newIdx ) return true;
if ( idx <= queueIdx.value || newIdx <= queueIdx.value || idx > queue.value.length || newIdx > queue.value.length )
return false;
// Affects only the queue if shuffled, else copy the queue into rawQueue
const movedEl = queue.value[ idx ]!;
if ( idx < newIdx )
for ( let i = idx + 1; i < Math.min( queue.value.length, newIdx + 1 ); i++ ) {
queue.value[ i - 1 ] = queue.value[ i ]!;
}
else if ( idx > newIdx )
for ( let i = idx + 1; i > Math.max( 0, newIdx + 1 ); i-- ) {
queue.value[ i ] = queue.value[ i - 1 ]!;
}
queue.value[ newIdx ] = movedEl;
if ( !shuffle.value ) {
// If we don't shuffle, the rawQueue should also be updated
rawQueue.value = [];
for ( const song of queue.value ) {
rawQueue.value.push( song );
}
}
return true;
};
/** Shuffle the song list */
export const shuffleList = () => {
const shuffled = rawQueue.value
.map( ( val, idx ) => {
return {
val,
idx,
'sort': Math.random()
};
} ).sort( ( a, b ) => a.sort - b.sort );
const q: Song[] = [];
// Make current song the first in the list
q.push( rawQueue.value[queueIdx.value]! );
for ( const el of shuffled ) {
if ( el.idx !== queueIdx.value )
q.push( el.val );
}
queue.value = q;
};