File indexing completed on 2024-05-12 04:57:45

0001 /*
0002     This file is part of Choqok, the KDE micro-blogging client
0003 
0004     SPDX-FileCopyrightText: 2010-2012 Andrey Esin <gmlastik@gmail.com>
0005 
0006     SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0007 
0008 */
0009 
0010 #include "twitgoo.h"
0011 
0012 #include <QDebug>
0013 #include <QJsonDocument>
0014 
0015 #include <KIO/StoredTransferJob>
0016 #include <KPluginFactory>
0017 
0018 #include "accountmanager.h"
0019 #include "mediamanager.h"
0020 #include "passwordmanager.h"
0021 
0022 #include "twitterapiaccount.h"
0023 #include "twitterapimicroblog.h"
0024 
0025 #include "twitgoosettings.h"
0026 
0027 K_PLUGIN_CLASS_WITH_JSON(Twitgoo, "choqok_twitgoo.json")
0028 
0029 Twitgoo::Twitgoo(QObject *parent, const QList<QVariant> &)
0030     : Choqok::Uploader(QLatin1String("choqok_twitgoo"), parent)
0031 {
0032 }
0033 
0034 Twitgoo::~Twitgoo()
0035 {
0036 }
0037 
0038 void Twitgoo::upload(const QUrl &localUrl, const QByteArray &medium, const QByteArray &mediumType)
0039 {
0040     TwitgooSettings::self()->load();
0041     QString alias = TwitgooSettings::alias();
0042     if (alias.isEmpty()) {
0043         qCritical() << "No account to use";
0044         Q_EMIT uploadingFailed(localUrl, i18n("There is no Twitter account configured to use."));
0045         return;
0046     }
0047     TwitterApiAccount *acc = qobject_cast<TwitterApiAccount *> (Choqok::AccountManager::self()->findAccount(alias));
0048     if (!acc) {
0049         return;
0050     }
0051 
0052     QUrl url(QLatin1String("http://twitgoo.com/api/upload"));
0053 
0054     QMap<QString, QByteArray> formdata;
0055     formdata[QLatin1String("source")] = QCoreApplication::applicationName().toLatin1();
0056     formdata[QLatin1String("format")] = "json";
0057 
0058     QMap<QString, QByteArray> mediafile;
0059     mediafile[QLatin1String("name")] = "media";
0060     mediafile[QLatin1String("filename")] = localUrl.fileName().toUtf8();
0061     mediafile[QLatin1String("mediumType")] = mediumType;
0062     mediafile[QLatin1String("medium")] = medium;
0063     QList< QMap<QString, QByteArray> > listMediafiles;
0064     listMediafiles.append(mediafile);
0065 
0066     QByteArray data = Choqok::MediaManager::createMultipartFormData(formdata, listMediafiles);
0067 
0068     KIO::StoredTransferJob *job = KIO::storedHttpPost(data, url, KIO::HideProgressInfo) ;
0069     job->addMetaData(QStringLiteral("customHTTPHeader"),
0070                      QStringLiteral("X-Auth-Service-Provider: https://api.twitter.com/1/account/verify_credentials.json"));
0071     QUrl requrl(QLatin1String("https://api.twitter.com/1/account/verify_credentials.json"));
0072     QByteArray credentials = acc->oauthInterface()->authorizationHeader(requrl, QNetworkAccessManager::GetOperation);
0073     job->addMetaData(QStringLiteral("customHTTPHeader"),
0074                      QStringLiteral("X-Verify-Credentials-Authorization: ") + QLatin1String(credentials));
0075     if (!job) {
0076         qCritical() << "Cannot create a http POST request!";
0077         return;
0078     }
0079     job->addMetaData(QStringLiteral("content-type"),
0080                      QStringLiteral("Content-Type: multipart/form-data; boundary=AaB03x"));
0081     mUrlMap[job] = localUrl;
0082     connect(job, &KIO::StoredTransferJob::result, this, &Twitgoo::slotUpload);
0083     job->start();
0084 }
0085 
0086 void Twitgoo::slotUpload(KJob *job)
0087 {
0088     QUrl localUrl = mUrlMap.take(job);
0089     if (job->error()) {
0090         qCritical() << "Job Error:" << job->errorString();
0091         Q_EMIT uploadingFailed(localUrl, job->errorString());
0092         return;
0093     } else {
0094         KIO::StoredTransferJob *stj = qobject_cast<KIO::StoredTransferJob *>(job);
0095         //qDebug() << stj->data();
0096         const QJsonDocument json = QJsonDocument::fromJson(stj->data());
0097         if (!json.isNull()) {
0098             QVariantMap map = json.toVariant().toMap();
0099             if (map.value(QLatin1String("status")) == QLatin1String("fail")) {
0100                 QVariantMap err = map.value(QLatin1String("err")).toMap();
0101                 Q_EMIT uploadingFailed(localUrl, err.value(QLatin1String("err_msg")).toString());
0102             } else if (map.value(QLatin1String("status")) == QLatin1String("ok")) {
0103                 TwitgooSettings::self()->load();
0104                 QString val = TwitgooSettings::directLink() ? QLatin1String("imageurl") : QLatin1String("mediaurl");
0105                 Q_EMIT mediumUploaded(localUrl, map.value(val).toString());
0106             }
0107         } else {
0108             Q_EMIT uploadingFailed(localUrl, i18n("Malformed response"));
0109             qWarning() << "Parse error:" << stj->data();
0110         }
0111     }
0112 }
0113 
0114 #include "moc_twitgoo.cpp"
0115 #include "twitgoo.moc"