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:
parent
c4396e03a7
commit
b78cdc910b
@ -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"
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
@ -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);
|
||||||
};
|
};
|
||||||
|
@ -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");
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user