Make LyricsWikia query more robust
This PR adds a fallback to a self-crafted URL if the XML which is supposed to contain it broken. That's required because it seems that the XML is sometimes not generated correctly (e.g. missing "+" character in song name which has the plus sign in it).
This commit is contained in:
parent
7f58124bf0
commit
2a9b7eb48a
|
@ -26,6 +26,15 @@ QUrl lyricsWikiaApiUrl()
|
||||||
return QUrl((lyricsWikiaUrl.isEmpty() ? defaultLyricsWikiaUrl : lyricsWikiaUrl) + QStringLiteral("/api.php"));
|
return QUrl((lyricsWikiaUrl.isEmpty() ? defaultLyricsWikiaUrl : lyricsWikiaUrl) + QStringLiteral("/api.php"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void lazyInitializeLyricsWikiaSongId(SongDescription &desc)
|
||||||
|
{
|
||||||
|
if (!desc.songId.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
desc.songId = desc.artist % QChar(':') % desc.title;
|
||||||
|
desc.songId.replace(QChar(' '), QChar('_'));
|
||||||
|
}
|
||||||
|
|
||||||
LyricsWikiaResultsModel::LyricsWikiaResultsModel(SongDescription &&initialSongDescription, QNetworkReply *reply)
|
LyricsWikiaResultsModel::LyricsWikiaResultsModel(SongDescription &&initialSongDescription, QNetworkReply *reply)
|
||||||
: HttpResultsModel(move(initialSongDescription), reply)
|
: HttpResultsModel(move(initialSongDescription), reply)
|
||||||
{
|
{
|
||||||
|
@ -230,7 +239,7 @@ void LyricsWikiaResultsModel::parseSongDetails(int row, const QByteArray &data)
|
||||||
setResultsAvailable(true);
|
setResultsAvailable(true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const SongDescription &assocDesc = m_results.at(row);
|
SongDescription &assocDesc = m_results[row];
|
||||||
|
|
||||||
QUrl parsedUrl;
|
QUrl parsedUrl;
|
||||||
|
|
||||||
|
@ -277,16 +286,20 @@ void LyricsWikiaResultsModel::parseSongDetails(int row, const QByteArray &data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// requets lyrics (seem to be incomplete in XML response, so just get the regular Wiki page)
|
// requets lyrics (lyrics are trunacted in XML response so just get them via the regular Wiki page)
|
||||||
|
// -> fall back to self-crafted URL if it was not possible to parse it from XML
|
||||||
if (parsedUrl.isEmpty()) {
|
if (parsedUrl.isEmpty()) {
|
||||||
m_errorList << tr("Song details requested for %1/%2 do not contain URL for Wiki page").arg(assocDesc.artist, assocDesc.title);
|
lazyInitializeLyricsWikiaSongId(assocDesc);
|
||||||
setResultsAvailable(true);
|
parsedUrl.setPath(QStringLiteral("/wiki/") + assocDesc.songId);
|
||||||
return;
|
m_errorList << tr(
|
||||||
|
"Song details requested for %1/%2 do not contain URL for Wiki page or do not match requested song; using self-crafted link instead")
|
||||||
|
.arg(assocDesc.artist, assocDesc.title);
|
||||||
}
|
}
|
||||||
// do not use parsed URL directly to avoid unintended requests
|
// -> do not use parsed URL "as-is" in any case to avoid unintended requests
|
||||||
QUrl requestUrl(lyricsWikiaApiUrl());
|
QUrl requestUrl(lyricsWikiaApiUrl());
|
||||||
requestUrl.setPath(parsedUrl.path());
|
requestUrl.setPath(parsedUrl.path());
|
||||||
auto *reply = Utility::networkAccessManager().get(QNetworkRequest(parsedUrl));
|
// -> initialize the actual request
|
||||||
|
auto *const reply = Utility::networkAccessManager().get(QNetworkRequest(requestUrl));
|
||||||
addReply(reply, bind(&LyricsWikiaResultsModel::handleLyricsReplyFinished, this, reply, row));
|
addReply(reply, bind(&LyricsWikiaResultsModel::handleLyricsReplyFinished, this, reply, row));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -394,12 +407,8 @@ QUrl LyricsWikiaResultsModel::webUrl(const QModelIndex &index)
|
||||||
}
|
}
|
||||||
|
|
||||||
SongDescription &desc = m_results[index.row()];
|
SongDescription &desc = m_results[index.row()];
|
||||||
|
lazyInitializeLyricsWikiaSongId(desc);
|
||||||
|
|
||||||
// lazy initialize song ID
|
|
||||||
if (desc.songId.isEmpty()) {
|
|
||||||
desc.songId = desc.artist % QChar(':') % desc.title;
|
|
||||||
desc.songId.replace(QChar(' '), QChar('_'));
|
|
||||||
}
|
|
||||||
// return URL
|
// return URL
|
||||||
QUrl url(lyricsWikiaApiUrl());
|
QUrl url(lyricsWikiaApiUrl());
|
||||||
url.setPath(QStringLiteral("/wiki/") + desc.songId);
|
url.setPath(QStringLiteral("/wiki/") + desc.songId);
|
||||||
|
|
Loading…
Reference in New Issue