Merge tag 'v1.7.0' into vencord
v1.7.0
This commit is contained in:
@@ -4,6 +4,7 @@
|
||||
<metadata_license>CC0-1.0</metadata_license>
|
||||
<project_license>GPL-3.0+</project_license>
|
||||
<name>discord-screenaudio</name>
|
||||
<developer_name>Malte Jürgens</developer_name>
|
||||
<releases>
|
||||
<release version="${DISCORD_SCEENAUDIO_VERSION_FULL}" timestamp="${TIMESTAMP}" />
|
||||
</releases>
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
// From v0.4
|
||||
|
||||
navigator.mediaDevices.chromiumGetDisplayMedia =
|
||||
navigator.mediaDevices.getDisplayMedia;
|
||||
|
||||
@@ -16,16 +14,16 @@ const getAudioDevice = async (nameOfAudioDevice) => {
|
||||
let devices = await navigator.mediaDevices.enumerateDevices();
|
||||
audioDevice = devices.find(({ label }) => label === nameOfAudioDevice);
|
||||
if (!audioDevice)
|
||||
console.log(
|
||||
`dsa: Did not find '${nameOfAudioDevice}', trying again in 100ms`
|
||||
userscript.log(
|
||||
`Did not find '${nameOfAudioDevice}', trying again in 100ms`
|
||||
);
|
||||
await sleep(100);
|
||||
}
|
||||
console.log(`dsa: Found '${nameOfAudioDevice}'`);
|
||||
userscript.log(`Found '${nameOfAudioDevice}'`);
|
||||
return audioDevice;
|
||||
};
|
||||
|
||||
function setGetDisplayMedia(overrideArgs = undefined) {
|
||||
function setGetDisplayMedia(video = true, overrideArgs = undefined) {
|
||||
const getDisplayMedia = async (...args) => {
|
||||
var id;
|
||||
try {
|
||||
@@ -63,6 +61,7 @@ function setGetDisplayMedia(overrideArgs = undefined) {
|
||||
: args || [{ video: true, audio: true }])
|
||||
);
|
||||
gdm.addTrack(track);
|
||||
if (!video) for (const track of gdm.getVideoTracks()) track.enabled = false;
|
||||
return gdm;
|
||||
};
|
||||
navigator.mediaDevices.getDisplayMedia = getDisplayMedia;
|
||||
@@ -70,137 +69,275 @@ function setGetDisplayMedia(overrideArgs = undefined) {
|
||||
|
||||
setGetDisplayMedia();
|
||||
|
||||
let userscript;
|
||||
let muteBtn;
|
||||
let deafenBtn;
|
||||
let streamStartBtn;
|
||||
let streamStartBtnInitialDisplay;
|
||||
let streamStartBtnClone;
|
||||
let resolutionString;
|
||||
const clonedElements = [];
|
||||
const hiddenElements = [];
|
||||
let wasStreamActive = false;
|
||||
|
||||
setInterval(() => {
|
||||
const streamActive =
|
||||
document.getElementsByClassName("panel-2ZFCRb activityPanel-9icbyU")
|
||||
.length > 0;
|
||||
function createButton(text, onClick) {
|
||||
const button = document.createElement("button");
|
||||
button.style.marginBottom = "20px";
|
||||
button.classList =
|
||||
"button-ejjZWC lookFilled-1H2Jvj colorBrand-2M3O3N sizeSmall-3R2P2p grow-2T4nbg";
|
||||
button.innerText = text;
|
||||
button.addEventListener("click", onClick);
|
||||
return button;
|
||||
}
|
||||
|
||||
if (!streamActive && wasStreamActive)
|
||||
console.log("!discord-screenaudio-stream-stopped");
|
||||
wasStreamActive = streamActive;
|
||||
function createSwitch(text, enabled, onClick) {
|
||||
const container = document.createElement("div");
|
||||
container.style.marginBottom = "20px";
|
||||
container.className = "labelRow-NnoUIp";
|
||||
|
||||
if (streamActive) {
|
||||
clonedElements.forEach((el) => {
|
||||
el.remove();
|
||||
});
|
||||
clonedElements.length = 0;
|
||||
const label = document.createElement("label");
|
||||
label.innerText = text;
|
||||
label.className = "title-2yADjX";
|
||||
container.appendChild(label);
|
||||
|
||||
hiddenElements.forEach((el) => {
|
||||
el.style.display = "block";
|
||||
});
|
||||
hiddenElements.length = 0;
|
||||
} else {
|
||||
for (const el of [
|
||||
document.getElementsByClassName("actionButtons-2vEOUh")?.[0]?.children[1],
|
||||
document.querySelector(
|
||||
".wrapper-3t3Yqv > div > div > div > div > .controlButton-2PMNom"
|
||||
),
|
||||
]) {
|
||||
if (!el) continue;
|
||||
if (el.classList.contains("discord-screenaudio-cloned")) continue;
|
||||
el.classList.add("discord-screenaudio-cloned");
|
||||
elClone = el.cloneNode(true);
|
||||
elClone.title = "Share Your Screen with Audio";
|
||||
elClone.addEventListener("click", () => {
|
||||
console.log("!discord-screenaudio-start-stream");
|
||||
});
|
||||
const svg = document.createElement("div");
|
||||
container.appendChild(svg);
|
||||
|
||||
const initialDisplay = el.style.display;
|
||||
|
||||
window.discordScreenaudioStartStream = (width, height, frameRate) => {
|
||||
window.discordScreenaudioResolutionString = `${height}p ${frameRate}FPS`;
|
||||
setGetDisplayMedia({
|
||||
audio: true,
|
||||
video: { width, height, frameRate },
|
||||
});
|
||||
el.click();
|
||||
el.style.display = initialDisplay;
|
||||
elClone.remove();
|
||||
};
|
||||
|
||||
el.style.display = "none";
|
||||
el.parentNode.insertBefore(elClone, el);
|
||||
|
||||
clonedElements.push(elClone);
|
||||
hiddenElements.push(el);
|
||||
}
|
||||
function setSvgDisabled() {
|
||||
svg.innerHTML = `<div class="container-1QtPKm default-colors" style="opacity: 1; background-color: rgb(114, 118, 125);"><svg class="slider-HJFN2i" viewBox="0 0 28 20" preserveAspectRatio="xMinYMid meet" aria-hidden="true" style="left: -3px;"><rect fill="white" x="4" y="0" height="20" width="20" rx="10"></rect><svg viewBox="0 0 20 20" fill="none"><path fill="rgba(114, 118, 125, 1)" d="M5.13231 6.72963L6.7233 5.13864L14.855 13.2704L13.264 14.8614L5.13231 6.72963Z"></path><path fill="rgba(114, 118, 125, 1)" d="M13.2704 5.13864L14.8614 6.72963L6.72963 14.8614L5.13864 13.2704L13.2704 5.13864Z"></path></svg></svg><input id="uid_84" type="checkbox" class="input-125oad" tabindex="0"></div>`;
|
||||
}
|
||||
|
||||
// Add about text in settings
|
||||
if (
|
||||
document.getElementsByClassName("dirscordScreenaudioAboutText").length == 0
|
||||
) {
|
||||
for (const el of document.getElementsByClassName("info-3pQQBb")) {
|
||||
let aboutEl;
|
||||
if (window.discordScreenaudioKXMLGUI) {
|
||||
aboutEl = document.createElement("a");
|
||||
aboutEl.addEventListener("click", () => {
|
||||
console.log("!discord-screenaudio-about");
|
||||
});
|
||||
} else {
|
||||
aboutEl = document.createElement("div");
|
||||
}
|
||||
aboutEl.innerText = `discord-screenaudio ${window.discordScreenaudioVersion}`;
|
||||
aboutEl.style.fontSize = "12px";
|
||||
aboutEl.style.color = "var(--text-muted)";
|
||||
aboutEl.style.textTransform = "none";
|
||||
aboutEl.classList.add("dirscordScreenaudioAboutText");
|
||||
aboutEl.style.cursor = "pointer";
|
||||
el.appendChild(aboutEl);
|
||||
}
|
||||
function setSvgEnabled() {
|
||||
svg.innerHTML = `<div class="container-1QtPKm default-colors checked-16gMAN" style="opacity: 1; background-color: rgb(59, 165, 92);"><svg class="slider-HJFN2i" viewBox="0 0 28 20" preserveAspectRatio="xMinYMid meet" aria-hidden="true" style="left: 12px;"><rect fill="white" x="4" y="0" height="20" width="20" rx="10"></rect><svg viewBox="0 0 20 20" fill="none"><path fill="rgba(59, 165, 92, 1)" d="M7.89561 14.8538L6.30462 13.2629L14.3099 5.25755L15.9009 6.84854L7.89561 14.8538Z"></path><path fill="rgba(59, 165, 92, 1)" d="M4.08643 11.0903L5.67742 9.49929L9.4485 13.2704L7.85751 14.8614L4.08643 11.0903Z"></path></svg></svg><input id="uid_74" type="checkbox" class="input-125oad" tabindex="0" checked=""></div>`;
|
||||
}
|
||||
|
||||
// Remove stream settings if stream is active
|
||||
document.getElementById("manage-streams-change-windows")?.remove();
|
||||
document.querySelector(`[aria-label="Stream Settings"]`)?.remove();
|
||||
|
||||
// Add event listener for keybind tab
|
||||
if (
|
||||
document
|
||||
.getElementById("keybinds-tab")
|
||||
?.getElementsByClassName(
|
||||
"container-3jbRo5 info-1hMolH fontSize16-3zr6Io browserNotice-1u-Y5o"
|
||||
).length
|
||||
) {
|
||||
const el = document
|
||||
.getElementById("keybinds-tab")
|
||||
.getElementsByClassName("children-1xdcWE")[0];
|
||||
const div = document.createElement("div");
|
||||
div.style.marginBottom = "50px";
|
||||
const button = document.createElement("button");
|
||||
button.classList =
|
||||
"button-f2h6uQ lookFilled-yCfaCM colorBrand-I6CyqQ sizeSmall-wU2dO- grow-2sR_-F";
|
||||
button.innerText = "Edit Global Keybinds";
|
||||
button.addEventListener("click", () => {
|
||||
console.log("!discord-screenaudio-keybinds");
|
||||
});
|
||||
div.appendChild(button);
|
||||
el.innerHTML = "";
|
||||
el.appendChild(div);
|
||||
function updateSvg() {
|
||||
if (enabled) setSvgEnabled();
|
||||
else setSvgDisabled();
|
||||
}
|
||||
|
||||
const muteBtn = document.getElementsByClassName(
|
||||
"button-12Fmur enabled-9OeuTA button-f2h6uQ lookBlank-21BCro colorBrand-I6CyqQ grow-2sR_-F"
|
||||
)[0];
|
||||
window.discordScreenaudioToggleMute = () => muteBtn.click();
|
||||
const deafenBtn = document.getElementsByClassName(
|
||||
"button-12Fmur enabled-9OeuTA button-f2h6uQ lookBlank-21BCro colorBrand-I6CyqQ grow-2sR_-F"
|
||||
)[1];
|
||||
window.discordScreenaudioToggleDeafen = () => deafenBtn.click();
|
||||
container.addEventListener("click", () => {
|
||||
enabled = !enabled;
|
||||
updateSvg();
|
||||
onClick(enabled);
|
||||
});
|
||||
updateSvg();
|
||||
|
||||
if (window.discordScreenaudioResolutionString) {
|
||||
for (const el of document.getElementsByClassName(
|
||||
"qualityIndicator-39wQDy"
|
||||
)) {
|
||||
el.innerHTML = window.discordScreenaudioResolutionString;
|
||||
}
|
||||
}
|
||||
}, 500);
|
||||
return container;
|
||||
}
|
||||
|
||||
// Fix for broken discord notifications after restart
|
||||
// (https://github.com/maltejur/discord-screenaudio/issues/17)
|
||||
Notification.requestPermission();
|
||||
|
||||
setTimeout(() => {
|
||||
new QWebChannel(qt.webChannelTransport, (channel) => {
|
||||
userscript = channel.objects.userscript;
|
||||
main();
|
||||
});
|
||||
});
|
||||
|
||||
function main() {
|
||||
userscript.muteToggled.connect(() => {
|
||||
muteBtn && muteBtn.click();
|
||||
});
|
||||
|
||||
userscript.deafenToggled.connect(() => {
|
||||
deafenBtn && deafenBtn.click();
|
||||
});
|
||||
|
||||
userscript.streamStarted.connect((video, width, height, frameRate) => {
|
||||
resolutionString = video ? `${height}p ${frameRate}FPS` : "Audio Only";
|
||||
setGetDisplayMedia(video, {
|
||||
audio: true,
|
||||
video: { width, height, frameRate },
|
||||
});
|
||||
streamStartBtn.click();
|
||||
streamStartBtn.style.display = streamStartBtnInitialDisplay;
|
||||
streamStartBtnClone.remove();
|
||||
});
|
||||
|
||||
setInterval(async () => {
|
||||
const streamActive =
|
||||
document.getElementsByClassName("panel-2ZFCRb activityPanel-9icbyU")
|
||||
.length > 0;
|
||||
|
||||
if (!streamActive && wasStreamActive) userscript.stopVirtmic();
|
||||
wasStreamActive = streamActive;
|
||||
|
||||
if (streamActive) {
|
||||
clonedElements.forEach((el) => {
|
||||
el.remove();
|
||||
});
|
||||
clonedElements.length = 0;
|
||||
|
||||
hiddenElements.forEach((el) => {
|
||||
el.style.display = "block";
|
||||
});
|
||||
hiddenElements.length = 0;
|
||||
} else {
|
||||
for (const el of [
|
||||
document.getElementsByClassName("actionButtons-2vEOUh")?.[0]
|
||||
?.children[1],
|
||||
document.querySelector(
|
||||
".wrapper-3t3Yqv > div > div > div > div > .controlButton-2PMNom"
|
||||
),
|
||||
]) {
|
||||
if (!el) continue;
|
||||
if (el.classList.contains("discord-screenaudio-cloned")) continue;
|
||||
streamStartBtn = el;
|
||||
streamStartBtn.classList.add("discord-screenaudio-cloned");
|
||||
|
||||
streamStartBtnClone = streamStartBtn.cloneNode(true);
|
||||
streamStartBtnClone.title = "Share Your Screen with Audio";
|
||||
streamStartBtnClone.addEventListener("click", () => {
|
||||
userscript.showStreamDialog();
|
||||
});
|
||||
|
||||
streamStartBtnInitialDisplay = streamStartBtn.style.display;
|
||||
|
||||
streamStartBtn.style.display = "none";
|
||||
streamStartBtn.parentNode.insertBefore(streamStartBtnClone, el);
|
||||
|
||||
clonedElements.push(streamStartBtnClone);
|
||||
hiddenElements.push(streamStartBtn);
|
||||
}
|
||||
}
|
||||
|
||||
// Add about text in settings
|
||||
if (
|
||||
document.getElementsByClassName("dirscordScreenaudioAboutText").length ==
|
||||
0
|
||||
) {
|
||||
for (const el of document.getElementsByClassName("info-3pQQBb")) {
|
||||
let aboutEl;
|
||||
if (userscript.kxmlgui) {
|
||||
aboutEl = document.createElement("a");
|
||||
aboutEl.addEventListener("click", () => {
|
||||
userscript.showHelpMenu();
|
||||
});
|
||||
} else {
|
||||
aboutEl = document.createElement("div");
|
||||
}
|
||||
aboutEl.innerText = `discord-screenaudio ${userscript.version}`;
|
||||
aboutEl.style.fontSize = "12px";
|
||||
aboutEl.style.color = "var(--text-muted)";
|
||||
aboutEl.style.textTransform = "none";
|
||||
aboutEl.style.display = "inline-block";
|
||||
aboutEl.style.width = "100%";
|
||||
aboutEl.classList.add("dirscordScreenaudioAboutText");
|
||||
aboutEl.style.cursor = "pointer";
|
||||
el.appendChild(aboutEl);
|
||||
}
|
||||
}
|
||||
|
||||
// Remove stream settings if stream is active
|
||||
document.getElementById("manage-streams-change-windows")?.remove();
|
||||
document.querySelector(`[aria-label="Stream Settings"]`)?.remove();
|
||||
|
||||
// Add event listener for keybind tab
|
||||
if (
|
||||
document
|
||||
.getElementById("keybinds-tab")
|
||||
?.getElementsByClassName(
|
||||
"container-3jbRo5 info-1hMolH browserNotice-1u-Y5o"
|
||||
).length
|
||||
) {
|
||||
const el = document
|
||||
.getElementById("keybinds-tab")
|
||||
.getElementsByClassName("children-1xdcWE")[0];
|
||||
const div = document.createElement("div");
|
||||
div.style.marginBottom = "50px";
|
||||
div.appendChild(
|
||||
createButton("Edit Global Keybinds", () => {
|
||||
userscript.showShortcutsDialog();
|
||||
})
|
||||
);
|
||||
el.innerHTML = "";
|
||||
el.appendChild(div);
|
||||
}
|
||||
|
||||
const buttonContainer =
|
||||
document.getElementsByClassName("container-YkUktl")[0];
|
||||
if (!buttonContainer) {
|
||||
userscript.log(
|
||||
"Cannot locate Mute/Deafen/Settings button container, please report this on GitHub"
|
||||
);
|
||||
}
|
||||
|
||||
muteBtn = buttonContainer
|
||||
? buttonContainer.getElementsByClassName(
|
||||
"button-12Fmur enabled-9OeuTA button-f2h6uQ lookBlank-21BCro colorBrand-I6CyqQ grow-2sR_-F"
|
||||
)[0]
|
||||
: null;
|
||||
|
||||
deafenBtn = buttonContainer
|
||||
? buttonContainer.getElementsByClassName(
|
||||
"button-12Fmur enabled-9OeuTA button-f2h6uQ lookBlank-21BCro colorBrand-I6CyqQ grow-2sR_-F"
|
||||
)[1]
|
||||
: null;
|
||||
|
||||
if (resolutionString) {
|
||||
for (const el of document.getElementsByClassName(
|
||||
"qualityIndicator-39wQDy"
|
||||
)) {
|
||||
el.innerHTML = resolutionString;
|
||||
}
|
||||
}
|
||||
|
||||
const accountTab = document.getElementById("my-account-tab");
|
||||
if (accountTab) {
|
||||
const discordScreenaudioSettings = document.getElementById(
|
||||
"discord-screenaudio-settings"
|
||||
);
|
||||
if (!discordScreenaudioSettings) {
|
||||
const firstDivider = accountTab.getElementsByClassName(
|
||||
"divider-3nqZNm marginTop40-Q4o1tS"
|
||||
)[0];
|
||||
if (firstDivider) {
|
||||
const section = document.createElement("div");
|
||||
section.className = "marginTop40-Q4o1tS";
|
||||
section.id = "discord-screenaudio-settings";
|
||||
|
||||
const title = document.createElement("h2");
|
||||
title.className =
|
||||
"h1-3iMExa title-lXcL8p defaultColor-3Olr-9 defaultMarginh1-1UYutH";
|
||||
title.innerText = "discord-screenaudio";
|
||||
section.appendChild(title);
|
||||
|
||||
section.appendChild(
|
||||
createButton("Edit Global Keybinds", () => {
|
||||
userscript.showShortcutsDialog();
|
||||
})
|
||||
);
|
||||
|
||||
section.appendChild(
|
||||
createSwitch(
|
||||
"Move discord-screenaudio to the system tray instead of closing",
|
||||
await userscript.getBoolPref("trayIcon", false),
|
||||
(enabled) => {
|
||||
userscript.setTrayIcon(enabled);
|
||||
}
|
||||
)
|
||||
);
|
||||
|
||||
section.appendChild(
|
||||
createSwitch(
|
||||
"Start discord-screenaudio hidden to tray",
|
||||
await userscript.getPref("startHidden", false),
|
||||
(hidden) => {
|
||||
userscript.setPref("startHidden", hidden);
|
||||
}
|
||||
)
|
||||
);
|
||||
|
||||
const divider = document.createElement("div");
|
||||
divider.className = "divider-3nqZNm marginTop40-Q4o1tS";
|
||||
|
||||
firstDivider.after(section);
|
||||
section.after(divider);
|
||||
}
|
||||
}
|
||||
}
|
||||
}, 500);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user