Guess artist and title from filename (third attempt)
This commit is contained in:
parent
ddbde91889
commit
9b580e4a5c
|
@ -18,6 +18,7 @@
|
||||||
#include "tagreader.h"
|
#include "tagreader.h"
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
#include <QCoreApplication>
|
#include <QCoreApplication>
|
||||||
#include <QDateTime>
|
#include <QDateTime>
|
||||||
|
@ -130,49 +131,50 @@ const char* kASF_OriginalDate_ID = "WM/OriginalReleaseTime";
|
||||||
const char* kASF_OriginalYear_ID = "WM/OriginalReleaseYear";
|
const char* kASF_OriginalYear_ID = "WM/OriginalReleaseYear";
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
void TagReader::RemoveExtension(std::string* s) const {
|
// Helper for GuessArtistAndTitle()
|
||||||
if (s->empty()) return;
|
static void removeExtension(std::string& s) {
|
||||||
const int i = s->find_last_of('.');
|
if (s.empty()) return;
|
||||||
|
const int i = s.find_last_of('.');
|
||||||
if (i == std::string::npos) return;
|
if (i == std::string::npos) return;
|
||||||
s->assign(s->substr(0, i));
|
s.assign(s.substr(0, i));
|
||||||
}
|
}
|
||||||
|
|
||||||
void TagReader::ChangeUnderscores(std::string* s) const {
|
static void changeUnderscores(std::string& s) {
|
||||||
for (int i = 0; i < s->size(); i++) {
|
std::replace(s.begin(), s.end(), '_', ' ');
|
||||||
if (s->at(i) == '_') s->at(i) = ' ';
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string& TagReader::ltrim(std::string& str, const std::string& chars) const {
|
static std::string& ltrim(std::string& str, const std::string& chars = "\t\n\v\f\r ") {
|
||||||
str.erase(0, str.find_first_not_of(chars));
|
str.erase(0, str.find_first_not_of(chars));
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string& TagReader::rtrim(std::string& str, const std::string& chars) const {
|
static std::string& rtrim(std::string& str, const std::string& chars = "\t\n\v\f\r ") {
|
||||||
str.erase(str.find_last_not_of(chars) + 1);
|
str.erase(str.find_last_not_of(chars) + 1);
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string& TagReader::trim(std::string& str, const std::string& chars) const {
|
static std::string& trim(std::string& str, const std::string& chars = "\t\n\v\f\r ") {
|
||||||
return ltrim(rtrim(str, chars), chars);
|
return ltrim(rtrim(str, chars), chars);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TagReader::GuessArtistAndTitle(pb::tagreader::SongMetadata *song) const {
|
void TagReader::GuessArtistAndTitle(pb::tagreader::SongMetadata *song) const {
|
||||||
|
std::string artist = song->artist();
|
||||||
|
std::string title = song->title();
|
||||||
const std::string bn = song->basefilename();
|
const std::string bn = song->basefilename();
|
||||||
std::string *artist = song->mutable_artist();
|
if (!artist.empty() || !title.empty()) return;
|
||||||
std::string *title = song->mutable_title();
|
|
||||||
if (!artist->empty() || !title->empty()) return;
|
|
||||||
if (bn.empty()) return;
|
if (bn.empty()) return;
|
||||||
int i = bn.find(" - ");
|
int i = bn.find(" - ");
|
||||||
if (i == std::string::npos) i = bn.find("_-_");
|
if (i == std::string::npos) i = bn.find("_-_");
|
||||||
if (i == std::string::npos) return;
|
if (i == std::string::npos) return;
|
||||||
artist->assign(bn.substr(0, i));
|
artist.assign(bn.substr(0, i));
|
||||||
title->assign(bn.substr(i + 3));
|
title.assign(bn.substr(i + 3));
|
||||||
RemoveExtension(title);
|
removeExtension(title);
|
||||||
ChangeUnderscores(artist);
|
changeUnderscores(artist);
|
||||||
ChangeUnderscores(title);
|
changeUnderscores(title);
|
||||||
trim(*artist);
|
trim(artist);
|
||||||
trim(*title);
|
trim(title);
|
||||||
|
if (!artist.empty()) { song->mutable_artist()->assign(artist); }
|
||||||
|
if (!title.empty()) { song->mutable_title()->assign(title); }
|
||||||
}
|
}
|
||||||
|
|
||||||
TagReader::TagReader()
|
TagReader::TagReader()
|
||||||
|
|
|
@ -95,12 +95,6 @@ class TagReader {
|
||||||
TagLib::Ogg::XiphComment* vorbis_comments,
|
TagLib::Ogg::XiphComment* vorbis_comments,
|
||||||
const pb::tagreader::SongMetadata& song) const;
|
const pb::tagreader::SongMetadata& song) const;
|
||||||
|
|
||||||
// Helpers for GuessArtistAndTitle()
|
|
||||||
void RemoveExtension(std::string*) const;
|
|
||||||
void ChangeUnderscores(std::string*) const;
|
|
||||||
std::string& ltrim(std::string&, const std::string &chars = "\t\n\v\f\r ") const;
|
|
||||||
std::string& rtrim(std::string&, const std::string &chars = "\t\n\v\f\r ") const;
|
|
||||||
std::string& trim(std::string&, const std::string &chars = "\t\n\v\f\r ") const;
|
|
||||||
void GuessArtistAndTitle(pb::tagreader::SongMetadata* song) const;
|
void GuessArtistAndTitle(pb::tagreader::SongMetadata* song) const;
|
||||||
|
|
||||||
pb::tagreader::SongMetadata_Type GuessFileType(
|
pb::tagreader::SongMetadata_Type GuessFileType(
|
||||||
|
|
Loading…
Reference in New Issue