Compare commits
17 Commits
v1.0.0-rc.
...
v1.0.0-rc.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8fc529102c | ||
|
|
a7a8346b63 | ||
|
|
88b129f863 | ||
|
|
f4fc2e1f19 | ||
|
|
e1b35e3ca8 | ||
|
|
a773795e38 | ||
|
|
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)
|
||||
|
||||
install(TARGETS discord-screenaudio DESTINATION bin)
|
||||
install(PROGRAMS assets/discord-screenaudio.desktop DESTINATION ${CMAKE_INSTALL_PREFIX}/share/applications)
|
||||
install(PROGRAMS assets/de.shorsh.discord-screenaudio.png DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/256x256/apps)
|
||||
install(PROGRAMS assets/de.shorsh.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
|
||||
|
||||
- Only works with **PipeWire**
|
||||
- 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
|
||||
|
||||
@@ -36,7 +43,14 @@ On Debian:
|
||||
|
||||
### 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
|
||||
cmake -B build
|
||||
|
||||
@@ -2,5 +2,5 @@
|
||||
Type=Application
|
||||
Name=discord-screenaudio
|
||||
Exec=discord-screenaudio
|
||||
Icon=discord
|
||||
Icon=de.shorsh.discord-screenaudio
|
||||
Terminal=false
|
||||
38
assets/de.shorsh.discord-screenaudio.metainfo.xml
Normal file
38
assets/de.shorsh.discord-screenaudio.metainfo.xml
Normal file
@@ -0,0 +1,38 @@
|
||||
<?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.11" />
|
||||
</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 great work of @edisionnano and the Rohrkabel library by @Curve.</p>
|
||||
<p>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.</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/de.shorsh.discord-screenaudio.png
Normal file
BIN
assets/de.shorsh.discord-screenaudio.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 48 KiB |
@@ -81,11 +81,16 @@ setInterval(() => {
|
||||
});
|
||||
hiddenElements.length = 0;
|
||||
} else {
|
||||
for (const el of document.querySelectorAll(
|
||||
'[aria-label="Share Your Screen"]'
|
||||
)) {
|
||||
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.ariaLabel = "Share Your Screen with Audio";
|
||||
elClone.title = "Share Your Screen with Audio";
|
||||
elClone.addEventListener("click", () => {
|
||||
console.log("!discord-screenaudio-start-stream");
|
||||
@@ -117,7 +122,7 @@ setInterval(() => {
|
||||
) {
|
||||
for (const el of document.getElementsByClassName("info-3pQQBb")) {
|
||||
const aboutEl = document.createElement("div");
|
||||
aboutEl.innerText = "discord-screenaudio v1.0.0-rc.6";
|
||||
aboutEl.innerText = "discord-screenaudio v1.0.0-rc.11";
|
||||
aboutEl.style.fontSize = "12px";
|
||||
aboutEl.style.color = "var(--text-muted)";
|
||||
aboutEl.classList.add("dirscordScreenaudioAboutText");
|
||||
@@ -129,3 +134,7 @@ setInterval(() => {
|
||||
document.getElementById("manage-streams-change-windows")?.remove();
|
||||
document.querySelector(`[aria-label="Stream Settings"]`)?.remove();
|
||||
}, 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::PlaybackRequiresUserGesture,
|
||||
false);
|
||||
settings()->setAttribute(QWebEngineSettings::JavascriptCanOpenWindows, false);
|
||||
|
||||
setUrl(QUrl("https://discord.com/app"));
|
||||
|
||||
@@ -85,6 +86,18 @@ bool DiscordPage::acceptNavigationRequest(const QUrl &url,
|
||||
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() {
|
||||
if (m_virtmicProcess.state() == QProcess::Running) {
|
||||
qDebug() << "[virtmic] Stopping Virtmic";
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
#include "virtmic.h"
|
||||
|
||||
#include <QProcess>
|
||||
#include <QWebEngineFullScreenRequest>
|
||||
#include <QWebEnginePage>
|
||||
|
||||
class DiscordPage : public QWebEnginePage {
|
||||
@@ -18,6 +19,7 @@ private:
|
||||
bool acceptNavigationRequest(const QUrl &url,
|
||||
QWebEnginePage::NavigationType type,
|
||||
bool isMainFrame) override;
|
||||
QWebEnginePage *createWindow(QWebEnginePage::WebWindowType type) override;
|
||||
void
|
||||
javaScriptConsoleMessage(QWebEnginePage::JavaScriptConsoleMessageLevel level,
|
||||
const QString &message, int lineNumber,
|
||||
@@ -31,3 +33,15 @@ private Q_SLOTS:
|
||||
QWebEnginePage::Feature feature);
|
||||
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[]) {
|
||||
QApplication app(argc, argv);
|
||||
QApplication::setApplicationName("discord-screenaudio");
|
||||
QApplication::setApplicationVersion("1.0.0-rc.6");
|
||||
QApplication::setApplicationVersion("1.0.0-rc.11");
|
||||
|
||||
QCommandLineParser parser;
|
||||
parser.setApplicationDescription(
|
||||
|
||||
@@ -23,8 +23,25 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) {
|
||||
}
|
||||
|
||||
void MainWindow::setupWebView() {
|
||||
m_webView = new QWebEngineView(this);
|
||||
auto page = new DiscordPage(this);
|
||||
connect(page, &QWebEnginePage::fullScreenRequested, this,
|
||||
&MainWindow::fullScreenRequested);
|
||||
|
||||
m_webView = new QWebEngineView(this);
|
||||
m_webView->setPage(page);
|
||||
|
||||
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;
|
||||
QWebEngineProfile *prepareProfile();
|
||||
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