/* * Cantata * * Copyright (c) 2011-2012 Craig Drummond * */ /* * Copyright (c) 2008 Sander Knopper (sander AT knopper DOT tk) and * Roeland Douma (roeland AT rullzer DOT com) * * This file is part of QtMPC. * * QtMPC is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * QtMPC is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with QtMPC. If not, see . */ #include #include "song.h" #include "mpdparseutils.h" #include "musiclibraryitemalbum.h" #ifdef ENABLE_KDE_SUPPORT #include #else #include #endif #include #include const quint16 Song::constNullKey(0xFFFF); Song::Song() : id(-1), time(0), track(0), pos(0), disc(0), year(0), size(0), key(constNullKey) { } Song & Song::operator=(const Song &s) { id = s.id; file = s.file; time = s.time; album = s.album; artist = s.artist; albumartist = s.albumartist; title = s.title; modifiedtitle = s.modifiedtitle; track = s.track; pos = s.pos; disc = s.disc; year = s.year; genre = s.genre; name = s.name; size = s.size; key = s.key; return *this; } bool Song::operator==(const Song &o) const { // When transfferring off an MPT device we will not have AlbumArtist, as libMTP does not handle this. // But, MPD does, so if the labum artist is different - then treat as a new file. // TODO: ALBUMARTIST: This check can be removed when libMTP supports album artist. return file == o.file && albumartist==o.albumartist; } bool Song::operator<(const Song &o) const { bool sortDateBeforeAlbum=MusicLibraryItemAlbum::showDate(); int compare=albumArtist().localeAwareCompare(o.albumArtist()); if (0!=compare) { return compare<0; } if (sortDateBeforeAlbum && year!=o.year) { return yearconstHour) { return MPDParseUtils::formatDuration(seconds); } QString result(QString::number(floor(seconds / 60.0))+QChar(':')); if (seconds % 60 < 10) { result += "0"; } return result+QString::number(seconds % 60); } /* * Genarate a string with song info. * Currently in this format: * artist - [album -][#.] song */ QString Song::format() { QString s = artist + " - "; if (!album.isEmpty()) { s += album + " - "; } if (track != 0) { s += QString::number(track) + ". "; } s += title; return s; } QString Song::entryName() const { if (title.isEmpty()) { return file; } #ifdef ENABLE_KDE_SUPPORT return i18nc("Song\nArtist\nAlbum", "%1\n%2\n%3", title, artist, album); #else return QObject::tr("%1\n%2\n%3").arg(title).arg(artist).arg(album); #endif } QString Song::artistSong() const { return artist+QLatin1String(" - ")+title; } QString Song::trackAndTitleStr(bool addArtist) const { return (track>9 ? QString::number(track) : (QChar('0')+QString::number(track))) +QChar(' ')+(addArtist ? artistSong() : title); } void Song::updateSize(const QString &dir) const { if (size<=0) { size=QFileInfo(dir+file).size(); } } bool Song::isVariousArtists(const QString &str) { return QLatin1String("Various Artists")==str || #ifdef ENABLE_KDE_SUPPORT i18n("Various Artists")==str #else QObject::tr("Various Artists")==str #endif ; } bool Song::fixVariousArtists() { if (isVariousArtists()) { artist.replace(" - ", ", "); title=artistSong(); artist=albumartist; return true; } return false; } bool Song::revertVariousArtists() { if (artist==albumartist) { // Then real artist is embedded in track title... int sepPos=title.indexOf(QLatin1String(" - ")); if (sepPos>0 && sepPos