Save actual artist name, if using composer

This commit is contained in:
craig.p.drummond
2013-08-22 18:20:31 +00:00
committed by craig.p.drummond
parent c48b20a940
commit eedcbc3cf3
3 changed files with 35 additions and 16 deletions

View File

@@ -74,11 +74,12 @@ void MusicLibraryItemArtist::clearDefaultCover()
}
}
MusicLibraryItemArtist::MusicLibraryItemArtist(const QString &data, MusicLibraryItemContainer *parent)
MusicLibraryItemArtist::MusicLibraryItemArtist(const QString &data, const QString &artistName, MusicLibraryItemContainer *parent)
: MusicLibraryItemContainer(data, parent)
, m_coverIsDefault(false)
, m_cover(0)
, m_various(false)
, m_actualArtist(artistName==data ? QString() : artistName)
{
if (m_itemData.startsWith(QLatin1String("The "))) {
m_nonTheArtist=m_itemData.mid(4);

View File

@@ -41,7 +41,7 @@ class MusicLibraryItemArtist : public MusicLibraryItemContainer
public:
static bool lessThan(const MusicLibraryItem *a, const MusicLibraryItem *b);
MusicLibraryItemArtist(const QString &data, MusicLibraryItemContainer *parent = 0);
MusicLibraryItemArtist(const QString &data, const QString &artistName, MusicLibraryItemContainer *parent = 0);
virtual ~MusicLibraryItemArtist() { }
MusicLibraryItemAlbum * album(const Song &s, bool create=true);
@@ -62,6 +62,8 @@ public:
const QString & imageUrl() const { return m_imageUrl; }
void setImageUrl(const QString &u) { m_imageUrl=u; }
void clearImages();
// 'data' could be 'Composer' if we are set to use that, but need to save real artist...
const QString & actualArtist() const { return m_actualArtist; }
private:
bool largeImages() const;
@@ -71,6 +73,7 @@ private:
mutable QPixmap *m_cover;
bool m_various;
QString m_nonTheArtist;
QString m_actualArtist;
QHash<QString, int> m_indexes;
QString m_imageUrl;
};

View File

@@ -56,7 +56,7 @@ MusicLibraryItemArtist * MusicLibraryItemRoot::artist(const Song &s, bool create
MusicLibraryItemArtist * MusicLibraryItemRoot::createArtist(const Song &s)
{
QString aa=songArtist(s);
MusicLibraryItemArtist *item=new MusicLibraryItemArtist(aa, this);
MusicLibraryItemArtist *item=new MusicLibraryItemArtist(aa, Song::Standard==s.type ? s.albumArtist() : QString(), this);
m_indexes.insert(aa, m_childItems.count());
m_childItems.append(item);
return item;
@@ -78,7 +78,7 @@ void MusicLibraryItemRoot::groupSingleTracks()
QString artist=i18n("Various Artists");
QHash<QString, int>::ConstIterator it=m_indexes.find(artist);
if (m_indexes.end()==it) {
various=new MusicLibraryItemArtist(artist, this);
various=new MusicLibraryItemArtist(artist, QString(), this);
created=true;
} else {
various=static_cast<MusicLibraryItemArtist *>(m_childItems.at(*it));
@@ -127,7 +127,7 @@ void MusicLibraryItemRoot::groupMultipleArtists()
if (!various) {
QHash<QString, int>::ConstIterator it=m_indexes.find(va);
if (m_indexes.end()==it) {
various=new MusicLibraryItemArtist(va, this);
various=new MusicLibraryItemArtist(va, QString(), this);
created=true;
} else {
various=static_cast<MusicLibraryItemArtist *>(m_childItems.at(*it));
@@ -330,7 +330,7 @@ static const QString constArtistAttribute=QLatin1String("artist");
static const QString constAlbumArtistAttribute=QLatin1String("albumartist");
static const QString constComposerAttribute=QLatin1String("composer");
static const QString constAlbumAttribute=QLatin1String("album");
static const QString constOriginalAttribute=QLatin1String("original");
static const QString constActualAttribute=QLatin1String("actual");
static const QString constTrackAttribute=QLatin1String("track");
static const QString constGenreAttribute=QLatin1String("genre");
static const QString constYearAttribute=QLatin1String("year");
@@ -395,6 +395,9 @@ void MusicLibraryItemRoot::toXML(QXmlStreamWriter &writer, const QDateTime &date
if (!artist->imageUrl().isEmpty()) {
writer.writeAttribute(constImageAttribute, artist->imageUrl());
}
if (!artist->actualArtist().isEmpty()) {
writer.writeAttribute(constActualAttribute, artist->actualArtist());
}
foreach (const MusicLibraryItem *al, artist->childItems()) {
if (prog && prog->wasStopped()) {
return;
@@ -413,11 +416,13 @@ void MusicLibraryItemRoot::toXML(QXmlStreamWriter &writer, const QDateTime &date
writer.writeAttribute(constMultipleArtistsAttribute, constTrueValue);
}
if (!album->originalName().isEmpty()) {
writer.writeAttribute(constOriginalAttribute, album->originalName());
writer.writeAttribute(constActualAttribute, album->originalName());
}
if (!album->imageUrl().isEmpty()) {
writer.writeAttribute(constImageAttribute, album->imageUrl());
}
QString artistName=artist->actualArtist().isEmpty() ? artist->data() : artist->actualArtist();
foreach (const MusicLibraryItem *t, album->childItems()) {
const MusicLibraryItemSong *track = static_cast<const MusicLibraryItemSong *>(t);
bool wroteArtist=false;
@@ -436,11 +441,11 @@ void MusicLibraryItemRoot::toXML(QXmlStreamWriter &writer, const QDateTime &date
if (track->disc() != 0) {
writer.writeAttribute(constDiscAttribute, QString::number(track->disc()));
}
if (!track->song().artist.isEmpty() && track->song().artist!=artist->data()) {
if (!track->song().artist.isEmpty() && track->song().artist!=artistName) {
writer.writeAttribute(constArtistAttribute, track->song().artist);
wroteArtist=true;
}
if (track->song().albumartist!=artist->data()) {
if (track->song().albumartist!=artistName) {
writer.writeAttribute(constAlbumArtistAttribute, track->song().albumartist);
}
if (!track->song().composer.isEmpty() && track->song().composer!=track->song().albumartist) {
@@ -452,7 +457,7 @@ void MusicLibraryItemRoot::toXML(QXmlStreamWriter &writer, const QDateTime &date
}
if (album->isSingleTracks()) {
writer.writeAttribute(constAlbumAttribute, track->song().album);
} else if (!wroteArtist && album->isMultipleArtists() && !track->song().artist.isEmpty() && track->song().artist!=artist->data()) {
} else if (!wroteArtist && album->isMultipleArtists() && !track->song().artist.isEmpty() && track->song().artist!=artistName) {
writer.writeAttribute(constArtistAttribute, track->song().artist);
}
if (Song::Playlist==track->song().type) {
@@ -548,8 +553,14 @@ quint32 MusicLibraryItemRoot::fromXML(QXmlStreamReader &reader, const QDateTime
total=attributes.value(constnumTracksAttribute).toString().toUInt();
}
} else if (constArtistElement==element) {
QString actual=attributes.value(constActualAttribute).toString();
song.type=Song::Standard;
song.artist=song.albumartist=attributes.value(constNameAttribute).toString();
if (actual.isEmpty()) {
song.artist=song.albumartist=attributes.value(constNameAttribute).toString();
} else {
song.artist=song.albumartist=actual;
song.composer=attributes.value(constNameAttribute).toString();
}
artistItem = createArtist(song);
QString img = attributes.value(constImageAttribute).toString();
if (!img.isEmpty()) {
@@ -576,9 +587,9 @@ quint32 MusicLibraryItemRoot::fromXML(QXmlStreamReader &reader, const QDateTime
} else {
song.type=Song::Standard;
}
QString orig=attributes.value(constOriginalAttribute).toString();
if (!orig.isEmpty()) {
song.album=orig;
QString actual=attributes.value(constActualAttribute).toString();
if (!actual.isEmpty()) {
song.album=actual;
}
} else if (constTrackElement==element) {
song.title=attributes.value(constNameAttribute).toString();
@@ -604,13 +615,17 @@ quint32 MusicLibraryItemRoot::fromXML(QXmlStreamReader &reader, const QDateTime
}
if (attributes.hasAttribute(constArtistAttribute)) {
song.artist=attributes.value(constArtistAttribute).toString();
} else {
} else if (artistItem->actualArtist().isEmpty()) {
song.artist=artistItem->data();
} else {
song.artist=artistItem->actualArtist();
}
if (attributes.hasAttribute(constAlbumArtistAttribute)) {
song.albumartist=attributes.value(constAlbumArtistAttribute).toString();
} else {
} else if (artistItem->actualArtist().isEmpty()) {
song.albumartist=artistItem->data();
} else {
song.albumartist=artistItem->actualArtist();
}
song.composer=attributes.value(constComposerAttribute).toString();