Skip to content

Commit 5f91968

Browse files
committed
Add AFK Screen feature and update dependencies
- Removed react-player dependency and added youtube-player for video playback. - Introduced AFK Screen in Navbar and updated related routes and pages. - Enhanced DocsPage and WelcomePage to include AFK Screen details. - Updated TypeScript definitions for youtube-player. - Adjusted package.json and yarn.lock to reflect new dependencies.
1 parent 464b37a commit 5f91968

File tree

21 files changed

+1343
-40
lines changed

21 files changed

+1343
-40
lines changed

.yarn/install-state.gz

2.59 KB
Binary file not shown.

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,6 @@
5757
"react-dom": "^19.0.0",
5858
"react-hook-form": "^7.62.0",
5959
"react-is": "^19.1.0",
60-
"react-player": "^2.16.0",
6160
"react-roulette-pro": "^3.2.2",
6261
"react-router-dom": "^7.0.1",
6362
"react-shaders": "^0.0.4",
@@ -72,6 +71,7 @@
7271
"swagger-typescript-api": "^13.0.23",
7372
"uuid": "^11.0.3",
7473
"vite-plugin-mkcert": "^1.17.6",
74+
"youtube-player": "^5.6.0",
7575
"zod": "^4.0.15",
7676
"zustand": "^5.0.7"
7777
},
@@ -94,6 +94,7 @@
9494
"@types/react": "^19.0.1",
9595
"@types/react-dom": "^19.0.1",
9696
"@types/react-is": "^19",
97+
"@types/youtube-player": "^5.5.11",
9798
"@typescript-eslint/eslint-plugin": "^8.24.0",
9899
"@typescript-eslint/parser": "^8.24.0",
99100
"@vitejs/plugin-react": "^4.3.4",

src/Site/ControlRoom_Components/Navbar/Navbar.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ const Navbar: React.FC<NavbarProps> = ({ activeTab, onTabChange }) => {
6767
{ label: "Fumo Friday", path: "/fumofriday" },
6868
{ label: "Random Mem", path: "/randommem" },
6969
{ label: "Экранные частицы", path: "/confetti" },
70+
{ label: "AFK Screen", path: "/afkscreen" },
7071
],
7172
},
7273
{

src/Site/Pages/DocsPage/DocsPage.tsx

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,18 @@ const DocsPage: React.FC = () => {
7070
"Триггеры событий",
7171
],
7272
},
73+
{
74+
name: "AFK Screen",
75+
path: "/afkscreen",
76+
description:
77+
"Автоматическое воспроизведение случайных видео из YouTube плейлиста",
78+
features: [
79+
"Автоматическое переключение видео",
80+
"Случайный выбор из плейлиста",
81+
"Интеграция с YouTube",
82+
"Элементы управления воспроизведением",
83+
],
84+
},
7385
];
7486

7587
const renderGettingStarted = () => (

src/Site/Pages/WelcomePage/WelcomePage.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,11 @@ const WelcomePage: React.FC = () => {
6868
path: "/confetti",
6969
description: "Экранные эффекты",
7070
},
71+
{
72+
name: "AFK Screen",
73+
path: "/afkscreen",
74+
description: "Автоматическое воспроизведение видео из плейлиста",
75+
},
7176
];
7277

7378
return (

src/Site/Site_Components/Layout/Header/Header.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ const Header: React.FC = () => {
4949
{ label: "Fumo Friday", path: "/fumofriday" },
5050
{ label: "Random Mem", path: "/randommem" },
5151
{ label: "Экранные частицы", path: "/confetti" },
52+
{ label: "AFK Screen", path: "/afkscreen" },
5253
],
5354
},
5455
{
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
.afk-screen {
2+
position: relative;
3+
width: 100%;
4+
height: 100vh;
5+
background: #000;
6+
overflow: hidden;
7+
}
8+
9+
.afk-screen-container {
10+
position: relative;
11+
width: 100%;
12+
height: 100vh;
13+
background: #000;
14+
overflow: hidden;
15+
}
16+
17+
.youtube-player {
18+
width: 100%;
19+
height: 100%;
20+
21+
iframe {
22+
width: 100%;
23+
height: 100%;
24+
border: none;
25+
}
26+
}
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
import type { Meta, StoryObj } from "@storybook/react-vite";
2+
3+
import AFKScreen from "./AFKScreen";
4+
5+
const meta: Meta<typeof AFKScreen> = {
6+
title: "OBS Components/AFKScreen",
7+
component: AFKScreen,
8+
parameters: {
9+
layout: "fullscreen",
10+
docs: {
11+
description: {
12+
component:
13+
"Компонент AFK экрана с использованием YouTube IFrame API. " +
14+
"Автоматически воспроизводит YouTube видео из плейлиста, " +
15+
"включает автозапуск, зацикливание и управление звуком. " +
16+
"Использует официальную библиотеку youtube-player для надежной работы.",
17+
},
18+
},
19+
},
20+
tags: ["autodocs"],
21+
argTypes: {
22+
videoId: {
23+
control: "text",
24+
description: "ID YouTube видео",
25+
defaultValue: "6oMsWcCDGnw",
26+
},
27+
playlistId: {
28+
control: "text",
29+
description: "ID YouTube плейлиста",
30+
defaultValue: "PLB6r_8YDnipME_VANRWiiBgI9-rabmmL1",
31+
},
32+
autoplay: {
33+
control: "boolean",
34+
description: "Автоматический запуск воспроизведения",
35+
defaultValue: true,
36+
},
37+
controls: {
38+
control: "boolean",
39+
description: "Показ элементов управления",
40+
defaultValue: true,
41+
},
42+
loop: {
43+
control: "boolean",
44+
description: "Зацикливание видео",
45+
defaultValue: true,
46+
},
47+
muted: {
48+
control: "boolean",
49+
description: "Запуск без звука",
50+
defaultValue: true,
51+
},
52+
},
53+
};
54+
55+
export default meta;
56+
type Story = StoryObj<typeof meta>;
57+
58+
export const Default: Story = {
59+
args: {},
60+
parameters: {
61+
docs: {
62+
description: {
63+
story:
64+
"Основной вид компонента с автоматическим воспроизведением YouTube видео. " +
65+
"Плеер автоматически запускается, зацикливается и воспроизводит видео из плейлиста. " +
66+
"Включает обработку событий готовности, изменения состояния и ошибок.",
67+
},
68+
},
69+
},
70+
};
71+
72+
export const CustomVideo: Story = {
73+
args: {
74+
videoId: "dQw4w9WgXcQ",
75+
playlistId: "PLB6r_8YDnipME_VANRWiiBgI9-rabmmL1",
76+
},
77+
parameters: {
78+
docs: {
79+
description: {
80+
story:
81+
"Компонент с кастомным видео и плейлистом. " +
82+
"Демонстрирует использование пропсов для настройки воспроизведения.",
83+
},
84+
},
85+
},
86+
};
87+
88+
export const NoControls: Story = {
89+
args: {
90+
controls: false,
91+
muted: false,
92+
},
93+
parameters: {
94+
docs: {
95+
description: {
96+
story:
97+
"Компонент без элементов управления и со звуком. " +
98+
"Подходит для фонового воспроизведения в OBS.",
99+
},
100+
},
101+
},
102+
};
103+
104+
export const Fullscreen: Story = {
105+
args: {},
106+
parameters: {
107+
layout: "fullscreen",
108+
docs: {
109+
description: {
110+
story:
111+
"Компонент в полноэкранном режиме для OBS. " +
112+
"Плеер занимает весь экран и автоматически адаптируется под размер контейнера.",
113+
},
114+
},
115+
},
116+
};

0 commit comments

Comments
 (0)