bool MetadataDownload::findBestMatch(MetadataLookupList list, QString originaltitle) { QStringList titles; // Build a list of all the titles for (MetadataLookupList::const_iterator i = list.begin(); i != list.end(); ++i) { titles.append((*i)->GetTitle()); } // Apply Levenshtein distance algorithm to determine closest match QString bestTitle = nearestName(originaltitle, titles); // If no "best" was chosen, give up. if (bestTitle.isEmpty()) { LOG(VB_GENERAL, LOG_ERR, QString("No adequate match or multiple " "matches found for %1. Update manually.") .arg(originaltitle)); return false; } LOG(VB_GENERAL, LOG_INFO, QString("Best Title Match For %1: %2") .arg(originaltitle).arg(bestTitle)); // Grab the one item that matches the besttitle (IMPERFECT) for (MetadataLookupList::const_iterator i = list.begin(); i != list.end(); ++i) { if ((*i)->GetTitle() == bestTitle) { MetadataLookup *newlookup = (*i); newlookup->SetStep(kLookupData); prependLookup(newlookup); return true; } } return false; }
MetadataLookup* MetadataDownload::findBestMatch(MetadataLookupList list, const QString &originaltitle) const { QStringList titles; MetadataLookup *ret = NULL; // Build a list of all the titles int exactMatches = 0; for (MetadataLookupList::const_iterator i = list.begin(); i != list.end(); ++i) { QString title = (*i)->GetTitle(); if (title == originaltitle) { ret = (*i); exactMatches++; } titles.append(title); } // If there was one or more exact matches then we can skip a more intensive // and time consuming search if (exactMatches > 0) { if (exactMatches == 1) { LOG(VB_GENERAL, LOG_INFO, QString("Single Exact Title Match For %1") .arg(originaltitle)); return ret; } else { LOG(VB_GENERAL, LOG_ERR, QString("Multiple exact title matches found for %1. " "Need to match on other criteria.") .arg(originaltitle)); return NULL; } } // Apply Levenshtein distance algorithm to determine closest match QString bestTitle = nearestName(originaltitle, titles); // If no "best" was chosen, give up. if (bestTitle.isEmpty()) { LOG(VB_GENERAL, LOG_ERR, QString("No adequate match or multiple " "matches found for %1. Update manually.") .arg(originaltitle)); return NULL; } LOG(VB_GENERAL, LOG_INFO, QString("Best Title Match For %1: %2") .arg(originaltitle).arg(bestTitle)); // Grab the one item that matches the besttitle (IMPERFECT) for (MetadataLookupList::const_iterator i = list.begin(); i != list.end(); ++i) { if ((*i)->GetTitle() == bestTitle) { ret = (*i); break; } } return ret; }