/*
* 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"
#include "core/memcheck.h"
UBOEmbedParser::UBOEmbedParser(QObject *parent, const char* name)
{
Q_UNUSED(parent);
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)
{
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);
}
}