diff --git a/src/components/Button.svelte b/src/components/Button.svelte index e0c18e9..43cb598 100644 --- a/src/components/Button.svelte +++ b/src/components/Button.svelte @@ -1,5 +1,8 @@ - diff --git a/src/components/appbar/AppBar.svelte b/src/components/appbar/AppBar.svelte index d606a56..f3042a0 100644 --- a/src/components/appbar/AppBar.svelte +++ b/src/components/appbar/AppBar.svelte @@ -1,10 +1,15 @@ @@ -15,7 +20,11 @@ history.back()} aria-label="Account" /> {/if} {title} - {#if settings} - - {/if} + + + + + {#each right as item} + + {/each} \ No newline at end of file diff --git a/src/lib/server/songs.ts b/src/lib/server/songs.ts index ffbe4b4..7c8bc7f 100644 --- a/src/lib/server/songs.ts +++ b/src/lib/server/songs.ts @@ -35,7 +35,7 @@ function parsePlaylistRef(ref: string): number { /** * Get raw playlist data from cache or netease API. */ -const getPlaylistRaw = cached('playlists', +export const getPlaylistRaw = cached('playlists', async (id: number) => { const pl = ((await ne.playlist_detail({ id })).body as any) @@ -67,10 +67,10 @@ export const parseBrief = (songData: any): NeteaseSongBrief => ({ /** * Get a list of songs from a playlist reference. */ -export async function getSongsFromPlaylist(ref: string): Promise { +export async function getSongsFromPlaylist(ref: string): Promise<{meta: any, songs: NeteaseSongBrief[]}> { const playlistId = parsePlaylistRef(ref) const plData = await getPlaylistRaw(playlistId) - return plData.playlist.tracks.map(parseBrief) + return {meta: plData.playlist, songs: plData.playlist.tracks.map(parseBrief)} } interface NeteaseLyricsResponse { lrc: { lyric: string } } @@ -85,3 +85,7 @@ export const getLyricsProcessed = cached('lyrics_processed', return aiParseLyrics(raw.lrc.lyric) }) +await getSongsFromPlaylist("13555799996") +await getSongsFromPlaylist("https://music.163.com/playlist?id=14348145982") +await getSongsFromPlaylist("https://music.163.com/playlist?id=14392963638") +await getSongsFromPlaylist("https://music.163.com/playlist?id=580208139") diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 50476af..1fd8d81 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -11,7 +11,9 @@ - alert('Account clicked')} settings={() => alert('Settings clicked')} /> + alert('Account clicked')} right={[ + {icon: "i-material-symbols:settings-rounded", onclick: () => alert('Settings clicked')} +]} /> {#if data.last} @@ -49,13 +51,13 @@ {#each data.recPlaylists as playlist} - + {playlist.name} {playlist.creator.nickname} 创建 - + {/each} diff --git a/src/routes/playlist/[slug]/+page.server.ts b/src/routes/playlist/[slug]/+page.server.ts new file mode 100644 index 0000000..0e48000 --- /dev/null +++ b/src/routes/playlist/[slug]/+page.server.ts @@ -0,0 +1,6 @@ +import type { PageServerLoad } from './$types'; +import { getSongsFromPlaylist, listPlaylists } from "$lib/server/songs.ts"; + +export const load: PageServerLoad = async ({ params }) => ({ + playlist: await getSongsFromPlaylist(params.slug) +}) diff --git a/src/routes/playlist/[slug]/+page.svelte b/src/routes/playlist/[slug]/+page.svelte new file mode 100644 index 0000000..b90b9f6 --- /dev/null +++ b/src/routes/playlist/[slug]/+page.svelte @@ -0,0 +1,28 @@ + + + alert('Bookmark clicked')}, + {icon: "i-material-symbols:more-vert", onclick: () => alert('More clicked')} +]} /> + + + + + {meta.name} + + 创建者: {meta.creator.nickname} + 歌曲数: {meta.trackCount} + + + 开始练习 + + + \ No newline at end of file