UI: Add Start Streaming settings check on start

When we use the server error to respond to user's failing to start a
stream it is slow to return an error and unclear to the user what went
wrong. This diff introduces a simple settings check before attempting
to stream and catch and explain specific URL/key issues to the user.

In the case of preset services we check there is a Stream Key before
attempting to start a stream.

In the case of "custom" we only verify there is a URL since for some
services that's all that is required or the user may use user/password
authentication.
This commit is contained in:
JohannMG 2019-11-26 14:55:46 -08:00 committed by jp9000
parent c4396e03a7
commit b78cdc910b
4 changed files with 101 additions and 4 deletions

View File

@ -679,6 +679,11 @@ Basic.Settings.Stream.TTVAddon.None="None"
Basic.Settings.Stream.TTVAddon.BTTV="BetterTTV" Basic.Settings.Stream.TTVAddon.BTTV="BetterTTV"
Basic.Settings.Stream.TTVAddon.FFZ="FrankerFaceZ" Basic.Settings.Stream.TTVAddon.FFZ="FrankerFaceZ"
Basic.Settings.Stream.TTVAddon.Both="BetterTTV and FrankerFaceZ" Basic.Settings.Stream.TTVAddon.Both="BetterTTV and FrankerFaceZ"
Basic.Settings.Stream.MissingSettingAlert="Missing Stream Setup"
Basic.Settings.Stream.StreamSettingsWarning="Open Settings"
Basic.Settings.Stream.MissingUrlAndApiKey="URL and Stream Key are missing.\n\nOpen settings to enter the URL and Stream Key in the 'stream' tab."
Basic.Settings.Stream.MissingUrl="Stream URL is missing.\n\nOpen settings to enter the URL in the 'Stream' tab."
Basic.Settings.Stream.MissingStreamKey="Stream key is missing.\n\nOpen settings to enter the stream key in the 'Stream' tab."
# basic mode 'output' settings # basic mode 'output' settings
Basic.Settings.Output="Output" Basic.Settings.Output="Output"

View File

@ -6,6 +6,7 @@
#include <QPushButton> #include <QPushButton>
#include <obs-app.hpp> #include <obs-app.hpp>
#include <obs-service.h>
static int CountVideoSources() static int CountVideoSources()
{ {
@ -54,3 +55,65 @@ bool UIValidation::NoSourcesConfirmation(QWidget *parent)
else else
return true; return true;
} }
StreamSettingsAction
UIValidation::StreamSettingsConfirmation(QWidget *parent, OBSService service)
{
// Custom services can user API key in URL or user/pass combo.
// So only check there is a URL
char const *serviceType = obs_service_get_type(service);
bool isCustomUrlService = (strcmp(serviceType, "rtmp_custom") == 0);
char const *streamUrl = obs_service_get_url(service);
char const *streamKey = obs_service_get_key(service);
bool hasStreamUrl = (streamUrl != NULL && streamUrl[0] != '\0');
bool hasStreamKey = ((streamKey != NULL && streamKey[0] != '\0') ||
isCustomUrlService);
if (hasStreamUrl && hasStreamKey)
return StreamSettingsAction::ContinueStream;
QString msg;
if (!hasStreamUrl && !hasStreamKey) {
msg = QTStr("Basic.Settings.Stream.MissingUrlAndApiKey");
} else if (!hasStreamKey) {
msg = QTStr("Basic.Settings.Stream.MissingStreamKey");
} else {
msg = QTStr("Basic.Settings.Stream.MissingUrl");
}
QMessageBox messageBox(parent);
messageBox.setWindowTitle(
QTStr("Basic.Settings.Stream.MissingSettingAlert"));
messageBox.setText(msg);
QPushButton *cancel;
QPushButton *settings;
#ifdef __APPLE__
#define ACCEPT_BUTTON QMessageBox::AcceptRole
#define REJECT_BUTTON QMessageBox::ResetRole
#else
#define ACCEPT_BUTTON QMessageBox::NoRole
#define REJECT_BUTTON QMessageBox::NoRole
#endif
settings = messageBox.addButton(
QTStr("Basic.Settings.Stream.StreamSettingsWarning"),
ACCEPT_BUTTON);
cancel = messageBox.addButton(QTStr("Cancel"), REJECT_BUTTON);
messageBox.setDefaultButton(settings);
messageBox.setEscapeButton(cancel);
messageBox.setIcon(QMessageBox::Warning);
messageBox.exec();
if (messageBox.clickedButton() == settings)
return StreamSettingsAction::OpenSettings;
if (messageBox.clickedButton() == cancel)
return StreamSettingsAction::Cancel;
return StreamSettingsAction::ContinueStream;
}

View File

@ -3,13 +3,28 @@
#include <QObject> #include <QObject>
#include <QWidget> #include <QWidget>
#include <obs.hpp>
enum class StreamSettingsAction {
OpenSettings,
Cancel,
ContinueStream,
};
class UIValidation : public QObject { class UIValidation : public QObject {
Q_OBJECT Q_OBJECT
public: public:
// Shows alert box notifying there are no video sources /* Confirm video about to record or stream has sources. Shows alert
// Returns true if user clicks "Yes" * box notifying there are no video sources Returns true if user clicks
// Returns false if user clicks "No" * "Yes" Returns false if user clicks "No" */
// Blocks UI
static bool NoSourcesConfirmation(QWidget *parent); static bool NoSourcesConfirmation(QWidget *parent);
/* Check streaming requirements, shows warning with options to open
* settings, cancel stream, or attempt connection anyways. If setup
* basics is missing in stream, explain missing fields and offer to
* open settings, cancel, or continue. Returns Continue if all
* settings are valid. */
static StreamSettingsAction
StreamSettingsConfirmation(QWidget *parent, OBSService service);
}; };

View File

@ -5754,6 +5754,20 @@ void OBSBasic::on_streamButton_clicked()
return; return;
} }
auto action =
UIValidation::StreamSettingsConfirmation(this, service);
switch (action) {
case StreamSettingsAction::ContinueStream:
break;
case StreamSettingsAction::OpenSettings:
on_action_Settings_triggered();
ui->streamButton->setChecked(false);
return;
case StreamSettingsAction::Cancel:
ui->streamButton->setChecked(false);
return;
}
bool confirm = config_get_bool(GetGlobalConfig(), "BasicWindow", bool confirm = config_get_bool(GetGlobalConfig(), "BasicWindow",
"WarnBeforeStartingStream"); "WarnBeforeStartingStream");