diff --git a/src/lib/components/media/mediaCard.svelte b/src/lib/components/media/mediaCard.svelte index af76632..7bcb4a6 100644 --- a/src/lib/components/media/mediaCard.svelte +++ b/src/lib/components/media/mediaCard.svelte @@ -28,7 +28,7 @@ { - if (mediaItem.type === 'song') $queue.push(mediaItem) + if (mediaItem.type === 'song') $queue.enqueue(mediaItem) }} > diff --git a/src/lib/components/media/mediaPlayer.svelte b/src/lib/components/media/mediaPlayer.svelte index 658d12e..cf16c15 100644 --- a/src/lib/components/media/mediaPlayer.svelte +++ b/src/lib/components/media/mediaPlayer.svelte @@ -5,8 +5,7 @@ // import { FastAverageColor } from 'fast-average-color' import Slider from '$lib/components/util/slider.svelte' - let queuePosition = 0 - $: currentlyPlaying = $queue[queuePosition] + $: console.log(`Queue is now: ${$queue}`) let paused = true, shuffle = false, @@ -49,7 +48,8 @@ $: if (!seeking && durationTimestamp) durationTimestamp.innerText = formatTime(duration) -{#if currentlyPlaying} +{#if $queue.queue.length > 0} + {@const currentlyPlaying = $queue.getCurrent()}
@@ -108,11 +108,11 @@
-
-
{/if} diff --git a/src/lib/stores.ts b/src/lib/stores.ts index 7961b87..c9c38ab 100644 --- a/src/lib/stores.ts +++ b/src/lib/stores.ts @@ -1,11 +1,51 @@ -import { writable, type Writable } from 'svelte/store' +import { writable, readable, type Writable, type Readable } from 'svelte/store' import type { AlertType } from '$lib/components/util/alert.svelte' export const pageWidth: Writable = writable() export const newestAlert: Writable<[AlertType, string]> = writable() -export const queue: Writable = writable() - const youtubeMusicBackground: string = 'https://www.gstatic.com/youtube/media/ytm/images/sbg/wsbg@4000x2250.png' // Default Youtube music background export const backgroundImage: Writable = writable(youtubeMusicBackground) + +class Queue { + public currentPos: number + public queue: Song[] + + constructor() { + this.queue = [] + this.currentPos = 0 + } + + public enqueue = (...songs: Song[]): void => { + this.queue.push(...songs) + } + + public getStart = (): Song | undefined => { + return this.queue[0] + } + + public getCurrent = (): Song => { + return this.queue[this.currentPos] + } + + public next = (): Song | undefined => { + if (this.queue.length > this.currentPos + 1) { + this.currentPos += 1 + return this.queue[this.currentPos] + } + + return undefined + } + + public previous = (): Song | undefined => { + if (this.currentPos > 0) { + this.currentPos -= 1 + return this.queue[this.currentPos] + } + + return undefined + } +} + +export const queue: Readable = readable(new Queue()) diff --git a/src/routes/api/remoteImage/+server.ts b/src/routes/api/remoteImage/+server.ts index 0a88a83..b8598c8 100644 --- a/src/routes/api/remoteImage/+server.ts +++ b/src/routes/api/remoteImage/+server.ts @@ -6,7 +6,7 @@ export const GET: RequestHandler = async ({ url }) => { const imageUrl = url.searchParams.get('url') if (!imageUrl || !URL.canParse(imageUrl)) return new Response('Missing or invalid url parameter', { status: 400 }) - const fetchImage = async (): Promise => { + const fetchImage = async (): Promise => { const MAX_TRIES = 3 let tries = 0 while (tries < MAX_TRIES) { @@ -20,11 +20,11 @@ export const GET: RequestHandler = async ({ url }) => { const contentType = response.headers.get('content-type') if (!contentType || !contentType.startsWith('image')) throw new Error(`Url ${imageUrl} does not link to an image`) - return await response.arrayBuffer() + return response } throw new Error('Exceed Max Retires') } - return new Response(await fetchImage()) + return await fetchImage() }