void TagGuesser::guessTags(MPDSong &song) { QString pattern = Config::instance()->guessPattern(); // Check that we have a pattern at all if (pattern.isEmpty()) return; // Cant guess from URL's if (song.url().contains("://")) return; // Return if we already have everything we can guess if (!(song.title().isEmpty() || song.album().isEmpty() || song.artist().isEmpty() || song.track().isEmpty())) return; DEBUG4("Guessing.."); // Tokens to expand. %a=album, %b=band, %n=tracknr, %t=title, %i=ignore QStringList matchers = pattern.split(QRegExp("%[abnti]"), QString::SkipEmptyParts); QStringList markers = pattern.split('%', QString::SkipEmptyParts); // Check that we actually have any matchers, if not, return filename as title, the rest empty. DEBUG4("Matchers size: %d %d", matchers.size(), markers.size()); if (matchers.isEmpty() || markers.isEmpty()) { DEBUG4("No matchers or no markers"); if (song.title().isEmpty()) song.setTitle(song.url()); return; } // Remove bogus markers DEBUG4("Removing bogus markers"); markers = markers.filter(QRegExp("^[abnti]")); // Remove trailing garbage on markers DEBUG4("Removing trailing garbage on markers"); markers = markers.replaceInStrings(QRegExp("^([abnti]).*"), "%\\1"); DEBUG4("Adding greedy front matcher"); // If pattern does not have leading characters, add a greedy matcher at front so we get the whole start if (pattern.contains(QRegExp("^%[abnti]"))) matchers.push_front("^"); // If pattern contains trailing characters, add a dummy marker at the end. DEBUG4("Finding last matcher"); QString lastMarker = markers.last(); DEBUG4("Finding end of last marker"); int endOfLastMatcher = pattern.lastIndexOf(lastMarker) + lastMarker.size(); DEBUG4("Adding dummy end marker"); if (endOfLastMatcher < pattern.size()) markers += "trailingcharacters"; foreach (QString p, markers) { DEBUG4("marker : %s", qPrintable(p)); }