Use SystemExec for post-export hook
Use the new command-line parsing constructor for SystemExec to construct the args array for the post-export hook from the entered command string, with some simple substitutions for filename, directory, &c.
This commit is contained in:
parent
e1562961c0
commit
cac644270a
|
@ -52,7 +52,7 @@ ExportFormatDialog::ExportFormatDialog (FormatPtr format, bool new_dialog) :
|
|||
silence_end_clock ("silence_end", true, "", true, false, true),
|
||||
|
||||
upload_checkbox(_("Upload to Soundcloud")),
|
||||
command_label(_("Command to run post-export (%1=full path & filename, %2=directory, %3=basename):")),
|
||||
command_label(_("Command to run post-export\n(%f=full path & filename, %d=directory, %b=basename, %u=username, %p=password):")),
|
||||
|
||||
format_table (3, 4),
|
||||
compatibility_label (_("Compatibility"), Gtk::ALIGN_LEFT),
|
||||
|
|
|
@ -95,6 +95,8 @@ class ExportHandler : public ExportElementFactory, public sigc::trackable
|
|||
friend boost::shared_ptr<ExportHandler> Session::get_export_handler();
|
||||
ExportHandler (Session & session);
|
||||
|
||||
void command_output(std::string output, size_t size);
|
||||
|
||||
public:
|
||||
~ExportHandler ();
|
||||
|
||||
|
|
|
@ -34,6 +34,7 @@
|
|||
#include "ardour/soundcloud_upload.h"
|
||||
#include "pbd/openuri.h"
|
||||
#include "pbd/basename.h"
|
||||
#include "pbd/system_exec.h"
|
||||
|
||||
#include "i18n.h"
|
||||
|
||||
|
@ -277,6 +278,13 @@ ExportHandler::process_normalize ()
|
|||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
ExportHandler::command_output(std::string output, size_t size)
|
||||
{
|
||||
std::cerr << "command: " << size << ", " << output << std::endl;
|
||||
info << output << endmsg;
|
||||
}
|
||||
|
||||
void
|
||||
ExportHandler::finish_timespan ()
|
||||
{
|
||||
|
@ -294,13 +302,40 @@ ExportHandler::finish_timespan ()
|
|||
}
|
||||
|
||||
if (!fmt->command().empty()) {
|
||||
std::string command = string_compose(fmt->command(),
|
||||
filepath,
|
||||
Glib::path_get_dirname(filepath),
|
||||
PBD::basename_nosuffix(filepath)
|
||||
);
|
||||
std::cerr << "running command: " << command << "..." << std::endl;
|
||||
system(command.c_str());
|
||||
|
||||
#if 0 // would be nicer with C++11 initialiser...
|
||||
std::map<char, std::string> subs {
|
||||
{ 'f', filepath },
|
||||
{ 'd', Glib::path_get_dirname(filepath) },
|
||||
{ 'b', PBD::basename_nosuffix(filepath) },
|
||||
{ 'u', upload_username },
|
||||
{ 'p', upload_password}
|
||||
};
|
||||
#endif
|
||||
|
||||
PBD::ScopedConnection command_connection;
|
||||
std::map<char, std::string> subs;
|
||||
subs.insert (std::pair<char, std::string> ('f', filepath));
|
||||
subs.insert (std::pair<char, std::string> ('d', Glib::path_get_dirname(filepath)));
|
||||
subs.insert (std::pair<char, std::string> ('b', PBD::basename_nosuffix(filepath)));
|
||||
subs.insert (std::pair<char, std::string> ('u', upload_username));
|
||||
subs.insert (std::pair<char, std::string> ('p', upload_password));
|
||||
|
||||
|
||||
std::cerr << "running command: " << fmt->command() << "..." << std::endl;
|
||||
SystemExec *se = new SystemExec(fmt->command(), subs);
|
||||
se->ReadStdout.connect_same_thread(command_connection, boost::bind(&ExportHandler::command_output, this, _1, _2));
|
||||
if (se->start (2) == 0) {
|
||||
// successfully started
|
||||
std::cerr << "started!" << std::endl;
|
||||
while (se->is_running ()) {
|
||||
// wait for system exec to terminate
|
||||
// std::cerr << "waiting..." << std::endl;
|
||||
usleep (1000);
|
||||
}
|
||||
}
|
||||
std::cerr << "done! deleting..." << std::endl;
|
||||
delete (se);
|
||||
}
|
||||
|
||||
if (fmt->upload()) {
|
||||
|
|
Loading…
Reference in New Issue
Block a user