feat: implement media echo fix and YouTube screenshare design

- Introduced a new `ScreenShareController` to manage YouTube screenshare functionality.
- Updated `DiscordPlayer` to track ownership of audio streams, preventing conflicts between music playback and screenshare.
- Added error handling for various states including voice connection checks and media busy states.
- Created unit tests for `ScreenShareController` and `DiscordPlayer` ownership rules to ensure correct functionality.
- Added documentation for the new media echo fix and screenshare design.
This commit is contained in:
MythEclipse
2026-05-16 15:48:28 +07:00
parent e32e092596
commit d50ce8698f
21 changed files with 2284 additions and 51 deletions

View File

@@ -20,7 +20,7 @@ describe("MediaQueue", () => {
() => 1700000000000,
);
const item = queue.add(source(), "tester");
const item = queue.add(source(), "music", "tester");
expect(item).toMatchObject({
id: "item-1",
@@ -40,7 +40,7 @@ describe("MediaQueue", () => {
() => "item-1",
() => 1700000000000,
);
const item = queue.add(source(), "tester");
const item = queue.add(source(), "music", "tester");
expect(queue.startNext()).toEqual({ ...item, status: "playing" });
expect(queue.snapshot()).toEqual({
@@ -55,8 +55,8 @@ describe("MediaQueue", () => {
() => `item-${++id}`,
() => 1700000000000,
);
queue.add(source({ title: "first" }), "tester");
queue.add(source({ title: "second" }), "tester");
queue.add(source({ title: "first" }), "music", "tester");
queue.add(source({ title: "second" }), "music", "tester");
queue.startNext();
queue.completeCurrent();
@@ -71,7 +71,7 @@ describe("MediaQueue", () => {
() => "item-1",
() => 1700000000000,
);
const item = queue.add(source(), "tester");
const item = queue.add(source(), "music", "tester");
queue.startNext();
expect(queue.failCurrent()).toEqual({ ...item, status: "failed" });
@@ -83,7 +83,7 @@ describe("MediaQueue", () => {
() => "item-1",
() => 1700000000000,
);
queue.add(source(), "tester");
queue.add(source(), "music", "tester");
queue.startNext();
queue.clear();