#include "ardour/export_handler.h"
+#include <glib/gstdio.h>
#include <glibmm.h>
#include <glibmm/convert.h>
#include "pbd/convert.h"
+#include "ardour/audiofile_tagger.h"
+#include "ardour/debug.h"
#include "ardour/export_graph_builder.h"
#include "ardour/export_timespan.h"
#include "ardour/export_channel_configuration.h"
#include "ardour/export_format_specification.h"
#include "ardour/export_filename.h"
#include "ardour/soundcloud_upload.h"
+#include "ardour/system_exec.h"
#include "pbd/openuri.h"
#include "pbd/basename.h"
+#include "ardour/session_metadata.h"
#include "i18n.h"
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 ()
{
while (config_map.begin() != timespan_bounds.second) {
ExportFormatSpecPtr fmt = config_map.begin()->second.format;
- std::string filepath = config_map.begin()->second.filename->get_path(fmt);
+ std::string filename = config_map.begin()->second.filename->get_path(fmt);
if (fmt->with_cue()) {
- export_cd_marker_file (current_timespan, fmt, filepath, CDMarkerCUE);
- }
+ export_cd_marker_file (current_timespan, fmt, filename, CDMarkerCUE);
+ }
if (fmt->with_toc()) {
- export_cd_marker_file (current_timespan, fmt, filepath, CDMarkerTOC);
+ export_cd_marker_file (current_timespan, fmt, filename, CDMarkerTOC);
+ }
+
+ if (fmt->tag()) {
+ AudiofileTagger::tag_file(filename, *SessionMetadata::Metadata());
}
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', filename },
+ { 'd', Glib::path_get_dirname(filename) },
+ { 'b', PBD::basename_nosuffix(filename) },
+ { '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', filename));
+ subs.insert (std::pair<char, std::string> ('d', Glib::path_get_dirname(filename)));
+ subs.insert (std::pair<char, std::string> ('b', PBD::basename_nosuffix(filename)));
+ subs.insert (std::pair<char, std::string> ('u', soundcloud_username));
+ subs.insert (std::pair<char, std::string> ('p', soundcloud_password));
+
+
+ std::cerr << "running command: " << fmt->command() << "..." << std::endl;
+ ARDOUR::SystemExec *se = new ARDOUR::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;
+ Glib::usleep (1000);
+ }
+ }
+ std::cerr << "done! deleting..." << std::endl;
+ delete (se);
}
- if (fmt->upload()) {
+ if (fmt->soundcloud_upload()) {
SoundcloudUploader *soundcloud_uploader = new SoundcloudUploader;
- std::string token = soundcloud_uploader->Get_Auth_Token(upload_username, upload_password);
- std::cerr
- << "uploading "
- << filepath << std::endl
- << "username = " << upload_username
- << ", password = " << upload_password
- << " - token = " << token << " ..."
- << std::endl;
+ std::string token = soundcloud_uploader->Get_Auth_Token(soundcloud_username, soundcloud_password);
+ DEBUG_TRACE (DEBUG::Soundcloud, string_compose(
+ "uploading %1 - username=%2, password=%3, token=%4",
+ filename, soundcloud_username, soundcloud_password, token) );
std::string path = soundcloud_uploader->Upload (
- filepath,
- PBD::basename_nosuffix(filepath), // title
+ filename,
+ PBD::basename_nosuffix(filename), // title
token,
- upload_public,
+ soundcloud_make_public,
+ soundcloud_downloadable,
this);
if (path.length() != 0) {
- if (upload_open) {
- std::cerr << "opening " << path << " ..." << std::endl;
- open_uri(path.c_str()); // open the soundcloud website to the new file
+ info << string_compose ( _("File %1 uploaded to %2"), filename, path) << endmsg;
+ if (soundcloud_open_page) {
+ DEBUG_TRACE (DEBUG::Soundcloud, string_compose ("opening %1", path) );
+ open_uri(path.c_str()); // open the soundcloud website to the new file
}
} else {
error << _("upload to Soundcloud failed. Perhaps your email or password are incorrect?\n") << endmsg;
} catch (std::exception& e) {
error << string_compose (_("an error occured while writing a TOC/CUE file: %1"), e.what()) << endmsg;
- ::unlink (filepath.c_str());
+ ::g_unlink (filepath.c_str());
} catch (Glib::Exception& e) {
error << string_compose (_("an error occured while writing a TOC/CUE file: %1"), e.what()) << endmsg;
- ::unlink (filepath.c_str());
+ ::g_unlink (filepath.c_str());
}
}