From b2ce9ff01665e359062ab800cf6ad56ef1bfb400 Mon Sep 17 00:00:00 2001 From: Craig Drummond Date: Mon, 1 Jun 2015 21:53:55 +0100 Subject: [PATCH] Various devel changes - Use time_t to store MPD DB version, as that is what MPD sends anyway - Initial changes for an (experimental) webapp --- devices/fsdevice.cpp | 6 +-- gui/albumspage.cpp | 2 +- gui/librarypage.cpp | 2 +- gui/mainwindow.cpp | 10 ++-- models/dirviewmodel.cpp | 31 ++++++------ models/dirviewmodel.h | 7 ++- models/musiclibraryitemroot.cpp | 16 +++--- models/musiclibraryitemroot.h | 10 ++-- models/musiclibrarymodel.cpp | 22 ++++----- models/musiclibrarymodel.h | 9 ++-- models/playlistsmodel.cpp | 13 ++--- models/playqueuemodel.cpp | 2 +- models/streamsmodel.cpp | 41 +++------------ models/streamsmodel.h | 7 ++- mpd-interface/cuefile.cpp | 4 +- mpd-interface/mpdconnection.cpp | 85 +++++++++++++++++++++++--------- mpd-interface/mpdconnection.h | 25 +++++++--- mpd-interface/mpdparseutils.cpp | 37 +++++++++++++- mpd-interface/mpdparseutils.h | 13 +++-- mpd-interface/mpdstats.h | 5 +- mpd-interface/song.cpp | 6 +-- mpd-interface/song.h | 2 +- network/networkaccessmanager.cpp | 5 +- online/onlineservice.cpp | 4 +- 24 files changed, 212 insertions(+), 152 deletions(-) diff --git a/devices/fsdevice.cpp b/devices/fsdevice.cpp index 6035726b1..9ab7aeca0 100644 --- a/devices/fsdevice.cpp +++ b/devices/fsdevice.cpp @@ -82,7 +82,7 @@ void MusicScanner::scan(const QString &folder, const QString &cacheFile, bool re MusicLibraryItemRoot *lib=new MusicLibraryItemRoot; MusicLibraryModel::convertCache(cacheFile); readProgress(0.0); - if (lib->fromXML(cacheFile, QDateTime(), 0, folder)) { + if (lib->fromXML(cacheFile, 0, 0, folder)) { lib->applyGrouping(); if (!stopRequested) { emit libraryUpdated(lib); @@ -109,7 +109,7 @@ void MusicScanner::scan(const QString &folder, const QString &cacheFile, bool re library->applyGrouping(); if (!cacheFile.isEmpty()) { writeProgress(0.0); - library->toXML(cacheFile, QDateTime(), false, this); + library->toXML(cacheFile, 0, false, this); } emit libraryUpdated(library); } else { @@ -120,7 +120,7 @@ void MusicScanner::scan(const QString &folder, const QString &cacheFile, bool re void MusicScanner::saveCache(const QString &cache, MusicLibraryItemRoot *lib) { writeProgress(0.0); - lib->toXML(cache, QDateTime(), false, this); + lib->toXML(cache, 0, false, this); emit cacheSaved(); } diff --git a/gui/albumspage.cpp b/gui/albumspage.cpp index 9b6e35e4d..9f0284896 100644 --- a/gui/albumspage.cpp +++ b/gui/albumspage.cpp @@ -71,7 +71,7 @@ AlbumsPage::AlbumsPage(QWidget *p) connect(view, SIGNAL(itemsSelected(bool)), this, SLOT(controlActions())); connect(view, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(itemDoubleClicked(const QModelIndex &))); connect(view, SIGNAL(rootIndexSet(QModelIndex)), this, SLOT(updateGenres(QModelIndex))); - connect(MPDConnection::self(), SIGNAL(updatingLibrary()), view, SLOT(updating())); + connect(MPDConnection::self(), SIGNAL(updatingLibrary(time_t)), view, SLOT(updating())); connect(MPDConnection::self(), SIGNAL(updatedLibrary()), view, SLOT(updated())); connect(MPDConnection::self(), SIGNAL(updatingDatabase()), view, SLOT(updating())); connect(MPDConnection::self(), SIGNAL(updatedDatabase()), view, SLOT(updated())); diff --git a/gui/librarypage.cpp b/gui/librarypage.cpp index dfc4e6351..67d33ee27 100644 --- a/gui/librarypage.cpp +++ b/gui/librarypage.cpp @@ -65,7 +65,7 @@ LibraryPage::LibraryPage(QWidget *p) connect(this, SIGNAL(add(const QStringList &, bool, quint8)), MPDConnection::self(), SLOT(add(const QStringList &, bool, quint8))); connect(this, SIGNAL(addSongsToPlaylist(const QString &, const QStringList &)), MPDConnection::self(), SLOT(addToPlaylist(const QString &, const QStringList &))); connect(genreCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(searchItems())); - connect(MPDConnection::self(), SIGNAL(updatingLibrary()), view, SLOT(updating())); + connect(MPDConnection::self(), SIGNAL(updatingLibrary(time_t)), view, SLOT(updating())); connect(MPDConnection::self(), SIGNAL(updatedLibrary()), view, SLOT(updated())); connect(MPDConnection::self(), SIGNAL(updatingDatabase()), view, SLOT(updating())); connect(MPDConnection::self(), SIGNAL(updatedDatabase()), view, SLOT(updated())); diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp index 2ea5165a4..51e79c77a 100644 --- a/gui/mainwindow.cpp +++ b/gui/mainwindow.cpp @@ -1617,6 +1617,8 @@ void MainWindow::showServerInfo() qSort(handlers); qSort(tags); long version=MPDConnection::self()->version(); + QDateTime dbUpdate; + dbUpdate.setTime_t(MPDStats::self()->dbUpdate()); MessageBox::information(this, #ifdef Q_OS_MAC i18n("Server Information")+QLatin1String("

")+ @@ -1640,7 +1642,7 @@ void MainWindow::showServerInfo() "Duration: %4" "Updated: %5", MPDStats::self()->artists(), MPDStats::self()->albums(), MPDStats::self()->songs(), - Utils::formatDuration(MPDStats::self()->dbPlaytime()), MPDStats::self()->dbUpdate().toString(Qt::SystemLocaleShortDate))+ + Utils::formatDuration(MPDStats::self()->dbPlaytime()), dbUpdate.toString(Qt::SystemLocaleShortDate))+ QLatin1String("

"), i18n("Server Information")); } @@ -1841,8 +1843,8 @@ void MainWindow::scrollPlayQueue(bool wasEmpty) void MainWindow::updateStats() { // Check if remote db is more recent than local one - if (!MusicLibraryModel::self()->lastUpdate().isValid() || MPDStats::self()->dbUpdate() > MusicLibraryModel::self()->lastUpdate()) { - if (!MusicLibraryModel::self()->lastUpdate().isValid()) { + if (0==MusicLibraryModel::self()->lastUpdate() || MPDStats::self()->dbUpdate() > MusicLibraryModel::self()->lastUpdate()) { + if (0==MusicLibraryModel::self()->lastUpdate()) { libraryPage->clear(); //albumsPage->clear(); folderPage->clear(); @@ -2066,7 +2068,7 @@ void MainWindow::addToNewStoredPlaylist() for(;;) { QString name = InputDialog::getText(i18n("Playlist Name"), i18n("Enter a name for the playlist:"), QString(), 0, this); - if (name==StreamsModel::constPlayListName) { + if (name==MPDConnection::constStreamsPlayListName) { MessageBox::error(this, i18n("'%1' is used to store favorite streams, please choose another name.", name)); continue; } diff --git a/models/dirviewmodel.cpp b/models/dirviewmodel.cpp index fa3e69c67..a54ca7105 100644 --- a/models/dirviewmodel.cpp +++ b/models/dirviewmodel.cpp @@ -31,6 +31,7 @@ #include #include #include +#include #include "support/localize.h" #include "gui/plurals.h" #include "dirviewmodel.h" @@ -90,12 +91,12 @@ void DirViewModel::setEnabled(bool e) if (enabled) { connect(MPDConnection::self(), SIGNAL(updatingDatabase()), this, SLOT(updatingMpd())); - connect(MPDConnection::self(), SIGNAL(dirViewUpdated(DirViewItemRoot *, const QDateTime &)), this, SLOT(updateDirView(DirViewItemRoot *, const QDateTime &))); + connect(MPDConnection::self(), SIGNAL(dirViewUpdated(DirViewItemRoot *, time_t)), this, SLOT(updateDirView(DirViewItemRoot *, time_t))); } else { clear(); removeCache(); disconnect(MPDConnection::self(), SIGNAL(updatingDatabase()), this, SLOT(updatingMpd())); - disconnect(MPDConnection::self(), SIGNAL(dirViewUpdated(DirViewItemRoot *, const QDateTime &)), this, SLOT(updateDirView(DirViewItemRoot *, const QDateTime &))); + disconnect(MPDConnection::self(), SIGNAL(dirViewUpdated(DirViewItemRoot *, time_t)), this, SLOT(updateDirView(DirViewItemRoot *, time_t))); } } @@ -236,7 +237,7 @@ void DirViewModel::clear() } const DirViewItemRoot *oldRoot = rootItem; beginResetModel(); - databaseTime = QDateTime(); + databaseTime = 0; rootItem = new DirViewItemRoot; delete oldRoot; endResetModel(); @@ -276,7 +277,7 @@ void DirViewModel::toXML() writer.writeStartDocument(); writer.writeStartElement(constTopTag); writer.writeAttribute(constVersionAttribute, QString::number(constVersion)); - writer.writeAttribute(constDateAttribute, QString::number(databaseTime.toTime_t())); + writer.writeAttribute(constDateAttribute, QString::number(databaseTime)); if (databaseTimeUnreliable) { writer.writeAttribute(constDateUnreliableAttribute, constTrueValue); } @@ -298,7 +299,7 @@ void DirViewModel::removeCache() QFile::remove(cacheFile); } - databaseTime = QDateTime(); + databaseTime = 0; } void DirViewModel::toXML(const DirViewItem *item, QXmlStreamWriter &writer) @@ -329,23 +330,21 @@ bool DirViewModel::fromXML() } DirViewItemRoot *root=new DirViewItemRoot; - quint32 date=fromXML(&compressor, MPDStats::self()->dbUpdate(), root); + time_t date=fromXML(&compressor, MPDStats::self()->dbUpdate(), root); compressor.close(); if (!date) { delete root; return false; } - QDateTime dt; - dt.setTime_t(date); - updateDirView(root, dt, true); + updateDirView(root, date, true); return true; } -quint32 DirViewModel::fromXML(QIODevice *dev, const QDateTime &dt, DirViewItemRoot *root) +time_t DirViewModel::fromXML(QIODevice *dev, time_t dt, DirViewItemRoot *root) { QXmlStreamReader reader(dev); - quint32 xmlDate=0; + time_t xmlDate=0; DirViewItemDir *currentDir=root; QList dirStack; @@ -362,7 +361,7 @@ quint32 DirViewModel::fromXML(QIODevice *dev, const QDateTime &dt, DirViewItemRo if (constTopTag == element) { quint32 version = attributes.value(constVersionAttribute).toString().toUInt(); xmlDate = attributes.value(constDateAttribute).toString().toUInt(); - if ( version < constVersion || (dt.isValid() && xmlDate < dt.toTime_t())) { + if ( version < constVersion || (dt>0 && xmlDate < dt)) { return 0; } databaseTimeUnreliable=constTrueValue==attributes.value(constDateUnreliableAttribute).toString(); @@ -387,16 +386,16 @@ quint32 DirViewModel::fromXML(QIODevice *dev, const QDateTime &dt, DirViewItemRo return xmlDate; } -void DirViewModel::updateDirView(DirViewItemRoot *newroot, const QDateTime &dbUpdate, bool fromFile) +void DirViewModel::updateDirView(DirViewItemRoot *newroot, time_t dbUpdate, bool fromFile) { - if (databaseTime.isValid() && databaseTime >= dbUpdate) { + if (databaseTime>0 && databaseTime >= dbUpdate) { delete newroot; return; } bool incremental=enabled && rootItem->childCount() && newroot->childCount(); bool updatedListing=false; - bool needToSave=!databaseTime.isValid() || (MusicLibraryModel::validCacheDate(dbUpdate) && dbUpdate>databaseTime); + bool needToSave=databaseTime==0 || (MusicLibraryModel::validCacheDate(dbUpdate) && dbUpdate>databaseTime); if (incremental && !QFile::exists(cacheFileName())) { incremental=false; @@ -439,7 +438,7 @@ void DirViewModel::updateDirView(DirViewItemRoot *newroot, const QDateTime &dbUp databaseTimeUnreliable=!MusicLibraryModel::validCacheDate(dbUpdate); // See note in updatingMpd() } if (!MusicLibraryModel::validCacheDate(databaseTime) && !MusicLibraryModel::validCacheDate(dbUpdate)) { - databaseTime=QDateTime::currentDateTime(); + databaseTime=QDateTime::currentDateTime().toTime_t(); } if (!fromFile && (needToSave || updatedListing)) { diff --git a/models/dirviewmodel.h b/models/dirviewmodel.h index 3b5e1e644..906b25ef5 100644 --- a/models/dirviewmodel.h +++ b/models/dirviewmodel.h @@ -28,7 +28,6 @@ #include #include -#include #include "dirviewitemroot.h" #include "actionmodel.h" @@ -66,7 +65,7 @@ public: bool fromXML(); public Q_SLOTS: - void updateDirView(DirViewItemRoot *newroot, const QDateTime &dbUpdate=QDateTime(), bool fromFile=false); + void updateDirView(DirViewItemRoot *newroot, time_t dbUpdate=0, bool fromFile=false); void updatingMpd(); Q_SIGNALS: @@ -74,14 +73,14 @@ Q_SIGNALS: private: void toXML(const DirViewItem *item, QXmlStreamWriter &writer); - quint32 fromXML(QIODevice *dev, const QDateTime &dt, DirViewItemRoot *root); + time_t fromXML(QIODevice *dev, time_t dt, DirViewItemRoot *root); void addFileToList(const QStringList &parts, const QModelIndex &parent, DirViewItemDir *dir, const QString &mopidyPath); void removeFileFromList(const QStringList &parts, const QModelIndex &parent, DirViewItemDir *dir); void getFiles(DirViewItem *item, QStringList &filenames, bool allowPlaylists) const; private: DirViewItemRoot *rootItem; - QDateTime databaseTime; + time_t databaseTime; bool databaseTimeUnreliable; bool enabled; }; diff --git a/models/musiclibraryitemroot.cpp b/models/musiclibraryitemroot.cpp index f2a559c56..7ba60dd45 100644 --- a/models/musiclibraryitemroot.cpp +++ b/models/musiclibraryitemroot.cpp @@ -221,14 +221,14 @@ void MusicLibraryItemRoot::updateSongFile(const Song &from, const Song &to) static quint32 constVersion=9; static QLatin1String constTopTag("CantataLibrary"); -void MusicLibraryItemRoot::toXML(const QString &filename, const QDateTime &date, bool dateUnreliable, MusicLibraryProgressMonitor *prog) const +void MusicLibraryItemRoot::toXML(const QString &filename, time_t date, bool dateUnreliable, MusicLibraryProgressMonitor *prog) const { if (isFlat) { return; } // If saving device cache, and we have NO items, then remove cache file... - if (0==childCount() && date.date().year()<2000) { + if (0==childCount() && date<2000) { if (QFile::exists(filename)) { QFile::remove(filename); } @@ -276,7 +276,7 @@ static const QString constImageAttribute=QLatin1String("img"); static const QString constnumTracksAttribute=QLatin1String("numTracks"); static const QString constTrueValue=QLatin1String("true"); -void MusicLibraryItemRoot::toXML(QXmlStreamWriter &writer, const QDateTime &date, bool dateUnreliable, MusicLibraryProgressMonitor *prog) const +void MusicLibraryItemRoot::toXML(QXmlStreamWriter &writer, time_t date, bool dateUnreliable, MusicLibraryProgressMonitor *prog) const { if (isFlat) { return; @@ -295,7 +295,7 @@ void MusicLibraryItemRoot::toXML(QXmlStreamWriter &writer, const QDateTime &date //Start with the document writer.writeStartElement(constTopTag); writer.writeAttribute(constVersionAttribute, QString::number(constVersion)); - writer.writeAttribute(constDateAttribute, QString::number(date.toTime_t())); + writer.writeAttribute(constDateAttribute, QString::number(date)); if (dateUnreliable) { writer.writeAttribute(constDateUnreliableAttribute, constTrueValue); } @@ -411,7 +411,7 @@ void MusicLibraryItemRoot::toXML(QXmlStreamWriter &writer, const QDateTime &date writer.writeEndDocument(); } -quint32 MusicLibraryItemRoot::fromXML(const QString &filename, const QDateTime &date, bool *dateUnreliable, const QString &baseFolder, MusicLibraryProgressMonitor *prog, MusicLibraryErrorMonitor *em) +time_t MusicLibraryItemRoot::fromXML(const QString &filename, time_t date, bool *dateUnreliable, const QString &baseFolder, MusicLibraryProgressMonitor *prog, MusicLibraryErrorMonitor *em) { if (isFlat) { return 0; @@ -429,7 +429,7 @@ quint32 MusicLibraryItemRoot::fromXML(const QString &filename, const QDateTime & return 0; } QXmlStreamReader reader(&compressor); - quint32 rv=fromXML(reader, date, dateUnreliable, baseFolder, prog, em); + time_t rv=fromXML(reader, date, dateUnreliable, baseFolder, prog, em); compressor.close(); #ifdef TIME_XML_FILE_LOADING qWarning() << filename << timer.elapsed(); @@ -437,7 +437,7 @@ quint32 MusicLibraryItemRoot::fromXML(const QString &filename, const QDateTime & return rv; } -quint32 MusicLibraryItemRoot::fromXML(QXmlStreamReader &reader, const QDateTime &date, bool *dateUnreliable, const QString &baseFolder, MusicLibraryProgressMonitor *prog, MusicLibraryErrorMonitor *em) +time_t MusicLibraryItemRoot::fromXML(QXmlStreamReader &reader, time_t date, bool *dateUnreliable, const QString &baseFolder, MusicLibraryProgressMonitor *prog, MusicLibraryErrorMonitor *em) { if (isFlat) { return 0; @@ -476,7 +476,7 @@ quint32 MusicLibraryItemRoot::fromXML(QXmlStreamReader &reader, const QDateTime xmlDate = attributes.value(constDateAttribute).toString().toUInt(); gs = constTrueValue==attributes.value(constGroupSingleAttribute).toString(); gm = constTrueValue==attributes.value(constGroupSingleAttribute).toString(); - if ( version < constVersion || (date.isValid() && xmlDate < date.toTime_t())) { + if ( version < constVersion || (date>0 && xmlDate < date)) { return 0; } if (prog) { diff --git a/models/musiclibraryitemroot.h b/models/musiclibraryitemroot.h index 8ff303262..183de83de 100644 --- a/models/musiclibraryitemroot.h +++ b/models/musiclibraryitemroot.h @@ -31,14 +31,12 @@ #include #include #include -#include #include #include #include "musiclibraryitem.h" #include "mpd-interface/song.h" #include "support/icon.h" -class QDateTime; class QXmlStreamReader; class QXmlStreamWriter; class MusicLibraryItemArtist; @@ -87,10 +85,10 @@ public: QSet allSongs(bool revertVa=false) const; void getDetails(QSet &artists, QSet &albumArtists, QSet &composers, QSet &albums, QSet &genres); void updateSongFile(const Song &from, const Song &to); - void toXML(const QString &filename, const QDateTime &date=QDateTime(), bool dateUnreliable=false, MusicLibraryProgressMonitor *prog=0) const; - void toXML(QXmlStreamWriter &writer, const QDateTime &date=QDateTime(), bool dateUnreliable=false, MusicLibraryProgressMonitor *prog=0) const; - quint32 fromXML(const QString &filename, const QDateTime &date=QDateTime(), bool *dateUnreliable=0, const QString &baseFolder=QString(), MusicLibraryProgressMonitor *prog=0, MusicLibraryErrorMonitor *em=0); - quint32 fromXML(QXmlStreamReader &reader, const QDateTime &date=QDateTime(), bool *dateUnreliable=0, const QString &baseFolder=QString(), MusicLibraryProgressMonitor *prog=0, MusicLibraryErrorMonitor *em=0); + void toXML(const QString &filename, time_t date=0, bool dateUnreliable=false, MusicLibraryProgressMonitor *prog=0) const; + void toXML(QXmlStreamWriter &writer, time_t date=0, bool dateUnreliable=false, MusicLibraryProgressMonitor *prog=0) const; + time_t fromXML(const QString &filename, time_t date=0, bool *dateUnreliable=0, const QString &baseFolder=QString(), MusicLibraryProgressMonitor *prog=0, MusicLibraryErrorMonitor *em=0); + time_t fromXML(QXmlStreamReader &reader, time_t date=0, bool *dateUnreliable=0, const QString &baseFolder=QString(), MusicLibraryProgressMonitor *prog=0, MusicLibraryErrorMonitor *em=0); Type itemType() const { return Type_Root; } void add(const QSet &songs); bool supportsAlbumArtistTag() const { return supportsAlbumArtist; } diff --git a/models/musiclibrarymodel.cpp b/models/musiclibrarymodel.cpp index a1488b000..c5965d05b 100644 --- a/models/musiclibrarymodel.cpp +++ b/models/musiclibrarymodel.cpp @@ -148,8 +148,8 @@ MusicLibraryModel::MusicLibraryModel(QObject *parent, bool isMpdModel, bool isCh this, SLOT(setArtistImage(const Song &, const QImage &, const QString &))); #endif connect(MPDConnection::self(), SIGNAL(updatingDatabase()), this, SLOT(updatingMpd())); - connect(MPDConnection::self(), SIGNAL(musicLibraryUpdated(MusicLibraryItemRoot *, QDateTime)), - this, SLOT(updateMusicLibrary(MusicLibraryItemRoot *, QDateTime))); + connect(MPDConnection::self(), SIGNAL(musicLibraryUpdated(MusicLibraryItemRoot *, time_t)), + this, SLOT(updateMusicLibrary(MusicLibraryItemRoot *, time_t))); } rootItem->setModel(this); #if defined ENABLE_MODEL_TEST @@ -367,7 +367,7 @@ void MusicLibraryModel::clear() { const MusicLibraryItemRoot *oldRoot = rootItem; beginResetModel(); - databaseTime = QDateTime(); + databaseTime = 0; rootItem = new MusicLibraryItemRoot; rootItem->setModel(this); delete oldRoot; @@ -433,7 +433,7 @@ void MusicLibraryModel::removeCache() QFile::remove(oldCache); } - databaseTime = QDateTime(); + databaseTime = 0; } QSet MusicLibraryModel::getAlbumArtists() @@ -477,15 +477,15 @@ void MusicLibraryModel::clearNewState() emit haveNewItems(false); } -void MusicLibraryModel::updateMusicLibrary(MusicLibraryItemRoot *newroot, QDateTime dbUpdate, bool fromFile) +void MusicLibraryModel::updateMusicLibrary(MusicLibraryItemRoot *newroot, time_t dbUpdate, bool fromFile) { - if (!mpdModel || (databaseTime.isValid() && databaseTime >= dbUpdate)) { + if (!mpdModel || (databaseTime>0 && databaseTime >= dbUpdate)) { delete newroot; return; } bool updatedSongs=false; - bool needToSave=!databaseTime.isValid() || (validCacheDate(dbUpdate) && dbUpdate>databaseTime); + bool needToSave=0==databaseTime || (validCacheDate(dbUpdate) && dbUpdate>databaseTime); bool incremental=rootItem->childCount() && newroot->childCount(); if (incremental && !QFile::exists(cacheFileName())) { @@ -519,7 +519,7 @@ void MusicLibraryModel::updateMusicLibrary(MusicLibraryItemRoot *newroot, QDateT databaseTimeUnreliable=!validCacheDate(dbUpdate); // See note in updatingMpd() } if (!validCacheDate(databaseTime) && !validCacheDate(dbUpdate)) { - databaseTime=QDateTime::currentDateTime(); + databaseTime=QDateTime::currentDateTime().toTime_t(); } if (!fromFile && (needToSave || updatedSongs)) { @@ -808,14 +808,12 @@ bool MusicLibraryModel::fromXML() convertCache(cacheFileName()); MusicLibraryItemRoot *root=new MusicLibraryItemRoot; - quint32 date=root->fromXML(cacheFileName(), MPDStats::self()->dbUpdate(), &databaseTimeUnreliable, QString(), 0, this); + time_t date=root->fromXML(cacheFileName(), MPDStats::self()->dbUpdate(), &databaseTimeUnreliable, QString(), 0, this); if (!date) { delete root; return false; } - QDateTime dt; - dt.setTime_t(date); - updateMusicLibrary(root, dt, true); + updateMusicLibrary(root, date, true); return true; } diff --git a/models/musiclibrarymodel.h b/models/musiclibrarymodel.h index c750a5e12..3299ae37b 100644 --- a/models/musiclibrarymodel.h +++ b/models/musiclibrarymodel.h @@ -27,7 +27,6 @@ #ifndef MUSIC_LIBRARY_MODEL_H #define MUSIC_LIBRARY_MODEL_H -#include #include #include #include "musiclibraryitemroot.h" @@ -51,7 +50,7 @@ public: static void convertCache(const QString &compressedName); static void cleanCache(); - static bool validCacheDate(const QDateTime &dt) { return dt.isValid() && dt.date().year()>2000; } + static bool validCacheDate(time_t dt) { return dt>0; } MusicLibraryModel(QObject *parent=0, bool isMpdModel=true, bool isCheckable=false); ~MusicLibraryModel(); @@ -88,7 +87,7 @@ public: QSet getAlbumArtists(); bool update(const QSet &songs); // void uncheckAll(); - const QDateTime & lastUpdate() { return databaseTime; } + time_t lastUpdate() { return databaseTime; } void setSupportsAlbumArtistTag(bool s) { rootItem->setSupportsAlbumArtistTag(s); } void toggleGrouping(); const QSet & genres() const { return rootItem->genres(); } @@ -100,7 +99,7 @@ public: public Q_SLOTS: void clearNewState(); - void updateMusicLibrary(MusicLibraryItemRoot * root, QDateTime dbUpdate = QDateTime(), bool fromFile = false); + void updateMusicLibrary(MusicLibraryItemRoot * root, time_t dbUpdate = 0, bool fromFile = false); void coverLoaded(const Song &song, int size); void updatingMpd(); // Touch version... @@ -126,7 +125,7 @@ private: bool checkable; bool artistImages; MusicLibraryItemRoot *rootItem; - QDateTime databaseTime; + time_t databaseTime; bool databaseTimeUnreliable; }; diff --git a/models/playlistsmodel.cpp b/models/playlistsmodel.cpp index 377b5bbf8..7169f940c 100644 --- a/models/playlistsmodel.cpp +++ b/models/playlistsmodel.cpp @@ -44,7 +44,6 @@ #include "mpd-interface/mpdstats.h" #include "mpd-interface/mpdconnection.h" #include "playqueuemodel.h" -#include "streamsmodel.h" #include "widgets/icons.h" #ifdef ENABLE_HTTP_SERVER #include "http/httpserver.h" @@ -675,10 +674,9 @@ QStringList PlaylistsModel::mimeTypes() const void PlaylistsModel::getPlaylists() { -// ALWAYS need to send listPlaylists() -> as it is now used for favourite streams! -// if (enabled) { + if (enabled) { emit listPlaylists(); -// } + } } void PlaylistsModel::clear() @@ -725,9 +723,7 @@ void PlaylistsModel::setPlaylists(const QList &playlists) } beginResetModel(); foreach (const Playlist &p, playlists) { - if (p.name!=StreamsModel::constPlayListName) { - items.append(new PlaylistItem(p, allocateKey())); - } + items.append(new PlaylistItem(p, allocateKey())); } endResetModel(); updateItemMenu(); @@ -751,9 +747,6 @@ void PlaylistsModel::setPlaylists(const QList &playlists) } foreach (const Playlist &p, playlists) { - if (p.name==StreamsModel::constPlayListName) { - continue; - } retreived.insert(p.name); PlaylistItem *pl=getPlaylist(p.name); diff --git a/models/playqueuemodel.cpp b/models/playqueuemodel.cpp index afe185207..ba4a063db 100644 --- a/models/playqueuemodel.cpp +++ b/models/playqueuemodel.cpp @@ -934,7 +934,7 @@ void PlayQueueModel::update(const QList &songList, bool isComplete) } // If we have too many changes UI can hang, so it is sometimes better just to do a complete reset! - if (isComplete && songs.count()>MPDConnection::constMaxPqChaanges) { + if (isComplete && songs.count()>MPDConnection::constMaxPqChanges) { songs.clear(); } diff --git a/models/streamsmodel.cpp b/models/streamsmodel.cpp index 8e14c0a26..a8800c490 100644 --- a/models/streamsmodel.cpp +++ b/models/streamsmodel.cpp @@ -566,10 +566,10 @@ StreamsModel::StreamsModel(QObject *parent) new ModelTest(this, this); #endif - connect(MPDConnection::self(), SIGNAL(playlistsRetrieved(QList)), SLOT(storedPlaylists(QList))); connect(MPDConnection::self(), SIGNAL(savedStream(QString,QString)), SLOT(savedFavouriteStream(QString,QString))); connect(MPDConnection::self(), SIGNAL(removedStreams(QList)), SLOT(removedFavouriteStreams(QList))); connect(MPDConnection::self(), SIGNAL(streamList(QList)), SLOT(favouriteStreams(QList))); + connect(MPDConnection::self(), SIGNAL(stateChanged(bool)), SLOT(mpdConnectionState(bool))); connect(this, SIGNAL(listFavouriteStreams()), MPDConnection::self(), SLOT(listStreams())); connect(this, SIGNAL(saveFavouriteStream(QString,QString)), MPDConnection::self(), SLOT(saveStream(QString,QString))); connect(this, SIGNAL(removeFavouriteStreams(QList)), MPDConnection::self(), SLOT(removeStreams(QList))); @@ -1155,37 +1155,6 @@ void StreamsModel::tooltipUpdated(QAction *act) #endif } -void StreamsModel::storedPlaylists(const QList &list) -{ - QDateTime favouritesDateTime; - foreach (const Playlist &p, list) { - if (p.name==constPlayListName) { - favouritesDateTime=p.lastModified; - break; - } - } - - if (favouritesDateTime.isNull()) { - favourites->state=CategoryItem::Fetched; - if (!favourites->children.isEmpty()) { - beginRemoveRows(favouritesIndex(), 0, favourites->children.count()-1); - qDeleteAll(favourites->children); - favourites->children.clear(); - endRemoveRows(); - } - importOldFavourites(); - } else if (favourites->lastModified.isNull() || favourites->lastModifiedlastModified.currentMSecsSinceEpoch())<3) { - if (favourites->lastModified.isNull()) { - favourites->state=CategoryItem::Fetching; - } - emit listFavouriteStreams(); - } - favourites->lastModified=favouritesDateTime; -} - void StreamsModel::savedFavouriteStream(const QString &url, const QString &name) { if (favouritesNameForUrl(url).isEmpty()) { @@ -1306,6 +1275,13 @@ void StreamsModel::favouriteStreams(const QList &streams) } } +void StreamsModel::mpdConnectionState(bool c) +{ + if (c) { + emit listFavouriteStreams(); + } +} + QList StreamsModel::parseRadioTimeResponse(QIODevice *dev, CategoryItem *cat, bool parseSubText) { QList newItems; @@ -1911,7 +1887,6 @@ QModelIndex StreamsModel::categoryIndex(const CategoryItem *cat) const #endif // ENABLE_STREAMS const QString StreamsModel::constPrefix=QLatin1String("cantata-stream-"); -const QString StreamsModel::constPlayListName=QLatin1String("[Radio Streams]"); QString StreamsModel::modifyUrl(const QString &u, bool addPrefix, const QString &name) { diff --git a/models/streamsmodel.h b/models/streamsmodel.h index 08e9e2196..d5426cd9f 100644 --- a/models/streamsmodel.h +++ b/models/streamsmodel.h @@ -24,10 +24,11 @@ #ifndef STREAMSMODEL_H #define STREAMSMODEL_H -#include "actionmodel.h" #include "config.h" +#include #ifdef ENABLE_STREAMS +#include "actionmodel.h" #include "mpd-interface/stream.h" #include "mpd-interface/playlist.h" #include @@ -119,7 +120,6 @@ public: QList loadXml(QIODevice *dev); bool isFavourites() const { return true; } bool canReload() const { return false; } - QDateTime lastModified; bool importedOld; }; @@ -196,7 +196,6 @@ public: }; static const QString constPrefix; - static const QString constPlayListName; static const QString constSubDir; static const QString constCacheExt; @@ -304,11 +303,11 @@ private Q_SLOTS: void tooltipUpdated(QAction *act); // Responses from MPD... - void storedPlaylists(const QList &list); void savedFavouriteStream(const QString &url, const QString &name); void removedFavouriteStreams(const QList &removed); // void editedFavouriteStream(const QString &url, const QString &name, quint32 position); void favouriteStreams(const QList &streams); + void mpdConnectionState(bool c); private: bool loadCache(CategoryItem *cat); diff --git a/mpd-interface/cuefile.cpp b/mpd-interface/cuefile.cpp index 1c24cfd71..b33e32536 100644 --- a/mpd-interface/cuefile.cpp +++ b/mpd-interface/cuefile.cpp @@ -24,7 +24,9 @@ #include "cuefile.h" #include "mpdconnection.h" #include "support/utils.h" +#if !defined ENABLE_UBUNTU && !defined CANTATA_WEB #include "gui/settings.h" +#endif #include #include #include @@ -203,7 +205,7 @@ static const QList & codecList() codecs.append(codec); } - #ifndef ENABLE_UBUNTU + #if !defined ENABLE_UBUNTU && !defined CANTATA_WEB QStringList configCodecs=Settings::self()->cueFileCodecs(); foreach (const QString &cfg, configCodecs) { codec=QTextCodec::codecForName(cfg.toLatin1()); diff --git a/mpd-interface/mpdconnection.cpp b/mpd-interface/mpdconnection.cpp index e1fbde6b5..09040d777 100644 --- a/mpd-interface/mpdconnection.cpp +++ b/mpd-interface/mpdconnection.cpp @@ -26,23 +26,26 @@ #include "mpdconnection.h" #include "mpdparseutils.h" +#ifndef CANTATA_WEB #include "models/musiclibraryitemroot.h" #include "models/streamsmodel.h" +#endif #ifdef ENABLE_SIMPLE_MPD_SUPPORT #include "mpduser.h" #include "gui/settings.h" #endif #include "support/localize.h" -#include "support/utils.h" #include "support/globalstatic.h" +#if !defined ENABLE_UBUNTU && !defined CANTATA_WEB #include "support/configuration.h" -#include +#endif #include #include #include #include #include #include +#include #include "support/thread.h" #include "cuefile.h" #if defined Q_OS_LINUX && defined QT_QTDBUS_FOUND @@ -64,7 +67,7 @@ void MPDConnection::enableDebug() static const int constSocketCommsTimeout=2000; static const int constMaxReadAttempts=4; static int maxFilesPerAddCommand=10000; -static bool alwaysUseLsInfo=false; +static bool alwaysUseLsInfo=true; static int seekStep=5; static const QByteArray constOkValue("OK"); @@ -107,7 +110,8 @@ static QByteArray log(const QByteArray &data) GLOBAL_STATIC(MPDConnection, instance) QString MPDConnection::constModifiedSince=QLatin1String("modified-since"); -const int MPDConnection::constMaxPqChaanges=1000; +const int MPDConnection::constMaxPqChanges=1000; +const QString MPDConnection::constStreamsPlayListName=QLatin1String("[Radio Streams]"); QByteArray MPDConnection::quote(int val) { @@ -243,6 +247,7 @@ MPDConnection::MPDConnection() , fadeDuration(0) , restoreVolume(-1) { + qRegisterMetaType("time_t"); qRegisterMetaType("Song"); qRegisterMetaType("Output"); qRegisterMetaType("Playlist"); @@ -263,7 +268,7 @@ MPDConnection::MPDConnection() #if (defined Q_OS_LINUX && defined QT_QTDBUS_FOUND) || (defined Q_OS_MAC && defined IOKIT_FOUND) connect(PowerManagement::self(), SIGNAL(resuming()), this, SLOT(reconnect())); #endif - #ifndef ENABLE_UBUNTU + #if !defined ENABLE_UBUNTU && !defined CANTATA_WEB Configuration cfg; maxFilesPerAddCommand=cfg.get("mpdListSize", 10000, 100, 65535); alwaysUseLsInfo=cfg.get("alwaysUseLsInfo", true); @@ -564,7 +569,12 @@ void MPDConnection::setDetails(const MPDConnectionDetails &d) emit stateChanged(true); break; default: + #ifdef CANTATA_WEB + qWarning() << "Could not connect to MPD" << details.hostname << details.port; + ::exit(-1); + #else emit error(errorString(status), true); + #endif } } else if (diffName) { emit stateChanged(true); @@ -907,7 +917,7 @@ void MPDConnection::setOrder(const QList &items) // If there are more than X changes made to the playqueue, then doing partial updates // can hang the UI. Therefore, set lastUpdatePlayQueueVersion to 0 to cause playlistInfo // to be used to do a complete update. - if (sendCommand(send).ok && numChanges>constMaxPqChaanges) { + if (sendCommand(send).ok && numChanges>constMaxPqChanges) { lastUpdatePlayQueueVersion=0; } } @@ -958,7 +968,7 @@ void MPDConnection::playListChanges() emitStatusUpdated(sv); QList changes=MPDParseUtils::parseChanges(response.data); if (!changes.isEmpty()) { - if (changes.count()>constMaxPqChaanges) { + if (changes.count()>constMaxPqChanges) { playListInfo(); return; } @@ -1059,9 +1069,10 @@ void MPDConnection::playListChanges() void MPDConnection::playListInfo() { Response response=sendCommand("playlistinfo"); + QList songs; if (response.ok) { lastUpdatePlayQueueVersion=lastStatusPlayQueueVersion; - QList songs=MPDParseUtils::parseSongs(response.data, MPDParseUtils::Loc_PlayQueue); + songs=MPDParseUtils::parseSongs(response.data, MPDParseUtils::Loc_PlayQueue); playQueueIds.clear(); streamIds.clear(); @@ -1079,7 +1090,6 @@ void MPDConnection::playListInfo() } } emit cantataStreams(cStreams, false); - emit playlistUpdated(songs, true); if (songs.isEmpty()) { stopVolumeFade(); } @@ -1090,6 +1100,7 @@ void MPDConnection::playListInfo() emitStatusUpdated(sv); } } + emit playlistUpdated(songs, true); } /* @@ -1287,7 +1298,7 @@ void MPDConnection::getStats() MPDStatsValues stats=MPDParseUtils::parseStats(response.data); dbUpdate=stats.dbUpdate; mopidy=0==stats.artists && 0==stats.albums && 0==stats.songs && - 0==stats.uptime && 0==stats.playtime && 0==stats.dbPlaytime && 0==dbUpdate.toTime_t(); + 0==stats.uptime && 0==stats.playtime && 0==stats.dbPlaytime && 0==dbUpdate; emit statsUpdated(stats); } } @@ -1423,6 +1434,7 @@ void MPDConnection::parseIdleReturn(const QByteArray &data) getStatus(); } else if (constIdleStoredPlaylistValue==value) { listPlaylists(); + listStreams(); } else if (constIdlePlaylistValue==value) { if (!playListUpdated) { playListChanges(); @@ -1488,7 +1500,10 @@ void MPDConnection::update() */ void MPDConnection::loadLibrary() { - emit updatingLibrary(); + emit updatingLibrary(dbUpdate); + #ifdef CANTATA_WEB + listDirInfo(details.topLevel.isEmpty() ? "/" : details.topLevel); + #else Response response=alwaysUseLsInfo || !details.topLevel.isEmpty() ? Response(false) : sendCommand("listallinfo", false); MusicLibraryItemRoot *root=0; if (response.ok) { @@ -1506,9 +1521,11 @@ void MPDConnection::loadLibrary() root->applyGrouping(); emit musicLibraryUpdated(root, dbUpdate); } + #endif emit updatedLibrary(); } +#ifndef CANTATA_WEB void MPDConnection::loadFolders() { emit updatingFileList(); @@ -1518,6 +1535,7 @@ void MPDConnection::loadFolders() } emit updatedFileList(); } +#endif /* * Playlists commands @@ -1533,7 +1551,9 @@ void MPDConnection::listPlaylists() { Response response=sendCommand("listplaylists"); if (response.ok) { - emit playlistsRetrieved(MPDParseUtils::parsePlaylists(response.data)); + QList playlists=MPDParseUtils::parsePlaylists(response.data); + playlists.removeAll((Playlist(constStreamsPlayListName))); + emit playlistsRetrieved(playlists); } } @@ -1708,21 +1728,20 @@ void MPDConnection::search(const QString &field, const QString &value, int id) void MPDConnection::listStreams() { - Response response=sendCommand("listplaylistinfo "+encodeName(StreamsModel::constPlayListName)); + Response response=sendCommand("listplaylistinfo "+encodeName(constStreamsPlayListName)); + QList streams; if (response.ok) { QList songs=MPDParseUtils::parseSongs(response.data, MPDParseUtils::Loc_Streams); - QList streams; foreach (const Song &song, songs) { streams.append(Stream(song.file, song.name())); - } - - emit streamList(streams); + } } + emit streamList(streams); } void MPDConnection::saveStream(const QString &url, const QString &name) { - if (sendCommand("playlistadd "+encodeName(StreamsModel::constPlayListName)+" "+encodeName(MPDParseUtils::addStreamName(url, name))).ok) { + if (sendCommand("playlistadd "+encodeName(constStreamsPlayListName)+" "+encodeName(MPDParseUtils::addStreamName(url, name))).ok) { emit savedStream(url, name); } } @@ -1733,7 +1752,7 @@ void MPDConnection::removeStreams(const QList &positions) return; } - QByteArray encodedName=encodeName(StreamsModel::constPlayListName); + QByteArray encodedName=encodeName(constStreamsPlayListName); QList sorted=positions; QList removed; @@ -1752,14 +1771,12 @@ void MPDConnection::removeStreams(const QList &positions) } } - if (removed.count()) { - emit removedStreams(removed); - } + emit removedStreams(removed); } void MPDConnection::editStream(const QString &url, const QString &name, quint32 position) { - QByteArray encodedName=encodeName(StreamsModel::constPlayListName); + QByteArray encodedName=encodeName(constStreamsPlayListName); if (sendCommand("playlistdelete "+encodedName+" "+quote(position)).ok && sendCommand("playlistadd "+encodedName+" "+encodeName(MPDParseUtils::addStreamName(url, name))).ok) { // emit editedStream(url, name, position); @@ -1871,6 +1888,27 @@ void MPDConnection::toggleStopAfterCurrent(bool afterCurrent) } } +#ifdef CANTATA_WEB +bool MPDConnection::listDirInfo(const QString &dir) +{ + bool topLevel="/"==dir; + Response response=sendCommand(topLevel ? "lsinfo" : ("lsinfo "+encodeName(dir))); + if (response.ok) { + QSet childDirs; + QList *songs=new QList(); + MPDParseUtils::parseLibraryItems(response.data, *songs, !topLevel, &childDirs); + emit librarySongs(songs); + foreach (const QString &child, childDirs) { + if (!listDirInfo(child)) { + return false; + } + } + return true; + } else { + return false; + } +} +#else bool MPDConnection::listDirInfo(const QString &dir, MusicLibraryItemRoot *root) { bool topLevel="/"==dir; @@ -1888,6 +1926,7 @@ bool MPDConnection::listDirInfo(const QString &dir, MusicLibraryItemRoot *root) return false; } } +#endif #ifdef ENABLE_DYNAMIC bool MPDConnection::checkRemoteDynamicSupport() diff --git a/mpd-interface/mpdconnection.h b/mpd-interface/mpdconnection.h index ef9259006..5d4419bfd 100644 --- a/mpd-interface/mpdconnection.h +++ b/mpd-interface/mpdconnection.h @@ -31,7 +31,6 @@ #include #include #include -#include #include #include #include "mpdstats.h" @@ -43,9 +42,11 @@ #include "config.h" #include +#ifndef CANTATA_WEB class MusicLibraryItemArtist; class DirViewItemRoot; class MusicLibraryItemRoot; +#endif class QTimer; class Thread; class QPropertyAnimation; @@ -189,7 +190,9 @@ public: }; static QString constModifiedSince; - static const int constMaxPqChaanges; + static const int constMaxPqChanges; + static const QString constStreamsPlayListName; + static MPDConnection * self(); static QByteArray quote(int val); static QByteArray encodeName(const QString &name); @@ -284,7 +287,9 @@ public Q_SLOTS: // Database void loadLibrary(); + #ifndef CANTATA_WEB void loadFolders(); + #endif // Admin void update(); @@ -330,8 +335,12 @@ Q_SIGNALS: void statsUpdated(const MPDStatsValues &stats); void statusUpdated(const MPDStatusValues &status); void outputsUpdated(const QList &outputs); - void musicLibraryUpdated(MusicLibraryItemRoot *root, QDateTime dbUpdate); - void dirViewUpdated(DirViewItemRoot *root, QDateTime dbUpdate); + #ifdef CANTATA_WEB + void librarySongs(QList *songs); + #else + void musicLibraryUpdated(MusicLibraryItemRoot *root, time_t dbUpdate); + void dirViewUpdated(DirViewItemRoot *root, time_t dbUpdate); + #endif void playlistsRetrieved(const QList &data); void playlistInfoRetrieved(const QString &name, const QList &songs); void playlistRenamed(const QString &from, const QString &to); @@ -342,7 +351,7 @@ Q_SIGNALS: void playlistLoaded(const QString &playlist); void added(const QStringList &files); void replayGain(const QString &); - void updatingLibrary(); + void updatingLibrary(time_t dbUpdate); void updatedLibrary(); void updatingFileList(); void updatedFileList(); @@ -396,7 +405,11 @@ private: void parseIdleReturn(const QByteArray &data); bool doMoveInPlaylist(const QString &name, const QList &items, quint32 pos, quint32 size); void toggleStopAfterCurrent(bool afterCurrent); + #ifdef CANTATA_WEB + bool listDirInfo(const QString &dir); + #else bool listDirInfo(const QString &dir, MusicLibraryItemRoot *root); + #endif #ifdef ENABLE_DYNAMIC bool checkRemoteDynamicSupport(); bool subscribe(const QByteArray &channel); @@ -420,7 +433,7 @@ private: QSet tagTypes; bool canUseStickers; MPDConnectionDetails details; - QDateTime dbUpdate; + time_t dbUpdate; // Use 2 sockets, 1 for commands and 1 to receive MPD idle events. // Cant use 1, as we could write a command just as an idle event is ready to read MpdSocket sock; diff --git a/mpd-interface/mpdparseutils.cpp b/mpd-interface/mpdparseutils.cpp index f3940fede..feb24dac2 100644 --- a/mpd-interface/mpdparseutils.cpp +++ b/mpd-interface/mpdparseutils.cpp @@ -29,6 +29,7 @@ #include #include #include +#ifndef CANTATA_WEB #include "models/dirviewitemroot.h" #include "models/dirviewitemdir.h" #include "models/dirviewitemfile.h" @@ -36,13 +37,13 @@ #include "models/musiclibraryitemalbum.h" #include "models/musiclibraryitemsong.h" #include "models/musiclibraryitemroot.h" +#endif #include "mpdparseutils.h" #include "mpdstatus.h" #include "mpdstats.h" #include "playlist.h" #include "song.h" #include "output.h" -#include "gui/covers.h" #ifdef ENABLE_HTTP_SERVER #include "http/httpserver.h" #endif @@ -177,7 +178,7 @@ MPDStatsValues MPDParseUtils::parseStats(const QByteArray &data) } else if (line.startsWith(constStatsDbPlaytimeKey)) { v.dbPlaytime=line.mid(constStatsDbPlaytimeKey.length()).toUInt(); } else if (line.startsWith(constStatsDbUpdateKey)) { - v.dbUpdate.setTime_t(line.mid(constStatsDbUpdateKey.length()).toUInt()); + v.dbUpdate=line.mid(constStatsDbUpdateKey.length()).toUInt(); } } return v; @@ -539,6 +540,37 @@ void MPDParseUtils::setGroupSingle(bool g) groupSingleTracks=g; } +#ifdef CANTATA_WEB +void MPDParseUtils::parseLibraryItems(const QByteArray &data, QList &songs, bool parsePlaylists, QSet *childDirs) +{ + QList currentItem; + QList lines = data.split('\n'); + int amountOfLines = lines.size(); + + for (int i = 0; i < amountOfLines; i++) { + const QByteArray &line=lines.at(i); + if (childDirs && line.startsWith(constDirectoryKey)) { + childDirs->insert(QString::fromUtf8(line.mid(constDirectoryKey.length()))); + } + currentItem.append(line); + if (i == amountOfLines - 1 || lines.at(i + 1).startsWith(constFileKey) || lines.at(i + 1).startsWith(constPlaylistKey)) { + Song currentSong = parseSong(currentItem, Loc_Library); + currentItem.clear(); + if (currentSong.file.isEmpty()) { + continue; + } + + // lsinfo / will return all stored playlists - but this is deprecated. + if (Song::Playlist==currentSong.type&& !parsePlaylists) { + continue; + } + + currentSong.fillEmptyFields(); + songs.append(currentSong); + } + } +} +#else void MPDParseUtils::parseLibraryItems(const QByteArray &data, const QString &mpdDir, long mpdVersion, bool isMopidy, MusicLibraryItemRoot *rootItem, bool parsePlaylists, QSet *childDirs) @@ -793,6 +825,7 @@ DirViewItemRoot * MPDParseUtils::parseDirViewItems(const QByteArray &data, bool return rootItem; } +#endif QList MPDParseUtils::parseOuputs(const QByteArray &data) { diff --git a/mpd-interface/mpdparseutils.h b/mpd-interface/mpdparseutils.h index 9979a0a4d..31e927497 100644 --- a/mpd-interface/mpdparseutils.h +++ b/mpd-interface/mpdparseutils.h @@ -30,14 +30,17 @@ #include #include #include "config.h" - +#ifdef CANTATA_WEB +#include "song.h" +#else struct Song; +class DirViewItemRoot; +class MusicLibraryItemRoot; +#endif struct Playlist; struct Output; struct MPDStatsValues; struct MPDStatusValues; -class DirViewItemRoot; -class MusicLibraryItemRoot; namespace MPDParseUtils { @@ -74,10 +77,14 @@ namespace MPDParseUtils #endif extern bool groupSingle(); extern void setGroupSingle(bool g); + #ifdef CANTATA_WEB + extern void parseLibraryItems(const QByteArray &data, QList &songs, bool parsePlaylists=true, QSet *childDirs=0); + #else extern void parseLibraryItems(const QByteArray &data, const QString &mpdDir, long mpdVersion, bool isMopidy, MusicLibraryItemRoot *rootItem, bool parsePlaylists=true, QSet *childDirs=0); extern DirViewItemRoot * parseDirViewItems(const QByteArray &data, bool isMopidy); + #endif extern QList parseOuputs(const QByteArray &data); extern QByteArray parseSticker(const QByteArray &data, const QByteArray &sticker); extern QString addStreamName(const QString &url, const QString &name); diff --git a/mpd-interface/mpdstats.h b/mpd-interface/mpdstats.h index 5ecd1f473..b28ac18fd 100644 --- a/mpd-interface/mpdstats.h +++ b/mpd-interface/mpdstats.h @@ -29,6 +29,7 @@ #include #include +#include struct MPDStatsValues { @@ -46,7 +47,7 @@ struct MPDStatsValues quint32 uptime; quint32 playtime; quint32 dbPlaytime; - QDateTime dbUpdate; + time_t dbUpdate; }; class MPDStats : public QObject @@ -63,7 +64,7 @@ public: quint32 uptime() const { return values.uptime; } quint32 playtime() const { return values.playtime; } quint32 dbPlaytime() const { return values.dbPlaytime; } - const QDateTime & dbUpdate() const { return values.dbUpdate; } + time_t dbUpdate() const { return values.dbUpdate; } public Q_SLOTS: void update(const MPDStatsValues &v); diff --git a/mpd-interface/song.cpp b/mpd-interface/song.cpp index d74d35482..3d41ec54f 100644 --- a/mpd-interface/song.cpp +++ b/mpd-interface/song.cpp @@ -27,7 +27,6 @@ #include #include "config.h" #include "song.h" -#include "models/musiclibraryitemalbum.h" #include "support/localize.h" #if !defined CANTATA_NO_UI_FUNCTIONS && defined ENABLE_ONLINE_SERVICES #include "online/onlineservice.h" @@ -367,11 +366,11 @@ QString Song::combineGenres(const QSet &genres) return g; } -void Song::setKey(int location) +quint16 Song::setKey(int location) { if (isStandardStream()) { key=0; - return; + return 0; } KeyStore &store=storeMap[location]; @@ -384,6 +383,7 @@ void Song::setKey(int location) store.keys.insert(songKey, store.currentKey); key=store.currentKey; } + return key; } bool Song::isUnknown() const diff --git a/mpd-interface/song.h b/mpd-interface/song.h index 1b6e0eaf0..e82f97b31 100644 --- a/mpd-interface/song.h +++ b/mpd-interface/song.h @@ -134,7 +134,7 @@ struct Song void guessTags(); void revertGuessedTags(); void fillEmptyFields(); - void setKey(int location); + quint16 setKey(int location); virtual void clear(); void addGenre(const QString &g); QStringList genres() const; diff --git a/network/networkaccessmanager.cpp b/network/networkaccessmanager.cpp index cf5fdb15c..6c7a9b736 100644 --- a/network/networkaccessmanager.cpp +++ b/network/networkaccessmanager.cpp @@ -23,12 +23,15 @@ #include "networkaccessmanager.h" #include "networkproxyfactory.h" +#if !defined ENABLE_UBUNTU && !defined CANTATA_WEB #include "gui/settings.h" +#endif #include "config.h" #include "support/globalstatic.h" #include #include #include +#include #include static bool debugEnabled=false; @@ -175,7 +178,7 @@ GLOBAL_STATIC(NetworkAccessManager, instance) NetworkAccessManager::NetworkAccessManager(QObject *parent) : BASE_NETWORK_ACCESS_MANAGER(parent) { - #ifdef ENABLE_UBUNTU + #if defined ENABLE_UBUNTU || defined CANTATA_WEB enabled=true; #else enabled=Settings::self()->networkAccessEnabled(); diff --git a/online/onlineservice.cpp b/online/onlineservice.cpp index f6e35a87c..d5f6d2237 100644 --- a/online/onlineservice.cpp +++ b/online/onlineservice.cpp @@ -95,7 +95,7 @@ bool OnlineMusicLoader::readFromCache() { if (!cache.isEmpty() && QFile::exists(cache)) { emit status(i18n("Reading cache"), 0); - if (library->fromXML(cache, QDateTime(), 0, QString(), this)) { + if (library->fromXML(cache, 0, 0, QString(), this)) { if (!stopRequested) { fixLibrary(); emit status(i18n("Updating display"), -100); @@ -138,7 +138,7 @@ void OnlineMusicLoader::downloadFinished() if (parse(reader)) { fixLibrary(); emit status(i18n("Saving cache"), 0); - library->toXML(cache, QDateTime(), false, this); + library->toXML(cache, 0, false, this); emit loaded(); } else { emit error(i18n("Failed to parse"));