From 8995a80be8644e5f3657b3f588450b9c5b6de919 Mon Sep 17 00:00:00 2001 From: "craig.p.drummond" Date: Thu, 14 Mar 2013 19:50:59 +0000 Subject: [PATCH] - Group cd tracks under 'Audio CD' in grouped view. - Add isCdda() to Song --- devices/audiocddevice.cpp | 6 +++--- gui/coverdialog.cpp | 2 +- gui/covers.cpp | 2 +- http/httpserver.cpp | 2 +- http/httpsocket.cpp | 2 +- mpd/song.cpp | 7 +++++++ mpd/song.h | 2 ++ widgets/coverwidget.cpp | 4 ++-- widgets/groupedview.cpp | 5 +++-- 9 files changed, 21 insertions(+), 11 deletions(-) diff --git a/devices/audiocddevice.cpp b/devices/audiocddevice.cpp index 07b31d964..e60417200 100644 --- a/devices/audiocddevice.cpp +++ b/devices/audiocddevice.cpp @@ -44,7 +44,7 @@ QString AudioCdDevice::coverUrl(QString udi) udi.replace("\t", "_"); udi.replace("/", "_"); udi.replace(":", "_"); - return QLatin1String("cdda://")+udi; + return Song::constCddaProtocol+udi; } AudioCdDevice::AudioCdDevice(DevicesModel *m, Solid::Device &dev) @@ -69,7 +69,7 @@ AudioCdDevice::AudioCdDevice(DevicesModel *m, Solid::Device &dev) qRegisterMetaType >("QList"); registeredTypes=true; } - devPath=QLatin1String("cdda:/")+block->device()+QChar('/'); + devPath=Song::constCddaProtocol+block->device()+QChar('/'); #if defined CDDB_FOUND && defined MUSICBRAINZ5_FOUND connectService(Settings::self()->useCddb()); #else @@ -308,7 +308,7 @@ void AudioCdDevice::cdMatches(const QList &albums) void AudioCdDevice::setCover(const Song &song, const QImage &img, const QString &file) { - if (song.file.startsWith("cdda://") && song.artist==artist && song.album==album) { + if (song.isCdda() && song.artist==artist && song.album==album) { coverImage=Covers::Image(img, file); updateStatus(); } diff --git a/gui/coverdialog.cpp b/gui/coverdialog.cpp index db8ea6c91..00b12a171 100644 --- a/gui/coverdialog.cpp +++ b/gui/coverdialog.cpp @@ -1126,7 +1126,7 @@ void CoverDialog::slotButtonClicked(int button) bool CoverDialog::saveCover(const QString &src, const QImage &img) { - if (song.file.startsWith("cdda://")) { + if (song.isCdda()) { QString dir = Utils::cacheDir(Covers::constCddaCoverDir, true); if (!dir.isEmpty()) { QString destName=dir+song.file.mid(7)+src.mid(src.length()-4); diff --git a/gui/covers.cpp b/gui/covers.cpp index ee15db258..034130061 100644 --- a/gui/covers.cpp +++ b/gui/covers.cpp @@ -947,7 +947,7 @@ QString Covers::saveImg(const Job &job, const QImage &img, const QByteArray &raw QString extension=mimeType.isEmpty() ? constExtensions.at(0) : mimeType; QString savedName; - if (job.song.file.startsWith(("cdda://"))) { + if (job.song.isCdda()) { QString dir = Utils::cacheDir(constCddaCoverDir, true); if (!dir.isEmpty()) { savedName=save(mimeType, extension, dir+job.song.file.mid(7), img, raw); diff --git a/http/httpserver.cpp b/http/httpserver.cpp index 67e527ebc..d12971b76 100644 --- a/http/httpserver.cpp +++ b/http/httpserver.cpp @@ -211,7 +211,7 @@ Song HttpServer::decodeUrl(const QUrl &url) const } s.file=url.path(); #if defined CDDB_FOUND || defined MUSICBRAINZ5_FOUND - if (s.file.startsWith("/cdda:/")) { + if (s.file.startsWith(QChar('/')+Song::constCddaProtocol)) { s.file=s.file.mid(1); } #endif diff --git a/http/httpsocket.cpp b/http/httpsocket.cpp index 6b056973e..b50c8fdda 100644 --- a/http/httpsocket.cpp +++ b/http/httpsocket.cpp @@ -255,7 +255,7 @@ void HttpSocket::readClient() if (q.hasQueryItem("cantata")) { Song song=HttpServer::self()->decodeUrl(url); - if (song.file.startsWith(QLatin1String("cdda:/"))) { + if (song.isCdda()) { #if defined CDDB_FOUND || defined MUSICBRAINZ5_FOUND QStringList parts=song.file.split("/", QString::SkipEmptyParts); if (parts.length()>=3) { diff --git a/mpd/song.cpp b/mpd/song.cpp index 25dce6a29..c6c1887bb 100644 --- a/mpd/song.cpp +++ b/mpd/song.cpp @@ -37,6 +37,8 @@ #include #include +const QString Song::constCddaProtocol("cdda:/"); + // When displaying albums, we use the 1st track's year as the year of the album. // The map below stores the mapping from artist+album to year. // This way the grouped view can find this quickly... @@ -401,3 +403,8 @@ bool Song::isCantataStream() const return false; #endif } + +bool Song::isCdda() const +{ + return !file.isEmpty() && file.contains(constCddaProtocol); +} diff --git a/mpd/song.h b/mpd/song.h index 742d5c5ac..1d292091b 100644 --- a/mpd/song.h +++ b/mpd/song.h @@ -64,6 +64,7 @@ struct Song // Only used in PlayQueue/PlayLists... quint16 key; + static const QString constCddaProtocol; static void storeAlbumYear(const Song &s); static int albumYear(const Song &s); @@ -98,6 +99,7 @@ struct Song bool capitalise(); bool isStream() const { return /*file.isEmpty() || */file.contains("://"); } bool isCantataStream() const; + bool isCdda() const; QString albumKey() const { return albumArtist()+QChar(':')+album; } }; diff --git a/widgets/coverwidget.cpp b/widgets/coverwidget.cpp index 4a48e852a..5984702d1 100644 --- a/widgets/coverwidget.cpp +++ b/widgets/coverwidget.cpp @@ -111,7 +111,7 @@ void CoverWidget::update(const Song &s) } else { valid=false; coverFileName=QString(); - update(stdPixmap(current.isStream())); + update(stdPixmap(current.isStream() && !current.isCdda())); emit coverImage(QImage()); emit coverFile(QString()); } @@ -133,7 +133,7 @@ void CoverWidget::coverRetreived(const Song &s, const QImage &img, const QString emit coverImage(img); emit coverFile(file); } else { - update(stdPixmap(current.isStream())); + update(stdPixmap(current.isStream() && !current.isCdda())); coverFileName=QString(); emit coverImage(QImage()); emit coverFile(QString()); diff --git a/widgets/groupedview.cpp b/widgets/groupedview.cpp index b0985f574..d96700fb8 100644 --- a/widgets/groupedview.cpp +++ b/widgets/groupedview.cpp @@ -205,6 +205,7 @@ public: QString track; QString duration=song.time>0 ? Song::formattedTime(song.time) : QString(); bool stream=!isCollection && (song.isStream() && !song.isCantataStream()); + bool audiocd=stream && song.isCdda(); bool isEmpty=song.title.isEmpty() & song.artist.isEmpty() && !song.file.isEmpty(); QString trackTitle=isEmpty ? song.file @@ -222,7 +223,7 @@ public: title=index.data(Qt::DisplayRole).toString(); } else if (AlbumHeader==type) { if (stream) { - title=i18n("Streams"); + title=audiocd ? i18n("Audio CD") : i18n("Streams"); if (song.album.isEmpty() && song.albumArtist().isEmpty()) { track=song.title.isEmpty() && song.name.isEmpty() ? song.file : (song.name.isEmpty() ? song.title : QString("%1 (%2)").arg(song.title).arg(song.name)); } else if (!song.title.isEmpty() && !song.artist.isEmpty()) { @@ -296,7 +297,7 @@ public: pix=index.data(Qt::DecorationRole).value().pixmap(constCoverSize, constCoverSize); } else { QPixmap *cover=stream ? 0 : Covers::self()->get(song, constCoverSize); - pix=cover ? *cover : (stream ? Icons::streamIcon : Icons::albumIcon).pixmap(constCoverSize, constCoverSize); + pix=cover ? *cover : (stream && !audiocd ? Icons::streamIcon : Icons::albumIcon).pixmap(constCoverSize, constCoverSize); } if (rtl) {