Account for difference between boards when parsing XML
Apparently there's nothing similar among these boards: Gelbooru and Konachan use xml attributes, and Danbooru uses proper tags. This is workarounded by adding a new parameter to parseDanbooruResult() which takes into account the difference between the two calls. Hopefully JSON isn't broken in Danbooru so I never have to use XML...
This commit is contained in:
		
					parent
					
						
							
								7eaa207852
							
						
					
				
			
			
				commit
				
					
						0ee1d034c7
					
				
			
		
					 2 changed files with 54 additions and 29 deletions
				
			
		| 
						 | 
					@ -126,49 +126,74 @@ QUrl requestUrl(QUrl &url, const QString &path, const QString &username,
 | 
				
			||||||
    return danbooruUrl;
 | 
					    return danbooruUrl;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
QList< QVariant > parseDanbooruResult(QByteArray data, QString xlmElement, bool *result)
 | 
					QList< QVariant > parseDanbooruResult(QByteArray data, QString xlmElement, bool *result, ApiType apiType)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    QXmlStreamReader reader;
 | 
					    QXmlStreamReader reader;
 | 
				
			||||||
    reader.addData(data);
 | 
					    reader.addData(data);
 | 
				
			||||||
 | 
					 | 
				
			||||||
    QList<QVariant> postData;
 | 
					    QList<QVariant> postData;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    while (!reader.atEnd() && !reader.hasError()) {
 | 
					    if (apiType != ApiType::OriginalDanbooru) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        QXmlStreamReader::TokenType token = reader.readNext();
 | 
					        while (!reader.atEnd() && !reader.hasError()) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (token == QXmlStreamReader::StartDocument) {
 | 
					            QXmlStreamReader::TokenType token = reader.readNext();
 | 
				
			||||||
            continue;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (token == QXmlStreamReader::StartElement &&
 | 
					            if (token == QXmlStreamReader::StartDocument) {
 | 
				
			||||||
                reader.name() == xlmElement)  {
 | 
					                continue;
 | 
				
			||||||
 | 
					 | 
				
			||||||
            QVariantMap values;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            QXmlStreamAttributes attributes = reader.attributes();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//                 qCDebug(LIBDANBOORU) << attributes;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            for (auto attribute : attributes) {
 | 
					 | 
				
			||||||
                values.insert(attribute.name().toString(),
 | 
					 | 
				
			||||||
                              attribute.value().toString());
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (values.isEmpty()) {
 | 
					            if (token == QXmlStreamReader::StartElement &&
 | 
				
			||||||
                *result = false;
 | 
					                    reader.name() == xlmElement)  {
 | 
				
			||||||
                qCWarning(LIBDANBOORU) << "No results found when parsing XML";
 | 
					
 | 
				
			||||||
                return QList<QVariant>();
 | 
					                QVariantMap values;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                QXmlStreamAttributes attributes = reader.attributes();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    //                 qCDebug(LIBDANBOORU) << attributes;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                for (auto attribute : attributes) {
 | 
				
			||||||
 | 
					                    values.insert(attribute.name().toString(),
 | 
				
			||||||
 | 
					                                attribute.value().toString());
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (values.isEmpty()) {
 | 
				
			||||||
 | 
					                    *result = false;
 | 
				
			||||||
 | 
					                    qCWarning(LIBDANBOORU) << "No results found when parsing XML";
 | 
				
			||||||
 | 
					                    return QList<QVariant>();
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                QVariant converted = QVariant(values);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                postData.append(converted);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        *result = true;
 | 
				
			||||||
 | 
					        return postData;
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        QString plural = xlmElement + QString("s");
 | 
				
			||||||
 | 
					        while(reader.readNextStartElement()) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (reader.name() == xlmElement) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                QVariantMap values;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                while(reader.readNextStartElement()) {
 | 
				
			||||||
 | 
					                    values.insert(reader.name().toString(), reader.readElementText());
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                QVariant converted = QVariant(values);
 | 
				
			||||||
 | 
					                postData.append(converted);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            QVariant converted = QVariant(values);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            postData.append(converted);
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        if (postData.isEmpty()) {
 | 
				
			||||||
 | 
					            *result = false;
 | 
				
			||||||
 | 
					            qCWarning(LIBDANBOORU) << "No results found when parsing XML";
 | 
				
			||||||
 | 
					            return QList<QVariant>();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        *result = true;
 | 
				
			||||||
 | 
					        return postData;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    *result = true;
 | 
					 | 
				
			||||||
    return postData;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
QVariant parseDanbooruResult(QByteArray data, bool *result)
 | 
					QVariant parseDanbooruResult(QByteArray data, bool *result)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -102,7 +102,7 @@ QUrl requestUrl(QUrl &url, const QString &path, const QString &username,
 | 
				
			||||||
                const QString &password);
 | 
					                const QString &password);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
QList<QVariant> parseDanbooruResult(QByteArray data, QString xlmElement,
 | 
					QList<QVariant> parseDanbooruResult(QByteArray data, QString xlmElement,
 | 
				
			||||||
                                    bool *result);
 | 
					                                    bool *result, ApiType=ApiType::KonachanDanbooru);
 | 
				
			||||||
QVariant parseDanbooruResult(QByteArray data, bool *result);
 | 
					QVariant parseDanbooruResult(QByteArray data, bool *result);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue