From eac245fd65e9ecf316a2f341919539191b0a28d7 Mon Sep 17 00:00:00 2001 From: "craig.p.drummond" Date: Wed, 11 Jun 2014 18:25:29 +0000 Subject: [PATCH] Also read performer for display in context view --- context/songview.cpp | 7 +++-- devices/albumdetailsdialog.cpp | 4 ++- devices/deviceoptions.cpp | 2 +- devices/filenameschemedialog.cpp | 2 +- devices/mtpdevice.cpp | 7 +++-- http/httpserver.cpp | 6 ++-- models/albumsmodel.cpp | 4 +-- models/musiclibraryitemalbum.cpp | 4 +-- models/musiclibraryitemartist.cpp | 2 +- models/musiclibraryitempodcast.h | 2 +- models/musiclibraryitemroot.cpp | 17 +++++++----- models/proxymodel.cpp | 4 +-- mpd/cuefile.cpp | 12 ++++++-- mpd/mpdparseutils.cpp | 22 ++++++++++----- mpd/song.cpp | 26 +++++------------ mpd/song.h | 46 +++++++++++++++++++++---------- tags/tageditor.cpp | 26 ++++++++++------- tags/tags.cpp | 20 +++++++------- 18 files changed, 125 insertions(+), 88 deletions(-) diff --git a/context/songview.cpp b/context/songview.cpp index 12f05501b..a6b903eae 100644 --- a/context/songview.cpp +++ b/context/songview.cpp @@ -484,15 +484,16 @@ void SongView::loadTags() if (tagInfo.isEmpty()) { tagInfo=QLatin1String(""); - tagInfo+=addEntry(i18n("Artist"), currentSong.artist); tagInfo+=addEntry(i18n("Album artist"), currentSong.albumartist); - tagInfo+=addEntry(i18n("Composer"), currentSong.composer); - //tagInfo+=addEntry(i18n("Performer"), currentSong.performer); + tagInfo+=addEntry(i18n("Artist"), currentSong.artist); + tagInfo+=addEntry(i18n("Composer"), currentSong.composer()); + tagInfo+=addEntry(i18n("Performer"), currentSong.performer()); tagInfo+=addEntry(i18n("Album"), currentSong.album); tagInfo+=addEntry(i18n("Disc number"), 0==currentSong.disc ? QString() : QString::number(currentSong.disc)); tagInfo+=addEntry(i18n("Track number"), 0==currentSong.track ? QString() : QString::number(currentSong.track)); tagInfo+=addEntry(i18n("Genre"), currentSong.genres().join(", ")); tagInfo+=addEntry(i18n("Year"), 0==currentSong.track ? QString() : QString::number(currentSong.year)); + tagInfo+=addEntry(i18n("Comment"), currentSong.comment()); } tagInfo+=QLatin1String("
"); setHtml(tagInfo, Page_Tags); diff --git a/devices/albumdetailsdialog.cpp b/devices/albumdetailsdialog.cpp index fd244d410..d7c88ead8 100644 --- a/devices/albumdetailsdialog.cpp +++ b/devices/albumdetailsdialog.cpp @@ -322,7 +322,9 @@ Song AlbumDetailsDialog::toSong(QTreeWidgetItem *i, const CdAlbum &album) s.year=album.year; s.disc=album.disc; s.artist=singleArtist->isChecked() ? s.albumartist : i->text(COL_ARTIST); - s.composer=album.composer; + if (!album.composer.isEmpty()) { + s.setComposer(album.composer); + } s.title=i->text(COL_TITLE); s.track=i->text(COL_TRACK).toInt(); s.id=i->data(0, Role_Id).toInt(); diff --git a/devices/deviceoptions.cpp b/devices/deviceoptions.cpp index 8535d4bf3..7ea3d72b0 100644 --- a/devices/deviceoptions.cpp +++ b/devices/deviceoptions.cpp @@ -363,7 +363,7 @@ QString DeviceOptions::createFilename(const Song &s) const Song copy=clean(s); path.replace(constAlbumArtist, copy.albumArtist()); - path.replace(constComposer, copy.composer); + path.replace(constComposer, copy.composer()); path.replace(constAlbumTitle, copy.album); path.replace(constTrackArtist, copy.artist); path.replace(constTrackTitle, copy.title); diff --git a/devices/filenameschemedialog.cpp b/devices/filenameschemedialog.cpp index 46c9e5528..eb223ce6b 100644 --- a/devices/filenameschemedialog.cpp +++ b/devices/filenameschemedialog.cpp @@ -61,7 +61,7 @@ FilenameSchemeDialog::FilenameSchemeDialog(QWidget *parent) genre->setProperty(constVariableProperty, DeviceOptions::constGenre); exampleSong.albumartist=i18nc("Example album artist", "Various Artists"); exampleSong.artist=i18nc("Example artist", "Wibble"); - exampleSong.composer=i18nc("Example composer", "Vivaldi"); + exampleSong.setComposer(i18nc("Example composer", "Vivaldi")); exampleSong.album=i18nc("Example album", "Now 5001"); exampleSong.title=i18nc("Example song name", "Wobble"); exampleSong.genre=i18nc("Example genre", "Dance"); diff --git a/devices/mtpdevice.cpp b/devices/mtpdevice.cpp index d4d380459..2c18d2f88 100644 --- a/devices/mtpdevice.cpp +++ b/devices/mtpdevice.cpp @@ -382,7 +382,10 @@ void MtpConnection::updateLibrary(const DeviceOptions &opts) s.album=QString::fromUtf8(track->album); s.artist=QString::fromUtf8(track->artist); s.albumartist=s.artist; // TODO: ALBUMARTIST: Read from 'track' when libMTP supports album artist! - s.composer=QString::fromUtf8(track->composer); + QString composer=QString::fromUtf8(track->composer); + if (!composer.isEmpty()) { + s.setComposer(composer); + } s.year=QString::fromUtf8(track->date).mid(0, 4).toUInt(); s.title=QString::fromUtf8(track->title); s.genre=QString::fromUtf8(track->genre); @@ -962,7 +965,7 @@ void MtpConnection::putSong(const Song &s, bool fixVa, const DeviceOptions &opts if (status!=Device::SongExists) { meta->title=createString(song.title); meta->artist=createString(song.artist); - meta->composer=createString(song.composer); + meta->composer=createString(song.composer()); meta->genre=createString(song.genre); meta->album=createString(song.album); meta->date=createString(QString().sprintf("%4d0101T0000.0", song.year)); diff --git a/http/httpserver.cpp b/http/httpserver.cpp index 750f70cb2..4a58b5efd 100644 --- a/http/httpserver.cpp +++ b/http/httpserver.cpp @@ -166,8 +166,8 @@ QByteArray HttpServer::encodeUrl(const Song &s) if (!s.albumartist.isEmpty()) { query.addQueryItem("albumartist", s.albumartist); } - if (!s.composer.isEmpty()) { - query.addQueryItem("composer", s.composer); + if (!s.composer().isEmpty()) { + query.addQueryItem("composer", s.composer()); } if (!s.title.isEmpty()) { query.addQueryItem("title", s.title); @@ -255,7 +255,7 @@ Song HttpServer::decodeUrl(const QUrl &url) const s.albumartist=q.queryItemValue("albumartist"); } if (q.hasQueryItem("composer")) { - s.composer=q.queryItemValue("composer"); + s.setComposer(q.queryItemValue("composer")); } if (q.hasQueryItem("title")) { s.title=q.queryItemValue("title"); diff --git a/models/albumsmodel.cpp b/models/albumsmodel.cpp index aa24634dd..264878cf6 100644 --- a/models/albumsmodel.cpp +++ b/models/albumsmodel.cpp @@ -766,13 +766,13 @@ const Song & AlbumsModel::AlbumItem::coverSong() if (cSong.isEmpty() && songs.count()) { SongItem *firstSong=songs.first(); cSong.artist=firstSong->artist; - cSong.albumartist=Song::useComposer() && !firstSong->composer.isEmpty() + cSong.albumartist=Song::useComposer() && !firstSong->composer().isEmpty() ? firstSong->albumArtist() : artist; cSong.album=album; cSong.year=year; cSong.file=firstSong->file; cSong.type=type; - cSong.composer=firstSong->composer; + cSong.setComposer(firstSong->composer()); cSong.mbAlbumId=firstSong->mbAlbumId; } return cSong; diff --git a/models/musiclibraryitemalbum.cpp b/models/musiclibraryitemalbum.cpp index 59ea92a8f..c1b5dc2e8 100644 --- a/models/musiclibraryitemalbum.cpp +++ b/models/musiclibraryitemalbum.cpp @@ -222,7 +222,7 @@ const QPixmap & MusicLibraryItemAlbum::cover() const song.year=m_year; song.file=firstSong->file(); song.type=m_type; - song.composer=firstSong->song().composer; + song.setComposer(firstSong->song().composer()); song.mbAlbumId=firstSong->song().mbAlbumId; Covers::Image img; MusicLibraryItemRoot *root=parentItem() && parentItem()->parentItem() && MusicLibraryItem::Type_Root==parentItem()->parentItem()->itemType() @@ -432,7 +432,7 @@ Song MusicLibraryItemAlbum::coverSong() const MusicLibraryItemSong *firstSong=static_cast(childItem(0)); Song song; song.artist=firstSong->song().artist; - song.albumartist=Song::useComposer() && !firstSong->song().composer.isEmpty() ? firstSong->song().albumArtist() : parentItem()->data(); + song.albumartist=Song::useComposer() && !firstSong->song().composer().isEmpty() ? firstSong->song().albumArtist() : parentItem()->data(); song.album=Song::useComposer() ? firstSong->song().album : m_itemData; song.mbAlbumId=firstSong->song().mbAlbumId; return song; diff --git a/models/musiclibraryitemartist.cpp b/models/musiclibraryitemartist.cpp index a0fdc8f0d..c182efe7f 100644 --- a/models/musiclibraryitemartist.cpp +++ b/models/musiclibraryitemartist.cpp @@ -147,7 +147,7 @@ const QPixmap & MusicLibraryItemArtist::cover() const if (firstSong) { m_coverSong.file=firstSong->file(); - if (Song::useComposer() && !firstSong->song().composer.isEmpty()) { + if (Song::useComposer() && !firstSong->song().composer().isEmpty()) { m_coverSong.albumartist=firstSong->song().albumArtist(); } } diff --git a/models/musiclibraryitempodcast.h b/models/musiclibraryitempodcast.h index 946f2e501..2877e208e 100644 --- a/models/musiclibraryitempodcast.h +++ b/models/musiclibraryitempodcast.h @@ -97,7 +97,7 @@ public: virtual ~MusicLibraryItemPodcastEpisode() { } const QString & published(); - const QString & localPath() { return m_song.podcastLocalPath(); } + QString localPath() { return m_song.podcastLocalPath(); } void setLocalPath(const QString &l) { m_song.setPodcastLocalPath(l); } void setDownloadProgress(int prog) { downloadProg=prog; } int downloadProgress() const { return downloadProg; } diff --git a/models/musiclibraryitemroot.cpp b/models/musiclibraryitemroot.cpp index 7021961d2..f926aa278 100644 --- a/models/musiclibraryitemroot.cpp +++ b/models/musiclibraryitemroot.cpp @@ -189,7 +189,7 @@ void MusicLibraryItemRoot::getDetails(QSet &artists, QSet &alb const Song &s=static_cast(child)->song(); artists.insert(s.artist); albumArtists.insert(s.albumArtist()); - composers.insert(s.composer); + composers.insert(s.composer()); albums.insert(s.album); if (!s.genre.isEmpty()) { genres.insert(s.genre); @@ -200,7 +200,7 @@ void MusicLibraryItemRoot::getDetails(QSet &artists, QSet &alb const Song &s=static_cast(song)->song(); artists.insert(s.artist); albumArtists.insert(s.albumArtist()); - composers.insert(s.composer); + composers.insert(s.composer()); albums.insert(s.album); if (!s.genre.isEmpty()) { genres.insert(s.genre); @@ -379,8 +379,8 @@ void MusicLibraryItemRoot::toXML(QXmlStreamWriter &writer, const QDateTime &date if (supportsAlbumArtist && track->song().albumartist!=artistName) { writer.writeAttribute(constAlbumArtistAttribute, track->song().albumartist); } - if (!track->song().composer.isEmpty()) { - writer.writeAttribute(constComposerAttribute, track->song().composer); + if (!track->song().composer().isEmpty()) { + writer.writeAttribute(constComposerAttribute, track->song().composer()); } if (!track->song().genre.isEmpty() && track->song().genre!=albumGenre && track->song().genre!=Song::unknown()) { writer.writeAttribute(constGenreAttribute, track->song().genre); @@ -487,7 +487,7 @@ quint32 MusicLibraryItemRoot::fromXML(QXmlStreamReader &reader, const QDateTime song.artist=song.albumartist=attributes.value(constNameAttribute).toString(); } else { song.artist=song.albumartist=actual; - song.composer=attributes.value(constNameAttribute).toString(); + song.setComposer(attributes.value(constNameAttribute).toString()); } artistItem = createArtist(song); } else if (constAlbumElement==element) { @@ -547,7 +547,10 @@ quint32 MusicLibraryItemRoot::fromXML(QXmlStreamReader &reader, const QDateTime song.albumartist=artistItem->actualArtist(); } } - song.composer=attributes.value(constComposerAttribute).toString(); + QString composer=attributes.value(constComposerAttribute).toString(); + if (!composer.isEmpty()) { + song.setComposer(composer); + } // Fix cache error - where MusicLibraryItemSong::data() was saved as name instead of song.name!!!! if (!song.albumartist.isEmpty() && !song.artist.isEmpty() && song.albumartist!=song.artist && @@ -598,7 +601,7 @@ quint32 MusicLibraryItemRoot::fromXML(QXmlStreamReader &reader, const QDateTime } } song.time=song.track=0; - song.composer=QString(); + song.clearExtra(); } } } diff --git a/models/proxymodel.cpp b/models/proxymodel.cpp index 2c2c41a38..602971229 100644 --- a/models/proxymodel.cpp +++ b/models/proxymodel.cpp @@ -39,8 +39,8 @@ bool ProxyModel::matchesFilter(const Song &s) const if (!s.albumartist.isEmpty() && s.albumartist!=s.artist) { strings << s.artist; } - if (!s.composer.isEmpty() && s.composer!=s.artist && s.composer!=s.albumartist) { - strings << s.composer; + if (!s.composer().isEmpty() && s.composer()!=s.artist && s.composer()!=s.albumartist) { + strings << s.composer(); } strings << s.title << s.album; return matchesFilter(strings); diff --git a/mpd/cuefile.cpp b/mpd/cuefile.cpp index 4d8c7f8d5..659aa4252 100644 --- a/mpd/cuefile.cpp +++ b/mpd/cuefile.cpp @@ -155,7 +155,11 @@ static bool updateSong(const CueEntry &entry, const QString &nextIndex, Song &so song.genre=entry.genre; song.year=entry.date.toInt(); song.time=(end-beginning)/constMsecPerSec; - song.composer=entry.composer.isEmpty() ? entry.albumComposer : entry.composer; + if (!entry.composer.isEmpty()) { + song.setComposer(entry.composer); + } else if (!entry.albumComposer.isEmpty()) { + song.setComposer(entry.albumComposer); + } return true; } @@ -176,7 +180,11 @@ static bool updateLastSong(const CueEntry &entry, Song &song) song.albumartist=entry.albumArtist; song.genre=entry.genre; song.year=entry.date.toInt(); - song.composer=entry.composer.isEmpty() ? entry.albumComposer : entry.composer; + if (!entry.composer.isEmpty()) { + song.setComposer(entry.composer); + } else if (!entry.albumComposer.isEmpty()) { + song.setComposer(entry.albumComposer); + } return true; } diff --git a/mpd/mpdparseutils.cpp b/mpd/mpdparseutils.cpp index ccdd7ab68..d7acb8cb8 100644 --- a/mpd/mpdparseutils.cpp +++ b/mpd/mpdparseutils.cpp @@ -66,6 +66,8 @@ static const QByteArray constAlbumKey("Album: "); static const QByteArray constArtistKey("Artist: "); static const QByteArray constAlbumArtistKey("AlbumArtist: "); static const QByteArray constComposerKey("Composer: "); +static const QByteArray constPerformerKey("Performer: "); +static const QByteArray constCommentKey("Comment: "); static const QByteArray constTitleKey("Title: "); static const QByteArray constTrackKey("Track: "); static const QByteArray constIdKey("Id: "); @@ -271,7 +273,7 @@ Song MPDParseUtils::parseSong(const QList &lines, Location location) } else if (line.startsWith(constAlbumArtistKey)) { song.albumartist = QString::fromUtf8(line.mid(constAlbumArtistKey.length())); } else if (line.startsWith(constComposerKey)) { - song.composer = QString::fromUtf8(line.mid(constComposerKey.length())); + song.extra[Song::Composer] = QString::fromUtf8(line.mid(constComposerKey.length())); } else if (line.startsWith(constTitleKey)) { song.title =QString::fromUtf8(line.mid(constTitleKey.length())); } else if (line.startsWith(constTrackKey)) { @@ -295,10 +297,16 @@ Song MPDParseUtils::parseSong(const QList &lines, Location location) song.file = QString::fromUtf8(line.mid(constPlaylistKey.length())); song.title=Utils::getFile(song.file); song.type=Song::Playlist; - } else if (Loc_PlayQueue==location && line.startsWith(constPriorityKey)) { - song.priority = line.mid(constPriorityKey.length()).toUInt(); - } else if (line.startsWith(constAlbumId)) { + } else if (line.startsWith(constAlbumId)) { song.mbAlbumId = line.mid(constAlbumId.length()); + } else if (Loc_PlayQueue==location) { + if (line.startsWith(constPriorityKey)) { + song.priority = line.mid(constPriorityKey.length()).toUInt(); + } else if (line.startsWith(constPerformerKey)) { + song.extra[Song::Performer] = QString::fromUtf8(line.mid(constPerformerKey.length())); + } else if (line.startsWith(constCommentKey)) { + song.extra[Song::Comment] = QString::fromUtf8(line.mid(constCommentKey.length())); + } } } @@ -577,9 +585,9 @@ void MPDParseUtils::parseLibraryItems(const QByteArray &data, const QString &mpd s.artist=albumSong.artist; DBUG << "Get artist from album" << albumSong.artist; } - if (s.composer.isEmpty() && !albumSong.composer.isEmpty()) { - s.composer=albumSong.composer; - DBUG << "Get composer from album" << albumSong.composer; + if (s.composer().isEmpty() && !albumSong.composer().isEmpty()) { + s.setComposer(albumSong.composer()); + DBUG << "Get composer from album" << albumSong.composer(); } if (s.album.isEmpty() && !albumSong.album.isEmpty()) { s.album=albumSong.album; diff --git a/mpd/song.cpp b/mpd/song.cpp index ae7347792..b083cf108 100644 --- a/mpd/song.cpp +++ b/mpd/song.cpp @@ -166,7 +166,6 @@ Song & Song::operator=(const Song &s) album = s.album; artist = s.artist; albumartist = s.albumartist; - composer = s.composer; title = s.title; track = s.track; // pos = s.pos; @@ -180,6 +179,7 @@ Song & Song::operator=(const Song &s) key = s.key; type = s.type; guessed = s.guessed; + extra = s.extra; return *this; } @@ -415,12 +415,12 @@ QString Song::entryName() const QString Song::artistOrComposer() const { - return useComposerIfSet && !composer.isEmpty() ? composer : albumArtist(); + return useComposerIfSet && extra.contains(Composer) ? extra[Composer] : albumArtist(); } QString Song::albumName() const { - return useComposerIfSet && !composer.isEmpty() && composer!=albumArtist() + return useComposerIfSet && extra.contains(Composer) && extra[Composer]!=albumArtist() ? album+QLatin1String(" (")+albumArtist()+QLatin1Char(')') : album; } @@ -569,24 +569,12 @@ QString Song::describe(bool withMarkup) const // : i18nc("track - artist", "%1 - %2", title, artist); //} -bool Song::isFromOnlineService() const -{ - return constOnlineDiscId==disc && (isCantataStream() || file.startsWith("http://")) && albumartist==album; -} - -void Song::setIsFromOnlineService(const QString &service) -{ - disc=constOnlineDiscId; - album=service; - albumartist=service; -} - #ifdef ENABLE_EXTERNAL_TAGS QDataStream & operator<<(QDataStream &stream, const Song &song) { - stream << song.id << song.file << song.album << song.artist << song.albumartist << song.composer << song.title + stream << song.id << song.file << song.album << song.artist << song.albumartist << song.title << song.genre << song.name << song.mbAlbumId << song.disc << song.priority << song.time << song.track << (quint16)song.year - << (quint16)song.type << (bool)song.guessed << song.size; + << (quint16)song.type << (bool)song.guessed << song.size << song.extra; return stream; } @@ -595,9 +583,9 @@ QDataStream & operator>>(QDataStream &stream, Song &song) quint16 type; quint16 year; bool guessed; - stream >> song.id >> song.file >> song.album >> song.artist >> song.albumartist >> song.composer >> song.title + stream >> song.id >> song.file >> song.album >> song.artist >> song.albumartist >> song.title >> song.genre >> song.name >> song.mbAlbumId >> song.disc >> song.priority >> song.time >> song.track >> year - >> type >> guessed >> song.size; + >> type >> guessed >> song.size >> song.extra; song.type=(Song::Type)type; song.year=year; song.guessed=guessed; diff --git a/mpd/song.h b/mpd/song.h index c7160c828..f43f22fc1 100644 --- a/mpd/song.h +++ b/mpd/song.h @@ -30,6 +30,7 @@ #include #include +#include #include #include "config.h" #include "support/utils.h" @@ -41,6 +42,18 @@ struct Song static bool useComposer(); static void setUseComposer(bool u); + enum ExtraTags { + Composer, + Performer, + Comment, + + // These are not real tags - but fields used elsewhere in the code... + PodcastPublishedDate, + PodcastLocalPath, + PodcastImage, + OnlineServiceName + }; + enum Type { Standard = 0, SingleTracks = 1, @@ -56,7 +69,6 @@ struct Song QString album; QString artist; QString albumartist; - QString composer; QString title; QString genre; QString name; @@ -70,6 +82,7 @@ struct Song mutable Type type : 3; mutable bool guessed : 1; qint32 size; + QMap extra; // Only used in PlayQueue/PlayLists... quint16 key; @@ -111,6 +124,15 @@ struct Song const QString & albumArtist() const { return albumartist.isEmpty() ? artist : albumartist; } QString displayTitle() const { return !albumartist.isEmpty() && albumartist!=artist ? artistSong() : title; } QString trackAndTitleStr(bool showArtistIfDifferent=true) const; + + QString extraField(int f) const { return extra.contains(f) ? extra[f] : QString(); } + QString composer() const { return extraField(Composer); } + void setComposer(const QString &v) { extra[Composer]=v; } + QString performer() const { return extraField(Performer); } + QString comment() const { return extraField(Comment); } + void setComment(const QString &v) { extra[Comment]=v; } + void clearExtra() { extra.clear(); } + static bool isVariousArtists(const QString &str); bool isVariousArtists() const { return isVariousArtists(albumArtist()); } bool diffArtist() const; @@ -154,24 +176,20 @@ struct Song } bool isSpecificSizeRequest() const { return size>4 && size<1024 && track==size && id==size && 0xFFFF==time; } - // TagEditor... - const QString comment() const { return name; } - void setComment(const QString &v) { name=v; } - // podcast functions... bool hasBeenPlayed() const { return 0!=id; } void setPlayed(bool p) { id=p ? 1 : 0; } - void setPodcastImage(const QString &i) { genre=i; } - const QString & podcastImage() const { return genre; } - void setPodcastPublishedDate(const QString &pd) { composer=pd; } - const QString & podcastPublishedDate() const { return composer; } - const QString & podcastLocalPath() const { return name; } - void setPodcastLocalPath(const QString &l) { name=l; } + void setPodcastImage(const QString &i) { extra[PodcastLocalPath]=i; } + QString podcastImage() const { return extraField(PodcastLocalPath); } + void setPodcastPublishedDate(const QString &pd) { extra[PodcastPublishedDate]=pd; } + QString podcastPublishedDate() const { return extraField(PodcastPublishedDate); } + QString podcastLocalPath() const { return extraField(PodcastLocalPath); } + void setPodcastLocalPath(const QString &l) { extra[PodcastLocalPath]=l; } // podcast/soundcloud functions... - void setIsFromOnlineService(const QString &service); - bool isFromOnlineService() const; - const QString & onlineService() const { return album; } + void setIsFromOnlineService(const QString &service) { extra[OnlineServiceName]=service; } + bool isFromOnlineService() const { return extra.contains(OnlineServiceName); } + QString onlineService() const { return extraField(OnlineServiceName); } }; Q_DECLARE_METATYPE(Song) diff --git a/tags/tageditor.cpp b/tags/tageditor.cpp index d6993bdf0..581b2f1d1 100644 --- a/tags/tageditor.cpp +++ b/tags/tageditor.cpp @@ -57,7 +57,8 @@ static bool equalTags(const Song &a, const Song &b, bool compareCommon, bool com { return (compareCommon || a.track==b.track) && a.year==b.year && a.disc==b.disc && a.artist==b.artist && a.genre==b.genre && a.album==b.album && - a.albumartist==b.albumartist && (!composerSupport || a.composer==b.composer) && (!commentSupport || a.comment()==b.comment()) && (compareCommon || a.title==b.title); + a.albumartist==b.albumartist && (!composerSupport || a.composer()==b.composer()) && + (!commentSupport || a.comment()==b.comment()) && (compareCommon || a.title==b.title); } static bool setString(QString &str, const QString &v, bool skipEmpty) { @@ -243,7 +244,7 @@ TagEditor::TagEditor(QWidget *parent, const QList &songs, songAlbums.insert(s.album); songGenres.insert(s.genre); if (composerSupport) { - songComposers.insert(s.composer); + songComposers.insert(s.composer()); } if (commentSupport) { songComments.insert(s.comment()); @@ -261,7 +262,9 @@ TagEditor::TagEditor(QWidget *parent, const QList &songs, all.title.clear(); all.track=0; all.artist=1==songArtists.count() ? *(songArtists.begin()) : QString(); - all.composer=1==songComposers.count() ? *(songComposers.begin()) : QString(); + if (1==songComposers.count()) { + all.setComposer(*(songComposers.begin())); + } all.setComment(1==songComments.count() ? *(songComments.begin()) : QString()); all.albumartist=1==songAlbumArtists.count() ? *(songAlbumArtists.begin()) : QString(); all.album=1==songAlbums.count() ? *(songAlbums.begin()) : QString(); @@ -339,11 +342,14 @@ void TagEditor::fillSong(Song &s, bool isAll, bool skipEmpty) const setString(s.album, album->text().trimmed(), skipEmpty && (!haveAll || all.album.isEmpty())); setString(s.albumartist, albumArtist->text().trimmed(), skipEmpty && (!haveAll || all.albumartist.isEmpty())); if (composerSupport) { - setString(s.composer, composer->text().trimmed(), skipEmpty && (!haveAll || all.composer.isEmpty())); + QString str; + if (setString(str, composer->text().trimmed(), skipEmpty && (!haveAll || all.composer().isEmpty()))) { + s.setComposer(str); + } } if (commentSupport) { QString str; - if (setString(str, comment->text().trimmed(), skipEmpty && (!haveAll || all.composer.isEmpty()))) { + if (setString(str, comment->text().trimmed(), skipEmpty && (!haveAll || all.comment().isEmpty()))) { s.setComment(str); } } @@ -367,7 +373,7 @@ void TagEditor::setVariousHint() album->setPlaceholderText(all.album.isEmpty() && haveAlbums ? TagSpinBox::variousStr() : QString()); albumArtist->setPlaceholderText(all.albumartist.isEmpty() && haveAlbumArtists ? TagSpinBox::variousStr() : QString()); if (composerSupport) { - composer->setPlaceholderText(all.composer.isEmpty() && haveComposers ? TagSpinBox::variousStr() : QString()); + composer->setPlaceholderText(all.composer().isEmpty() && haveComposers ? TagSpinBox::variousStr() : QString()); } if (commentSupport) { comment->setPlaceholderText(all.comment().isEmpty() && haveComments ? TagSpinBox::variousStr() : QString()); @@ -395,7 +401,7 @@ void TagEditor::setLabelStates() titleLabel->setOn(!isAll && o.title!=e.title); artistLabel->setOn(o.artist!=e.artist); if (composerSupport) { - composerLabel->setOn(o.composer!=e.composer); + composerLabel->setOn(o.composer()!=e.composer()); } if (commentSupport) { commentLabel->setOn(o.comment()!=e.comment()); @@ -713,8 +719,8 @@ void TagEditor::updateEdited(bool isFromAll) if (all.albumartist.isEmpty() && s.albumartist.isEmpty() && !o.albumartist.isEmpty()) { s.albumartist=o.albumartist; } - if (composerSupport && all.composer.isEmpty() && s.composer.isEmpty() && !o.composer.isEmpty()) { - s.composer=o.composer; + if (composerSupport && all.composer().isEmpty() && s.composer().isEmpty() && !o.composer().isEmpty()) { + s.setComposer(o.composer()); } if (commentSupport && all.comment().isEmpty() && s.comment().isEmpty() && !o.comment().isEmpty()) { s.setComment(o.comment()); @@ -748,7 +754,7 @@ void TagEditor::setSong(const Song &s) artist->setText(s.artist); albumArtist->setText(s.albumartist); if (composerSupport) { - composer->setText(s.composer); + composer->setText(s.composer()); } if (commentSupport) { comment->setText(s.comment()); diff --git a/tags/tags.cpp b/tags/tags.cpp index d17234a69..7d92c1118 100644 --- a/tags/tags.cpp +++ b/tags/tags.cpp @@ -275,7 +275,7 @@ static void readID3v2Tags(TagLib::ID3v2::Tag *tag, Song *song, ReplayGain *rg, Q const TagLib::ID3v2::FrameList &composer = tag->frameListMap()["TCOM"]; if (!composer.isEmpty()) { - song->composer=tString2QString(composer.front()->toString()); + song->setComposer(tString2QString(composer.front()->toString())); } const TagLib::ID3v2::FrameList &disc = tag->frameListMap()["TPOS"]; @@ -427,7 +427,7 @@ static bool writeID3v2Tags(TagLib::ID3v2::Tag *tag, const Song &from, const Song if (from.albumartist!=to.albumartist && updateID3v2Tag(tag, "TPE2", to.albumartist)) { changed=true; } - if (from.composer!=to.composer && updateID3v2Tag(tag, "TCOM", to.composer)) { + if (from.composer()!=to.composer() && updateID3v2Tag(tag, "TCOM", to.composer())) { changed=true; } if (from.disc!=to.disc&& updateID3v2Tag(tag, "TPOS", 0==to.disc ? QString() : QString::number(to.disc))) { @@ -494,7 +494,7 @@ static void readAPETags(TagLib::APE::Tag *tag, Song *song, ReplayGain *rg) song->albumartist=tString2QString(map["Album Artist"].toString()); } if (map.contains("Composer")) { - song->composer=tString2QString(map["Composer"].toString()); + song->setComposer(tString2QString(map["Composer"].toString())); } if (map.contains("Disc")) { song->disc=splitDiscNumber(tString2QString(map["Disc"].toString())).first; @@ -549,7 +549,7 @@ static bool writeAPETags(TagLib::APE::Tag *tag, const Song &from, const Song &to if (from.albumartist!=to.albumartist && updateAPETag(tag, "Album Artist", to.albumartist)) { changed=true; } - if (from.composer!=to.composer && updateAPETag(tag, "Composer", to.composer)) { + if (from.composer()!=to.composer() && updateAPETag(tag, "Composer", to.composer())) { changed=true; } if (from.disc!=to.disc && updateAPETag(tag, "Disc", 0==to.disc ? QString() : QString::number(to.disc))) { @@ -606,7 +606,7 @@ static void readVorbisCommentTags(TagLib::Ogg::XiphComment *tag, Song *song, Rep } str=readVorbisTag(tag, "COMPOSER"); if (str.isEmpty()) { - song->composer=tString2QString(str); + song->setComposer(tString2QString(str)); } str=readVorbisTag(tag, "DISCNUMBER"); if (str.isEmpty()) { @@ -686,7 +686,7 @@ static bool writeVorbisCommentTags(TagLib::Ogg::XiphComment *tag, const Song &fr if (from.albumartist!=to.albumartist && updateVorbisCommentTag(tag, "ALBUMARTIST", to.albumartist)) { changed=true; } - if (from.composer!=to.composer && updateVorbisCommentTag(tag, "COMPOSER", to.composer)) { + if (from.composer()!=to.composer() && updateVorbisCommentTag(tag, "COMPOSER", to.composer())) { changed=true; } if (from.disc!=to.disc && updateVorbisCommentTag(tag, "DISCNUMBER", 0==to.disc ? QString() : QString::number(to.disc))) { @@ -741,7 +741,7 @@ static void readMP4Tags(TagLib::MP4::Tag *tag, Song *song, ReplayGain *rg, QImag song->albumartist=tString2QString(map["aART"].toStringList().front()); } if (map.contains("\xA9wrt") && !map["\xA9wrt"].toStringList().isEmpty()) { - song->composer=tString2QString(map["\xA9wrt"].toStringList().front()); + song->setComposer(tString2QString(map["\xA9wrt"].toStringList().front())); } if (map.contains("disk")) { song->disc=map["disk"].toIntPair().first; @@ -805,7 +805,7 @@ static bool writeMP4Tags(TagLib::MP4::Tag *tag, const Song &from, const Song &to if (from.albumartist!=to.albumartist && updateMP4Tag(tag, "aART", to.albumartist)) { changed=true; } - if (from.composer!=to.composer && updateMP4Tag(tag, "\xA9wrt", to.composer)) { + if (from.composer()!=to.composer() && updateMP4Tag(tag, "\xA9wrt", to.composer())) { changed=true; } if (from.disc!=to.disc && updateMP4Tag(tag, "disk", 0==to.disc ? QString() : QString::number(to.disc))) { @@ -867,7 +867,7 @@ static void readASFTags(TagLib::ASF::Tag *tag, Song *song, ReplayGain *rg) song->albumartist=tString2QString(map["WM/AlbumTitle"].front().toString()); } if (map.contains("WM/Composer") && !map["WM/Composer"].isEmpty()) { - song->composer=tString2QString(map["WM/Composer"].front().toString()); + song->setComposer(tString2QString(map["WM/Composer"].front().toString())); } if (map.contains("WM/PartOfSet") && !map["WM/PartOfSet"].isEmpty()) { song->albumartist=map["WM/PartOfSet"].front().toUInt(); @@ -908,7 +908,7 @@ static bool writeASFTags(TagLib::ASF::Tag *tag, const Song &from, const Song &to if (from.albumartist!=to.albumartist && updateASFTag(tag, "WM/AlbumTitle", to.albumartist)) { changed=true; } - if (from.composer!=to.composer && updateASFTag(tag, "WM/Composer", to.composer)) { + if (from.composer()!=to.composer() && updateASFTag(tag, "WM/Composer", to.composer())) { changed=true; } if (from.disc!=to.disc && updateASFTag(tag, "WM/PartOfSet", 0==to.disc ? QString() : QString::number(to.disc))) {