parent
ff6fbd525f
commit
631133d95d
@ -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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
|
||||||
|
#include <QRegExp> |
||||||
|
#include <QStringList> |
||||||
|
#include <QDomDocument> |
||||||
|
#include <QDomElement> |
||||||
|
#include <QDomNode> |
||||||
|
#include <QScriptValue> |
||||||
|
#include <QScriptEngine> |
||||||
|
#include <QDebug> |
||||||
|
|
||||||
|
#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 = "<link([^>]*)>"; |
||||||
|
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<QString> oembedUrls; |
||||||
|
|
||||||
|
if(2 <= results.size()){ |
||||||
|
for(int i=1; i<results.size(); i++){ |
||||||
|
if("" != results.at(i)){ |
||||||
|
QString qsNode = QString("<link%0>").arg(results.at(i)); |
||||||
|
QDomDocument domDoc; |
||||||
|
domDoc.setContent(qsNode); |
||||||
|
QDomNode linkNode = domDoc.documentElement(); |
||||||
|
|
||||||
|
// At this point, we have a node that is the <link> 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<oembedUrls.size(); i++){ |
||||||
|
emit parseContent(oembedUrls.at(i)); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/**
|
||||||
|
/brief Extract the oembed infos from the JSON |
||||||
|
@param jsonUrl as the url of the JSON file |
||||||
|
*/ |
||||||
|
sOEmbedContent UBOEmbedParser::getJSONInfos(const QString &json) |
||||||
|
{ |
||||||
|
sOEmbedContent content; |
||||||
|
|
||||||
|
QScriptValue scriptValue; |
||||||
|
QScriptEngine scriptEngine; |
||||||
|
scriptValue = scriptEngine.evaluate ("(" + json + ")"); |
||||||
|
|
||||||
|
QString providerUrl = scriptValue.property("provider_url").toString(); |
||||||
|
QString title = scriptValue.property("title").toString(); |
||||||
|
QString html = scriptValue.property("html").toString(); |
||||||
|
QString authorName = scriptValue.property("author_name").toString(); |
||||||
|
int height = scriptValue.property("height").toInteger(); |
||||||
|
int thumbnailWidth = scriptValue.property("thumbnail_width").toInteger(); |
||||||
|
int width = scriptValue.property("width").toInteger(); |
||||||
|
float version = scriptValue.property("version").toString().toFloat(); |
||||||
|
QString authorUrl = scriptValue.property("author_url").toString(); |
||||||
|
QString providerName = scriptValue.property("provider_name").toString(); |
||||||
|
QString thumbnailUrl = scriptValue.property("thumbnail_url").toString(); |
||||||
|
QString type = scriptValue.property("type").toString(); |
||||||
|
int thumbnailHeight = scriptValue.property("thumbnail_height").toInteger(); |
||||||
|
|
||||||
|
content.providerUrl = providerUrl; |
||||||
|
content.title = title; |
||||||
|
content.html = html; |
||||||
|
content.author = authorName; |
||||||
|
content.height = height; |
||||||
|
content.thumbWidth = thumbnailWidth; |
||||||
|
content.width = width; |
||||||
|
content.version = version; |
||||||
|
content.authorUrl = authorUrl; |
||||||
|
content.providerName = providerName; |
||||||
|
content.thumbUrl = thumbnailUrl; |
||||||
|
content.type = type; |
||||||
|
content.thumbHeight = thumbnailHeight; |
||||||
|
|
||||||
|
if("photo" == content.type){ |
||||||
|
content.url = scriptValue.property("url").toString(); |
||||||
|
}else if("video" == content.type){ |
||||||
|
QStringList strl = content.html.split('\"'); |
||||||
|
for(int i=0; i<strl.size(); i++){ |
||||||
|
if(strl.at(i).endsWith("src=") && strl.size() > (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<children.size(); i++){ |
||||||
|
QDomNode node = children.at(i); |
||||||
|
QString tag = node.nodeName(); |
||||||
|
QString value = node.toElement().text(); |
||||||
|
if("provider_url" == tag){ |
||||||
|
content.providerUrl = value; |
||||||
|
}else if("title" == tag){ |
||||||
|
content.title = value; |
||||||
|
}else if("html" == tag){ |
||||||
|
content.html = value; |
||||||
|
}else if("author_name" == tag){ |
||||||
|
content.author = value; |
||||||
|
}else if("height" == tag){ |
||||||
|
content.height = value.toInt(); |
||||||
|
}else if("thumbnail_width" == tag){ |
||||||
|
content.thumbWidth = value.toInt(); |
||||||
|
}else if("width" == tag){ |
||||||
|
content.width = value.toInt(); |
||||||
|
}else if("version" == tag){ |
||||||
|
content.version = value.toFloat(); |
||||||
|
}else if("author_url" == tag){ |
||||||
|
content.authorUrl = value; |
||||||
|
}else if("provider_name" == tag){ |
||||||
|
content.providerName = value; |
||||||
|
}else if("thumbnail_url" == tag){ |
||||||
|
content.thumbUrl = value; |
||||||
|
}else if("type" == tag){ |
||||||
|
content.type = value; |
||||||
|
}else if("thumbnail_height" == tag){ |
||||||
|
content.thumbHeight = value.toInt(); |
||||||
|
}else if("url" == tag){ |
||||||
|
content.url = value; // This case appears only for type = photo
|
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if("video" == content.type){ |
||||||
|
QStringList strl = content.html.split('\"'); |
||||||
|
for(int i=0; i<strl.size(); i++){ |
||||||
|
if(strl.at(i).endsWith("src=") && strl.size() > (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("<oembed>")){ |
||||||
|
// 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); |
||||||
|
} |
||||||
|
} |
@ -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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef UBOEMBEDPARSER_H |
||||||
|
#define UBOEMBEDPARSER_H |
||||||
|
|
||||||
|
#include <QObject> |
||||||
|
#include <QVector> |
||||||
|
#include <QString> |
||||||
|
#include <QUrl> |
||||||
|
#include <QNetworkAccessManager> |
||||||
|
#include <QNetworkRequest> |
||||||
|
#include <QNetworkReply> |
||||||
|
#include <QMutex> |
||||||
|
|
||||||
|
/**********************************************************************************
|
||||||
|
---------------------------------------------------------------- |
||||||
|
Here is an example of an embed content in an XML representation |
||||||
|
---------------------------------------------------------------- |
||||||
|
<oembed> |
||||||
|
<provider_url>http://www.youtube.com/</provider_url>
|
||||||
|
<title>EPISODE 36 Traditional Mediums</title> |
||||||
|
<html> |
||||||
|
<iframe width="480" height="270" src="http://www.youtube.com/embed/C3lApsNmdwM?fs=1&feature=oembed" frameborder="0" allowfullscreen></iframe> |
||||||
|
</html> |
||||||
|
<author_name>FZDSCHOOL</author_name> |
||||||
|
<height>270</height> |
||||||
|
<thumbnail_width>480</thumbnail_width> |
||||||
|
<width>480</width> |
||||||
|
<version>1.0</version> |
||||||
|
<author_url>http://www.youtube.com/user/FZDSCHOOL</author_url>
|
||||||
|
<provider_name>YouTube</provider_name> |
||||||
|
<thumbnail_url>http://i4.ytimg.com/vi/C3lApsNmdwM/hqdefault.jpg</thumbnail_url>
|
||||||
|
<type>video</type> |
||||||
|
<thumbnail_height>360</thumbnail_height> |
||||||
|
</oembed> |
||||||
|
***********************************************************************************/ |
||||||
|
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<sOEmbedContent> contents); |
||||||
|
|
||||||
|
private slots: |
||||||
|
void onFinished(QNetworkReply* reply); |
||||||
|
void onParseContent(QString url); |
||||||
|
|
||||||
|
private: |
||||||
|
sOEmbedContent getJSONInfos(const QString& json); |
||||||
|
sOEmbedContent getXMLInfos(const QString& xml); |
||||||
|
QVector<sOEmbedContent> mContents; |
||||||
|
QVector<QString> mParsedTitles; |
||||||
|
QNetworkAccessManager* mpNam; |
||||||
|
int mPending; |
||||||
|
}; |
||||||
|
|
||||||
|
#endif // UBOEMBEDPARSER_H
|
@ -0,0 +1,91 @@ |
|||||||
|
/*
|
||||||
|
* 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
|
||||||
|
#include <QRegExp> |
||||||
|
|
||||||
|
#include "UBOEmbedParser.h" |
||||||
|
|
||||||
|
/**********************************************************************************
|
||||||
|
---------------------------------------------------------------- |
||||||
|
Here is an example of an embed content in an XML representation |
||||||
|
---------------------------------------------------------------- |
||||||
|
<oembed> |
||||||
|
<provider_url>http://www.youtube.com/</provider_url>
|
||||||
|
<title>EPISODE 36 Traditional Mediums</title> |
||||||
|
<html> |
||||||
|
<iframe width="480" height="270" src="http://www.youtube.com/embed/C3lApsNmdwM?fs=1&feature=oembed" frameborder="0" allowfullscreen></iframe> |
||||||
|
</html> |
||||||
|
<author_name>FZDSCHOOL</author_name> |
||||||
|
<height>270</height> |
||||||
|
<thumbnail_width>480</thumbnail_width> |
||||||
|
<width>480</width> |
||||||
|
<version>1.0</version> |
||||||
|
<author_url>http://www.youtube.com/user/FZDSCHOOL</author_url>
|
||||||
|
<provider_name>YouTube</provider_name> |
||||||
|
<thumbnail_url>http://i4.ytimg.com/vi/C3lApsNmdwM/hqdefault.jpg</thumbnail_url>
|
||||||
|
<type>video</type> |
||||||
|
<thumbnail_height>360</thumbnail_height> |
||||||
|
</oembed> |
||||||
|
***********************************************************************************/ |
||||||
|
typedef struct{ |
||||||
|
QString providerUrl; |
||||||
|
QString title; |
||||||
|
QString author; |
||||||
|
int height; |
||||||
|
int thumbWidth; |
||||||
|
float version; |
||||||
|
QString authorUrl; |
||||||
|
QString providerName; |
||||||
|
QString thumbUrl; |
||||||
|
QString type; |
||||||
|
QString thumbHeight; |
||||||
|
QString sourceUrl; |
||||||
|
}sOEmbedContent; |
||||||
|
|
||||||
|
UBOEmbedParser::UBOEmbedParser(QObject *parent, const char* name) |
||||||
|
{ |
||||||
|
setObjectName(name); |
||||||
|
mParsedTitles.clear(); |
||||||
|
} |
||||||
|
|
||||||
|
UBOEmbedParser::~UBOEmbedParser() |
||||||
|
{ |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
void UBOEmbedParser::parse(const QString& html, QList<QUrl> *pList) |
||||||
|
{ |
||||||
|
// get all the oembed links and parse their informations
|
||||||
|
QString query = ""; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
/**
|
||||||
|
/brief Extract the oembed infos from the JSON |
||||||
|
@param jsonUrl as the url of the JSON file |
||||||
|
*/ |
||||||
|
void UBOEmbedParser::getJSONInfos(const QString &jsonUrl) |
||||||
|
{ |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
/**
|
||||||
|
/brief Extract the oembed infos from the XML |
||||||
|
@param xmlUrl as the url of the XML file |
||||||
|
*/ |
||||||
|
void UBOEmbedParser::getXMLInfos(const QString &xmlUrl) |
||||||
|
{ |
||||||
|
|
||||||
|
} |
Loading…
Reference in new issue