diff --git a/.gitignore b/.gitignore
index 99d9898..0898abc 100644
--- a/.gitignore
+++ b/.gitignore
@@ -32,3 +32,4 @@ vite.config.ts.timestamp-*
*storybook.log
storybook-static
backups/
+server.log
diff --git a/src/assets/icons/check.svg b/src/assets/icons/check.svg
new file mode 100644
index 0000000..f654ec4
--- /dev/null
+++ b/src/assets/icons/check.svg
@@ -0,0 +1,3 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/clock.svg b/src/assets/icons/clock.svg
new file mode 100644
index 0000000..45f7c20
--- /dev/null
+++ b/src/assets/icons/clock.svg
@@ -0,0 +1,4 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/loader.svg b/src/assets/icons/loader.svg
new file mode 100644
index 0000000..7904da8
--- /dev/null
+++ b/src/assets/icons/loader.svg
@@ -0,0 +1,3 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/settings.svg b/src/assets/icons/settings.svg
new file mode 100644
index 0000000..6284452
--- /dev/null
+++ b/src/assets/icons/settings.svg
@@ -0,0 +1,4 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/trash.svg b/src/assets/icons/trash.svg
new file mode 100644
index 0000000..b95165c
--- /dev/null
+++ b/src/assets/icons/trash.svg
@@ -0,0 +1,3 @@
+
\ No newline at end of file
diff --git a/src/assets/icons/x.svg b/src/assets/icons/x.svg
new file mode 100644
index 0000000..05eacec
--- /dev/null
+++ b/src/assets/icons/x.svg
@@ -0,0 +1,3 @@
+
\ No newline at end of file
diff --git a/src/lib/components/Album.svelte b/src/lib/components/Album.svelte
index cac6695..ea72e0e 100644
--- a/src/lib/components/Album.svelte
+++ b/src/lib/components/Album.svelte
@@ -2,10 +2,9 @@
import { Spring } from 'svelte/motion'
import type { Album } from '$lib/types/lastfm'
import { audioPreview } from '$lib/stores/audio-preview'
- import { nowPlayingStream } from '$lib/stores/now-playing-stream'
import NowPlaying from './NowPlaying.svelte'
- import PlayIcon from '$icons/play.svg'
- import PauseIcon from '$icons/pause.svg'
+ import PlayIcon from '$icons/play.svg?component'
+ import PauseIcon from '$icons/pause.svg?component'
interface AlbumProps {
album?: Album
@@ -32,8 +31,8 @@
})
const scale = new Spring(1, {
- stiffness: 0.2,
- damping: 0.12
+ stiffness: 0.3,
+ damping: 0.25
})
// Determine if this album should shrink
@@ -41,9 +40,9 @@
$effect(() => {
if (isHovering) {
- scale.target = 1.1
+ scale.target = 1.05
} else if (shouldShrink) {
- scale.target = 0.95
+ scale.target = 0.97
} else {
scale.target = 1
}
@@ -99,32 +98,17 @@
const hasPreview = $derived(!!album?.appleMusicData?.previewUrl)
- // Subscribe to real-time now playing updates
- let realtimeNowPlaying = $state<{ isNowPlaying: boolean; nowPlayingTrack?: string } | null>(null)
-
- $effect(() => {
- if (album) {
- const unsubscribe = nowPlayingStream.isAlbumPlaying.subscribe((checkAlbum) => {
- const status = checkAlbum(album.artist.name, album.name)
- if (status !== null) {
- realtimeNowPlaying = status
- }
- })
- return unsubscribe
- }
- })
-
- // Combine initial state with real-time updates
- const isNowPlaying = $derived(realtimeNowPlaying?.isNowPlaying ?? album?.isNowPlaying ?? false)
- const nowPlayingTrack = $derived(realtimeNowPlaying?.nowPlayingTrack ?? album?.nowPlayingTrack)
-
+ // Use the album's isNowPlaying status directly - single source of truth
+ const isNowPlaying = $derived(album?.isNowPlaying ?? false)
+ const nowPlayingTrack = $derived(album?.nowPlayingTrack)
+
// Debug logging
$effect(() => {
- if (album && isNowPlaying) {
- console.log(`Album "${album.name}" is now playing:`, {
- fromRealtime: realtimeNowPlaying?.isNowPlaying,
- fromAlbum: album?.isNowPlaying,
- track: nowPlayingTrack
+ if (album && (isNowPlaying || album.isNowPlaying)) {
+ console.log(`🎵 Album component "${album.name}":`, {
+ isNowPlaying,
+ nowPlayingTrack,
+ albumData: album
})
}
})
@@ -165,9 +149,9 @@
class:playing={isPlaying}
>
{#if isPlaying}
-
+ Status: {#if connected}
+ Last Update: {lastUpdate ? lastUpdate.toLocaleTimeString() : 'Never'} +
+Next Update: {formatTime(nextUpdateIn)}
+Interval: {updateInterval}s {trackRemainingTime > 0 ? `(smart mode)` : nowPlaying ? '(fast mode)' : '(normal)'}
+ {#if trackRemainingTime > 0} +Track Remaining: {formatTime(trackRemainingTime)}
+ {/if} +No music playing
+ {/if} +Apple Music ID: {album.appleMusicData.appleMusicId}
+ {/if} + + {#if album.appleMusicData.releaseDate} +Release Date: {album.appleMusicData.releaseDate}
+ {/if} + + {#if album.appleMusicData.recordLabel} +Label: {album.appleMusicData.recordLabel}
+ {/if} + + {#if album.appleMusicData.genres?.length} +Genres: {album.appleMusicData.genres.join(', ')}
+ {/if} + + {#if album.appleMusicData.previewUrl} +Preview URL: {album.appleMusicData.previewUrl}
{JSON.stringify(album.appleMusicData, null, 2)}
+ This album was not searched in Apple Music or the search is pending.
+ {/if} +Key format: apple:album:ArtistName:AlbumName
Example: apple:album:藤井風:Hachikō