Fix and improve Streamlink code

Move streamlink code to its own file

Fixes #275

Untested on linux, but should work decently there as well.
This commit is contained in:
Rasmus Karlsson
2018-03-24 14:13:04 +01:00
parent 6c56e9cc82
commit 41fbcc738b
6 changed files with 237 additions and 98 deletions
+16 -13
View File
@@ -1,14 +1,12 @@
#include "qualitypopup.hpp"
#include <QProcess>
#include "debug/log.hpp"
#include "util/streamlink.hpp"
namespace chatterino {
namespace widgets {
QualityPopup::QualityPopup(const QString &channel, const QString &path, QStringList options)
: BaseWindow()
, channel(channel)
, path(path)
QualityPopup::QualityPopup(const QString &_channelName, QStringList options)
: channelName(_channelName)
{
this->ui.okButton.setText("OK");
this->ui.cancelButton.setText("Cancel");
@@ -21,9 +19,7 @@ QualityPopup::QualityPopup(const QString &channel, const QString &path, QStringL
this->ui.buttonBox.addButton(&this->ui.okButton, QDialogButtonBox::ButtonRole::AcceptRole);
this->ui.buttonBox.addButton(&this->ui.cancelButton, QDialogButtonBox::ButtonRole::RejectRole);
for (int i = 0; i < options.length(); ++i) {
this->ui.selector.addItem(options.at(i));
}
this->ui.selector.addItems(options);
this->ui.vbox.addWidget(&this->ui.selector);
this->ui.vbox.addWidget(&this->ui.buttonBox);
@@ -31,9 +27,9 @@ QualityPopup::QualityPopup(const QString &channel, const QString &path, QStringL
this->setLayout(&this->ui.vbox);
}
void QualityPopup::showDialog(const QString &channel, const QString &path, QStringList options)
void QualityPopup::showDialog(const QString &channelName, QStringList options)
{
QualityPopup *instance = new QualityPopup(channel, path, options);
QualityPopup *instance = new QualityPopup(channelName, options);
instance->setAttribute(Qt::WA_DeleteOnClose, true);
@@ -45,9 +41,16 @@ void QualityPopup::showDialog(const QString &channel, const QString &path, QStri
void QualityPopup::okButtonClicked()
{
QString channelURL = "twitch.tv/" + this->channelName;
singletons::SettingManager &settings = singletons::SettingManager::getInstance();
QProcess::startDetached(this->path, {"twitch.tv/" + this->channel,
this->ui.selector.currentText(), settings.streamlinkOpts});
try {
streamlink::OpenStreamlink(channelURL, this->ui.selector.currentText());
} catch (const streamlink::Exception &ex) {
debug::Log("Exception caught trying to open streamlink: {}", ex.what());
}
this->close();
}
+3 -4
View File
@@ -17,8 +17,8 @@ namespace widgets {
class QualityPopup : public BaseWindow
{
public:
QualityPopup(const QString &channel, const QString &path, QStringList options);
static void showDialog(const QString &channel, const QString &path, QStringList options);
QualityPopup(const QString &_channelName, QStringList options);
static void showDialog(const QString &_channelName, QStringList options);
private:
struct {
@@ -29,8 +29,7 @@ private:
QPushButton cancelButton;
} ui;
QString channel;
QString path;
QString channelName;
void okButtonClicked();
void cancelButtonClicked();
+5 -79
View File
@@ -7,6 +7,7 @@
#include "singletons/settingsmanager.hpp"
#include "singletons/thememanager.hpp"
#include "singletons/windowmanager.hpp"
#include "util/streamlink.hpp"
#include "util/urlfetch.hpp"
#include "widgets/helper/searchpopup.hpp"
#include "widgets/helper/shortcut.hpp"
@@ -21,13 +22,11 @@
#include <QDesktopServices>
#include <QDockWidget>
#include <QDrag>
#include <QFileInfo>
#include <QFont>
#include <QFontDatabase>
#include <QListWidget>
#include <QMimeData>
#include <QPainter>
#include <QProcess>
#include <QShortcut>
#include <QTimer>
#include <QVBoxLayout>
@@ -364,83 +363,10 @@ void Split::doOpenPopupPlayer()
void Split::doOpenStreamlink()
{
singletons::SettingManager &settings = singletons::SettingManager::getInstance();
QString preferredQuality = settings.preferredQuality;
preferredQuality = preferredQuality.toLower();
// TODO(Confuseh): Default streamlink paths
QString path = settings.streamlinkPath;
QString channel = this->channelName.getValue();
QFileInfo fileinfo = QFileInfo(path);
if (path.isEmpty()) {
debug::Log("[Split:doOpenStreamlink] No streamlink path selected in Settings");
return;
}
if (!fileinfo.exists()) {
debug::Log("[Split:doOpenStreamlink] Streamlink path ({}) is invalid, file does not exist",
path);
return;
}
if (fileinfo.isDir() || !fileinfo.isExecutable()) {
debug::Log("[Split:doOpenStreamlink] Streamlink path ({}) is invalid, it needs to point to "
"the streamlink executable",
path);
return;
}
if (preferredQuality != "choose") {
QStringList args = {"twitch.tv/" + channel};
QString quality = "";
QString exclude = "";
if (preferredQuality == "high") {
exclude = ">720p30";
quality = "high,best";
} else if (preferredQuality == "medium") {
exclude = ">540p30";
quality = "medium,best";
} else if (preferredQuality == "low") {
exclude = ">360p30";
quality = "low,best";
} else if (preferredQuality == "audio only") {
quality = "audio,audio_only";
} else {
quality = "best";
}
if (quality != "")
args << quality;
if (exclude != "")
args << "--stream-sorting-excludes" << exclude;
args << settings.streamlinkOpts;
QProcess::startDetached(path, args);
} else {
QProcess *p = new QProcess();
// my god that signal though
QObject::connect(p, static_cast<void (QProcess::*)(int)>(&QProcess::finished), this,
[path, channel, p](int) {
QString lastLine = QString(p->readAllStandardOutput());
lastLine = lastLine.trimmed().split('\n').last().trimmed();
if (lastLine.startsWith("Available streams: ")) {
QStringList options;
QStringList split =
lastLine.right(lastLine.length() - 19).split(", ");
for (int i = split.length() - 1; i >= 0; i--) {
QString option = split.at(i);
if (option.endsWith(" (worst)")) {
options << option.left(option.length() - 8);
} else if (option.endsWith(" (best)")) {
options << option.left(option.length() - 7);
} else {
options << option;
}
}
QualityPopup::showDialog(channel, path, options);
}
});
p->start(path, {"twitch.tv/" + channel, "--default-stream=KKona"});
try {
streamlink::Start(this->channelName.getValue());
} catch (const streamlink::Exception &ex) {
debug::Log("Error in doOpenStreamlink: {}", ex.what());
}
}