2017-02-24 2 views
1

En utilisant QOAuth2AuthorizationCodeFlow pour autoriser avec google's oauth2. L'autorisation est réussie ainsi que l'utilisation de la demande GET (par exemple, obtenir la liste des vidéos de la chaîne YouTube). Mais alors que QNetworkAccessManager fournit à l'utilisateur un tas de post surcharges de méthode:Comment télécharger une vidéo sur Youtube avec QNetworkAuth

QNetworkReply * post(const QNetworkRequest &request, QIODevice *data) 
QNetworkReply * post(const QNetworkRequest &request, const QByteArray &data) 
QNetworkReply * post(const QNetworkRequest &request, QHttpMultiPart *multiPart) 

QOAuth2AuthorizationCodeFlow a seulement:

QNetworkReply *post(const QUrl &url, const QVariantMap &parameters = QVariantMap()); 

Il est facile d'ajouter un fichier à l'aide QHttpMultiPart & QHttpPart::setBodyDevice(). Mais je ne suis pas sûr comment utiliser QVariantMap pour le téléchargement de vidéo/fichier.

Également, essayé d'utiliser: QOAuth2AuthorizationCodeFlow::networkAccessManager() pour accéder au gestionnaire de réseau sous-jacent, mais il donne le code de réponse 202 avec GET. Et, si vous utilisez avec l'URL authentifiée, QOAuth2AuthorizationCodeFlow::createAuthenticatedUrl(), le code de réponse est 200, mais le contenu de la réponse est vide (readAll() renvoie le tampon vide). Ne fonctionne pas avec POST également.

En utilisant QT 2ème jour, je peux mal comprendre certains concepts. Merci pour toute aide & idées.

+0

Heureux que quelqu'un ait posé cette question. – Akiva

+0

Juste curieux de savoir si cela ne vous dérangerait pas de rendre le code complet disponible pour cela. Je vais à mon tour faire don d'une réputation de remerciement. J'ai un peu de mal avec ça en raison du manque de documentation. – Akiva

+1

@Akiva le code n'est pas si joli, mais il a téléchargé une vidéo pour moi https://github.com/x4t3a/YoutubeUploader/blob/master/youtube_wrapper.cpp#L98 –

Répondre

1

A réussi à contourner ce problème. Mais encore, peut-être y a-t-il la bonne solution.

QOAuth2AuthorizationCodeFlow youtube{}; 
... 
// authorization 
... 
auto multi_part = new QHttpMultiPart{ QHttpMultiPart::MixedType }; 
auto video_part = new QHttpPart{}; 
auto video = new QFile{ video_path }; 

if (!video->open(QIODevice::ReadOnly)) { return nullptr; } 

video_part->setHeader(QNetworkRequest::ContentTypeHeader, QVariant("video/*")); 
video_part->setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("Slug")); 
video_part->setBodyDevice(video); 
multi_part->append(*video_part); 

QNetworkRequest req{youtube_videos_insert}; 
const QString bearer_format = QStringLiteral("Bearer %1"); 
const QString bearer = bearer_format.arg(youtube.token()); 
req.setRawHeader("Authorization", bearer.toUtf8()); 

youtube.networkAccessManager()->post(req, multi_part);