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;