diff --git a/gui/interfacesettings.cpp b/gui/interfacesettings.cpp index 346010181..8775ec454 100644 --- a/gui/interfacesettings.cpp +++ b/gui/interfacesettings.cpp @@ -293,6 +293,8 @@ InterfaceSettings::InterfaceSettings(QWidget *p) sbLayout->addItem(new QSpacerItem(0, 2, QSizePolicy::Expanding, QSizePolicy::Minimum)); } connect(libraryGrouping, SIGNAL(currentIndexChanged(int)), SLOT(libraryGroupingChanged())); + composerGenres->setToolTip(composerGenresLabel->toolTip()); + singleTracksFolder->setToolTip(singleTracksFolderLabel->toolTip()); } void InterfaceSettings::load() @@ -311,6 +313,7 @@ void InterfaceSettings::load() selectEntry(onlineView, Settings::self()->onlineView()); #endif composerGenres->setText(QStringList(Settings::self()->composerGenres().toList()).join(QString(Song::constGenreSep))); + singleTracksFolder->setText(Settings::self()->singleTracksFolder()); #ifdef ENABLE_DEVICES_SUPPORT showDeleteAction->setChecked(Settings::self()->showDeleteAction()); selectEntry(devicesView, Settings::self()->devicesView()); @@ -405,6 +408,7 @@ void InterfaceSettings::save() Settings::self()->saveOnlineView(getValue(onlineView)); #endif Settings::self()->saveComposerGenres(composerGenres->text().trimmed().split(Song::constGenreSep).toSet()); + Settings::self()->saveSingleTracksFolder(singleTracksFolder->text().trimmed()); #ifdef ENABLE_DEVICES_SUPPORT Settings::self()->saveShowDeleteAction(showDeleteAction->isChecked()); Settings::self()->saveDevicesView(getValue(devicesView)); diff --git a/gui/interfacesettings.ui b/gui/interfacesettings.ui index 172928d17..7335c7808 100644 --- a/gui/interfacesettings.ui +++ b/gui/interfacesettings.ui @@ -674,20 +674,21 @@ - + + - General + Tweaks - + - + QFormLayout::ExpandingFieldsGrow - Use the 'Composer' tag, and not 'Artist' or 'Album Artist', to group albums. (List should be comma spearated - e.g. 'Classical, Symphonic') + <p>Use the 'Composer' tag, and not 'Artist' or 'Album Artist', to group albums. (List should be comma spearated - e.g. 'Classical, Symphonic')</p> Group albums by composer for genres: @@ -700,28 +701,78 @@ - + + + + <p>If set, any tracks found within this folder will have their 'Album Artist' set to 'Various Artists' and album set to 'Single Tracks'</p> + + + Single track files folder: + + + singleTracksFolder + + + + + + + + + + Changing any of the above will require a DB refresh in order to take affect. + + + + + + + Qt::Vertical + + + + 16 + 16 + + + + + + + + + + + General + + + + + + QFormLayout::ExpandingFieldsGrow + + Fetch missing covers from Last.fm - + Show delete action in context menus - + Enforce single-click activation of items - + <p>This will change Cantata's interface as detailed: @@ -732,21 +783,21 @@ - + Show song information tooltips - + Support retina displays - + Language: diff --git a/gui/settings.cpp b/gui/settings.cpp index dc71f5f64..324d246e3 100644 --- a/gui/settings.cpp +++ b/gui/settings.cpp @@ -397,6 +397,11 @@ QSet Settings::composerGenres() return cfg.get("composerGenres", Song::composerGenres().toList()).toSet(); } +QString Settings::singleTracksFolder() +{ + return cfg.get("singleTracksFolder", QString()); +} + QStringList Settings::lyricProviders() { return cfg.get("lyricProviders", QStringList() << "lyrics.wikia.com" << "lyricstime.com" << "lyricsreg.com" @@ -1021,6 +1026,11 @@ void Settings::saveComposerGenres(const QSet &v) cfg.set("composerGenres", v.toList()); } +void Settings::saveSingleTracksFolder(const QString &v) +{ + cfg.set("singleTracksFolder", v); +} + void Settings::saveLyricProviders(const QStringList &v) { cfg.set("lyricProviders", v); diff --git a/gui/settings.h b/gui/settings.h index b1898f0d1..f262e7bbb 100644 --- a/gui/settings.h +++ b/gui/settings.h @@ -85,6 +85,7 @@ public: QString librarySort(); QString libraryGrouping(); QSet composerGenres(); + QString singleTracksFolder(); QStringList lyricProviders(); QStringList wikipediaLangs(); bool wikipediaIntroOnly(); @@ -209,6 +210,7 @@ public: void saveLibrarySort(const QString &v); void saveLibraryGrouping(const QString &v); void saveComposerGenres(const QSet &v); + void saveSingleTracksFolder(const QString &v); void saveLyricProviders(const QStringList &v); void saveWikipediaLangs(const QStringList &v); void saveWikipediaIntroOnly(bool v); diff --git a/mpd-interface/mpdconnection.cpp b/mpd-interface/mpdconnection.cpp index 474c15b8e..1fe58e591 100644 --- a/mpd-interface/mpdconnection.cpp +++ b/mpd-interface/mpdconnection.cpp @@ -272,6 +272,7 @@ MPDConnection::MPDConnection() maxFilesPerAddCommand=cfg.get("mpdListSize", 10000, 100, 65535); alwaysUseLsInfo=cfg.get("alwaysUseLsInfo", true); seekStep=cfg.get("seekStep", 5, 2, 60); + MPDParseUtils::setSingleTracksFolder(cfg.get("singleTracksFolder", QString())); #endif connTimer=new QTimer(this); connect(connTimer, SIGNAL(timeout()), SLOT(getStatus())); @@ -1875,7 +1876,7 @@ bool MPDConnection::listDirInfo(const QString &dir) if (response.ok) { QSet childDirs; QList *songs=new QList(); - MPDParseUtils::parseLibraryItems(response.data, details.dir, ver, *songs, !topLevel, &childDirs); + MPDParseUtils::parseLibraryItems(response.data, details.dir, ver, *songs, dir, &childDirs); emit librarySongs(songs); foreach (const QString &child, childDirs) { if (!listDirInfo(child)) { diff --git a/mpd-interface/mpdparseutils.cpp b/mpd-interface/mpdparseutils.cpp index 6c0923eb3..edaeeab83 100644 --- a/mpd-interface/mpdparseutils.cpp +++ b/mpd-interface/mpdparseutils.cpp @@ -44,6 +44,7 @@ #include "http/httpserver.h" #endif #include "support/utils.h" +#include "support/localize.h" #include "cuefile.h" #include "mpdconnection.h" #ifdef ENABLE_ONLINE_SERVICES @@ -128,6 +129,13 @@ static const QString constHttpProtocol=QLatin1String("http://"); static inline bool toBool(const QByteArray &v) { return v==constSetValue; } +static QString singleTracksFolder; + +void MPDParseUtils::setSingleTracksFolder(const QString &f) +{ + singleTracksFolder=f; +} + QList MPDParseUtils::parsePlaylists(const QByteArray &data) { QList playlists; @@ -524,11 +532,13 @@ MPDParseUtils::MessageMap MPDParseUtils::parseMessages(const QByteArray &data) } #endif -void MPDParseUtils::parseLibraryItems(const QByteArray &data, const QString &mpdDir, long mpdVersion, QList &songs, bool parsePlaylists, QSet *childDirs) +void MPDParseUtils::parseLibraryItems(const QByteArray &data, const QString &mpdDir, long mpdVersion, QList &songs, const QString &dir, QSet *childDirs) { QList currentItem; QList lines = data.split('\n'); int amountOfLines = lines.size(); + bool parsePlaylists="/"!=dir; + bool setSingleTracks=parsePlaylists && !singleTracksFolder.isEmpty() && dir==singleTracksFolder; for (int i = 0; i < amountOfLines; i++) { const QByteArray &line=lines.at(i); @@ -665,7 +675,11 @@ void MPDParseUtils::parseLibraryItems(const QByteArray &data, const QString &mpd } continue; } - + + if (Song::Playlist!=currentSong.type && setSingleTracks) { + currentSong.albumartist=Song::variousArtists(); + currentSong.album=i18n("Single Tracks"); + } currentSong.fillEmptyFields(); songs.append(currentSong); } diff --git a/mpd-interface/mpdparseutils.h b/mpd-interface/mpdparseutils.h index 1e1f0362f..8cde19ef1 100644 --- a/mpd-interface/mpdparseutils.h +++ b/mpd-interface/mpdparseutils.h @@ -60,6 +60,7 @@ namespace MPDParseUtils Loc_Search }; + extern void setSingleTracksFolder(const QString &f); extern QList parsePlaylists(const QByteArray &data); extern MPDStatsValues parseStats(const QByteArray &data); extern MPDStatusValues parseStatus(const QByteArray &data); @@ -72,7 +73,7 @@ namespace MPDParseUtils typedef QMap MessageMap; extern MessageMap parseMessages(const QByteArray &data); #endif - extern void parseLibraryItems(const QByteArray &data, const QString &mpdDir, long mpdVersion, QList &songs, bool parsePlaylists=true, QSet *childDirs=0); + extern void parseLibraryItems(const QByteArray &data, const QString &mpdDir, long mpdVersion, QList &songs, const QString &dir=QString(), QSet *childDirs=0); #ifndef CANTATA_WEB extern DirViewItemRoot * parseDirViewItems(const QByteArray &data, bool isMopidy); #endif diff --git a/web/app/application.cpp b/web/app/application.cpp index 83407e242..8f8c2e425 100644 --- a/web/app/application.cpp +++ b/web/app/application.cpp @@ -23,6 +23,7 @@ #include "application.h" #include "mpd-interface/mpdconnection.h" +#include "mpd-interface/mpdparseutils.h" #include "httpserver.h" #include "statusapi.h" #include "db/mpdlibrarydb.h" @@ -57,6 +58,7 @@ Application::Application(int argc, char *argv[]) mpd.port=cfg->value("mpd/port", "6600").toUInt(); mpd.password=cfg->value("mpd/password", QString()).toString(); mpd.dir=cfg->value("mpd/dir", "/var/lib/mpd/music").toString(); + MPDParseUtils::setSingleTracksFolder(cfg->value("mpd/singleTracksFolder", QString()).toString()); QString dbFile(cfg->value("db", QCoreApplication::applicationDirPath()+QDir::separator()+PACKAGE_NAME".sqlite").toString()); if (!MpdLibraryDb::self()->init(dbFile)) { qWarning() << dbFile << "failed to initialize";