void UltimateLyricsProvider::FetchInfo(INFO::InfoRequestData request) { //Debug::debug() << name() << " fetch info "; const QTextCodec* codec = QTextCodec::codecForName(charset_.toAscii().constData()); if (!codec) { qWarning() << "Invalid codec" << charset_; emit Finished(request); return; } //! Fill in fields in the URL //Debug::debug() << " ---- UltimateLyricsProvider::base url " << url_; lyrics_url_ = url_; ReplaceFields(request, &lyrics_url_); //Debug::debug() << " ---- UltimateLyricsProvider::complete url " << lyrics_url_; QUrl url(lyrics_url_); QObject *reply = HTTP()->get( url ); m_requests[reply] = request; connect(reply, SIGNAL(data(QByteArray)), this, SLOT(LyricsFetched(QByteArray))); connect(reply, SIGNAL(error(QNetworkReply*)), this, SLOT(signalFinish())); }
void UltimateLyricsProvider::FetchInfo(int id, const Song& metadata) { // Get the text codec const QTextCodec* codec = QTextCodec::codecForName(charset_.toAscii().constData()); if (!codec) { qLog(Warning) << "Invalid codec" << charset_; emit Finished(id); return; } // Fill in fields in the URL QString url_text(url_); ReplaceFields(metadata, &url_text); QUrl url(url_text); qLog(Debug) << "Fetching lyrics from" << url; // Fetch the URL, follow redirects metadata_ = metadata; redirect_count_ = 0; QNetworkReply* reply = network_->get(QNetworkRequest(url)); requests_[reply] = id; connect(reply, SIGNAL(finished()), SLOT(LyricsFetched())); }
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); }