UI: Allow directories in file formatting settings

When configuring file formatting settings in advanced, allow the ability
to specify formatted directories.

For example, "%CCYY-%MM/%DD %hh-%mm-%ss"

would make the year and month a subdirectory, then the
day/hour/minute/seconds as the file name.  January 21st 2121 at 4pm
would end up being:

"21 04-00-00.mp4" in the subdirectory "2121-01".
This commit is contained in:
jp9000 2016-07-04 23:11:24 -07:00
parent e9087cfdc9
commit d7cf581b3a
2 changed files with 18 additions and 3 deletions

View File

@ -1,4 +1,5 @@
#include <string>
#include <algorithm>
#include <QMessageBox>
#include "audio-encoders.hpp"
#include "window-basic-main.hpp"
@ -555,6 +556,18 @@ bool SimpleOutput::StartStreaming(obs_service_t *service)
return false;
}
static void ensure_directory_exists(string &path)
{
replace(path.begin(), path.end(), '\\', '/');
size_t last = path.rfind('/');
if (last == string::npos)
return;
string directory = path.substr(0, last);
os_mkdirs(directory.c_str());
}
bool SimpleOutput::StartRecording()
{
if (usingRecordingPreset) {
@ -600,6 +613,7 @@ bool SimpleOutput::StartRecording()
strPath += GenerateSpecifiedFilename(ffmpegOutput ? "avi" : format,
noSpace, filenameFormat);
ensure_directory_exists(strPath);
if (!overwriteIfExists)
FindBestFilename(strPath, noSpace);
@ -1136,6 +1150,7 @@ bool AdvancedOutput::StartRecording()
strPath += GenerateSpecifiedFilename(recFormat, noSpace,
filenameFormat);
ensure_directory_exists(strPath);
if (!overwriteIfExists)
FindBestFilename(strPath, noSpace);

View File

@ -2919,12 +2919,12 @@ void OBSBasicSettings::on_filenameFormatting_textEdited(const QString &text)
{
#ifdef __APPLE__
size_t invalidLocation =
text.toStdString().find_first_of(":/\\");
text.toStdString().find_first_of(":");
#elif _WIN32
size_t invalidLocation =
text.toStdString().find_first_of("<>:\"/\\|?*");
text.toStdString().find_first_of("<>:\"|?*");
#else
size_t invalidLocation = text.toStdString().find_first_of("/");
size_t invalidLocation = string::npos;
#endif
if (invalidLocation != string::npos)