mirror of
https://github.com/jeffvli/feishin.git
synced 2026-05-10 04:30:25 +02:00
Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 6b0c57998b | |||
| 6587e9cac8 | |||
| 2e3c69e61c |
Generated
+2
-2
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "feishin",
|
"name": "feishin",
|
||||||
"version": "0.8.0",
|
"version": "0.8.1",
|
||||||
"lockfileVersion": 2,
|
"lockfileVersion": 2,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "feishin",
|
"name": "feishin",
|
||||||
"version": "0.8.0",
|
"version": "0.8.1",
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"license": "GPL-3.0",
|
"license": "GPL-3.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
|||||||
+1
-1
@@ -2,7 +2,7 @@
|
|||||||
"name": "feishin",
|
"name": "feishin",
|
||||||
"productName": "Feishin",
|
"productName": "Feishin",
|
||||||
"description": "Feishin music server",
|
"description": "Feishin music server",
|
||||||
"version": "0.8.0",
|
"version": "0.8.1",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "concurrently \"npm run build:main\" \"npm run build:renderer\" \"npm run build:remote\"",
|
"build": "concurrently \"npm run build:main\" \"npm run build:renderer\" \"npm run build:remote\"",
|
||||||
"build:main": "cross-env NODE_ENV=production TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.main.prod.ts",
|
"build:main": "cross-env NODE_ENV=production TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.main.prod.ts",
|
||||||
|
|||||||
Generated
+2
-2
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "feishin",
|
"name": "feishin",
|
||||||
"version": "0.8.0",
|
"version": "0.8.1",
|
||||||
"lockfileVersion": 2,
|
"lockfileVersion": 2,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "feishin",
|
"name": "feishin",
|
||||||
"version": "0.8.0",
|
"version": "0.8.1",
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"license": "GPL-3.0",
|
"license": "GPL-3.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "feishin",
|
"name": "feishin",
|
||||||
"version": "0.8.0",
|
"version": "0.8.1",
|
||||||
"description": "",
|
"description": "",
|
||||||
"main": "./dist/main/main.js",
|
"main": "./dist/main/main.js",
|
||||||
"author": {
|
"author": {
|
||||||
|
|||||||
@@ -1,11 +1,13 @@
|
|||||||
import { useCallback, useEffect, useRef } from 'react';
|
import { useCallback, useEffect, useRef } from 'react';
|
||||||
import {
|
import {
|
||||||
|
useCurrentPlayer,
|
||||||
useCurrentStatus,
|
useCurrentStatus,
|
||||||
useCurrentTime,
|
useCurrentTime,
|
||||||
useLyricsSettings,
|
useLyricsSettings,
|
||||||
usePlaybackType,
|
usePlaybackType,
|
||||||
usePlayerData,
|
usePlayerData,
|
||||||
useSeeked,
|
useSeeked,
|
||||||
|
useSetCurrentTime,
|
||||||
} from '/@/renderer/store';
|
} from '/@/renderer/store';
|
||||||
import { PlaybackType, PlayerStatus } from '/@/renderer/types';
|
import { PlaybackType, PlayerStatus } from '/@/renderer/types';
|
||||||
import { LyricLine } from '/@/renderer/features/lyrics/lyric-line';
|
import { LyricLine } from '/@/renderer/features/lyrics/lyric-line';
|
||||||
@@ -13,9 +15,11 @@ import isElectron from 'is-electron';
|
|||||||
import { PlayersRef } from '/@/renderer/features/player/ref/players-ref';
|
import { PlayersRef } from '/@/renderer/features/player/ref/players-ref';
|
||||||
import { FullLyricsMetadata, SynchronizedLyricsArray } from '/@/renderer/api/types';
|
import { FullLyricsMetadata, SynchronizedLyricsArray } from '/@/renderer/api/types';
|
||||||
import styled from 'styled-components';
|
import styled from 'styled-components';
|
||||||
import { useCenterControls } from '/@/renderer/features/player/hooks/use-center-controls';
|
import { useScrobble } from '/@/renderer/features/player/hooks/use-scrobble';
|
||||||
|
|
||||||
const mpvPlayer = isElectron() ? window.electron.mpvPlayer : null;
|
const mpvPlayer = isElectron() ? window.electron.mpvPlayer : null;
|
||||||
|
const utils = isElectron() ? window.electron.utils : null;
|
||||||
|
const mpris = isElectron() && utils?.isLinux() ? window.electron.mpris : null;
|
||||||
|
|
||||||
const SynchronizedLyricsContainer = styled.div<{ $gap: number }>`
|
const SynchronizedLyricsContainer = styled.div<{ $gap: number }>`
|
||||||
display: flex;
|
display: flex;
|
||||||
@@ -66,7 +70,25 @@ export const SynchronizedLyrics = ({
|
|||||||
const playerData = usePlayerData();
|
const playerData = usePlayerData();
|
||||||
const now = useCurrentTime();
|
const now = useCurrentTime();
|
||||||
const settings = useLyricsSettings();
|
const settings = useLyricsSettings();
|
||||||
const centerControls = useCenterControls({ playersRef });
|
const currentPlayer = useCurrentPlayer();
|
||||||
|
const currentPlayerRef =
|
||||||
|
currentPlayer === 1 ? playersRef.current?.player1 : playersRef.current?.player2;
|
||||||
|
const setCurrentTime = useSetCurrentTime();
|
||||||
|
const { handleScrobbleFromSeek } = useScrobble();
|
||||||
|
|
||||||
|
const handleSeek = useCallback(
|
||||||
|
(time: number) => {
|
||||||
|
if (playbackType === PlaybackType.LOCAL && mpvPlayer) {
|
||||||
|
mpvPlayer.seekTo(time);
|
||||||
|
} else {
|
||||||
|
setCurrentTime(time, true);
|
||||||
|
handleScrobbleFromSeek(time);
|
||||||
|
mpris?.updateSeek(time);
|
||||||
|
currentPlayerRef?.seekTo(time);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[currentPlayerRef, handleScrobbleFromSeek, playbackType, setCurrentTime],
|
||||||
|
);
|
||||||
|
|
||||||
const seeked = useSeeked();
|
const seeked = useSeeked();
|
||||||
|
|
||||||
@@ -349,7 +371,7 @@ export const SynchronizedLyrics = ({
|
|||||||
fontSize={settings.fontSize}
|
fontSize={settings.fontSize}
|
||||||
id={`lyric-${idx}`}
|
id={`lyric-${idx}`}
|
||||||
text={text}
|
text={text}
|
||||||
onClick={() => centerControls.handleSeekSlider(time / 1000)}
|
onClick={() => handleSeek(time / 1000)}
|
||||||
/>
|
/>
|
||||||
))}
|
))}
|
||||||
</SynchronizedLyricsContainer>
|
</SynchronizedLyricsContainer>
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import { Playerbar } from '/@/renderer/features/player';
|
|||||||
import { useGeneralSettings } from '/@/renderer/store/settings.store';
|
import { useGeneralSettings } from '/@/renderer/store/settings.store';
|
||||||
|
|
||||||
interface PlayerbarContainerProps {
|
interface PlayerbarContainerProps {
|
||||||
drawerEffect: boolean;
|
$drawerEffect: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
const PlayerbarContainer = styled.footer<PlayerbarContainerProps>`
|
const PlayerbarContainer = styled.footer<PlayerbarContainerProps>`
|
||||||
@@ -13,7 +13,7 @@ const PlayerbarContainer = styled.footer<PlayerbarContainerProps>`
|
|||||||
transition: background 0.5s;
|
transition: background 0.5s;
|
||||||
|
|
||||||
${(props) =>
|
${(props) =>
|
||||||
props.drawerEffect &&
|
props.$drawerEffect &&
|
||||||
`
|
`
|
||||||
&:hover {
|
&:hover {
|
||||||
background: var(--playerbar-bg-active);
|
background: var(--playerbar-bg-active);
|
||||||
@@ -26,7 +26,7 @@ export const PlayerBar = () => {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<PlayerbarContainer
|
<PlayerbarContainer
|
||||||
drawerEffect={playerbarOpenDrawer}
|
$drawerEffect={playerbarOpenDrawer}
|
||||||
id="player-bar"
|
id="player-bar"
|
||||||
>
|
>
|
||||||
<Playerbar />
|
<Playerbar />
|
||||||
|
|||||||
Reference in New Issue
Block a user