void YouTube::uploadFinished() { fileToBeUploaded->close(); if (uploadReply->error()) { if (uploadReply->error() == QNetworkReply::OperationCanceledError) { emit uploadStatusChanged("aborted"); return; } else { int statusCode = uploadReply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); if (statusCode == 308) { if (uploadRetries > 0) { emit uploadStatusChanged("interrupted"); QTimer::singleShot(3000, this, SLOT(resumeVideoUpload())); } else { emit uploadStatusChanged("failed"); } } } } else { emit uploadStatusChanged("completed"); } }
void YouTube::resumeVideoUpload() { uploadRetries--; QByteArray rangeHeader = uploadReply->rawHeader("Range"); QByteArray startByte = rangeHeader.split('-').last(); QByteArray locationHeader = uploadReply->rawHeader("Location"); //qDebug() << rangeHeader << startByte << locationHeader; if (locationHeader.length() > 0) { uploadUrl = QUrl(locationHeader); } fileToBeUploaded->open(QIODevice::ReadOnly); int fs = fileToBeUploaded->size(); QByteArray fileSize = QByteArray::number(fs); QByteArray endByte = QByteArray::number(fs - 1); QByteArray range(startByte + '-' + endByte + '/' + fileSize); QNetworkRequest request(uploadUrl); request.setRawHeader("Host", "uploads.gdata.youtube.com"); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/octet-stream"); request.setHeader(QNetworkRequest::ContentLengthHeader, fs - startByte.toInt()); request.setRawHeader("Content-Range", range); uploadReply = nam->put(request, fileToBeUploaded); connect(uploadReply, SIGNAL(uploadProgress(qint64,qint64)), this, SIGNAL(updateUploadProgress(qint64,qint64))); connect(uploadReply, SIGNAL(finished()), this, SLOT(uploadFinished())); emit uploadStatusChanged("started"); }
void YouTube::uploadVideo(const QString &filename, const QString &title, const QString &description, const QString &tags, const QString &category, const bool &isPrivate) { // qDebug() << filename << "/n" << title << "/n" << description << "/n" << tags << "/n" << category << "/n" << isPrivate; emit uploadStatusChanged("preparing"); fileToBeUploaded = new QFile(filename); if (!fileToBeUploaded->exists()) { emit uploadStatusChanged("failed"); return; } QUrl url("http://uploads.gdata.youtube.com/resumable/feeds/api/users/default/uploads"); QByteArray xml("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" \ "<entry xmlns=\"http://www.w3.org/2005/Atom\"\n" \ "xmlns:media=\"http://search.yahoo.com/mrss/\"\n" \ "xmlns:yt=\"http://gdata.youtube.com/schemas/2007\">\n" \ "<media:group>\n" \ "<media:title>" + title.toAscii().toPercentEncoding(" \n\t#[]{}=+$&*()<>@|',/!\":;?") + "</media:title>\n" \ "<media:description>\n" + description.toAscii().toPercentEncoding(" \n\t#[]{}=+$&*()<>@|',/!\":;?") + "\n\n" + #ifdef Q_WS_MAEMO_5 "Uploaded via cuteTube\n</media:description>\n" #elif (defined(Q_WS_X11)) // NPM: aka, MeeGo "Uploaded via cuteTube for MeeGo\n</media:description>\n" #else "Uploaded via cuteTube on Symbian\n</media:description>\n" #endif "<media:category scheme=\"http://gdata.youtube.com/schemas/2007/categories.cat\">\n" + category.toAscii() + "\n</media:category>\n" \ "<media:keywords>" + tags.toAscii().toPercentEncoding(" \n\t#[]{}=+$&*()<>@|',/!\":;?") + "</media:keywords>\n" \ "</media:group>\n" \ "</entry>"); if (isPrivate) { int index = xml.lastIndexOf("<"); xml.insert(index, "<yt:private/>\n"); } QNetworkRequest request(url); request.setRawHeader("Host", "uploads.gdata.youtube.com"); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/atom+xml; charset=UTF-8"); request.setHeader(QNetworkRequest::ContentLengthHeader, xml.length()); request.setRawHeader("Authorization", "AuthSub token=" + accessToken.toAscii()); request.setRawHeader("GData-Version", "2"); request.setRawHeader("X-Gdata-Key", "key=" + developerKey); request.setRawHeader("Slug", filename.split("/").last().toAscii()); uploadReply = nam->post(request, xml); connect(uploadReply, SIGNAL(finished()), this, SLOT(setUploadUrl())); }
void DriveManager::handleUploadRequestFinished () { QNetworkReply *reply = qobject_cast<QNetworkReply*> (sender ()); if (!reply) return; reply->deleteLater (); QString path = Reply2FilePath_.take (reply); const int code = reply-> attribute (QNetworkRequest::HttpStatusCodeAttribute).toInt (); if (code != 200) { qWarning () << Q_FUNC_INFO << "upload initiating failed with code:" << code; return; } emit uploadStatusChanged (tr ("Uploading..."), path); QFile *file = new QFile (path); if (!file->open (QIODevice::ReadOnly)) { qWarning () << Q_FUNC_INFO << "unable to open file: " << file->errorString (); return; } QUrl url (reply->rawHeader ("Location")); QNetworkRequest request (url); #ifdef HAVE_MAGIC request.setHeader (QNetworkRequest::ContentTypeHeader, magic_file (Magic_, path.toUtf8 ())); #endif request.setHeader (QNetworkRequest::ContentLengthHeader, QString::number (QFileInfo (path).size ()).toUtf8 ()); QNetworkReply *uploadReply = Core::Instance ().GetProxy ()-> GetNetworkAccessManager ()->put (request, file); file->setParent (uploadReply); Reply2FilePath_ [uploadReply] = path; connect (uploadReply, SIGNAL (finished ()), this, SLOT (handleUploadFinished ())); connect (uploadReply, SIGNAL (error (QNetworkReply::NetworkError)), this, SLOT (handleUploadError (QNetworkReply::NetworkError))); connect (uploadReply, SIGNAL (uploadProgress (qint64, qint64)), this, SLOT (handleUploadProgress (qint64, qint64))); }
void YouTube::performVideoUpload() { uploadRetries = 3; fileToBeUploaded->open(QIODevice::ReadOnly); QNetworkRequest request(uploadUrl); request.setRawHeader("Host", "uploads.gdata.youtube.com"); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/octet-stream"); request.setHeader(QNetworkRequest::ContentLengthHeader, fileToBeUploaded->size()); uploadReply = nam->put(request, fileToBeUploaded); connect(uploadReply, SIGNAL(uploadProgress(qint64,qint64)), this, SLOT(updateUploadProgress(qint64,qint64))); connect(uploadReply, SIGNAL(finished()), this, SLOT(uploadFinished())); emit uploadStatusChanged("started"); uploadTime.start(); }
void YouTube::setUploadUrl() { if (uploadReply->error()) return; int statusCode = uploadReply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); QByteArray statusText = uploadReply->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toByteArray(); //qDebug() << "Status is:" << statusCode << ":" << statusText; if (statusCode == 200) { uploadUrl = QUrl(uploadReply->rawHeader("Location")); // qDebug() << uploadUrl; performVideoUpload(); } else { emit alert(tr("Error - Server repsonse is: ") + statusText); emit uploadStatusChanged("failed"); } }
void DriveManager::RequestUpload (const QString& filePath, const QString& parent, const QString& key) { emit uploadStatusChanged (tr ("Initializing..."), filePath); QFileInfo info (filePath); const QUrl initiateUrl (QString ("https://www.googleapis.com/upload/drive/v2/files?access_token=%1&uploadType=resumable") .arg (key)); QNetworkRequest request (initiateUrl); request.setPriority (QNetworkRequest::LowPriority); #ifdef HAVE_MAGIC request.setRawHeader ("X-Upload-Content-Type", magic_file (Magic_, filePath.toUtf8 ())); #endif request.setRawHeader ("X-Upload-Content-Length", QString::number (QFileInfo (filePath).size ()).toUtf8 ()); QVariantMap map; map ["title"] = QFileInfo (filePath).fileName (); if (!parent.isEmpty ()) { QVariantList parents; QVariantMap parentMap; parentMap ["id"] = parent; parents << parentMap; map ["parents"] = parents; } const auto& data = QJson::Serializer ().serialize (map); request.setHeader (QNetworkRequest::ContentTypeHeader, "application/json"); request.setHeader (QNetworkRequest::ContentLengthHeader, data.size ()); QNetworkReply *reply = Core::Instance ().GetProxy ()-> GetNetworkAccessManager ()->post (request, data); Reply2FilePath_ [reply] = filePath; connect (reply, SIGNAL (finished ()), this, SLOT (handleUploadRequestFinished ())); }
void YouTube::abortVideoUpload() { uploadReply->abort(); fileToBeUploaded->close(); emit uploadStatusChanged("aborted"); }