diff --git a/packages/main/cache.ts b/packages/main/cache.ts index b1a02fb..e72670d 100644 --- a/packages/main/cache.ts +++ b/packages/main/cache.ts @@ -35,6 +35,7 @@ export async function setCache(api: string, data: any, query: any) { } case 'album': { if (!data.album) return + data.album.songs = (data as FetchTracksResponse).songs db.set(ModelNames.ALBUM, Number(data.album.id), data) break } diff --git a/packages/renderer/src/api/playlist.ts b/packages/renderer/src/api/playlist.ts index ef8f4ab..8939edc 100644 --- a/packages/renderer/src/api/playlist.ts +++ b/packages/renderer/src/api/playlist.ts @@ -3,6 +3,7 @@ import request from '@/utils/request' export enum PlaylistApiNames { FETCH_PLAYLIST = 'fetchPlaylist', FETCH_RECOMMENDED_PLAYLISTS = 'fetchRecommendedPlaylists', + FETCH_DAILY_RECOMMEND_PLAYLISTS = 'fetchDailyRecommendPlaylists', } // 歌单详情 @@ -55,3 +56,17 @@ export function fetchRecommendedPlaylists( params, }) } + +// 每日推荐歌单(需要登录) +export interface FetchDailyRecommendPlaylistsResponse { + code: number + featureFirst: boolean + haveRcmdSongs: boolean + recommend: Playlist[] +} +export function fetchDailyRecommendPlaylists(): Promise { + return request({ + url: '/recommend/resource', + method: 'get', + }) +} diff --git a/packages/renderer/src/assets/icons/back.svg b/packages/renderer/src/assets/icons/back.svg index 7aa8869..e9db64e 100644 --- a/packages/renderer/src/assets/icons/back.svg +++ b/packages/renderer/src/assets/icons/back.svg @@ -1 +1,3 @@ - + + + diff --git a/packages/renderer/src/assets/icons/chevron-up.svg b/packages/renderer/src/assets/icons/chevron-up.svg deleted file mode 100644 index e653d68..0000000 --- a/packages/renderer/src/assets/icons/chevron-up.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/packages/renderer/src/assets/icons/compass.svg b/packages/renderer/src/assets/icons/compass.svg deleted file mode 100644 index ed1cdc2..0000000 --- a/packages/renderer/src/assets/icons/compass.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/packages/renderer/src/assets/icons/dislike.svg b/packages/renderer/src/assets/icons/dislike.svg index d969533..394de56 100644 --- a/packages/renderer/src/assets/icons/dislike.svg +++ b/packages/renderer/src/assets/icons/dislike.svg @@ -1 +1,3 @@ - + + + diff --git a/packages/renderer/src/assets/icons/fm.svg b/packages/renderer/src/assets/icons/fm.svg index fe760cd..4f33403 100644 --- a/packages/renderer/src/assets/icons/fm.svg +++ b/packages/renderer/src/assets/icons/fm.svg @@ -1 +1,7 @@ - + + + + + + + diff --git a/packages/renderer/src/assets/icons/forward.svg b/packages/renderer/src/assets/icons/forward.svg index 40c6bb8..551a962 100644 --- a/packages/renderer/src/assets/icons/forward.svg +++ b/packages/renderer/src/assets/icons/forward.svg @@ -1 +1,3 @@ - + + + diff --git a/packages/renderer/src/assets/icons/heart-outline.svg b/packages/renderer/src/assets/icons/heart-outline.svg index dab50ff..8e9ad38 100644 --- a/packages/renderer/src/assets/icons/heart-outline.svg +++ b/packages/renderer/src/assets/icons/heart-outline.svg @@ -1 +1,4 @@ - + + + + diff --git a/packages/renderer/src/assets/icons/heart.svg b/packages/renderer/src/assets/icons/heart.svg index c911d27..31a6186 100644 --- a/packages/renderer/src/assets/icons/heart.svg +++ b/packages/renderer/src/assets/icons/heart.svg @@ -1 +1,5 @@ - + + + + + diff --git a/packages/renderer/src/assets/icons/home.svg b/packages/renderer/src/assets/icons/home.svg index e0ad12a..74fc468 100644 --- a/packages/renderer/src/assets/icons/home.svg +++ b/packages/renderer/src/assets/icons/home.svg @@ -1 +1,3 @@ - + + + diff --git a/packages/renderer/src/assets/icons/lyrics.svg b/packages/renderer/src/assets/icons/lyrics.svg new file mode 100644 index 0000000..431edd7 --- /dev/null +++ b/packages/renderer/src/assets/icons/lyrics.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/packages/renderer/src/assets/icons/more.svg b/packages/renderer/src/assets/icons/more.svg index 51bb992..3f01cab 100644 --- a/packages/renderer/src/assets/icons/more.svg +++ b/packages/renderer/src/assets/icons/more.svg @@ -1 +1,5 @@ - \ No newline at end of file + + + + + diff --git a/packages/renderer/src/assets/icons/music-library.svg b/packages/renderer/src/assets/icons/music-library.svg index 7f462e6..21fc10b 100644 --- a/packages/renderer/src/assets/icons/music-library.svg +++ b/packages/renderer/src/assets/icons/music-library.svg @@ -1 +1,11 @@ - + + + + + + + + + + + diff --git a/packages/renderer/src/assets/icons/music-note.svg b/packages/renderer/src/assets/icons/music-note.svg index 822ed68..bbebf35 100644 --- a/packages/renderer/src/assets/icons/music-note.svg +++ b/packages/renderer/src/assets/icons/music-note.svg @@ -1,4 +1 @@ - + diff --git a/packages/renderer/src/assets/icons/next.svg b/packages/renderer/src/assets/icons/next.svg index 7064515..aee718b 100644 --- a/packages/renderer/src/assets/icons/next.svg +++ b/packages/renderer/src/assets/icons/next.svg @@ -1 +1,3 @@ - \ No newline at end of file + + + diff --git a/packages/renderer/src/assets/icons/pause.svg b/packages/renderer/src/assets/icons/pause.svg index 7cf2497..87b2191 100644 --- a/packages/renderer/src/assets/icons/pause.svg +++ b/packages/renderer/src/assets/icons/pause.svg @@ -1 +1,4 @@ - \ No newline at end of file + + + + diff --git a/packages/renderer/src/assets/icons/play-fill.svg b/packages/renderer/src/assets/icons/play-fill.svg new file mode 100644 index 0000000..ebeac08 --- /dev/null +++ b/packages/renderer/src/assets/icons/play-fill.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/renderer/src/assets/icons/play.svg b/packages/renderer/src/assets/icons/play.svg index d84a7d6..9acd0b5 100644 --- a/packages/renderer/src/assets/icons/play.svg +++ b/packages/renderer/src/assets/icons/play.svg @@ -1 +1,3 @@ - + + + diff --git a/packages/renderer/src/assets/icons/playlist.svg b/packages/renderer/src/assets/icons/playlist.svg index a2c67bf..c27cc50 100644 --- a/packages/renderer/src/assets/icons/playlist.svg +++ b/packages/renderer/src/assets/icons/playlist.svg @@ -1 +1,6 @@ - \ No newline at end of file + + + + + + diff --git a/packages/renderer/src/assets/icons/podcast.svg b/packages/renderer/src/assets/icons/podcast.svg new file mode 100644 index 0000000..e44cff4 --- /dev/null +++ b/packages/renderer/src/assets/icons/podcast.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/packages/renderer/src/assets/icons/previous.svg b/packages/renderer/src/assets/icons/previous.svg index 8d0f155..4c3f609 100644 --- a/packages/renderer/src/assets/icons/previous.svg +++ b/packages/renderer/src/assets/icons/previous.svg @@ -1 +1,3 @@ - \ No newline at end of file + + + diff --git a/packages/renderer/src/assets/icons/repeat-1.svg b/packages/renderer/src/assets/icons/repeat-1.svg index 45afc9a..8ddd241 100644 --- a/packages/renderer/src/assets/icons/repeat-1.svg +++ b/packages/renderer/src/assets/icons/repeat-1.svg @@ -1 +1,8 @@ - \ No newline at end of file + + + + + + + + diff --git a/packages/renderer/src/assets/icons/repeat.svg b/packages/renderer/src/assets/icons/repeat.svg index 78ed766..53cb70a 100644 --- a/packages/renderer/src/assets/icons/repeat.svg +++ b/packages/renderer/src/assets/icons/repeat.svg @@ -1 +1,6 @@ - \ No newline at end of file + + + + + + diff --git a/packages/renderer/src/assets/icons/search.svg b/packages/renderer/src/assets/icons/search.svg index f845303..6d12cdc 100644 --- a/packages/renderer/src/assets/icons/search.svg +++ b/packages/renderer/src/assets/icons/search.svg @@ -1 +1,4 @@ - + + + + diff --git a/packages/renderer/src/assets/icons/settings.svg b/packages/renderer/src/assets/icons/settings.svg index af294f4..3ab9883 100644 --- a/packages/renderer/src/assets/icons/settings.svg +++ b/packages/renderer/src/assets/icons/settings.svg @@ -1,4 +1,4 @@ - - - + + + diff --git a/packages/renderer/src/assets/icons/shuffle.svg b/packages/renderer/src/assets/icons/shuffle.svg index 92d38f1..5ab7532 100644 --- a/packages/renderer/src/assets/icons/shuffle.svg +++ b/packages/renderer/src/assets/icons/shuffle.svg @@ -1 +1,6 @@ - \ No newline at end of file + + + + + + diff --git a/packages/renderer/src/assets/icons/volume-half.svg b/packages/renderer/src/assets/icons/volume-half.svg index f433adf..3874031 100644 --- a/packages/renderer/src/assets/icons/volume-half.svg +++ b/packages/renderer/src/assets/icons/volume-half.svg @@ -1 +1,2 @@ - \ No newline at end of file + + diff --git a/packages/renderer/src/assets/icons/volume-mute.svg b/packages/renderer/src/assets/icons/volume-mute.svg index f3d25cb..28b2931 100644 --- a/packages/renderer/src/assets/icons/volume-mute.svg +++ b/packages/renderer/src/assets/icons/volume-mute.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/packages/renderer/src/assets/icons/volume.svg b/packages/renderer/src/assets/icons/volume.svg index bd2d645..420b924 100644 --- a/packages/renderer/src/assets/icons/volume.svg +++ b/packages/renderer/src/assets/icons/volume.svg @@ -1 +1,4 @@ - \ No newline at end of file + + + + diff --git a/packages/renderer/src/components/Button.tsx b/packages/renderer/src/components/Button.tsx index 3212e12..10f1205 100644 --- a/packages/renderer/src/components/Button.tsx +++ b/packages/renderer/src/components/Button.tsx @@ -23,19 +23,12 @@ const Button = ({ iconColor?: Color isSkelton?: boolean }) => { - const shape = - Array.isArray(children) && children.length === 1 - ? Shape.Square - : Shape.Default - return (
Wolf Alice
-
+
{/* Actions */}
{Object.values(ACTION).map(action => ( ))}
{/* FM logo */}
- + 私人FM
diff --git a/packages/renderer/src/components/IconButton.tsx b/packages/renderer/src/components/IconButton.tsx index e1ad68f..8821307 100644 --- a/packages/renderer/src/components/IconButton.tsx +++ b/packages/renderer/src/components/IconButton.tsx @@ -16,7 +16,7 @@ const IconButton = ({ onClick={onClick} className={classNames( className, - 'relative transform cursor-default p-2 transition duration-200', + 'relative transform cursor-default p-1.5 transition duration-200', !disabled && 'btn-pressed-animation btn-hover-animation after:bg-black/[.06] dark:after:bg-white/10', disabled && 'opacity-30' diff --git a/packages/renderer/src/components/Player.tsx b/packages/renderer/src/components/Player.tsx index 74d81e1..4f7e182 100644 --- a/packages/renderer/src/components/Player.tsx +++ b/packages/renderer/src/components/Player.tsx @@ -60,7 +60,7 @@ const PlayingTrack = () => { toast('Work in progress')}> @@ -78,15 +78,15 @@ const MediaControls = () => { return (
track && player.prevTrack()} disabled={!track}> - + track && player.playOrPause()} disabled={!track} - className='rounded-2xl' + className='after:rounded-xl' > { /> track && player.nextTrack()} disabled={!track}> - +
) @@ -105,19 +105,19 @@ const Others = () => { return (
toast('Work in progress')}> - + toast('Work in progress')}> - + toast('Work in progress')}> - + toast('Work in progress')}> - + toast('Work in progress')}> - +
) diff --git a/packages/renderer/src/components/Sidebar.tsx b/packages/renderer/src/components/Sidebar.tsx index 0a6f853..6dc6625 100644 --- a/packages/renderer/src/components/Sidebar.tsx +++ b/packages/renderer/src/components/Sidebar.tsx @@ -21,9 +21,9 @@ const primaryTabs: PrimaryTab[] = [ route: '/', }, { - name: 'Explore', - icon: 'compass', - route: '/explore', + name: 'Podcast', + icon: 'podcast', + route: '/podcast', }, { name: 'Library', diff --git a/packages/renderer/src/components/Topbar.tsx b/packages/renderer/src/components/Topbar.tsx index 1b3b9c3..0353afc 100644 --- a/packages/renderer/src/components/Topbar.tsx +++ b/packages/renderer/src/components/Topbar.tsx @@ -19,9 +19,9 @@ const NavigationButtons = () => {
handleNavigate(action)} key={action} - className='app-region-no-drag btn-hover-animation rounded-lg p-3 text-gray-500 transition duration-300 after:rounded-full after:bg-black/[.06] hover:text-gray-900 dark:text-gray-300 dark:after:bg-white/10 dark:hover:text-gray-200' + className='app-region-no-drag btn-hover-animation rounded-lg p-2 text-gray-500 transition duration-300 after:rounded-full after:bg-black/[.06] hover:text-gray-900 dark:text-gray-300 dark:after:bg-white/10 dark:hover:text-gray-200' > - +
))}
@@ -32,13 +32,13 @@ const SearchBox = () => { return (
) @@ -47,7 +47,7 @@ const SearchBox = () => { const Settings = () => { return (
- +
) } diff --git a/packages/renderer/src/components/TracksAlbum.tsx b/packages/renderer/src/components/TracksAlbum.tsx index e239f2c..0bc7701 100644 --- a/packages/renderer/src/components/TracksAlbum.tsx +++ b/packages/renderer/src/components/TracksAlbum.tsx @@ -29,12 +29,12 @@ const PlayOrPauseButtonInTrack = memo(
@@ -69,7 +69,7 @@ const Track = memo( 'group grid w-full rounded-xl after:scale-[.98] after:rounded-xl', 'grid-cols-12 py-2.5 px-4', !isSkeleton && { - 'btn-hover-animation after:bg-gray-100 dark:after:bg-white/[.08]': + 'btn-hover-animation after:bg-gray-100 dark:after:bg-white/10': !isHighlight, 'bg-brand-50 dark:bg-gray-800': isHighlight, } @@ -163,7 +163,7 @@ const Track = memo( > )} diff --git a/packages/renderer/src/components/TracksList.tsx b/packages/renderer/src/components/TracksList.tsx index d3efe3b..26aefab 100644 --- a/packages/renderer/src/components/TracksList.tsx +++ b/packages/renderer/src/components/TracksList.tsx @@ -28,11 +28,11 @@ const Track = memo(
onClick(e, track.id)} className={classNames( - 'group grid w-full rounded-xl after:scale-[.98] after:rounded-xl dark:after:bg-white/[.08]', + 'group grid w-full rounded-xl after:scale-[.98] after:rounded-xl ', 'grid-cols-12 p-2 pr-4', !isSkeleton && !isPlaying && - 'btn-hover-animation after:bg-gray-100 dark:after:bg-white/[.08]', + 'btn-hover-animation after:bg-gray-100 dark:after:bg-white/10', !isSkeleton && isPlaying && 'bg-brand-50 dark:bg-gray-800' )} > @@ -127,7 +127,7 @@ const Track = memo( > )} @@ -197,7 +197,7 @@ const TracksList = memo(
TIME
-
+
{/* Tracks */} {isSkeleton ? skeletonTracks.map((track, index) => ( diff --git a/packages/renderer/src/hooks/usePlaylist.ts b/packages/renderer/src/hooks/usePlaylist.ts index c7fd13d..83cf3c7 100644 --- a/packages/renderer/src/hooks/usePlaylist.ts +++ b/packages/renderer/src/hooks/usePlaylist.ts @@ -16,7 +16,7 @@ export default function usePlaylist( () => fetch(params, noCache), { enabled: !!(params.id && params.id > 0 && !isNaN(Number(params.id))), - staleTime: 60 * 60 * 1000, // 1 hour + refetchOnWindowFocus: true, placeholderData: (): FetchPlaylistResponse | undefined => window.ipcRenderer.sendSync('getApiCacheSync', { api: 'playlist/detail', @@ -29,7 +29,6 @@ export default function usePlaylist( } export async function prefetchPlaylist(params: FetchPlaylistParams) { - console.log('prefetchAlbum', params) await reactQueryClient.prefetchQuery( [PlaylistApiNames.FETCH_PLAYLIST, params], () => fetch(params), diff --git a/packages/renderer/src/pages/Album.tsx b/packages/renderer/src/pages/Album.tsx index 135865b..34eb818 100644 --- a/packages/renderer/src/pages/Album.tsx +++ b/packages/renderer/src/pages/Album.tsx @@ -54,7 +54,7 @@ const PlayButton = ({ @@ -74,7 +74,7 @@ const Header = ({ const albumDuration = useMemo(() => { const duration = album?.songs?.reduce((acc, cur) => acc + cur.dt, 0) || 0 - return formatDuration(duration, 'en', 'hh[hr] mm[min]') + return formatDuration(duration, 'zh-CN', 'hh[hr] mm[min]') }, [album?.songs]) const [isCoverError, setCoverError] = useState(false) @@ -160,8 +160,8 @@ const Header = ({ PLACEHOLDER ) : ( -
- {dayjs(album?.publishTime || 0).year()} · {album?.size} Songs,{' '} +
+ {dayjs(album?.publishTime || 0).year()} · {album?.size} 首歌,{' '} {albumDuration}
)} @@ -183,10 +183,11 @@ const Header = ({
diff --git a/packages/renderer/src/pages/Home.tsx b/packages/renderer/src/pages/Home.tsx index ac902c7..0ea958b 100644 --- a/packages/renderer/src/pages/Home.tsx +++ b/packages/renderer/src/pages/Home.tsx @@ -1,4 +1,8 @@ -import { PlaylistApiNames, fetchRecommendedPlaylists } from '@/api/playlist' +import { + PlaylistApiNames, + fetchRecommendedPlaylists, + fetchDailyRecommendPlaylists, +} from '@/api/playlist' import CoverRow from '@/components/CoverRow' import DailyTracksCard from '@/components/DailyTracksCard' import FMCard from '@/components/FMCard' @@ -18,12 +22,27 @@ export default function Home() { } ) + const { + data: dailyRecommendPlaylists, + isLoading: isLoadingDailyRecommendPlaylists, + } = useQuery( + PlaylistApiNames.FETCH_DAILY_RECOMMEND_PLAYLISTS, + fetchDailyRecommendPlaylists + ) + + const playlists = [ + ...(dailyRecommendPlaylists?.recommend ?? []), + ...(recommendedPlaylists?.result ?? []), + ].slice(0, 10) + return (
diff --git a/packages/renderer/src/pages/Login.tsx b/packages/renderer/src/pages/Login.tsx index 6dfdcd7..8b63d9d 100644 --- a/packages/renderer/src/pages/Login.tsx +++ b/packages/renderer/src/pages/Login.tsx @@ -46,11 +46,13 @@ const PhoneInput = ({ }) => { return (
-
Phone
+
+ Phone +
= 5 && 'w-20' @@ -61,7 +63,7 @@ const PhoneInput = ({ onChange={e => setCountryCode(e.target.value)} /> setPhone(e.target.value)} @@ -81,18 +83,20 @@ const PasswordInput = ({ const [showPassword, setShowPassword] = useState(false) return (
-
Password
+
+ Password +
setPassword(e.target.value)} - className='w-full rounded-md rounded-r-none border border-r-0 border-gray-300 px-2 py-2' + className='w-full rounded-md rounded-r-none border border-r-0 border-gray-300 px-2 py-2 dark:border-gray-600 dark:bg-gray-700 dark:text-white' type={showPassword ? 'text' : 'password'} /> -
+
- - + +
diff --git a/packages/renderer/src/utils/player.ts b/packages/renderer/src/utils/player.ts index d77330b..8eaf46d 100644 --- a/packages/renderer/src/utils/player.ts +++ b/packages/renderer/src/utils/player.ts @@ -191,6 +191,7 @@ export class Player { * @param {boolean} fade fade in */ play() { + if (_howler.playing()) return _howler.play() this.state = State.PLAYING this._progress = _howler.seek()