diff --git a/src/web/UBOEmbedParser.cpp b/src/web/UBOEmbedParser.cpp
new file mode 100644
index 00000000..f4247bd0
--- /dev/null
+++ b/src/web/UBOEmbedParser.cpp
@@ -0,0 +1,258 @@
+/*
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include "UBOEmbedParser.h"
+
+UBOEmbedParser::UBOEmbedParser(QObject *parent, const char* name)
+{
+ setObjectName(name);
+ mParsedTitles.clear();
+ connect(this, SIGNAL(parseContent(QString)), this, SLOT(onParseContent(QString)));
+}
+
+UBOEmbedParser::~UBOEmbedParser()
+{
+
+}
+
+void UBOEmbedParser::setNetworkAccessManager(QNetworkAccessManager *nam)
+{
+ mpNam = nam;
+ connect(mpNam, SIGNAL(finished(QNetworkReply*)), this, SLOT(onFinished(QNetworkReply*)));
+}
+
+void UBOEmbedParser::parse(const QString& html)
+{
+ mContents.clear();
+ QString query = "]*)>";
+ QRegExp exp(query);
+ QStringList results;
+ int count = 0;
+ int pos = 0;
+ while ((pos = exp.indexIn(html, pos)) != -1) {
+ ++count;
+ pos += exp.matchedLength();
+ QStringList res = exp.capturedTexts();
+ if("" != res.at(1)){
+ results << res.at(1);
+ }
+ }
+
+ QVector oembedUrls;
+
+ if(2 <= results.size()){
+ for(int i=1; i").arg(results.at(i));
+ QDomDocument domDoc;
+ domDoc.setContent(qsNode);
+ QDomNode linkNode = domDoc.documentElement();
+
+ // At this point, we have a node that is the element. Now we have to parse its attributes
+ // in order to check if it is a oEmbed node or not
+ QDomAttr typeAttribute = linkNode.toElement().attributeNode("type");
+ if(typeAttribute.value().contains("oembed")){
+ // The node is an oembed one! We have to get the url and the type of oembed encoding
+ QDomAttr hrefAttribute = linkNode.toElement().attributeNode("href");
+ QString url = hrefAttribute.value();
+ oembedUrls.append(url);
+ }
+ }
+ }
+ }
+
+ mPending = oembedUrls.size();
+
+ if(0 == mPending){
+ emit oembedParsed(mContents);
+ }else{
+ // Here we start the parsing (finally...)!
+ for(int i=0; i (i+1)){
+ content.url = strl.at(i+1);
+ }
+ }
+ }
+
+ return content;
+}
+
+/**
+ /brief Extract the oembed infos from the XML
+ @param xmlUrl as the url of the XML file
+ */
+sOEmbedContent UBOEmbedParser::getXMLInfos(const QString &xml)
+{
+ sOEmbedContent content;
+
+ QDomDocument domDoc;
+ domDoc.setContent(xml);
+ QDomNode oembed = domDoc.documentElement();
+
+ QDomNodeList children = oembed.toElement().childNodes();
+
+ for(int i=0; i (i+1)){
+ content.url = strl.at(i+1);
+ }
+ }
+ }
+
+ return content;
+}
+
+void UBOEmbedParser::onParseContent(QString url)
+{
+ QUrl qurl;
+ qurl.setEncodedUrl(url.toAscii());
+
+ QNetworkRequest req;
+ req.setUrl(qurl);
+ if(NULL != mpNam){
+ mpNam->get(req);
+ }
+}
+
+void UBOEmbedParser::onFinished(QNetworkReply *reply)
+{
+ QNetworkReply::NetworkError err = reply->error();
+ if(QNetworkReply::NoError == reply->error()){
+ QString receivedDatas = reply->readAll().constData();
+ sOEmbedContent crntContent;
+ // The received datas can be in two different formats: JSON or XML
+ if(receivedDatas.contains("")){
+ // XML !
+ crntContent = getXMLInfos(receivedDatas);
+ }else if(receivedDatas.contains("{\"provider_url")){
+ // JSON !
+ crntContent = getJSONInfos(receivedDatas);
+ }
+
+ // As we don't want duplicates, we have to check if the content title has already
+ // been parsed.
+ if("" != crntContent.title && !mParsedTitles.contains(crntContent.title)){
+ mParsedTitles << crntContent.title;
+ mContents << crntContent;
+ }
+
+ }else{
+ // We decided to not handle the error case here. If there is a problem with
+ // getting the oembed content information, we just don't handle it: the content
+ // will not be available for importation.
+ }
+
+ // Decrement the number of content to analyze
+ mPending--;
+ if(0 == mPending){
+ // All the oembed contents have been parsed. We notify it!
+ emit oembedParsed(mContents);
+ }
+}
diff --git a/src/web/UBOEmbedParser.h b/src/web/UBOEmbedParser.h
new file mode 100644
index 00000000..2c0c0549
--- /dev/null
+++ b/src/web/UBOEmbedParser.h
@@ -0,0 +1,93 @@
+/*
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#ifndef UBOEMBEDPARSER_H
+#define UBOEMBEDPARSER_H
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+/**********************************************************************************
+ ----------------------------------------------------------------
+ Here is an example of an embed content in an XML representation
+ ----------------------------------------------------------------
+
+ http://www.youtube.com/
+ EPISODE 36 Traditional Mediums
+
+
+
+ FZDSCHOOL
+ 270
+ 480
+ 480
+ 1.0
+ http://www.youtube.com/user/FZDSCHOOL
+ YouTube
+ http://i4.ytimg.com/vi/C3lApsNmdwM/hqdefault.jpg
+ video
+ 360
+
+***********************************************************************************/
+typedef struct{
+ QString providerUrl;
+ QString title;
+ QString author;
+ int height;
+ int width;
+ int thumbWidth;
+ float version;
+ QString authorUrl;
+ QString providerName;
+ QString thumbUrl;
+ QString type;
+ QString thumbHeight;
+ QString html;
+ QString url;
+}sOEmbedContent;
+
+class UBOEmbedParser : public QObject
+{
+ Q_OBJECT
+public:
+ UBOEmbedParser(QObject* parent=0, const char* name="UBOEmbedParser");
+ ~UBOEmbedParser();
+ void parse(const QString& html);
+ void setNetworkAccessManager(QNetworkAccessManager* nam);
+
+signals:
+ void parseContent(QString url);
+ void oembedParsed(QVector contents);
+
+private slots:
+ void onFinished(QNetworkReply* reply);
+ void onParseContent(QString url);
+
+private:
+ sOEmbedContent getJSONInfos(const QString& json);
+ sOEmbedContent getXMLInfos(const QString& xml);
+ QVector mContents;
+ QVector mParsedTitles;
+ QNetworkAccessManager* mpNam;
+ int mPending;
+};
+
+#endif // UBOEMBEDPARSER_H
diff --git a/src/web/UBWebController.cpp b/src/web/UBWebController.cpp
index 08c5e8ab..1cacd63b 100644
--- a/src/web/UBWebController.cpp
+++ b/src/web/UBWebController.cpp
@@ -14,6 +14,8 @@
*/
#include
+#include
+#include
#include "frameworks/UBPlatformUtils.h"
@@ -60,7 +62,6 @@ UBWebController::UBWebController(UBMainWindow* mainWindow)
// , mKeyboardCurrentPalette(0)
, mToolsPalettePositionned(false)
, mDownloadViewIsVisible(false)
-
{
connect(mMainWindow->actionWebTools, SIGNAL(toggled(bool)), this, SLOT(toggleWebToolsPalette(bool)));
@@ -72,11 +73,13 @@ UBWebController::UBWebController(UBMainWindow* mainWindow)
mToolsPalettePositionnedList[i] = false;
}
+ connect(&mOEmbedParser, SIGNAL(oembedParsed(QVector)), this, SLOT(onOEmbedParsed(QVector)));
+
+ // TODO : Comment the next line to continue the Youtube button bugfix
initialiazemOEmbedProviders();
}
-
UBWebController::~UBWebController()
{
// NOOP
@@ -93,7 +96,6 @@ void UBWebController::initialiazemOEmbedProviders()
mOEmbedProviders << "metacafe.com";
mOEmbedProviders << "qik.com";
mOEmbedProviders << "slideshare";
- mOEmbedProviders << "5min.com";
mOEmbedProviders << "twitpic.com";
mOEmbedProviders << "viddler.com";
mOEmbedProviders << "vimeo.com";
@@ -324,16 +326,53 @@ void UBWebController::activePageChanged()
mTrapFlashController->updateTrapFlashFromPage((*mCurrentWebBrowser)->currentTabWebView()->page()->currentFrame());
}
+
+
mMainWindow->actionWebTrap->setChecked(false);
QUrl latestUrl = (*mCurrentWebBrowser)->currentTabWebView()->url();
+
+ // TODO : Uncomment the next line to continue the youtube button bugfix
+ //UBApplication::mainWindow->actionWebOEmbed->setEnabled(hasEmbeddedContent());
+ // And remove this line once the previous one is uncommented
UBApplication::mainWindow->actionWebOEmbed->setEnabled(isOEmbedable(latestUrl));
+
UBApplication::mainWindow->actionEduMedia->setEnabled(isEduMedia(latestUrl));
emit activeWebPageChanged((*mCurrentWebBrowser)->currentTabWebView());
}
}
+bool UBWebController::hasEmbeddedContent()
+{
+ bool bHasContent = false;
+ if(mCurrentWebBrowser){
+ QString html = (*mCurrentWebBrowser)->currentTabWebView()->webPage()->mainFrame()->toHtml();
+
+ // search the presence of "+oembed"
+ QString query = "\\+oembed([^>]*)>";
+ QRegExp exp(query);
+ exp.indexIn(html);
+ QStringList results = exp.capturedTexts();
+ if(2 <= results.size() && "" != results.at(1)){
+ // An embedded content has been found, no need to check the other ones
+ bHasContent = true;
+ }else{
+ QList contentUrls;
+ lookForEmbedContent(&html, "embed", "src", &contentUrls);
+ lookForEmbedContent(&html, "video", "src", &contentUrls);
+ lookForEmbedContent(&html, "object", "data", &contentUrls);
+
+ // TODO: check the hidden iFrame
+
+ if(!contentUrls.empty()){
+ bHasContent = true;
+ }
+ }
+ }
+
+ return bHasContent;
+}
QPixmap UBWebController::captureCurrentPage()
{
@@ -539,9 +578,12 @@ void UBWebController::showTabAtTop(bool attop)
void UBWebController::captureoEmbed()
{
- if ( mCurrentWebBrowser && (*mCurrentWebBrowser)
- && (*mCurrentWebBrowser)->currentTabWebView())
- {
+ if ( mCurrentWebBrowser && (*mCurrentWebBrowser) && (*mCurrentWebBrowser)->currentTabWebView()){
+ // TODO : Uncomment the next lines to continue the youtube button bugfix
+ // getEmbeddableContent();
+
+ // And comment from here
+
QWebView* webView = (*mCurrentWebBrowser)->currentTabWebView();
QUrl currentUrl = webView->url();
@@ -555,9 +597,56 @@ void UBWebController::captureoEmbed()
UBDrawingController::drawingController()->setStylusTool(UBStylusTool::Selector);
}
}
+ // --> Until here
}
}
+void UBWebController::lookForEmbedContent(QString* pHtml, QString tag, QString attribute, QList *pList)
+{
+ if(NULL != pHtml && NULL != pList){
+ QVector urlsFound;
+ // Check for