cd-rec-status.cpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. #include <obs-module.h>
  2. #include <obs-frontend-api.h>
  3. #include <QLabel>
  4. #include <QTimer>
  5. #include <QVBoxLayout>
  6. #include <QWidget>
  7. #include <QDockWidget>
  8. #include <QWebSocket>
  9. #include <QJsonDocument>
  10. #include <QJsonObject>
  11. OBS_DECLARE_MODULE()
  12. OBS_MODULE_USE_DEFAULT_LOCALE("cd-rec-status", "en-US")
  13. class CDStatusDock : public QWidget {
  14. public:
  15. CDStatusDock(QWidget *parent = nullptr) : QWidget(parent), socket(new QWebSocket()) {
  16. QVBoxLayout *layout = new QVBoxLayout(this);
  17. statusLabel = new QLabel("Connecting to server...", this);
  18. layout->addWidget(statusLabel);
  19. setLayout(layout);
  20. connect(socket, &QWebSocket::connected, this, &CDStatusDock::onConnected);
  21. connect(socket, &QWebSocket::disconnected, this, &CDStatusDock::onDisconnected);
  22. connect(socket, &QWebSocket::textMessageReceived, this, &CDStatusDock::onMessageReceived);
  23. socket->open(QUrl(QStringLiteral("ws://localhost:8765")));
  24. }
  25. ~CDStatusDock() {
  26. socket->close();
  27. delete socket;
  28. }
  29. private slots:
  30. void onConnected() {
  31. statusLabel->setText("Connected to status server");
  32. updateBackgroundColor(Qt::gray); // assume no recording yet
  33. }
  34. void onDisconnected() {
  35. statusLabel->setText("Disconnected from server");
  36. updateBackgroundColor(Qt::red);
  37. }
  38. void onMessageReceived(const QString &message) {
  39. QJsonParseError parseError;
  40. QJsonDocument doc = QJsonDocument::fromJson(message.toUtf8(), &parseError);
  41. if (parseError.error != QJsonParseError::NoError || !doc.isObject()) {
  42. statusLabel->setText("Invalid status message");
  43. updateBackgroundColor(Qt::red);
  44. return;
  45. }
  46. QJsonObject obj = doc.object();
  47. bool isRecording = obj["recording"].toBool();
  48. QString statusText;
  49. if (isRecording) {
  50. statusText =
  51. QString("Recording: active\nCD: %2\nTrack: %3\nElapsed CD Time: %4\nElapsed Track Time: %5")
  52. .arg(obj["cd"].toInt())
  53. .arg(obj["track"].toInt())
  54. .arg(obj["cd_time"].toString())
  55. .arg(obj["track_time"].toString());
  56. } else {
  57. statusText = QString("Recording is currently not active.");
  58. }
  59. statusLabel->setText(statusText);
  60. updateBackgroundColor(isRecording ? QColor("#228B22") : Qt::gray);
  61. }
  62. private:
  63. void updateBackgroundColor(const QColor &bgColor) {
  64. this->setStyleSheet(QString(
  65. "background-color: %1;"
  66. "color: %2;"
  67. ).arg(bgColor.name())
  68. .arg(isColorDark(bgColor) ? "white" : "black"));
  69. }
  70. bool isColorDark(const QColor &color) {
  71. // Perceived brightness formula
  72. int brightness = (color.red() * 299 + color.green() * 587 + color.blue() * 114) / 1000;
  73. return brightness < 128;
  74. }
  75. private:
  76. QLabel *statusLabel;
  77. QWebSocket *socket;
  78. };
  79. static void *create_cd_status_dock(obs_source_t *) {
  80. return new CDStatusDock();
  81. }
  82. bool obs_module_load(void)
  83. {
  84. QDockWidget *dock = new QDockWidget("CD Rec Status");
  85. dock->setObjectName("cd-rec-status-dock");
  86. dock->setWidget(new CDStatusDock());
  87. obs_frontend_add_custom_qdock("cd_status_dock", (void *)dock);
  88. blog(LOG_INFO, "CD Rec Status Dock loaded!");
  89. return true;
  90. }
  91. MODULE_EXPORT const char *obs_module_description(void)
  92. {
  93. return obs_module_text("Description");
  94. }
  95. MODULE_EXPORT const char *obs_module_name(void)
  96. {
  97. return obs_module_text("CD Rec Status");
  98. }