Skip to content

Commit

Permalink
fix #182586: Upload MuseScore audio rendition on MuseScore.com togeth…
Browse files Browse the repository at this point in the history
…er with score
  • Loading branch information
lasconic committed Mar 31, 2017
1 parent 4b5bf8c commit 63cbfeb
Show file tree
Hide file tree
Showing 8 changed files with 240 additions and 73 deletions.
2 changes: 1 addition & 1 deletion mscore/exportaudio.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ bool MuseScore::saveAudio(Score* score, QIODevice *device, std::function<bool(fl
else { // use current synth settings
bool r = synti->setState(mscore->synthesizerState());
if (!r)
synti->init();
synti->init();
}

int oldSampleRate = MScore::sampleRate;
Expand Down
24 changes: 21 additions & 3 deletions mscore/exportmp3.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ bool MP3Exporter::loadLibrary(AskUser askuser)
}

// If not successful, must ask the user
if (!validLibraryLoaded()) {
if (!validLibraryLoaded() && askuser != MP3Exporter::AskUser::NO) {
qDebug("(Maybe) ask user for library");
int ret = QMessageBox::question(0, qApp->translate("MP3Exporter", "Save as MP3"),
qApp->translate("MP3Exporter", "MuseScore does not export MP3 files directly, but instead uses "
Expand All @@ -137,7 +137,7 @@ bool MP3Exporter::loadLibrary(AskUser askuser)
"You only need to do this once.\n\n"
"Would you like to locate %2 now?").arg(getLibraryName()).arg(getLibraryName()),
QMessageBox::Yes|QMessageBox::No, QMessageBox::NoButton);
if (ret == QMessageBox::Yes && askuser == MP3Exporter::AskUser::MAYBE && findLibrary()) {
if (ret == QMessageBox::Yes && findLibrary()) {
mLibraryLoaded = initLibrary(mLibPath);
}
}
Expand Down Expand Up @@ -605,6 +605,24 @@ QString MP3Exporter::getLibraryTypeString()
}
#endif //mac

//---------------------------------------------------------
// canSaveMp3
//---------------------------------------------------------

bool MuseScore::canSaveMp3()
{
MP3Exporter exporter;
if (!exporter.loadLibrary(MP3Exporter::AskUser::NO)) {
qDebug("Could not open MP3 encoding library!");
return false;
}

if (!exporter.validLibraryLoaded()) {
qDebug("Not a valid or supported MP3 encoding library!");
return false;
}
return true;
}

//---------------------------------------------------------
// saveMp3
Expand Down Expand Up @@ -694,7 +712,7 @@ bool MuseScore::saveMp3(Score* score, const QString& name)
else { // use current synth settings
bool r = synti->setState(mscore->synthesizerState());
if (!r)
synti->init();
synti->init();
}

MScore::sampleRate = sampleRate;
Expand Down
100 changes: 99 additions & 1 deletion mscore/loginmanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@

#include "loginmanager.h"
#include "musescore.h"
#include "libmscore/score.h"
#include "preferences.h"
#include "kQOAuth/kqoauthrequest.h"
#include "kQOAuth/kqoauthrequest_xauth.h"

Expand Down Expand Up @@ -55,6 +57,9 @@ LoginManager::LoginManager(QObject* parent)
ba[28] = 0x77; ba[29] = 0x35; ba[30] = 0x69; ba[31] = 0x77;
_consumerSecret = QString(ba);
load();
_progressDialog = new QProgressDialog(mscore);
_progressDialog->setWindowFlags(Qt::WindowFlags(Qt::Dialog | Qt::FramelessWindowHint | Qt::WindowTitleHint));
_progressDialog->setWindowModality(Qt::ApplicationModal);
}

//---------------------------------------------------------
Expand Down Expand Up @@ -318,6 +323,27 @@ void LoginManager::getScore(int nid)
_oauthManager->executeRequest(oauthRequest);
}

//---------------------------------------------------------
// getScore
//---------------------------------------------------------

void LoginManager::getMediaUrl(const QString& nid, const QString& vid, const QString& encoding)
{
KQOAuthRequest * oauthRequest = new KQOAuthRequest();
QString url = QString("https://%1/services/rest/signedurl/%2/%3/%4.json").arg(MUSESCORE_HOST).arg(nid).arg(vid).arg(encoding);
oauthRequest->initRequest(KQOAuthRequest::AuthorizedRequest, QUrl(url));
oauthRequest->setHttpMethod(KQOAuthRequest::GET);
oauthRequest->setConsumerKey(_consumerKey);
oauthRequest->setConsumerSecretKey(_consumerSecret);
oauthRequest->setToken(_accessToken);
oauthRequest->setTokenSecret(_accessTokenSecret);

connect(_oauthManager, SIGNAL(requestReady(QByteArray)),
this, SLOT(onGetMediaUrlRequestReady(QByteArray)));

_oauthManager->executeRequest(oauthRequest);
}

//---------------------------------------------------------
// onGetUserRequestReady
//---------------------------------------------------------
Expand Down Expand Up @@ -357,7 +383,79 @@ void LoginManager::onGetScoreRequestReady(QByteArray ba)
else {
emit getScoreError("");
}
}

//---------------------------------------------------------
// onGetMediaUrlRequestReady
//---------------------------------------------------------

void LoginManager::onGetMediaUrlRequestReady(QByteArray ba)
{
disconnect(_oauthManager, SIGNAL(requestReady(QByteArray)),
this, SLOT(onGetMediaUrlRequestReady(QByteArray)));
QJsonDocument jsonResponse = QJsonDocument::fromJson(ba);
QJsonObject response = jsonResponse.object();
QJsonValue urlValue = response.value("url");
if (urlValue.isString()) {
QString url = response.value("url").toString();
QString path = QDir::tempPath() + QString("/temp_%1.mp3").arg(qrand() % 100000);
Score* score = mscore->currentScore()->rootScore();
int br = preferences.exportMp3BitRate;
preferences.exportMp3BitRate = 128;
if (mscore->saveMp3(score, path)) { // no else, error handling is done in saveMp3
QFile* mp3File = new QFile(path);
if (mp3File->open(QIODevice::ReadOnly)) { // probably cancelled, no error handling
QNetworkRequest request;
request.setUrl(QUrl(url));
_progressDialog->setLabelText(tr("Uploading..."));
_progressDialog->setCancelButton(0);
_progressDialog->show();
QNetworkReply *reply = mscore->networkManager()->put(request, mp3File);
connect(reply, SIGNAL(finished()), this, SLOT(mediaUploadFinished()));
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(mediaUploadError(QNetworkReply::NetworkError)));
connect(reply, SIGNAL(uploadProgress(qint64,qint64)), this, SLOT(mediaUploadProgress(qint64, qint64)));
}
}
preferences.exportMp3BitRate = br;
}
}

//---------------------------------------------------------
// mediaUploadFinished
//---------------------------------------------------------

void LoginManager::mediaUploadFinished()
{
QNetworkReply* reply = static_cast<QNetworkReply*>(QObject::sender());
int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
reply->deleteLater();
_progressDialog->hide();
if (statusCode == 200)
emit displaySuccess();
}

//---------------------------------------------------------
// mediaDownloadError
//---------------------------------------------------------

void LoginManager::mediaUploadError(QNetworkReply::NetworkError e)
{
qDebug() << "error uploading media" << e;
QMessageBox::warning(0,
tr("Upload Error"),
tr("Sorry, MuseScore couldn't upload the audio file"),
QString::null, QString::null);
}

//---------------------------------------------------------
// mediaUploadProgress
//---------------------------------------------------------

void LoginManager::mediaUploadProgress(qint64 progress, qint64 total)
{
_progressDialog->setMinimum(0);
_progressDialog->setMaximum(total);
_progressDialog->setValue(progress);
}

//---------------------------------------------------------
Expand Down Expand Up @@ -442,7 +540,7 @@ void LoginManager::onUploadRequestReady(QByteArray ba)
QJsonDocument jsonResponse = QJsonDocument::fromJson(ba);
QJsonObject score = jsonResponse.object();
if (score.value("permalink") != QJsonValue::Undefined) {
emit uploadSuccess(score.value("permalink").toString());
emit uploadSuccess(score.value("permalink").toString(), score.value("id").toString(), score.value("vid").toString());
}
else {
emit uploadError(tr("An error occurred during the file transfer. Please try again"));
Expand Down
11 changes: 10 additions & 1 deletion mscore/loginmanager.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ class LoginManager : public QObject
QString _userName = 0;
int _uid = -1;

QProgressDialog* _progressDialog;

signals:
void loginError(const QString& error);
void loginSuccess();
Expand All @@ -41,8 +43,9 @@ class LoginManager : public QObject
void getScoreError(const QString& error);
void getScoreSuccess(const QString &title, const QString &description, bool priv, const QString& license, const QString& tags, const QString& url);
void uploadError(const QString& error);
void uploadSuccess(const QString& url);
void uploadSuccess(const QString& url, const QString& nid, const QString& vid);
void tryLoginSuccess();
void displaySuccess();

private slots:
void onAccessTokenRequestReady(QByteArray ba);
Expand All @@ -51,6 +54,11 @@ class LoginManager : public QObject
void onGetScoreRequestReady(QByteArray ba);
void onAuthorizedRequestDone();
void onUploadRequestReady(QByteArray ba);
void onGetMediaUrlRequestReady(QByteArray ba);

void mediaUploadFinished();
void mediaUploadError(QNetworkReply::NetworkError);
void mediaUploadProgress(qint64, qint64);

void onTryLoginSuccess();
void onTryLoginError(const QString&);
Expand All @@ -65,6 +73,7 @@ class LoginManager : public QObject
bool hasAccessToken();
void getUser();
void getScore(int nid);
void getMediaUrl(const QString& nid, const QString& vid, const QString& format);

bool save();
bool load();
Expand Down
1 change: 1 addition & 0 deletions mscore/musescore.h
Original file line number Diff line number Diff line change
Expand Up @@ -653,6 +653,7 @@ class MuseScore : public QMainWindow, public MuseScoreCore {
bool savePng(Score*, const QString& name, bool screenshot, bool transparent, double convDpi, int trimMargin, QImage::Format format);
bool saveAudio(Score*, QIODevice *device, std::function<bool(float)> updateProgress = nullptr);
bool saveAudio(Score*, const QString& name);
bool canSaveMp3();
bool saveMp3(Score*, const QString& name);
bool saveSvg(Score*, const QString& name);
bool savePng(Score*, const QString& name);
Expand Down
39 changes: 33 additions & 6 deletions mscore/uploadscoredialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,14 @@ UploadScoreDialog::UploadScoreDialog(LoginManager* loginManager)

tagsHelp->setText(tr("Use a comma to separate the tags"));
tagsHelp->setFont(font);
uploadAudioHelp->setFont(font);
QString urlHelp = QString("https://musescore.org/redirect/handbook?chapter=upload-score-audio&locale=%1&utm_source=desktop&utm_medium=save-online&utm_content=%2&utm_term=upload-score-audio&utm_campaign=MuseScore%3")
.arg(mscore->getLocaleISOCode())
.arg(mscore->revision().trimmed())
.arg(QString(VERSION));
uploadAudioHelp->setText(tr("Render the score with the current synth settings. %1More info%2.")
.arg("<a href=\"" + urlHelp + "\">")
.arg("</a>"));
lblChanges->setVisible(false);
changes->setVisible(false);

Expand All @@ -87,11 +95,12 @@ UploadScoreDialog::UploadScoreDialog(LoginManager* loginManager)
connect(buttonBox, SIGNAL(clicked(QAbstractButton*)), SLOT(buttonBoxClicked(QAbstractButton*)));
chkSignoutOnExit->setVisible(false);
_loginManager = loginManager;
connect(_loginManager, SIGNAL(uploadSuccess(QString)), this, SLOT(uploadSuccess(QString)));
connect(_loginManager, SIGNAL(uploadSuccess(QString, QString, QString)), this, SLOT(uploadSuccess(QString, QString, QString)));
connect(_loginManager, SIGNAL(uploadError(QString)), this, SLOT(uploadError(QString)));
connect(_loginManager, SIGNAL(getScoreSuccess(QString, QString, bool, QString, QString, QString)), this, SLOT(onGetScoreSuccess(QString, QString, bool, QString, QString, QString)));
connect(_loginManager, SIGNAL(getScoreError(QString)), this, SLOT(onGetScoreError(QString)));
connect(_loginManager, SIGNAL(tryLoginSuccess()), this, SLOT(display()));
connect(_loginManager, SIGNAL(displaySuccess()), this, SLOT(displaySuccess()));
connect(btnSignout, SIGNAL(pressed()), this, SLOT(logout()));

MuseScore::restoreGeometry(this);
Expand Down Expand Up @@ -121,7 +130,7 @@ void UploadScoreDialog::upload(int nid)
return;
}
Score* score = mscore->currentScore()->masterScore();
QString path = QDir::tempPath() + "/temp.mscz";
QString path = QDir::tempPath() + QString("/temp_%1.mscz").arg(qrand() % 100000);
if(mscore->saveAs(score, true, path, "mscz")) {
QString licenseString = license->currentData().toString();
QString privateString = cbPrivate->isChecked() ? "1" : "0";
Expand All @@ -133,9 +142,10 @@ void UploadScoreDialog::upload(int nid)
// uploadSuccess
//---------------------------------------------------------

void UploadScoreDialog::uploadSuccess(const QString& url)
void UploadScoreDialog::uploadSuccess(const QString& url, const QString& nid, const QString& vid)
{
setVisible(false);
_url = url;
Score* score = mscore->currentScore()->masterScore();
QMap<QString, QString> metatags = score->metaTags();
if (metatags.value("source") != url) {
Expand All @@ -144,13 +154,24 @@ void UploadScoreDialog::uploadSuccess(const QString& url)
score->undo(new ChangeMetaTags(score, metatags));
score->endCmd();
}
if (uploadAudio->isChecked())
_loginManager->getMediaUrl(nid, vid, "mp3");
else
displaySuccess();
}

//---------------------------------------------------------
// uploadSuccess
//---------------------------------------------------------

void UploadScoreDialog::displaySuccess()
{
QMessageBox::information(this,
tr("Success"),
tr("Finished! %1Go to my score%2.")
.arg("<a href=\"" + url + "\">")
.arg("<a href=\"" + _url + "\">")
.arg("</a>"),
QMessageBox::Ok, QMessageBox::NoButton);

}

//---------------------------------------------------------
Expand Down Expand Up @@ -186,6 +207,10 @@ void UploadScoreDialog::display()
}
}
}
uploadAudio->setEnabled(mscore->canSaveMp3());
bool v = !mscore->synthesizerState().isDefaultSynthSoundfont();
uploadAudio->setVisible(v);
uploadAudioHelp->setVisible(v);
clear();
setVisible(true);
}
Expand Down Expand Up @@ -228,7 +253,7 @@ void UploadScoreDialog::onGetScoreError(const QString& /*error*/)
}

//---------------------------------------------------------
// onGetScoreError
// clear
//---------------------------------------------------------

void UploadScoreDialog::clear()
Expand All @@ -241,7 +266,9 @@ void UploadScoreDialog::clear()
updateExistingCb->setChecked(false);
updateExistingCb->setVisible(false);
linkToScore->setText("");
uploadAudio->setChecked(false);
_nid = -1;
_url = "";
}

//---------------------------------------------------------
Expand Down
4 changes: 3 additions & 1 deletion mscore/uploadscoredialog.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,16 +28,18 @@ class UploadScoreDialog : public QDialog, public Ui::UploadScoreDialog

LoginManager* _loginManager;
int _nid;
QString _url;

virtual void hideEvent(QHideEvent*);
private slots:
void buttonBoxClicked(QAbstractButton* button);
void uploadSuccess(const QString& url);
void uploadSuccess(const QString& url, const QString& nid, const QString& vid);
void uploadError(const QString& error);
void onGetScoreSuccess(const QString &title, const QString &description, bool priv, const QString& license, const QString& tags, const QString &url);
void onGetScoreError(const QString& error);
void logout();
void display();
void displaySuccess();

private:
void upload(int nid);
Expand Down
Loading

0 comments on commit 63cbfeb

Please sign in to comment.