diff --git a/src/renderer/components/audio-player/AudioPlayer.tsx b/src/renderer/components/audio-player/AudioPlayer.tsx index 21e58453a..04b3407ba 100644 --- a/src/renderer/components/audio-player/AudioPlayer.tsx +++ b/src/renderer/components/audio-player/AudioPlayer.tsx @@ -154,14 +154,14 @@ export const AudioPlayer = forwardRef( ref={player1Ref} height={0} muted={muted} - playing={currentPlayer === 1 && status === PlayerStatus.Playing} + playing={currentPlayer === 1 && status === PlayerStatus.PLAYING} progressInterval={isTransitioning ? 10 : 250} url={player1?.streamUrl} volume={volume} width={0} onEnded={handleOnEnded} onProgress={ - playbackStyle === PlaybackStyle.Gapless + playbackStyle === PlaybackStyle.GAPLESS ? handleGapless1 : handleCrossfade1 } @@ -170,14 +170,14 @@ export const AudioPlayer = forwardRef( ref={player2Ref} height={0} muted={muted} - playing={currentPlayer === 2 && status === PlayerStatus.Playing} + playing={currentPlayer === 2 && status === PlayerStatus.PLAYING} progressInterval={isTransitioning ? 10 : 250} url={player2?.streamUrl} volume={volume} width={0} onEnded={handleOnEnded} onProgress={ - playbackStyle === PlaybackStyle.Gapless + playbackStyle === PlaybackStyle.GAPLESS ? handleGapless2 : handleCrossfade2 } diff --git a/src/renderer/features/player/components/CenterControls.tsx b/src/renderer/features/player/components/CenterControls.tsx index dd73a9969..d6fc53c69 100644 --- a/src/renderer/features/player/components/CenterControls.tsx +++ b/src/renderer/features/player/components/CenterControls.tsx @@ -2,7 +2,7 @@ import { useEffect, useMemo, useState } from 'react'; import format from 'format-duration'; import { useTranslation } from 'react-i18next'; import { - RiPauseFill, + RiPauseLine, RiPlayFill, RiRewindFill, RiSkipBackFill, @@ -88,8 +88,8 @@ export const CenterControls = ({ playersRef }: CenterControlsProps) => { useEffect(() => { let interval: any; - if (status === PlayerStatus.Playing && !isSeeking) { - if (settings.type === PlaybackType.Web) { + if (status === PlayerStatus.PLAYING && !isSeeking) { + if (settings.type === PlaybackType.WEB) { interval = setInterval(() => { setCurrentTime(currentPlayerRef.getCurrentTime()); }, 1000); @@ -119,15 +119,15 @@ export const CenterControls = ({ playersRef }: CenterControlsProps) => { /> ) : ( - + ) } tooltip={{ label: - status === PlayerStatus.Paused + status === PlayerStatus.PAUSED ? `${t('player.play')}` : `${t('player.pause')}`, }} diff --git a/src/renderer/features/player/components/LeftControls.tsx b/src/renderer/features/player/components/LeftControls.tsx index 97864ec33..c9568ba5b 100644 --- a/src/renderer/features/player/components/LeftControls.tsx +++ b/src/renderer/features/player/components/LeftControls.tsx @@ -67,7 +67,7 @@ export const LeftControls = () => { to="/nowplaying" weight={500} > - {album || '—'} + {album?.name || '—'} diff --git a/src/renderer/features/player/components/Playerbar.tsx b/src/renderer/features/player/components/Playerbar.tsx index 456d8be39..cb6b33d1b 100644 --- a/src/renderer/features/player/components/Playerbar.tsx +++ b/src/renderer/features/player/components/Playerbar.tsx @@ -65,7 +65,7 @@ export const Playerbar = () => { - {settings.type === PlaybackType.Web && ( + {settings.type === PlaybackType.WEB && ( ()( index: 0, player: 1, song: {} as Song, - status: PlayerStatus.Paused, + status: PlayerStatus.PAUSED, time: 0, }, getPlayerData: () => { @@ -171,14 +171,14 @@ export const usePlayerStore = create()( pause: () => { set( produce((state) => { - state.current.status = PlayerStatus.Paused; + state.current.status = PlayerStatus.PAUSED; }) ); }, play: () => { set( produce((state) => { - state.current.status = PlayerStatus.Playing; + state.current.status = PlayerStatus.PLAYING; }) ); }, @@ -228,12 +228,12 @@ export const usePlayerStore = create()( }, settings: { crossfadeDuration: 5, - crossfadeStyle: CrossfadeStyle.EqualPower, + crossfadeStyle: CrossfadeStyle.EQUALPOWER, muted: false, - repeat: PlayerRepeat.None, + repeat: PlayerRepeat.NONE, shuffle: false, - style: PlaybackStyle.Gapless, - type: PlaybackType.Local, + style: PlaybackStyle.GAPLESS, + type: PlaybackType.LOCAL, volume: 50, }, })) diff --git a/src/server/services/response.ts b/src/server/services/response.ts index cf5842e75..71cef1b24 100644 --- a/src/server/services/response.ts +++ b/src/server/services/response.ts @@ -1,6 +1,6 @@ /* eslint-disable no-underscore-dangle */ import meanBy from 'lodash/meanBy'; -import { Rating, User } from '../types/types'; +import { Item, Rating, User } from '../types/types'; import { getImageUrl } from '../utils'; const getSubsonicStreamUrl = ( @@ -71,12 +71,23 @@ const streamUrl = ( return ''; }; +const relatedAlbum = (item: any) => { + return { + deleted: item.deleted, + id: item.id, + itemType: Item.ALBUM, + name: item.name, + remoteId: item.remoteId, + }; +}; + const relatedArtists = (items: any[]) => { return ( items?.map((item: any) => { return { deleted: item.deleted, id: item.id, + itemType: Item.ARTIST, name: item.name, remoteId: item.remoteId, }; @@ -84,11 +95,21 @@ const relatedArtists = (items: any[]) => { ); }; +const relatedAlbumArtist = (item: any) => { + return { + deleted: item.deleted, + id: item.id, + itemType: item.ALBUMARTIST, + name: item.name, + remoteId: item.remoteId, + }; +}; const relatedGenres = (genres: any[]) => { return ( genres?.map((genre) => { return { id: genre.id, + itemType: Item.GENRE, name: genre.name, }; }) || [] @@ -128,8 +149,7 @@ const songs = ( const url = options.url ? options.url : item.server.serverUrls[0]; return { - album: item.album.name, - albumId: item.albumId, + album: item.album && relatedAlbum(item.album), artistName: item.artistName, artists: relatedArtists(item.artists), bitRate: item.bitRate, @@ -144,6 +164,7 @@ const songs = ( imageUrl: primaryImage(item.images, serverType, url, item.remoteId) || options.imageUrl, + itemType: Item.SONG, name: item.name, remoteCreatedAt: item.remoteCreatedAt, remoteId: item.remoteId, @@ -181,8 +202,7 @@ const albums = (items: any[], user: User) => { ); return { - albumArtist: item.albumArtist, - albumArtistId: item.albumArtistId, + albumArtist: item.albumArtist && relatedAlbumArtist(item.albumArtist), averageRating, createdAt: item.createdAt, date: item.date, @@ -190,6 +210,7 @@ const albums = (items: any[], user: User) => { genres: relatedGenres(item.genres), id: item.id, imageUrl, + itemType: Item.ALBUM, name: item.name, rating, remoteCreatedAt: item.remoteCreatedAt, diff --git a/src/server/types/types.ts b/src/server/types/types.ts index 7e6a8e68c..2221f9a3b 100644 --- a/src/server/types/types.ts +++ b/src/server/types/types.ts @@ -3,6 +3,16 @@ export enum SortOrder { DESC = 'desc', } +export enum Item { + ALBUM = 'album', + ALBUM_ARTIST = 'albumArtist', + ARTIST = 'artist', + FOLDER = 'folder', + GENRE = 'genre', + PLAYLIST = 'playlist', + SONG = 'song', +} + export enum AlbumFilter { FAVORITED, NOT_FAVORITED, diff --git a/src/types.ts b/src/types.ts index d32c65462..3104178a9 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,17 +1,18 @@ export enum Platform { - Linux = 'linux', - MacOS = 'macos', - Web = 'web', - Windows = 'windows', + LINUX = 'linux', + MACOS = 'macos', + WEB = 'web', + WINDOWS = 'windows', } export enum ServerType { - Jellyfin = 'jellyfin', - Subsonic = 'subsonic', + JELLYFIN = 'jellyfin', + SUBSONIC = 'subsonic', } export enum Item { ALBUM = 'album', + ALBUM_ARTIST = 'albumArtist', ARTIST = 'artist', FOLDER = 'folder', GENRE = 'genre', @@ -20,14 +21,14 @@ export enum Item { } export enum PlayerStatus { - Paused = 'paused', - Playing = 'playing', + PAUSED = 'paused', + PLAYING = 'playing', } export enum PlayerRepeat { - All = 'all', - None = 'none', - One = 'one', + ALL = 'all', + NONE = 'none', + ONE = 'one', } export enum Play { @@ -37,22 +38,22 @@ export enum Play { } export enum CrossfadeStyle { - ConstantPower = 'constantPower', - ConstantPowerSlowCut = 'constantPowerSlowCut', - ConstantPowerSlowFade = 'constantPowerSlowFade', - Dipped = 'dipped', - EqualPower = 'equalPower', - Linear = 'linear', + CONSTANT_POWER = 'constantPower', + CONSTANT_POWER_SLOW_CUT = 'constantPowerSlowCut', + CONSTANT_POWER_SLOW_FADE = 'constantPowerSlowFade', + DIPPED = 'dipped', + EQUALPOWER = 'equalPower', + LINEAR = 'linear', } export enum PlaybackStyle { - Crossfade = 'crossfade', - Gapless = 'gapless', + CROSSFADE = 'crossfade', + GAPLESS = 'gapless', } export enum PlaybackType { - Local = 'local', - Web = 'web', + LOCAL = 'local', + WEB = 'web', } export type APIEndpoints = @@ -97,25 +98,26 @@ export type APIEndpoints = | 'getSongsByGenre' | 'getLyrics'; -export interface GenericItem { - id: string; - title: string; -} - export interface APIResult { data: Album[] | Artist[] | Genre[] | Song[]; totalRecordCount?: number; } +interface RelatedItem { + deleted?: boolean; + id: string; + name: string; + remoteId?: string; +} + export interface Album { - albumArtist: Partial; - albumArtistId: string; + albumArtist: AlbumArtist; averageRating: number; container: string; createdAt: string; date: string; deleted: boolean; - genres: Genre[]; + genres: RelatedItem[]; id: number; imageUrl: string; name: string; @@ -154,27 +156,15 @@ export interface Artist { updatedAt: string; } -export interface ArtistInfo { - biography?: string; - externalUrl: GenericItem[]; - imageUrl?: string; - similarArtist?: Artist[]; -} - export interface Genre { - albumCount?: number; id: string; name: string; - songCount?: number; - type?: Item.GENRE; - uniqueId?: string; } export interface Song { - album: string; - albumId: number; + album: RelatedItem; artistName: null; - artists: Partial[]; + artists: RelatedItem[]; bitRate: number; container: string; createdAt: string; @@ -182,7 +172,7 @@ export interface Song { deleted: boolean; disc: number; duration: number; - genres: Partial[]; + genres: RelatedItem[]; id: number; imageUrl: string; name: string; @@ -196,23 +186,6 @@ export interface Song { year: number; } -export interface ScanStatus { - count: number | 'N/a'; - scanning: boolean; -} - -export interface Sort { - column?: string; - type: 'asc' | 'desc'; -} - -export interface Pagination { - activePage?: number; - pages?: number; - recordsPerPage: number; - serverSide?: boolean; -} - export interface ServerFolderAuth { id: number; locked: boolean;