Compare commits
11 Commits
v1.0.0-rc.
...
v1.0.0-rc.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c8695ca5ff | ||
|
|
bc23d3423a | ||
|
|
f5217dfdfa | ||
|
|
6ef16b9625 | ||
|
|
b62f1bab1f | ||
|
|
5f9211f98f | ||
|
|
cfbb4152c3 | ||
|
|
fa83e2d9a8 | ||
|
|
58ecbbc6f4 | ||
|
|
77300ed178 | ||
|
|
99df18ef89 |
@@ -48,4 +48,6 @@ add_executable(discord-screenaudio ${discord-screenaudio_SRC})
|
|||||||
target_link_libraries(discord-screenaudio Qt5::Widgets Qt5::WebEngineWidgets rohrkabel)
|
target_link_libraries(discord-screenaudio Qt5::Widgets Qt5::WebEngineWidgets rohrkabel)
|
||||||
|
|
||||||
install(TARGETS discord-screenaudio DESTINATION bin)
|
install(TARGETS discord-screenaudio DESTINATION bin)
|
||||||
|
install(PROGRAMS assets/discord.png DESTINATION ${CMAKE_INSTALL_PREFIX}/share/pixmaps)
|
||||||
install(PROGRAMS assets/discord-screenaudio.desktop DESTINATION ${CMAKE_INSTALL_PREFIX}/share/applications)
|
install(PROGRAMS assets/discord-screenaudio.desktop DESTINATION ${CMAKE_INSTALL_PREFIX}/share/applications)
|
||||||
|
install(PROGRAMS assets/de.shorsh.discord-screenaudio.metainfo.xml DESTINATION ${CMAKE_INSTALL_PREFIX}/share/metainfo)
|
||||||
|
|||||||
18
README.md
18
README.md
@@ -9,11 +9,18 @@ of [@edisionnano](https://github.com/edisionnano) and the
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
The purpose of this project is **not** to provide an alternative to the original
|
||||||
|
Discord client. Rather, it should be used in addition to the original client in
|
||||||
|
case you want to stream something, maybe used with a second account. For
|
||||||
|
anything else, this client has way too many things that work less well than in
|
||||||
|
the original client.
|
||||||
|
|
||||||
## Known Issues
|
## Known Issues
|
||||||
|
|
||||||
- Only works with **PipeWire**
|
- Only works with **PipeWire**
|
||||||
- Only works on **X11**
|
- Only works on **X11**
|
||||||
- Can only share primary screen (no other screens or specific applications) (see [#1](https://github.com/maltejur/discord-screenaudio/issues/1))
|
- Can only share primary screen (no other screens or specific applications) (see
|
||||||
|
[#1](https://github.com/maltejur/discord-screenaudio/issues/1))
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
@@ -36,7 +43,14 @@ On Debian:
|
|||||||
|
|
||||||
### Building
|
### Building
|
||||||
|
|
||||||
To build the program, run this in the source directory:
|
First, clone the repository:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git clone https://github.com/maltejur/discord-screenaudio.git
|
||||||
|
cd discord-screenaudio
|
||||||
|
```
|
||||||
|
|
||||||
|
Then, to build the program, run this in the source directory:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cmake -B build
|
cmake -B build
|
||||||
|
|||||||
55
assets/de.shorsh.discord-screenaudio.metainfo.xml
Normal file
55
assets/de.shorsh.discord-screenaudio.metainfo.xml
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<component type="desktop-application">
|
||||||
|
<id>de.shorsh.discord-screenaudio</id>
|
||||||
|
<metadata_license>CC0-1.0</metadata_license>
|
||||||
|
<project_license>GPL-3.0+</project_license>
|
||||||
|
<name>discord-screenaudio</name>
|
||||||
|
<releases>
|
||||||
|
<release version="v1.0.0-rc.8" />
|
||||||
|
</releases>
|
||||||
|
|
||||||
|
<summary>
|
||||||
|
A very WIP custom discord client that supports streaming with audio on
|
||||||
|
Linux.
|
||||||
|
</summary>
|
||||||
|
|
||||||
|
<description>
|
||||||
|
<p>
|
||||||
|
A very WIP custom discord client that supports streaming with audio on
|
||||||
|
Linux, made possible by the
|
||||||
|
<a href="https://github.com/edisionnano/Screenshare-with-audio-on-Discord-with-Linux" >
|
||||||
|
great work
|
||||||
|
</a>
|
||||||
|
of <a href="https://github.com/edisionnano">@edisionnano</a> and the
|
||||||
|
<a href="https://github.com/Soundux/rohrkabel">Rohrkabel</a> library by
|
||||||
|
<a href="https://github.com/Curve">@Curve</a>.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
The purpose of this project is
|
||||||
|
<b>not</b>
|
||||||
|
to provide an alternative to the original Discord client. Rather, it
|
||||||
|
should be used in addition to the original client in case you want to
|
||||||
|
stream something, maybe used with a second account. For anything else,
|
||||||
|
this client has way too many things that work less well than in the
|
||||||
|
original client.
|
||||||
|
</p>
|
||||||
|
</description>
|
||||||
|
|
||||||
|
<launchable type="desktop-id">
|
||||||
|
discord-screenaudio.desktop
|
||||||
|
</launchable>
|
||||||
|
|
||||||
|
<screenshots>
|
||||||
|
<screenshot type="default">
|
||||||
|
<image>
|
||||||
|
https://user-images.githubusercontent.com/48161361/179571245-11ea05f3-fb5e-4aef-9132-2736e122ef04.png
|
||||||
|
</image>
|
||||||
|
</screenshot>
|
||||||
|
</screenshots>
|
||||||
|
|
||||||
|
<url type="homepage">https://github.com/maltejur/discord-screenaudio</url>
|
||||||
|
|
||||||
|
<provides>
|
||||||
|
<binary>discord-screenaudio</binary>
|
||||||
|
</provides>
|
||||||
|
</component>
|
||||||
BIN
assets/discord.png
Normal file
BIN
assets/discord.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 6.8 KiB |
@@ -81,11 +81,16 @@ setInterval(() => {
|
|||||||
});
|
});
|
||||||
hiddenElements.length = 0;
|
hiddenElements.length = 0;
|
||||||
} else {
|
} else {
|
||||||
for (const el of document.querySelectorAll(
|
for (const el of [
|
||||||
'[aria-label="Share Your Screen"]'
|
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 = el.cloneNode(true);
|
||||||
elClone.ariaLabel = "Share Your Screen with Audio";
|
|
||||||
elClone.title = "Share Your Screen with Audio";
|
elClone.title = "Share Your Screen with Audio";
|
||||||
elClone.addEventListener("click", () => {
|
elClone.addEventListener("click", () => {
|
||||||
console.log("!discord-screenaudio-start-stream");
|
console.log("!discord-screenaudio-start-stream");
|
||||||
@@ -117,7 +122,7 @@ setInterval(() => {
|
|||||||
) {
|
) {
|
||||||
for (const el of document.getElementsByClassName("info-3pQQBb")) {
|
for (const el of document.getElementsByClassName("info-3pQQBb")) {
|
||||||
const aboutEl = document.createElement("div");
|
const aboutEl = document.createElement("div");
|
||||||
aboutEl.innerText = "discord-screenaudio v1.0.0-rc.6";
|
aboutEl.innerText = "discord-screenaudio v1.0.0-rc.8";
|
||||||
aboutEl.style.fontSize = "12px";
|
aboutEl.style.fontSize = "12px";
|
||||||
aboutEl.style.color = "var(--text-muted)";
|
aboutEl.style.color = "var(--text-muted)";
|
||||||
aboutEl.classList.add("dirscordScreenaudioAboutText");
|
aboutEl.classList.add("dirscordScreenaudioAboutText");
|
||||||
@@ -129,3 +134,7 @@ setInterval(() => {
|
|||||||
document.getElementById("manage-streams-change-windows")?.remove();
|
document.getElementById("manage-streams-change-windows")?.remove();
|
||||||
document.querySelector(`[aria-label="Stream Settings"]`)?.remove();
|
document.querySelector(`[aria-label="Stream Settings"]`)?.remove();
|
||||||
}, 500);
|
}, 500);
|
||||||
|
|
||||||
|
// Fix for broken discord notifications after restart
|
||||||
|
// (https://github.com/maltejur/discord-screenaudio/issues/17)
|
||||||
|
Notification.requestPermission();
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ DiscordPage::DiscordPage(QWidget *parent) : QWebEnginePage(parent) {
|
|||||||
settings()->setAttribute(QWebEngineSettings::FullScreenSupportEnabled, true);
|
settings()->setAttribute(QWebEngineSettings::FullScreenSupportEnabled, true);
|
||||||
settings()->setAttribute(QWebEngineSettings::PlaybackRequiresUserGesture,
|
settings()->setAttribute(QWebEngineSettings::PlaybackRequiresUserGesture,
|
||||||
false);
|
false);
|
||||||
|
settings()->setAttribute(QWebEngineSettings::JavascriptCanOpenWindows, false);
|
||||||
|
|
||||||
setUrl(QUrl("https://discord.com/app"));
|
setUrl(QUrl("https://discord.com/app"));
|
||||||
|
|
||||||
@@ -85,6 +86,18 @@ bool DiscordPage::acceptNavigationRequest(const QUrl &url,
|
|||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
bool ExternalPage::acceptNavigationRequest(const QUrl &url,
|
||||||
|
QWebEnginePage::NavigationType type,
|
||||||
|
bool isMainFrame) {
|
||||||
|
QDesktopServices::openUrl(url);
|
||||||
|
deleteLater();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
QWebEnginePage *DiscordPage::createWindow(QWebEnginePage::WebWindowType type) {
|
||||||
|
return new ExternalPage;
|
||||||
|
}
|
||||||
|
|
||||||
void DiscordPage::stopVirtmic() {
|
void DiscordPage::stopVirtmic() {
|
||||||
if (m_virtmicProcess.state() == QProcess::Running) {
|
if (m_virtmicProcess.state() == QProcess::Running) {
|
||||||
qDebug() << "[virtmic] Stopping Virtmic";
|
qDebug() << "[virtmic] Stopping Virtmic";
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
#include "virtmic.h"
|
#include "virtmic.h"
|
||||||
|
|
||||||
#include <QProcess>
|
#include <QProcess>
|
||||||
|
#include <QWebEngineFullScreenRequest>
|
||||||
#include <QWebEnginePage>
|
#include <QWebEnginePage>
|
||||||
|
|
||||||
class DiscordPage : public QWebEnginePage {
|
class DiscordPage : public QWebEnginePage {
|
||||||
@@ -18,6 +19,7 @@ private:
|
|||||||
bool acceptNavigationRequest(const QUrl &url,
|
bool acceptNavigationRequest(const QUrl &url,
|
||||||
QWebEnginePage::NavigationType type,
|
QWebEnginePage::NavigationType type,
|
||||||
bool isMainFrame) override;
|
bool isMainFrame) override;
|
||||||
|
QWebEnginePage *createWindow(QWebEnginePage::WebWindowType type) override;
|
||||||
void
|
void
|
||||||
javaScriptConsoleMessage(QWebEnginePage::JavaScriptConsoleMessageLevel level,
|
javaScriptConsoleMessage(QWebEnginePage::JavaScriptConsoleMessageLevel level,
|
||||||
const QString &message, int lineNumber,
|
const QString &message, int lineNumber,
|
||||||
@@ -31,3 +33,15 @@ private Q_SLOTS:
|
|||||||
QWebEnginePage::Feature feature);
|
QWebEnginePage::Feature feature);
|
||||||
void startStream(QString target, uint width, uint height, uint frameRate);
|
void startStream(QString target, uint width, uint height, uint frameRate);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Will immediately get destroyed again but is needed for navigation to
|
||||||
|
// target="_blank" links, since QWebEnginePage::newWindowRequested is
|
||||||
|
// only available sinec Qt 6.3.
|
||||||
|
class ExternalPage : public QWebEnginePage {
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool acceptNavigationRequest(const QUrl &url,
|
||||||
|
QWebEnginePage::NavigationType type,
|
||||||
|
bool isMainFrame) override;
|
||||||
|
};
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
QApplication app(argc, argv);
|
QApplication app(argc, argv);
|
||||||
QApplication::setApplicationName("discord-screenaudio");
|
QApplication::setApplicationName("discord-screenaudio");
|
||||||
QApplication::setApplicationVersion("1.0.0-rc.6");
|
QApplication::setApplicationVersion("1.0.0-rc.8");
|
||||||
|
|
||||||
QCommandLineParser parser;
|
QCommandLineParser parser;
|
||||||
parser.setApplicationDescription(
|
parser.setApplicationDescription(
|
||||||
|
|||||||
@@ -23,8 +23,25 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::setupWebView() {
|
void MainWindow::setupWebView() {
|
||||||
m_webView = new QWebEngineView(this);
|
|
||||||
auto page = new DiscordPage(this);
|
auto page = new DiscordPage(this);
|
||||||
|
connect(page, &QWebEnginePage::fullScreenRequested, this,
|
||||||
|
&MainWindow::fullScreenRequested);
|
||||||
|
|
||||||
|
m_webView = new QWebEngineView(this);
|
||||||
m_webView->setPage(page);
|
m_webView->setPage(page);
|
||||||
|
|
||||||
setCentralWidget(m_webView);
|
setCentralWidget(m_webView);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MainWindow::fullScreenRequested(
|
||||||
|
QWebEngineFullScreenRequest fullScreenRequest) {
|
||||||
|
fullScreenRequest.accept();
|
||||||
|
if (fullScreenRequest.toggleOn()) {
|
||||||
|
m_wasMaximized = isMaximized();
|
||||||
|
showFullScreen();
|
||||||
|
} else {
|
||||||
|
m_wasMaximized ? showMaximized() : showNormal();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::closeEvent(QCloseEvent *event) { QApplication::quit(); }
|
||||||
|
|||||||
@@ -21,4 +21,9 @@ private:
|
|||||||
QWebEngineView *m_webView;
|
QWebEngineView *m_webView;
|
||||||
QWebEngineProfile *prepareProfile();
|
QWebEngineProfile *prepareProfile();
|
||||||
DiscordPage *m_discordPage;
|
DiscordPage *m_discordPage;
|
||||||
|
void closeEvent(QCloseEvent *event) override;
|
||||||
|
bool m_wasMaximized;
|
||||||
|
|
||||||
|
private Q_SLOTS:
|
||||||
|
void fullScreenRequested(QWebEngineFullScreenRequest fullScreenRequest);
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user