Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fallback solution: Parse "artist-title" with a single dash from file name #3082

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
48 changes: 39 additions & 9 deletions src/test/trackmetadata_test.cpp
Expand Up @@ -14,19 +14,19 @@ TEST_F(TrackMetadataTest, parseArtistTitleFromFileName) {
}
{
mixxx::TrackInfo trackInfo;
trackInfo.parseArtistTitleFromFileName(" only-title ", true);
EXPECT_EQ(QString(), trackInfo.getArtist());
EXPECT_EQ("only-title", trackInfo.getTitle());
trackInfo.parseArtistTitleFromFileName(" artist-title ", true);
EXPECT_EQ("artist", trackInfo.getArtist());
EXPECT_EQ("title", trackInfo.getTitle());
}
{
mixxx::TrackInfo trackInfo;
trackInfo.parseArtistTitleFromFileName(" only -_title ", true);
EXPECT_EQ(QString(), trackInfo.getArtist());
EXPECT_EQ("only -_title", trackInfo.getTitle());
trackInfo.parseArtistTitleFromFileName(" artist -_title ", true);
EXPECT_EQ("artist", trackInfo.getArtist());
EXPECT_EQ("_title", trackInfo.getTitle());
}
{
mixxx::TrackInfo trackInfo;
trackInfo.parseArtistTitleFromFileName(" only - title ", false);
trackInfo.parseArtistTitleFromFileName(" only - title.mp3", false);
EXPECT_EQ(QString(), trackInfo.getArtist());
EXPECT_EQ("only - title", trackInfo.getTitle());
}
Expand All @@ -38,9 +38,39 @@ TEST_F(TrackMetadataTest, parseArtistTitleFromFileName) {
}
{
mixxx::TrackInfo trackInfo;
trackInfo.parseArtistTitleFromFileName(" only -\ttitle\t", true);
trackInfo.parseArtistTitleFromFileName(" ar.tist -\tti.tle\t.mp3", true);
EXPECT_EQ("ar.tist", trackInfo.getArtist());
EXPECT_EQ("ti.tle", trackInfo.getTitle());
}
{
mixxx::TrackInfo trackInfo;
trackInfo.parseArtistTitleFromFileName(" -artist - -title-.mp3", true);
EXPECT_EQ("-artist", trackInfo.getArtist());
EXPECT_EQ("-title-", trackInfo.getTitle());
}
{
mixxx::TrackInfo trackInfo;
trackInfo.parseArtistTitleFromFileName(" -artist ti-tle- ", true);
EXPECT_EQ(QString(), trackInfo.getArtist());
EXPECT_EQ("only -\ttitle", trackInfo.getTitle());
EXPECT_EQ("-artist ti-tle-", trackInfo.getTitle());
}
{
mixxx::TrackInfo trackInfo;
trackInfo.parseArtistTitleFromFileName(" artist- title ", true);
EXPECT_EQ("artist", trackInfo.getArtist());
EXPECT_EQ("title", trackInfo.getTitle());
}
{
mixxx::TrackInfo trackInfo;
trackInfo.parseArtistTitleFromFileName(" artist- ", true);
EXPECT_EQ("artist", trackInfo.getArtist());
EXPECT_EQ(QString(), trackInfo.getTitle());
}
{
mixxx::TrackInfo trackInfo;
trackInfo.parseArtistTitleFromFileName(" -title ", true);
EXPECT_EQ(QString(), trackInfo.getArtist());
EXPECT_EQ("title", trackInfo.getTitle());
}
{
mixxx::TrackInfo trackInfo;
Expand Down
53 changes: 30 additions & 23 deletions src/track/trackinfo.cpp
@@ -1,41 +1,48 @@
#include "track/trackinfo.h"


namespace mixxx {
#include <QFileInfo>

namespace {

const QString kDefaultArtistTitleSeparator = QStringLiteral("_-_");
const QString kArtistTitleSeparatorWithSpaces = QStringLiteral(" - ");
const QString kArtistTitleSeparator = QStringLiteral("_-_");

const QChar kFileExtensionSeparator = '.';
const QChar kFallbackArtistTitleSeparator = QChar('-');

} // anonymous namespace

namespace mixxx {

bool TrackInfo::parseArtistTitleFromFileName(
QString fileName,
const QString& fileName,
bool splitArtistTitle) {
bool modified = false;
fileName = fileName.trimmed();
auto titleWithFileType = fileName;
auto title = QFileInfo(fileName).completeBaseName().trimmed();
if (splitArtistTitle) {
fileName.replace(kArtistTitleSeparatorWithSpaces, kArtistTitleSeparator);
if (fileName.count(kArtistTitleSeparator) == 1) {
auto artist = fileName.section(kArtistTitleSeparator, 0, 0).trimmed();
if (!artist.isEmpty()) {
setArtist(artist);
modified = true;
}
titleWithFileType = fileName.section(kArtistTitleSeparator, 1).trimmed();
QString artist;
// Preprocessing for disambiguation
auto splitArtist = title;
splitArtist.replace(kArtistTitleSeparatorWithSpaces, kDefaultArtistTitleSeparator);
// Splitting
QString artistTitleSeparator;
if (splitArtist.count(kDefaultArtistTitleSeparator) == 1) {
artistTitleSeparator = kDefaultArtistTitleSeparator;
} else if (splitArtist.count(kFallbackArtistTitleSeparator) == 1) {
artistTitleSeparator = kFallbackArtistTitleSeparator;
}
if (!artistTitleSeparator.isEmpty()) {
const int splitPos = splitArtist.indexOf(artistTitleSeparator);
DEBUG_ASSERT(splitPos >= 0);
DEBUG_ASSERT(splitPos == splitArtist.lastIndexOf(artistTitleSeparator));
artist = splitArtist.left(splitPos).trimmed();
const auto rightLen = splitArtist.size() - (splitPos + artistTitleSeparator.size());
title = splitArtist.right(rightLen).trimmed();
}
if (!artist.isEmpty() && artist != getArtist()) {
setArtist(artist);
modified = true;
}
}
auto title = titleWithFileType;
if (titleWithFileType.contains(kFileExtensionSeparator)) {
// Strip file extension starting at the right-most '.'
title = titleWithFileType.section(kFileExtensionSeparator, 0, -2);
}
title = title.trimmed();
if (!title.isEmpty()) {
if (!title.isEmpty() && title != getTitle()) {
setTitle(title);
modified = true;
}
Expand Down
2 changes: 1 addition & 1 deletion src/track/trackinfo.h
Expand Up @@ -66,7 +66,7 @@ class TrackInfo final {

// Returns true if modified
bool parseArtistTitleFromFileName(
QString fileName,
const QString& fileName,
bool splitArtistTitle);

// Adjusts floating-point properties to match their string representation
Expand Down