From 44caf35c29e589bf94162a9e76c6a5a911014d74 Mon Sep 17 00:00:00 2001 From: WarmUpTill <19472752+WarmUpTill@users.noreply.github.com> Date: Wed, 26 Jun 2024 19:30:39 +0200 Subject: [PATCH] Add option to add new recording chapter --- data/locale/de-DE.ini | 1 - data/locale/en-US.ini | 3 ++- data/locale/es-ES.ini | 1 - data/locale/pt-BR.ini | 1 - data/locale/ru-RU.ini | 1 - data/locale/tr-TR.ini | 1 - data/locale/zh-CN.ini | 1 - plugins/base/macro-action-recording.cpp | 33 +++++++++++++++++++++++-- plugins/base/macro-action-recording.hpp | 4 +++ 9 files changed, 37 insertions(+), 9 deletions(-) diff --git a/data/locale/de-DE.ini b/data/locale/de-DE.ini index 38a3e890..8fb50207 100644 --- a/data/locale/de-DE.ini +++ b/data/locale/de-DE.ini @@ -414,7 +414,6 @@ AdvSceneSwitcher.action.recording.type.unpause="Aufnahme nicht mehr pausieren" AdvSceneSwitcher.action.recording.type.split="Aufnahme-Datei teilen" AdvSceneSwitcher.action.recording.pause.hint="Bitte beachten, dass je nach Aufnahmeeinstellung die Aufnahme möglicherweise nicht unterbrochen werden kann" AdvSceneSwitcher.action.recording.split.hint="Vergewissern, dass die automatische Dateiaufteilung in den OBS-Einstellungen aktiviert ist!" -AdvSceneSwitcher.action.recording.entry="{{actions}}{{recordFolder}}{{recordFileFormat}}{{pauseHint}}{{splitHint}}" AdvSceneSwitcher.action.replay="Replay Buffer" AdvSceneSwitcher.action.replay.saveWarn="Warnung: Ein zu häufiges Speichern kann dazu führen, dass der Replay Buffer nicht gespeichert wird!" AdvSceneSwitcher.action.replay.type.stop="Replay Buffer stoppen" diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index 1081cc02..7070ddb6 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -858,9 +858,10 @@ AdvSceneSwitcher.action.recording.type.unpause="Unpause recording" AdvSceneSwitcher.action.recording.type.split="Split recording file" AdvSceneSwitcher.action.recording.type.changeOutputFolder="Change output folder" AdvSceneSwitcher.action.recording.type.changeOutputFileFormat="Change filename formatting" +AdvSceneSwitcher.action.recording.type.addChapter="Add chapter" AdvSceneSwitcher.action.recording.pause.hint="Note that depending on your recording settings you might not be able to pause recording" AdvSceneSwitcher.action.recording.split.hint="Make sure to enable automatic file splitting in the OBS settings first!" -AdvSceneSwitcher.action.recording.entry="{{actions}}{{recordFolder}}{{recordFileFormat}}{{pauseHint}}{{splitHint}}" +AdvSceneSwitcher.action.recording.entry="{{actions}}{{recordFolder}}{{recordFileFormat}}{{chapterName}}{{pauseHint}}{{splitHint}}" AdvSceneSwitcher.action.replay="Replay buffer" AdvSceneSwitcher.action.replay.saveWarn="Warning: Saving too frequently might result in the replay buffer not actually being saved!" AdvSceneSwitcher.action.replay.durationWarn="Warning: Changing the maximum replay time will only apply the next time the replay buffer is started!" diff --git a/data/locale/es-ES.ini b/data/locale/es-ES.ini index 1c041c81..f676e0b3 100644 --- a/data/locale/es-ES.ini +++ b/data/locale/es-ES.ini @@ -335,7 +335,6 @@ AdvSceneSwitcher.action.recording.type.start="Iniciar grabación" AdvSceneSwitcher.action.recording.type.pause="Pausar grabación" AdvSceneSwitcher.action.recording.type.unpause="Reanudar grabación" AdvSceneSwitcher.action.recording.pause.hint="Tenga en cuenta que, dependiendo de la configuración de grabación, es posible que no pueda pausar la grabación" -AdvSceneSwitcher.action.recording.entry="{{actions}}{{recordFolder}}{{recordFileFormat}}{{pauseHint}}{{splitHint}}" AdvSceneSwitcher.action.replay="Búfer de reproducción" AdvSceneSwitcher.action.replay.saveWarn="Advertencia: ¡Guardar con demasiada frecuencia puede hacer que el búfer de reproducción no se guarde realmente!" AdvSceneSwitcher.action.replay.type.stop="Detener el búfer de reproducción" diff --git a/data/locale/pt-BR.ini b/data/locale/pt-BR.ini index a67c4b77..98a5e1ab 100644 --- a/data/locale/pt-BR.ini +++ b/data/locale/pt-BR.ini @@ -757,7 +757,6 @@ AdvSceneSwitcher.action.recording.type.changeOutputFolder="Alterar pasta de saí AdvSceneSwitcher.action.recording.type.changeOutputFileFormat="Alterar formatação do nome do arquivo" AdvSceneSwitcher.action.recording.pause.hint="Observe que dependendo das suas configurações de gravação, você pode não conseguir pausar a gravação" AdvSceneSwitcher.action.recording.split.hint="Certifique-se de habilitar a divisão automática de arquivos nas configurações do OBS primeiro!" -AdvSceneSwitcher.action.recording.entry="{{actions}}{{recordFolder}}{{recordFileFormat}}{{pauseHint}}{{splitHint}}" AdvSceneSwitcher.action.replay="Buffer de replay" AdvSceneSwitcher.action.replay.saveWarn="Aviso: Salvar com muita frequência pode resultar em o buffer de replay não ser realmente salvo!" AdvSceneSwitcher.action.replay.durationWarn="Aviso: Alterar o tempo máximo de replay só se aplicará na próxima vez que o buffer de replay for iniciado!" diff --git a/data/locale/ru-RU.ini b/data/locale/ru-RU.ini index 24cf1bcc..8a2f0553 100644 --- a/data/locale/ru-RU.ini +++ b/data/locale/ru-RU.ini @@ -131,7 +131,6 @@ AdvSceneSwitcher.action.recording.type.start="Начать запись" AdvSceneSwitcher.action.recording.type.pause="Пауза записи" AdvSceneSwitcher.action.recording.type.unpause="Снять запись с паузы" AdvSceneSwitcher.action.recording.pause.hint="Обратите внимание, что в зависимости от настроек записи вы можете не иметь возможности приостановить запись" -AdvSceneSwitcher.action.recording.entry="{{actions}}{{recordFolder}}{{recordFileFormat}}{{pauseHint}}{{splitHint}}" AdvSceneSwitcher.action.replay="Буфер воспроизведения" AdvSceneSwitcher.action.replay.type.stop="Остановить буфер воспроизведения" AdvSceneSwitcher.action.replay.type.start="Начать воспроизведение буфера" diff --git a/data/locale/tr-TR.ini b/data/locale/tr-TR.ini index 98bcf12b..9890b0b9 100644 --- a/data/locale/tr-TR.ini +++ b/data/locale/tr-TR.ini @@ -267,7 +267,6 @@ AdvSceneSwitcher.action.recording.type.start="Kayıt Başlat" AdvSceneSwitcher.action.recording.type.pause="Kayıt Duraklat" AdvSceneSwitcher.action.recording.type.unpause="Kayıt Duraklatma" AdvSceneSwitcher.action.recording.pause.hint="Kayıt ayarlarınıza bağlı olarak kaydı duraklatamayabileceğinizi unutmayın." -AdvSceneSwitcher.action.recording.entry="{{actions}}{{recordFolder}}{{recordFileFormat}}{{pauseHint}}{{splitHint}}" AdvSceneSwitcher.action.replay="Tekrar arabelleği" AdvSceneSwitcher.action.replay.type.stop="Tekrar arabelleğini durdur" AdvSceneSwitcher.action.replay.type.start="Tekrar arabelleğini başlat" diff --git a/data/locale/zh-CN.ini b/data/locale/zh-CN.ini index 7c9a5768..4e43918d 100644 --- a/data/locale/zh-CN.ini +++ b/data/locale/zh-CN.ini @@ -816,7 +816,6 @@ AdvSceneSwitcher.action.recording.type.changeOutputFolder="更改输出文件夹 AdvSceneSwitcher.action.recording.type.changeOutputFileFormat="改变文件名的格式" AdvSceneSwitcher.action.recording.pause.hint="请注意,根据您的录制设置,您可能无法暂停录制" AdvSceneSwitcher.action.recording.split.hint="注意,请先确保在OBS设置中启用自动分割文件!" -AdvSceneSwitcher.action.recording.entry="{{actions}}{{recordFolder}}{{recordFileFormat}}{{pauseHint}}{{splitHint}}" AdvSceneSwitcher.action.replay="回放缓存" AdvSceneSwitcher.action.replay.saveWarn="警告:保存过于频繁可能会导致回放缓存实际上未保存!" AdvSceneSwitcher.action.replay.durationWarn="警告:更改回放缓存时长上限,仅适用于下次回放缓存开启时!" diff --git a/plugins/base/macro-action-recording.cpp b/plugins/base/macro-action-recording.cpp index f69a0ee5..03fdacea 100644 --- a/plugins/base/macro-action-recording.cpp +++ b/plugins/base/macro-action-recording.cpp @@ -22,12 +22,18 @@ const static std::map actionTypes = { "AdvSceneSwitcher.action.recording.type.pause"}, {MacroActionRecord::Action::UNPAUSE, "AdvSceneSwitcher.action.recording.type.unpause"}, +#if LIBOBS_API_VER >= MAKE_SEMANTIC_VERSION(28, 0, 0) {MacroActionRecord::Action::SPLIT, "AdvSceneSwitcher.action.recording.type.split"}, +#endif {MacroActionRecord::Action::FOLDER, "AdvSceneSwitcher.action.recording.type.changeOutputFolder"}, {MacroActionRecord::Action::FILE_FORMAT, "AdvSceneSwitcher.action.recording.type.changeOutputFileFormat"}, +#if LIBOBS_API_VER >= MAKE_SEMANTIC_VERSION(30, 2, 0) + {MacroActionRecord::Action::ADD_CHAPTER, + "AdvSceneSwitcher.action.recording.type.addChapter"}, +#endif }; bool MacroActionRecord::PerformAction() @@ -87,6 +93,13 @@ bool MacroActionRecord::PerformAction() } break; } +#if LIBOBS_API_VER >= MAKE_SEMANTIC_VERSION(30, 2, 0) + case Action::ADD_CHAPTER: + if (!obs_frontend_recording_add_chapter(_chapterName.c_str())) { + blog(LOG_WARNING, "failed to add recoding chapter!"); + } + break; +#endif default: break; } @@ -110,6 +123,7 @@ bool MacroActionRecord::Save(obs_data_t *obj) const obs_data_set_int(obj, "action", static_cast(_action)); _folder.Save(obj, "folder"); _fileFormat.Save(obj, "format"); + _chapterName.Save(obj, "chapterName"); return true; } @@ -119,6 +133,7 @@ bool MacroActionRecord::Load(obs_data_t *obj) _action = static_cast(obs_data_get_int(obj, "action")); _folder.Load(obj, "folder"); _fileFormat.Load(obj, "format"); + _chapterName.Load(obj, "chapterName"); return true; } @@ -136,6 +151,7 @@ void MacroActionRecord::ResolveVariablesToFixedValues() { _folder.ResolveVariables(); _fileFormat.ResolveVariables(); + _chapterName.ResolveVariables(); } static inline void populateActionSelection(QComboBox *list) @@ -154,7 +170,8 @@ MacroActionRecordEdit::MacroActionRecordEdit( _splitHint(new QLabel(obs_module_text( "AdvSceneSwitcher.action.recording.split.hint"))), _recordFolder(new FileSelection(FileSelection::Type::FOLDER, this)), - _recordFileFormat(new VariableLineEdit(this)) + _recordFileFormat(new VariableLineEdit(this)), + _chapterName(new VariableLineEdit(this)) { populateActionSelection(_actions); @@ -164,6 +181,8 @@ MacroActionRecordEdit::MacroActionRecordEdit( this, SLOT(FolderChanged(const QString &))); QWidget::connect(_recordFileFormat, SIGNAL(editingFinished()), this, SLOT(FormatStringChanged())); + QWidget::connect(_chapterName, SIGNAL(editingFinished()), this, + SLOT(ChapterNameChanged())); auto mainLayout = new QHBoxLayout; PlaceWidgets(obs_module_text("AdvSceneSwitcher.action.recording.entry"), @@ -172,7 +191,8 @@ MacroActionRecordEdit::MacroActionRecordEdit( {"{{pauseHint}}", _pauseHint}, {"{{splitHint}}", _splitHint}, {"{{recordFolder}}", _recordFolder}, - {"{{recordFileFormat}}", _recordFileFormat}}); + {"{{recordFileFormat}}", _recordFileFormat}, + {"{{chapterName}}", _chapterName}}); setLayout(mainLayout); _entryData = entryData; @@ -188,6 +208,7 @@ void MacroActionRecordEdit::UpdateEntryData() _actions->setCurrentIndex(static_cast(_entryData->_action)); _recordFolder->SetPath(_entryData->_folder); _recordFileFormat->setText(_entryData->_fileFormat); + _chapterName->setText(_entryData->_chapterName); SetWidgetVisibility(); } @@ -209,6 +230,12 @@ void MacroActionRecordEdit::FormatStringChanged() _entryData->_fileFormat = _recordFileFormat->text().toStdString(); } +void MacroActionRecordEdit::ChapterNameChanged() +{ + GUARD_LOADING_AND_LOCK(); + _entryData->_chapterName = _chapterName->text().toStdString(); +} + void MacroActionRecordEdit::SetWidgetVisibility() { _pauseHint->setVisible(isPauseAction(_entryData->_action)); @@ -218,6 +245,8 @@ void MacroActionRecordEdit::SetWidgetVisibility() MacroActionRecord::Action::FOLDER); _recordFileFormat->setVisible(_entryData->_action == MacroActionRecord::Action::FILE_FORMAT); + _chapterName->setVisible(_entryData->_action == + MacroActionRecord::Action::ADD_CHAPTER); } void MacroActionRecordEdit::ActionChanged(int value) diff --git a/plugins/base/macro-action-recording.hpp b/plugins/base/macro-action-recording.hpp index c8d0d96c..af8e7d3e 100644 --- a/plugins/base/macro-action-recording.hpp +++ b/plugins/base/macro-action-recording.hpp @@ -29,11 +29,13 @@ public: SPLIT, FOLDER, FILE_FORMAT, + ADD_CHAPTER, }; Action _action = Action::STOP; StringVariable _folder = QDir::homePath().toStdString() + "/Videos"; StringVariable _fileFormat = "%CCYY-%MM-%DD %hh-%mm-%ss"; + StringVariable _chapterName = ""; private: static bool _registered; @@ -60,6 +62,7 @@ private slots: void ActionChanged(int value); void FolderChanged(const QString &); void FormatStringChanged(); + void ChapterNameChanged(); protected: QComboBox *_actions; @@ -67,6 +70,7 @@ protected: QLabel *_splitHint; FileSelection *_recordFolder; VariableLineEdit *_recordFileFormat; + VariableLineEdit *_chapterName; std::shared_ptr _entryData; private: