Working Soundcloud export
Adds an 'upload' property to ExportFormatSpecification, to indicate that files exported with that format specfication should be uploaded to Soundcloud, and makes it editable in the export format dialogue. Adds fields for the Soundcloud username & password to the file format selection page, as well as an option to make the uploaded files public and open them in the system browser. Possible improvements not yet implemented: - make upload happen in its own thread - cosmetic tidying up of dialogue control layout - remember username & password
This commit is contained in:
parent
15b4ebbb07
commit
a3465ff5d3
|
@ -151,6 +151,7 @@ ExportDialog::init_gui ()
|
|||
file_format_selector->set_homogeneous (false);
|
||||
file_format_selector->pack_start (*preset_align, false, false, 0);
|
||||
file_format_selector->pack_start (*file_notebook, false, false, 0);
|
||||
file_format_selector->pack_start (*soundcloud_selector, false, false, 0);
|
||||
|
||||
export_notebook.append_page (*file_format_selector, _("File format"));
|
||||
export_notebook.append_page (*timespan_selector, _("Time Span"));
|
||||
|
@ -168,6 +169,7 @@ ExportDialog::init_components ()
|
|||
preset_selector.reset (new ExportPresetSelector ());
|
||||
timespan_selector.reset (new ExportTimespanSelectorMultiple (_session, profile_manager));
|
||||
channel_selector.reset (new PortExportChannelSelector (_session, profile_manager));
|
||||
soundcloud_selector.reset (new SoundcloudExportSelector ());
|
||||
file_notebook.reset (new ExportFileNotebook ());
|
||||
}
|
||||
|
||||
|
@ -257,10 +259,33 @@ ExportDialog::show_conflicting_files ()
|
|||
dialog.run();
|
||||
}
|
||||
|
||||
void
|
||||
ExportDialog::soundcloud_upload_progress(double total, double now, std::string title)
|
||||
{
|
||||
soundcloud_selector->do_progress_callback(total, now, title);
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
ExportDialog::do_export ()
|
||||
{
|
||||
profile_manager->prepare_for_export ();
|
||||
handler->upload_username = soundcloud_selector->username();
|
||||
handler->upload_password = soundcloud_selector->password();
|
||||
handler->upload_public = soundcloud_selector->upload_public();
|
||||
handler->upload_open = soundcloud_selector->upload_open();
|
||||
|
||||
handler->SoundcloudProgress.connect_same_thread(
|
||||
*this,
|
||||
boost::bind(&ExportDialog::soundcloud_upload_progress, this, _1, _2, _3)
|
||||
);
|
||||
#if 0
|
||||
handler->SoundcloudProgress.connect(
|
||||
*this, invalidator (*this),
|
||||
boost::bind(&ExportDialog::soundcloud_upload_progress, this, _1, _2, _3),
|
||||
gui_context()
|
||||
);
|
||||
#endif
|
||||
handler->do_export ();
|
||||
show_progress ();
|
||||
}
|
||||
|
@ -370,6 +395,7 @@ ExportRangeDialog::init_components ()
|
|||
preset_selector.reset (new ExportPresetSelector ());
|
||||
timespan_selector.reset (new ExportTimespanSelectorSingle (_session, profile_manager, range_id));
|
||||
channel_selector.reset (new PortExportChannelSelector (_session, profile_manager));
|
||||
soundcloud_selector.reset (new SoundcloudExportSelector ());
|
||||
file_notebook.reset (new ExportFileNotebook ());
|
||||
}
|
||||
|
||||
|
@ -383,6 +409,7 @@ ExportSelectionDialog::init_components ()
|
|||
preset_selector.reset (new ExportPresetSelector ());
|
||||
timespan_selector.reset (new ExportTimespanSelectorSingle (_session, profile_manager, X_("selection")));
|
||||
channel_selector.reset (new PortExportChannelSelector (_session, profile_manager));
|
||||
soundcloud_selector.reset (new SoundcloudExportSelector ());
|
||||
file_notebook.reset (new ExportFileNotebook ());
|
||||
}
|
||||
|
||||
|
@ -407,6 +434,7 @@ ExportRegionDialog::init_components ()
|
|||
preset_selector.reset (new ExportPresetSelector ());
|
||||
timespan_selector.reset (new ExportTimespanSelectorSingle (_session, profile_manager, loc_id));
|
||||
channel_selector.reset (new RegionExportChannelSelector (_session, profile_manager, region, track));
|
||||
soundcloud_selector.reset (new SoundcloudExportSelector ());
|
||||
file_notebook.reset (new ExportFileNotebook ());
|
||||
}
|
||||
|
||||
|
@ -422,5 +450,6 @@ StemExportDialog::init_components ()
|
|||
preset_selector.reset (new ExportPresetSelector ());
|
||||
timespan_selector.reset (new ExportTimespanSelectorMultiple (_session, profile_manager));
|
||||
channel_selector.reset (new TrackExportChannelSelector (_session, profile_manager));
|
||||
soundcloud_selector.reset (new SoundcloudExportSelector ());
|
||||
file_notebook.reset (new ExportFileNotebook ());
|
||||
}
|
||||
|
|
|
@ -32,6 +32,7 @@
|
|||
#include "export_file_notebook.h"
|
||||
#include "export_preset_selector.h"
|
||||
#include "ardour_dialog.h"
|
||||
#include "soundcloud_export_selector.h"
|
||||
|
||||
#include <gtkmm.h>
|
||||
|
||||
|
@ -43,7 +44,8 @@ namespace ARDOUR {
|
|||
class ExportTimespanSelector;
|
||||
class ExportChannelSelector;
|
||||
|
||||
class ExportDialog : public ArdourDialog {
|
||||
class ExportDialog : public ArdourDialog, public PBD::ScopedConnectionList
|
||||
{
|
||||
|
||||
public:
|
||||
|
||||
|
@ -79,6 +81,7 @@ class ExportDialog : public ArdourDialog {
|
|||
boost::scoped_ptr<ExportTimespanSelector> timespan_selector;
|
||||
boost::scoped_ptr<ExportChannelSelector> channel_selector;
|
||||
boost::scoped_ptr<ExportFileNotebook> file_notebook;
|
||||
boost::scoped_ptr<SoundcloudExportSelector> soundcloud_selector;
|
||||
|
||||
Gtk::VBox warning_widget;
|
||||
Gtk::VBox progress_widget;
|
||||
|
@ -130,6 +133,8 @@ class ExportDialog : public ArdourDialog {
|
|||
|
||||
float previous_progress; // Needed for gtk bug workaround
|
||||
|
||||
void soundcloud_upload_progress(double total, double now, std::string title);
|
||||
|
||||
/* Buttons */
|
||||
|
||||
Gtk::Button * cancel_button;
|
||||
|
|
|
@ -51,6 +51,8 @@ ExportFormatDialog::ExportFormatDialog (FormatPtr format, bool new_dialog) :
|
|||
silence_end_checkbox (_("Add silence at end:")),
|
||||
silence_end_clock ("silence_end", true, "", true, false, true),
|
||||
|
||||
upload_checkbox(_("Upload to Soundcloud")),
|
||||
|
||||
format_table (3, 4),
|
||||
compatibility_label (_("Compatibility"), Gtk::ALIGN_LEFT),
|
||||
quality_label (_("Quality"), Gtk::ALIGN_LEFT),
|
||||
|
@ -113,6 +115,7 @@ ExportFormatDialog::ExportFormatDialog (FormatPtr format, bool new_dialog) :
|
|||
silence_table.attach (silence_end_checkbox, 1, 2, 2, 3);
|
||||
silence_table.attach (silence_end_clock, 2, 3, 2, 3);
|
||||
|
||||
get_vbox()->pack_start (upload_checkbox, false, false);
|
||||
/* Format table */
|
||||
|
||||
init_format_table();
|
||||
|
@ -296,6 +299,7 @@ ExportFormatDialog::load_state (FormatPtr spec)
|
|||
}
|
||||
|
||||
tag_checkbox.set_active (spec->tag());
|
||||
upload_checkbox.set_active (spec->upload());
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -175,6 +175,10 @@ class ExportFormatDialog : public ArdourDialog, public PBD::ScopedConnectionList
|
|||
Gtk::CheckButton silence_end_checkbox;
|
||||
AudioClock silence_end_clock;
|
||||
|
||||
/* Upload */
|
||||
|
||||
Gtk::CheckButton upload_checkbox;
|
||||
|
||||
/* Format table */
|
||||
|
||||
struct CompatibilityCols : public Gtk::TreeModelColumnRecord
|
||||
|
|
Binary file not shown.
After Width: | Height: | Size: 1.1 KiB |
|
@ -1,47 +0,0 @@
|
|||
/*soundcloud_export.h****************************************************************************
|
||||
|
||||
Adapted for Ardour by Ben Loftis, March 2012
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
#include <string>
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
#include <stdio.h>
|
||||
#include <cstring>
|
||||
#include <string>
|
||||
#include <sstream>
|
||||
#include <vector>
|
||||
#include <gtkmm/progressbar.h>
|
||||
//#include <ctime>
|
||||
|
||||
#include "curl/curl.h"
|
||||
|
||||
//--- struct to store XML file
|
||||
struct MemoryStruct {
|
||||
char *memory;
|
||||
size_t size;
|
||||
};
|
||||
|
||||
|
||||
class SoundcloudUploader
|
||||
{
|
||||
public:
|
||||
SoundcloudUploader();
|
||||
~SoundcloudUploader();
|
||||
|
||||
std::string Get_Auth_Token( std::string username, std::string password );
|
||||
std::string Upload( std::string file_path, std::string title, std::string auth_token, bool ispublic, curl_progress_callback, void* caller );
|
||||
|
||||
private:
|
||||
|
||||
void setcUrlOptions();
|
||||
|
||||
CURL *curl_handle;
|
||||
CURLM *multi_handle;
|
||||
char errorBuffer[CURL_ERROR_SIZE]; // storage for cUrl error message
|
||||
|
||||
std::string basePath;
|
||||
std::string xmlLocation;
|
||||
};
|
||||
|
|
@ -0,0 +1,110 @@
|
|||
/* soundcloud_export_selector.cpp ***************************************************
|
||||
|
||||
Adapted for Ardour by Ben Loftis, March 2012
|
||||
|
||||
Licence GPL:
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
|
||||
*************************************************************************************/
|
||||
#include "ardour/soundcloud_upload.h"
|
||||
#include "soundcloud_export_selector.h"
|
||||
|
||||
#include <pbd/error.h>
|
||||
#include "pbd/openuri.h"
|
||||
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
#include <iostream>
|
||||
#include <glib/gstdio.h>
|
||||
|
||||
#include "i18n.h"
|
||||
|
||||
using namespace PBD;
|
||||
|
||||
#include "ardour/session_metadata.h"
|
||||
#include "utils.h"
|
||||
|
||||
SoundcloudExportSelector::SoundcloudExportSelector() :
|
||||
sc_table (4, 3),
|
||||
soundcloud_public_checkbox (_("Make file(s) public")),
|
||||
soundcloud_username_label (_("User Email"), 1.0, 0.5),
|
||||
soundcloud_password_label (_("Password"), 1.0, 0.5),
|
||||
soundcloud_open_checkbox (_("Open uploaded files in browser")),
|
||||
progress_bar()
|
||||
{
|
||||
|
||||
|
||||
soundcloud_public_checkbox.set_name ("ExportCheckbox");
|
||||
soundcloud_username_label.set_name ("ExportFormatLabel");
|
||||
soundcloud_username_entry.set_name ("ExportFormatDisplay");
|
||||
soundcloud_password_label.set_name ("ExportFormatLabel");
|
||||
soundcloud_password_entry.set_name ("ExportFormatDisplay");
|
||||
|
||||
soundcloud_username_entry.set_text (ARDOUR::SessionMetadata::Metadata()->user_email());
|
||||
soundcloud_password_entry.set_visibility(false);
|
||||
|
||||
Gtk::Frame *sc_frame = manage(new Gtk::Frame);
|
||||
sc_frame->set_border_width(4);
|
||||
sc_frame->set_shadow_type(Gtk::SHADOW_ETCHED_OUT);
|
||||
sc_frame->set_name("soundcloud_export_box");
|
||||
pack_start(*sc_frame, false, false);
|
||||
|
||||
sc_table.set_border_width(4);
|
||||
sc_table.set_col_spacings (5);
|
||||
sc_table.set_row_spacings (5);
|
||||
sc_frame->add (sc_table);
|
||||
|
||||
// sc_table.attach ( *( manage (new EventBox (::get_icon (X_("soundcloud"))))) , 0, 1, 0, 1);
|
||||
sc_table.attach ( *(Gtk::manage (new Gtk::Image (get_icon (X_("soundcloud"))))) , 0, 1, 0, 2);
|
||||
|
||||
sc_table.attach (soundcloud_public_checkbox, 2, 3, 1, 2);
|
||||
sc_table.attach (soundcloud_username_label, 0, 1, 3, 4);
|
||||
sc_table.attach (soundcloud_username_entry, 1, 3, 3, 4);
|
||||
sc_table.attach (soundcloud_password_label, 0, 1, 5, 6);
|
||||
sc_table.attach (soundcloud_password_entry, 1, 3, 5, 6);
|
||||
sc_table.attach (soundcloud_open_checkbox, 2, 3, 7, 8);
|
||||
|
||||
pack_end(progress_bar, false, false);
|
||||
sc_frame->show_all();
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
SoundcloudExportSelector::do_progress_callback(double ultotal, double ulnow, const std::string &filename)
|
||||
{
|
||||
std::cerr << "SoundcloudExportSelector::do_progress_callback(" << ultotal << ", " << ulnow << ", " << filename << ")..." << std::endl;
|
||||
if (soundcloud_cancel) {
|
||||
progress_bar.set_fraction (0);
|
||||
// cancel_button.set_label ("");
|
||||
return -1;
|
||||
}
|
||||
|
||||
double fraction = 0.0;
|
||||
if (ultotal != 0) {
|
||||
fraction = ulnow / ultotal;
|
||||
}
|
||||
|
||||
progress_bar.set_fraction ( fraction );
|
||||
|
||||
std::string prog;
|
||||
prog = string_compose (_("%1: %2 of %3 bytes uploaded"), filename, ulnow, ultotal);
|
||||
progress_bar.set_text( prog );
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -0,0 +1,41 @@
|
|||
/*soundcloud_export_selector.h***********************************************
|
||||
|
||||
Adapted for Ardour by Ben Loftis, March 2012
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
#include <string>
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
#include <stdio.h>
|
||||
#include <cstring>
|
||||
#include <string>
|
||||
#include <sstream>
|
||||
#include <vector>
|
||||
#include <gtkmm.h>
|
||||
#include <gtkmm/progressbar.h>
|
||||
|
||||
class SoundcloudExportSelector : public Gtk::VBox, public ARDOUR::SessionHandlePtr
|
||||
{
|
||||
public:
|
||||
SoundcloudExportSelector ();
|
||||
int do_progress_callback (double ultotal, double ulnow, const std::string &filename);
|
||||
std::string username () { return soundcloud_username_entry.get_text (); }
|
||||
std::string password () { return soundcloud_password_entry.get_text (); }
|
||||
bool upload_public () { return soundcloud_public_checkbox.get_active (); }
|
||||
bool upload_open () { return soundcloud_open_checkbox.get_active (); }
|
||||
void cancel () { soundcloud_cancel = true; }
|
||||
|
||||
private:
|
||||
Gtk::Table sc_table;
|
||||
Gtk::CheckButton soundcloud_public_checkbox;
|
||||
Gtk::Label soundcloud_username_label;
|
||||
Gtk::Entry soundcloud_username_entry;
|
||||
Gtk::Label soundcloud_password_label;
|
||||
Gtk::Entry soundcloud_password_entry;
|
||||
Gtk::CheckButton soundcloud_open_checkbox;
|
||||
bool soundcloud_cancel;
|
||||
Gtk::ProgressBar progress_bar;
|
||||
|
||||
};
|
||||
|
|
@ -211,7 +211,7 @@ gtk2_ardour_sources = [
|
|||
'shuttle_control.cc',
|
||||
'simpleline.cc',
|
||||
'simplerect.cc',
|
||||
'soundcloud_export.cc',
|
||||
'soundcloud_export_selector.cc',
|
||||
'splash.cc',
|
||||
'speaker_dialog.cc',
|
||||
'startup.cc',
|
||||
|
|
|
@ -95,6 +95,7 @@ class ExportFormatSpecification : public ExportFormatBase {
|
|||
void set_tag (bool tag_it) { _tag = tag_it; }
|
||||
void set_with_cue (bool yn) { _with_cue = yn; }
|
||||
void set_with_toc (bool yn) { _with_toc = yn; }
|
||||
void set_upload (bool yn) { _upload = yn; }
|
||||
|
||||
void set_silence_beginning (AnyTime const & value) { _silence_beginning = value; }
|
||||
void set_silence_end (AnyTime const & value) { _silence_end = value; }
|
||||
|
@ -124,6 +125,7 @@ class ExportFormatSpecification : public ExportFormatBase {
|
|||
float normalize_target () const { return _normalize_target; }
|
||||
bool with_toc() const { return _with_toc; }
|
||||
bool with_cue() const { return _with_cue; }
|
||||
bool upload() const { return _upload; }
|
||||
|
||||
bool tag () const { return _tag && supports_tagging; }
|
||||
|
||||
|
@ -173,6 +175,7 @@ class ExportFormatSpecification : public ExportFormatBase {
|
|||
float _normalize_target;
|
||||
bool _with_toc;
|
||||
bool _with_cue;
|
||||
bool _upload;
|
||||
|
||||
/* serialization helpers */
|
||||
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
#include "ardour/export_pointers.h"
|
||||
#include "ardour/session.h"
|
||||
#include "ardour/types.h"
|
||||
#include "pbd/signals.h"
|
||||
|
||||
namespace AudioGrapher {
|
||||
class BroadcastInfo;
|
||||
|
@ -67,7 +68,7 @@ class ExportElementFactory
|
|||
Session & session;
|
||||
};
|
||||
|
||||
class ExportHandler : public ExportElementFactory
|
||||
class ExportHandler : public ExportElementFactory, public sigc::trackable
|
||||
{
|
||||
public:
|
||||
struct FileSpec {
|
||||
|
@ -104,6 +105,17 @@ class ExportHandler : public ExportElementFactory
|
|||
|
||||
std::string get_cd_marker_filename(std::string filename, CDMarkerFormat format);
|
||||
|
||||
/** signal emitted when soundcloud export reports progress updates during upload.
|
||||
* The parameters are total and current bytes downloaded, and the current filename
|
||||
*/
|
||||
PBD::Signal3<void, double, double, std::string> SoundcloudProgress;
|
||||
|
||||
/* upload credentials & preferences */
|
||||
std::string upload_username;
|
||||
std::string upload_password;
|
||||
bool upload_public;
|
||||
bool upload_open;
|
||||
|
||||
private:
|
||||
|
||||
void handle_duplicate_format_extensions();
|
||||
|
|
|
@ -0,0 +1,55 @@
|
|||
/* soundcloud_upload.h ******************************************************
|
||||
|
||||
Adapted for Ardour by Ben Loftis, March 2012
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef __ardour_soundcloud_upload_h__
|
||||
#define __ardour_soundcloud_upload_h__
|
||||
|
||||
#include <string>
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
#include <stdio.h>
|
||||
#include <cstring>
|
||||
#include <string>
|
||||
#include <sstream>
|
||||
#include <vector>
|
||||
|
||||
#include "curl/curl.h"
|
||||
#include "ardour/session_handle.h"
|
||||
#include "ardour/export_handler.h"
|
||||
#include "pbd/signals.h"
|
||||
|
||||
//--- struct to store XML file
|
||||
struct MemoryStruct {
|
||||
char *memory;
|
||||
size_t size;
|
||||
};
|
||||
|
||||
|
||||
class SoundcloudUploader
|
||||
{
|
||||
public:
|
||||
SoundcloudUploader();
|
||||
~SoundcloudUploader();
|
||||
|
||||
std::string Get_Auth_Token(std::string username, std::string password);
|
||||
std::string Upload (std::string file_path, std::string title, std::string token, bool ispublic, ARDOUR::ExportHandler *caller);
|
||||
static int progress_callback(void *caller, double dltotal, double dlnow, double ultotal, double ulnow);
|
||||
|
||||
|
||||
private:
|
||||
|
||||
void setcUrlOptions();
|
||||
|
||||
CURL *curl_handle;
|
||||
CURLM *multi_handle;
|
||||
char errorBuffer[CURL_ERROR_SIZE]; // storage for cUrl error message
|
||||
|
||||
std::string title;
|
||||
ARDOUR::ExportHandler *caller;
|
||||
|
||||
};
|
||||
|
||||
#endif /* __ardour_soundcloud_upload_h__ */
|
|
@ -170,6 +170,7 @@ ExportFormatSpecification::ExportFormatSpecification (Session & s)
|
|||
, _normalize_target (1.0)
|
||||
, _with_toc (false)
|
||||
, _with_cue (false)
|
||||
, _upload (false)
|
||||
{
|
||||
format_ids.insert (F_None);
|
||||
endiannesses.insert (E_FileDefault);
|
||||
|
@ -244,6 +245,7 @@ ExportFormatSpecification::get_state ()
|
|||
root->add_property ("id", _id.to_s());
|
||||
root->add_property ("with-cue", _with_cue ? "true" : "false");
|
||||
root->add_property ("with-toc", _with_toc ? "true" : "false");
|
||||
root->add_property ("upload", _upload ? "true" : "false");
|
||||
|
||||
node = root->add_child ("Encoding");
|
||||
node->add_property ("id", enum_2_string (format_id()));
|
||||
|
@ -321,6 +323,12 @@ ExportFormatSpecification::set_state (const XMLNode & root)
|
|||
_with_toc = false;
|
||||
}
|
||||
|
||||
if ((prop = root.property ("upload"))) {
|
||||
_upload = string_is_affirmative (prop->value());
|
||||
} else {
|
||||
_upload = false;
|
||||
}
|
||||
|
||||
/* Encoding and SRC */
|
||||
|
||||
if ((child = root.child ("Encoding"))) {
|
||||
|
@ -590,6 +598,9 @@ ExportFormatSpecification::description (bool include_name)
|
|||
components.push_back ("CUE");
|
||||
}
|
||||
|
||||
if (_upload) {
|
||||
components.push_back ("Upload");
|
||||
}
|
||||
string desc;
|
||||
if (include_name) {
|
||||
desc = _name + ": ";
|
||||
|
|
|
@ -31,6 +31,9 @@
|
|||
#include "ardour/export_status.h"
|
||||
#include "ardour/export_format_specification.h"
|
||||
#include "ardour/export_filename.h"
|
||||
#include "ardour/soundcloud_upload.h"
|
||||
#include "pbd/openuri.h"
|
||||
#include "pbd/basename.h"
|
||||
|
||||
#include "i18n.h"
|
||||
|
||||
|
@ -280,22 +283,50 @@ 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);
|
||||
|
||||
if (fmt->with_cue()) {
|
||||
export_cd_marker_file (current_timespan, fmt, config_map.begin()->second.filename->get_path(fmt), CDMarkerCUE);
|
||||
export_cd_marker_file (current_timespan, fmt, filepath, CDMarkerCUE);
|
||||
}
|
||||
|
||||
if (fmt->with_toc()) {
|
||||
export_cd_marker_file (current_timespan, fmt, config_map.begin()->second.filename->get_path(fmt), CDMarkerTOC);
|
||||
export_cd_marker_file (current_timespan, fmt, filepath, CDMarkerTOC);
|
||||
}
|
||||
|
||||
if (fmt->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 path = soundcloud_uploader->Upload (
|
||||
filepath,
|
||||
PBD::basename_nosuffix(filepath), // title
|
||||
token,
|
||||
upload_public,
|
||||
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
|
||||
}
|
||||
} else {
|
||||
error << _("upload to Soundcloud failed. Perhaps your email or password are incorrect?\n") << endmsg;
|
||||
}
|
||||
delete soundcloud_uploader;
|
||||
}
|
||||
config_map.erase (config_map.begin());
|
||||
}
|
||||
|
||||
start_timespan ();
|
||||
}
|
||||
|
||||
/*** CD Marker sutff ***/
|
||||
/*** CD Marker stuff ***/
|
||||
|
||||
struct LocationSortByStart {
|
||||
bool operator() (Location *a, Location *b) {
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
|
||||
|
||||
*************************************************************************************/
|
||||
#include "soundcloud_export.h"
|
||||
#include "ardour/soundcloud_upload.h"
|
||||
|
||||
#include "pbd/xml++.h"
|
||||
#include <pbd/error.h>
|
||||
|
@ -35,7 +35,7 @@
|
|||
|
||||
using namespace PBD;
|
||||
|
||||
static const std::string base_url = "http://api.soundcloud.com/tracks/13158665?client_id=";
|
||||
// static const std::string base_url = "http://api.soundcloud.com/tracks/13158665?client_id=";
|
||||
|
||||
size_t
|
||||
WriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data)
|
||||
|
@ -115,7 +115,7 @@ SoundcloudUploader::Get_Auth_Token( std::string username, std::string password )
|
|||
curl_easy_setopt(curl_handle, CURLOPT_URL, url.c_str());
|
||||
curl_easy_setopt(curl_handle, CURLOPT_HTTPPOST, formpost);
|
||||
|
||||
curl_easy_setopt(curl_handle, CURLOPT_VERBOSE, 1L);
|
||||
// curl_easy_setopt(curl_handle, CURLOPT_VERBOSE, 1L);
|
||||
|
||||
// perform online request
|
||||
CURLcode res = curl_easy_perform(curl_handle);
|
||||
|
@ -144,8 +144,18 @@ SoundcloudUploader::Get_Auth_Token( std::string username, std::string password )
|
|||
return "";
|
||||
}
|
||||
|
||||
int
|
||||
SoundcloudUploader::progress_callback(void *caller, double dltotal, double dlnow, double ultotal, double ulnow)
|
||||
{
|
||||
SoundcloudUploader *scu = (SoundcloudUploader *) caller;
|
||||
std::cerr << scu->title << ": uploaded " << ulnow << " of " << ultotal << std::endl;
|
||||
scu->caller->SoundcloudProgress(ultotal, ulnow, scu->title); /* EMIT SIGNAL */
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
std::string
|
||||
SoundcloudUploader::Upload(std::string file_path, std::string title, std::string auth_token, bool ispublic, curl_progress_callback progress_callback, void *caller )
|
||||
SoundcloudUploader::Upload(std::string file_path, std::string title, std::string token, bool ispublic, ARDOUR::ExportHandler *caller)
|
||||
{
|
||||
int still_running;
|
||||
|
||||
|
@ -173,7 +183,7 @@ SoundcloudUploader::Upload(std::string file_path, std::string title, std::string
|
|||
curl_formadd(&formpost,
|
||||
&lastptr,
|
||||
CURLFORM_COPYNAME, "oauth_token",
|
||||
CURLFORM_COPYCONTENTS, auth_token.c_str(),
|
||||
CURLFORM_COPYCONTENTS, token.c_str(),
|
||||
CURLFORM_END);
|
||||
|
||||
curl_formadd(&formpost,
|
||||
|
@ -195,19 +205,22 @@ SoundcloudUploader::Upload(std::string file_path, std::string title, std::string
|
|||
headerlist = curl_slist_append(headerlist, buf);
|
||||
|
||||
|
||||
if(curl_handle && multi_handle) {
|
||||
if (curl_handle && multi_handle) {
|
||||
|
||||
/* what URL that receives this POST */
|
||||
std::string url = "https://api.soundcloud.com/tracks";
|
||||
curl_easy_setopt(curl_handle, CURLOPT_URL, url.c_str());
|
||||
curl_easy_setopt(curl_handle, CURLOPT_VERBOSE, 1L);
|
||||
// curl_easy_setopt(curl_handle, CURLOPT_VERBOSE, 1L);
|
||||
|
||||
curl_easy_setopt(curl_handle, CURLOPT_HTTPHEADER, headerlist);
|
||||
curl_easy_setopt(curl_handle, CURLOPT_HTTPPOST, formpost);
|
||||
|
||||
this->title = title; // save title to show in progress bar
|
||||
this->caller = caller;
|
||||
|
||||
curl_easy_setopt (curl_handle, CURLOPT_NOPROGRESS, 0); // turn on the progress bar
|
||||
curl_easy_setopt (curl_handle, CURLOPT_PROGRESSFUNCTION, progress_callback);
|
||||
curl_easy_setopt (curl_handle, CURLOPT_PROGRESSDATA, caller);
|
||||
curl_easy_setopt (curl_handle, CURLOPT_PROGRESSFUNCTION, &SoundcloudUploader::progress_callback);
|
||||
curl_easy_setopt (curl_handle, CURLOPT_PROGRESSDATA, this);
|
||||
|
||||
curl_multi_add_handle(multi_handle, curl_handle);
|
||||
|
||||
|
@ -333,3 +346,4 @@ SoundcloudUploader::setcUrlOptions()
|
|||
curl_easy_setopt(curl_handle, CURLOPT_SSL_VERIFYHOST, 0);
|
||||
curl_easy_setopt(curl_handle, CURLOPT_SSL_VERIFYPEER, 0);
|
||||
}
|
||||
|
|
@ -197,6 +197,7 @@ libardour_sources = [
|
|||
'sndfile_helpers.cc',
|
||||
'sndfileimportable.cc',
|
||||
'sndfilesource.cc',
|
||||
'soundcloud_upload.cc',
|
||||
'source.cc',
|
||||
'source_factory.cc',
|
||||
'speakers.cc',
|
||||
|
|
Loading…
Reference in New Issue