void UltimateLyricsProvider::LyricsFetched(QByteArray bytes) { //Debug::debug() << "[UltimateLyricsProvider] " << name_ << " LyricsFetched"; QObject* reply = qobject_cast<QObject*>(sender()); if (!reply || !m_requests.contains(reply)) return; INFO::InfoRequestData request = m_requests.take(reply); const QTextCodec* codec = QTextCodec::codecForName(charset_.toAscii().constData()); const QString original_content = codec->toUnicode(bytes); //Debug::debug() << "[UltimateLyricsProvider] original_content :" << original_content; QString lyrics; // Check for invalid indicators foreach (const QString& indicator, invalid_indicators_) { if (original_content.contains(indicator)) { emit Finished(request); return; } } // Apply extract rules foreach (const Rule& rule, extract_rules_) { // Modify the rule for this request's metadata Rule rule_copy(rule); for (Rule::iterator it = rule_copy.begin() ; it != rule_copy.end() ; ++it) { ReplaceFields(request, &it->first); } QString content = original_content; ApplyExtractRule(rule_copy, &content); //Debug::debug() << "Extract rule" << rule_copy << "matched" << content.length(); if (!content.isEmpty()) { lyrics = content; break; } }
void UltimateLyricsProvider::LyricsFetched() { QNetworkReply* reply = qobject_cast<QNetworkReply*>(sender()); if (!reply) { url_hop_ = false; return; } int id = requests_.take(reply); reply->deleteLater(); if (reply->error() != QNetworkReply::NoError) { url_hop_ = false; emit Finished(id); return; } // Handle redirects QVariant redirect_target = reply->attribute(QNetworkRequest::RedirectionTargetAttribute); if (redirect_target.isValid()) { if (redirect_count_ >= kRedirectLimit) { url_hop_ = false; emit Finished(id); return; } QUrl target = redirect_target.toUrl(); if (target.scheme().isEmpty() || target.host().isEmpty()) { QString path = target.path(); target = reply->url(); target.setPath(path); } redirect_count_ ++; QNetworkReply* reply = network_->get(QNetworkRequest(target)); requests_[reply] = id; connect(reply, SIGNAL(finished()), SLOT(LyricsFetched())); return; } const QTextCodec* codec = QTextCodec::codecForName(charset_.toAscii().constData()); const QString original_content = codec->toUnicode(reply->readAll()); QString lyrics; // Check for invalid indicators foreach (const QString& indicator, invalid_indicators_) { if (original_content.contains(indicator)) { qLog(Debug) << "Found invalid indicator" << indicator; url_hop_ = false; emit Finished(id); return; } } if (!url_hop_) { // Apply extract rules foreach (const Rule& rule, extract_rules_) { // Modify the rule for this request's metadata Rule rule_copy(rule); for (Rule::iterator it = rule_copy.begin() ; it != rule_copy.end() ; ++it) { ReplaceFields(metadata_, &it->first); } QString content = original_content; if (ApplyExtractRule(rule_copy, &content)) { url_hop_ = true; QUrl url(content); qLog(Debug) << "Next url hop: " << url; QNetworkReply* reply = network_->get(QNetworkRequest(url)); requests_[reply] = id; connect(reply, SIGNAL(finished()), SLOT(LyricsFetched())); return; } // Apply exclude rules foreach (const Rule& rule, exclude_rules_) { ApplyExcludeRule(rule, &lyrics); }