diff options
Diffstat (limited to 'transferengine-plugins/mastodontransferplugin')
4 files changed, 86 insertions, 19 deletions
diff --git a/transferengine-plugins/mastodontransferplugin/mastodonapi.cpp b/transferengine-plugins/mastodontransferplugin/mastodonapi.cpp index a4b40a9..c12182f 100644 --- a/transferengine-plugins/mastodontransferplugin/mastodonapi.cpp +++ b/transferengine-plugins/mastodontransferplugin/mastodonapi.cpp @@ -108,10 +108,26 @@ bool MastodonApi::uploadImage(const QString &filePath, return true; } -bool MastodonApi::postStatus(const QString &mediaId) +bool MastodonApi::postStatus(const QString &statusText, + const QString &apiHost, + const QString &accessToken) { - if (mediaId.isEmpty()) { - qWarning() << Q_FUNC_INFO << "media id is empty"; + m_apiHost = normalizeApiHost(apiHost); + m_accessToken = accessToken; + m_statusText = statusText; + + if (m_accessToken.isEmpty()) { + qWarning() << Q_FUNC_INFO << "missing access token"; + return false; + } + + return postStatusInternal(QString()); +} + +bool MastodonApi::postStatusInternal(const QString &mediaId) +{ + if (m_statusText.trimmed().isEmpty() && mediaId.isEmpty()) { + qWarning() << Q_FUNC_INFO << "status and media id are empty"; return false; } @@ -119,7 +135,9 @@ bool MastodonApi::postStatus(const QString &mediaId) if (!m_statusText.isEmpty()) { query.addQueryItem(QStringLiteral("status"), m_statusText); } - query.addQueryItem(QStringLiteral("media_ids[]"), mediaId); + if (!mediaId.isEmpty()) { + query.addQueryItem(QStringLiteral("media_ids[]"), mediaId); + } const QByteArray postData = query.query(QUrl::FullyEncoded).toUtf8(); @@ -202,7 +220,7 @@ void MastodonApi::finished() } } - if (!postStatus(mediaId)) { + if (!postStatusInternal(mediaId)) { qWarning() << Q_FUNC_INFO << "unable to create mastodon status"; emit transferError(); } diff --git a/transferengine-plugins/mastodontransferplugin/mastodonapi.h b/transferengine-plugins/mastodontransferplugin/mastodonapi.h index 0ec3653..772ce89 100644 --- a/transferengine-plugins/mastodontransferplugin/mastodonapi.h +++ b/transferengine-plugins/mastodontransferplugin/mastodonapi.h @@ -26,6 +26,9 @@ public: const QString &mimeType, const QString &apiHost, const QString &accessToken); + bool postStatus(const QString &statusText, + const QString &apiHost, + const QString &accessToken); void cancelUpload(); @@ -43,7 +46,7 @@ private Q_SLOTS: private: static QString normalizeApiHost(const QString &rawHost); - bool postStatus(const QString &mediaId); + bool postStatusInternal(const QString &mediaId); void finishTransfer(QNetworkReply::NetworkError error, int httpCode, const QByteArray &data); QMap<QNetworkReply*, API_CALL> m_replies; diff --git a/transferengine-plugins/mastodontransferplugin/mastodonuploader.cpp b/transferengine-plugins/mastodontransferplugin/mastodonuploader.cpp index d85e138..050df18 100644 --- a/transferengine-plugins/mastodontransferplugin/mastodonuploader.cpp +++ b/transferengine-plugins/mastodontransferplugin/mastodonuploader.cpp @@ -88,7 +88,16 @@ void MastodonUploader::startUploading() return; } - postImage(); + const QString mimeType = mediaItem()->value(MediaItem::MimeType).toString(); + if (mimeType.startsWith(QLatin1String("image/"))) { + postImage(); + } else if (mimeType.contains(QLatin1String("text/plain")) + || mimeType.contains(QLatin1String("text/x-url"))) { + postStatus(); + } else { + qWarning() << Q_FUNC_INFO << "Unsupported mime type:" << mimeType; + setStatus(MediaTransferInterface::TransferInterrupted); + } } void MastodonUploader::transferFinished() @@ -172,6 +181,53 @@ void MastodonUploader::postImage() m_filePath = sourceFile; } + ensureApi(); + + const bool ok = m_api->uploadImage(m_filePath, + mediaItem()->value(MediaItem::Description).toString(), + mediaItem()->value(MediaItem::MimeType).toString(), + m_accountDetails.apiHost, + m_accountDetails.accessToken); + if (ok) { + setStatus(MediaTransferInterface::TransferStarted); + } else { + setStatus(MediaTransferInterface::TransferInterrupted); + qWarning() << Q_FUNC_INFO << "Failed to upload image"; + } +} + +void MastodonUploader::postStatus() +{ + ensureApi(); + + const QVariantMap userData = mediaItem()->value(MediaItem::UserData).toMap(); + QString statusText = userData.value(QStringLiteral("status")).toString().trimmed(); + if (statusText.isEmpty()) { + statusText = mediaItem()->value(MediaItem::Description).toString().trimmed(); + } + if (statusText.isEmpty()) { + statusText = mediaItem()->value(MediaItem::ContentData).toString().trimmed(); + } + + if (statusText.isEmpty()) { + qWarning() << Q_FUNC_INFO << "Failed to resolve status text"; + setStatus(MediaTransferInterface::TransferInterrupted); + return; + } + + const bool ok = m_api->postStatus(statusText, + m_accountDetails.apiHost, + m_accountDetails.accessToken); + if (ok) { + setStatus(MediaTransferInterface::TransferStarted); + } else { + setStatus(MediaTransferInterface::TransferInterrupted); + qWarning() << Q_FUNC_INFO << "Failed to post status"; + } +} + +void MastodonUploader::ensureApi() +{ if (!m_api) { m_api = new MastodonApi(m_qnam, this); connect(m_api, &MastodonApi::transferProgressUpdated, @@ -185,16 +241,4 @@ void MastodonUploader::postImage() connect(m_api, &MastodonApi::credentialsExpired, this, &MastodonUploader::credentialsExpired); } - - const bool ok = m_api->uploadImage(m_filePath, - mediaItem()->value(MediaItem::Description).toString(), - mediaItem()->value(MediaItem::MimeType).toString(), - m_accountDetails.apiHost, - m_accountDetails.accessToken); - if (ok) { - setStatus(MediaTransferInterface::TransferStarted); - } else { - setStatus(MediaTransferInterface::TransferInterrupted); - qWarning() << Q_FUNC_INFO << "Failed to upload image"; - } } diff --git a/transferengine-plugins/mastodontransferplugin/mastodonuploader.h b/transferengine-plugins/mastodontransferplugin/mastodonuploader.h index b0ea263..a55c359 100644 --- a/transferengine-plugins/mastodontransferplugin/mastodonuploader.h +++ b/transferengine-plugins/mastodontransferplugin/mastodonuploader.h @@ -38,7 +38,9 @@ protected: void setStatus(MediaTransferInterface::TransferStatus status); private: + void ensureApi(); void postImage(); + void postStatus(); MastodonApi *m_api; MastodonShareServiceStatus *m_mastodonShareServiceStatus; |
