summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libs/ardour/ardour/session_metadata.h4
-rw-r--r--libs/ardour/session_metadata.cc26
-rw-r--r--libs/pbd/pbd/system_exec.h2
-rw-r--r--libs/pbd/system_exec.cc33
4 files changed, 65 insertions, 0 deletions
diff --git a/libs/ardour/ardour/session_metadata.h b/libs/ardour/ardour/session_metadata.h
index c0bfdb4003..7232d9ec5d 100644
--- a/libs/ardour/ardour/session_metadata.h
+++ b/libs/ardour/ardour/session_metadata.h
@@ -132,6 +132,10 @@ class LIBARDOUR_API SessionMetadata : public PBD::StatefulDestructible
void set_organization (const std::string &);
void set_country (const std::string &);
+ /*** Export ***/
+ typedef std::map<std::string,std::string> MetaDataMap;
+ void av_export_tag (MetaDataMap&) const;
+
/*** Serialization ***/
XMLNode & get_state (); //serializes stuff in the map, to be stored in session file
XMLNode & get_user_state (); //serializes stuff in the user_map, to be stored in user's config file
diff --git a/libs/ardour/session_metadata.cc b/libs/ardour/session_metadata.cc
index 61818422cf..fbe5222552 100644
--- a/libs/ardour/session_metadata.cc
+++ b/libs/ardour/session_metadata.cc
@@ -647,3 +647,29 @@ SessionMetadata::set_country (const string & v)
{
set_value ("user_country", v);
}
+
+void
+SessionMetadata::av_export_tag (MetaDataMap& meta) const
+{
+ if (year() > 0) {
+ std::ostringstream osstream; osstream << year();
+ meta["year"] = osstream.str();
+ }
+ if (track_number() > 0) {
+ std::ostringstream osstream; osstream << track_number();
+ meta["track"] = osstream.str();
+ }
+ if (disc_number() > 0) {
+ std::ostringstream osstream; osstream << disc_number();
+ meta["disc"] = osstream.str();
+ }
+ if (!title().empty()) { meta["title"] = title(); }
+ if (!artist().empty()) { meta["author"] = artist(); }
+ if (!album_artist().empty()) { meta["album_artist"] = album_artist(); }
+ if (!album().empty()) { meta["album"] = album(); }
+ if (!genre().empty()) { meta["genre"] = genre(); }
+ if (!composer().empty()) { meta["composer"] = composer(); }
+ if (!comment().empty()) { meta["comment"] = comment(); }
+ if (!copyright().empty()) { meta["copyright"] = copyright(); }
+ if (!subtitle().empty()) { meta["description"] = subtitle(); }
+}
diff --git a/libs/pbd/pbd/system_exec.h b/libs/pbd/pbd/system_exec.h
index c5fb583152..5e543e76ae 100644
--- a/libs/pbd/pbd/system_exec.h
+++ b/libs/pbd/pbd/system_exec.h
@@ -118,6 +118,8 @@ class LIBPBD_API SystemExec
virtual ~SystemExec ();
+ static char* format_key_value_parameter (std::string, std::string);
+
std::string to_s() const;
/** fork and execute the given program
diff --git a/libs/pbd/system_exec.cc b/libs/pbd/system_exec.cc
index cc5d8d99fe..26f50146c8 100644
--- a/libs/pbd/system_exec.cc
+++ b/libs/pbd/system_exec.cc
@@ -236,6 +236,39 @@ SystemExec::SystemExec (std::string command, const std::map<char, std::string> s
make_envp();
}
+char*
+SystemExec::format_key_value_parameter (std::string key, std::string value)
+{
+ size_t start_pos = 0;
+ std::string v1 = value;
+ while((start_pos = v1.find_first_not_of(
+ "abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789(),.\"'",
+ start_pos)) != std::string::npos)
+ {
+ v1.replace(start_pos, 1, "_");
+ start_pos += 1;
+ }
+
+ start_pos = 0;
+ while((start_pos = v1.find("\"", start_pos)) != std::string::npos) {
+ v1.replace(start_pos, 1, "\\\"");
+ start_pos += 2;
+ }
+
+ size_t len = key.length() + v1.length() + 4;
+ char *mds = (char*) calloc(len, sizeof(char));
+#ifdef PLATFORM_WINDOWS
+ /* SystemExec::make_wargs() adds quotes around the complete argument
+ * windows uses CreateProcess() with a parameter string
+ * (and not an array list of separate arguments)
+ */
+ snprintf(mds, len, "%s=%s", key.c_str(), v1.c_str());
+#else
+ snprintf(mds, len, "%s=\"%s\"", key.c_str(), v1.c_str());
+#endif
+ return mds;
+}
+
void
SystemExec::make_argp_escaped(std::string command, const std::map<char, std::string> subs)
{