Remove the <xiphcomment.h> include from song.h so that windows headers don't infect everything else. Also move other bits of song.h into song.cpp, and reduce the number of includes in song.h.
This commit is contained in:
parent
7542949e2b
commit
b873209d39
@ -377,14 +377,12 @@ set(HEADERS
|
|||||||
globalsearch/groovesharksearchprovider.h
|
globalsearch/groovesharksearchprovider.h
|
||||||
globalsearch/searchprovider.h
|
globalsearch/searchprovider.h
|
||||||
globalsearch/simplesearchprovider.h
|
globalsearch/simplesearchprovider.h
|
||||||
globalsearch/somafmsearchprovider.h
|
|
||||||
globalsearch/tooltipactionwidget.h
|
globalsearch/tooltipactionwidget.h
|
||||||
globalsearch/tooltipresultwidget.h
|
globalsearch/tooltipresultwidget.h
|
||||||
|
|
||||||
internet/digitallyimportedclient.h
|
internet/digitallyimportedclient.h
|
||||||
internet/digitallyimportedservicebase.h
|
internet/digitallyimportedservicebase.h
|
||||||
internet/digitallyimportedsettingspage.h
|
internet/digitallyimportedsettingspage.h
|
||||||
internet/groovesharksearchplaylisttype.h
|
|
||||||
internet/groovesharkservice.h
|
internet/groovesharkservice.h
|
||||||
internet/groovesharksettingspage.h
|
internet/groovesharksettingspage.h
|
||||||
internet/groovesharkurlhandler.h
|
internet/groovesharkurlhandler.h
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
#include <QStringList>
|
#include <QStringList>
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
#include <QThread>
|
#include <QThread>
|
||||||
|
#include <QUrl>
|
||||||
|
|
||||||
const int DeleteFiles::kBatchSize = 50;
|
const int DeleteFiles::kBatchSize = 50;
|
||||||
|
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
|
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
#include <QFile>
|
#include <QFile>
|
||||||
|
#include <QUrl>
|
||||||
|
|
||||||
FilesystemMusicStorage::FilesystemMusicStorage(const QString& root)
|
FilesystemMusicStorage::FilesystemMusicStorage(const QString& root)
|
||||||
: root_(root)
|
: root_(root)
|
||||||
|
@ -24,6 +24,7 @@
|
|||||||
#include "core/mpris2_root.h"
|
#include "core/mpris2_root.h"
|
||||||
#include "core/mpris2_tracklist.h"
|
#include "core/mpris2_tracklist.h"
|
||||||
#include "core/player.h"
|
#include "core/player.h"
|
||||||
|
#include "core/timeconstants.h"
|
||||||
#include "covers/artloader.h"
|
#include "covers/artloader.h"
|
||||||
#include "engines/enginebase.h"
|
#include "engines/enginebase.h"
|
||||||
#include "playlist/playlist.h"
|
#include "playlist/playlist.h"
|
||||||
|
@ -24,6 +24,7 @@
|
|||||||
#include <QFileInfo>
|
#include <QFileInfo>
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
#include <QThread>
|
#include <QThread>
|
||||||
|
#include <QUrl>
|
||||||
|
|
||||||
#include <boost/bind.hpp>
|
#include <boost/bind.hpp>
|
||||||
|
|
||||||
|
@ -16,9 +16,11 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "organiseformat.h"
|
#include "organiseformat.h"
|
||||||
|
#include "core/timeconstants.h"
|
||||||
|
|
||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
#include <QPalette>
|
#include <QPalette>
|
||||||
|
#include <QUrl>
|
||||||
|
|
||||||
const char* OrganiseFormat::kTagPattern = "\\%([a-zA-Z]*)";
|
const char* OrganiseFormat::kTagPattern = "\\%([a-zA-Z]*)";
|
||||||
const char* OrganiseFormat::kBlockPattern = "\\{([^{}]+)\\}";
|
const char* OrganiseFormat::kBlockPattern = "\\{([^{}]+)\\}";
|
||||||
|
@ -16,9 +16,10 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "fmpsparser.h"
|
#include "fmpsparser.h"
|
||||||
|
#include "logging.h"
|
||||||
|
#include "mpris_common.h"
|
||||||
#include "song.h"
|
#include "song.h"
|
||||||
#include "core/logging.h"
|
#include "timeconstants.h"
|
||||||
#include "core/mpris_common.h"
|
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
@ -54,17 +55,26 @@
|
|||||||
#include <QFile>
|
#include <QFile>
|
||||||
#include <QFileInfo>
|
#include <QFileInfo>
|
||||||
#include <QLatin1Literal>
|
#include <QLatin1Literal>
|
||||||
|
#include <QSharedData>
|
||||||
#include <QSqlQuery>
|
#include <QSqlQuery>
|
||||||
#include <QtConcurrentRun>
|
|
||||||
#include <QTextCodec>
|
#include <QTextCodec>
|
||||||
#include <QTime>
|
#include <QTime>
|
||||||
#include <QVariant>
|
#include <QVariant>
|
||||||
|
#include <QtConcurrentRun>
|
||||||
|
|
||||||
#ifdef Q_OS_WIN32
|
#ifdef Q_OS_WIN32
|
||||||
# include <mswmdm.h>
|
# include <mswmdm.h>
|
||||||
# include <QUuid>
|
# include <QUuid>
|
||||||
#endif // Q_OS_WIN32
|
#endif // Q_OS_WIN32
|
||||||
|
|
||||||
|
#ifdef HAVE_LIBGPOD
|
||||||
|
# include <gpod/itdb.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_LIBMTP
|
||||||
|
# include <libmtp.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <boost/scoped_array.hpp>
|
#include <boost/scoped_array.hpp>
|
||||||
#include <boost/scoped_ptr.hpp>
|
#include <boost/scoped_ptr.hpp>
|
||||||
using boost::scoped_ptr;
|
using boost::scoped_ptr;
|
||||||
@ -83,20 +93,29 @@ using boost::scoped_ptr;
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
static QStringList Prepend(const QString& text, const QStringList& list) {
|
namespace {
|
||||||
|
|
||||||
|
QStringList Prepend(const QString& text, const QStringList& list) {
|
||||||
QStringList ret(list);
|
QStringList ret(list);
|
||||||
for (int i=0 ; i<ret.count() ; ++i)
|
for (int i=0 ; i<ret.count() ; ++i)
|
||||||
ret[i].prepend(text);
|
ret[i].prepend(text);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static QStringList Updateify(const QStringList& list) {
|
QStringList Updateify(const QStringList& list) {
|
||||||
QStringList ret(list);
|
QStringList ret(list);
|
||||||
for (int i=0 ; i<ret.count() ; ++i)
|
for (int i=0 ; i<ret.count() ; ++i)
|
||||||
ret[i].prepend(ret[i] + " = :");
|
ret[i].prepend(ret[i] + " = :");
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TagLib::String QStringToTaglibString(const QString& s) {
|
||||||
|
return TagLib::String(s.toUtf8().constData(), TagLib::String::UTF8);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
|
||||||
const QStringList Song::kColumns = QStringList()
|
const QStringList Song::kColumns = QStringList()
|
||||||
<< "title" << "album" << "artist" << "albumartist" << "composer" << "track"
|
<< "title" << "album" << "artist" << "albumartist" << "composer" << "track"
|
||||||
<< "disc" << "bpm" << "year" << "genre" << "comment" << "compilation"
|
<< "disc" << "bpm" << "year" << "genre" << "comment" << "compilation"
|
||||||
@ -123,39 +142,85 @@ const QString Song::kFtsUpdateSpec = Updateify(Song::kFtsColumns).join(", ");
|
|||||||
const QString Song::kManuallyUnsetCover = "(unset)";
|
const QString Song::kManuallyUnsetCover = "(unset)";
|
||||||
const QString Song::kEmbeddedCover = "(embedded)";
|
const QString Song::kEmbeddedCover = "(embedded)";
|
||||||
|
|
||||||
QString Song::JoinSpec(const QString& table) {
|
|
||||||
return Prepend(table + ".", kColumns).join(", ");
|
|
||||||
}
|
|
||||||
|
|
||||||
QString Song::TextForFiletype(FileType type) {
|
|
||||||
switch (type) {
|
|
||||||
case Song::Type_Asf: return QObject::tr("Windows Media audio");
|
|
||||||
case Song::Type_Flac: return QObject::tr("Flac");
|
|
||||||
case Song::Type_Mp4: return QObject::tr("MP4 AAC");
|
|
||||||
case Song::Type_Mpc: return QObject::tr("MPC");
|
|
||||||
case Song::Type_Mpeg: return QObject::tr("MP3"); // Not technically correct
|
|
||||||
case Song::Type_OggFlac: return QObject::tr("Ogg Flac");
|
|
||||||
case Song::Type_OggSpeex: return QObject::tr("Ogg Speex");
|
|
||||||
case Song::Type_OggVorbis: return QObject::tr("Ogg Vorbis");
|
|
||||||
case Song::Type_Aiff: return QObject::tr("AIFF");
|
|
||||||
case Song::Type_Wav: return QObject::tr("Wav");
|
|
||||||
case Song::Type_TrueAudio: return QObject::tr("TrueAudio");
|
|
||||||
case Song::Type_Cdda: return QObject::tr("CDDA");
|
|
||||||
|
|
||||||
case Song::Type_Stream: return QObject::tr("Stream");
|
|
||||||
|
|
||||||
case Song::Type_Unknown:
|
|
||||||
default:
|
|
||||||
return QObject::tr("Unknown");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static TagLib::String QStringToTaglibString(const QString& s);
|
|
||||||
|
|
||||||
TagLibFileRefFactory Song::kDefaultFactory;
|
TagLibFileRefFactory Song::kDefaultFactory;
|
||||||
|
QMutex Song::sTaglibMutex;
|
||||||
|
|
||||||
QMutex Song::taglib_mutex_;
|
|
||||||
|
struct Song::Private : public QSharedData {
|
||||||
|
Private();
|
||||||
|
|
||||||
|
// This is here and not in Song itself so we don't have to include
|
||||||
|
// <xiphcomment.h> in the main header.
|
||||||
|
void ParseOggTag(const TagLib::Ogg::FieldListMap& map, const QTextCodec* codec,
|
||||||
|
QString* disc, QString* compilation);
|
||||||
|
|
||||||
|
bool valid_;
|
||||||
|
int id_;
|
||||||
|
|
||||||
|
QString title_;
|
||||||
|
QString album_;
|
||||||
|
QString artist_;
|
||||||
|
QString albumartist_;
|
||||||
|
QString composer_;
|
||||||
|
int track_;
|
||||||
|
int disc_;
|
||||||
|
float bpm_;
|
||||||
|
int year_;
|
||||||
|
QString genre_;
|
||||||
|
QString comment_;
|
||||||
|
bool compilation_; // From the file tag
|
||||||
|
bool sampler_; // From the library scanner
|
||||||
|
bool forced_compilation_on_; // Set by the user
|
||||||
|
bool forced_compilation_off_; // Set by the user
|
||||||
|
|
||||||
|
float rating_;
|
||||||
|
int playcount_;
|
||||||
|
int skipcount_;
|
||||||
|
int lastplayed_;
|
||||||
|
int score_;
|
||||||
|
|
||||||
|
// The beginning of the song in seconds. In case of single-part media
|
||||||
|
// streams, this will equal to 0. In case of multi-part streams on the
|
||||||
|
// other hand, this will mark the beginning of a section represented by
|
||||||
|
// this Song object. This is always greater than 0.
|
||||||
|
qint64 beginning_;
|
||||||
|
// The end of the song in seconds. In case of single-part media
|
||||||
|
// streams, this will equal to the song's length. In case of multi-part
|
||||||
|
// streams on the other hand, this will mark the end of a section
|
||||||
|
// represented by this Song object.
|
||||||
|
// This may be negative indicating that the length of this song is
|
||||||
|
// unknown.
|
||||||
|
qint64 end_;
|
||||||
|
|
||||||
|
int bitrate_;
|
||||||
|
int samplerate_;
|
||||||
|
|
||||||
|
int directory_id_;
|
||||||
|
QUrl url_;
|
||||||
|
QString basefilename_;
|
||||||
|
int mtime_;
|
||||||
|
int ctime_;
|
||||||
|
int filesize_;
|
||||||
|
FileType filetype_;
|
||||||
|
|
||||||
|
// If the song has a CUE, this contains it's path.
|
||||||
|
QString cue_path_;
|
||||||
|
|
||||||
|
// Filenames to album art for this song.
|
||||||
|
QString art_automatic_; // Guessed by LibraryWatcher
|
||||||
|
QString art_manual_; // Set by the user - should take priority
|
||||||
|
|
||||||
|
QImage image_;
|
||||||
|
|
||||||
|
// Whether this song was loaded from a file using taglib.
|
||||||
|
bool init_from_file_;
|
||||||
|
// Whether our encoding guesser thinks these tags might be incorrectly encoded.
|
||||||
|
bool suspicious_tags_;
|
||||||
|
|
||||||
|
// Whether the song does not exist on the file system anymore, but is still
|
||||||
|
// stored in the database so as to remember the user's metadata.
|
||||||
|
bool unavailable_;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
Song::Private::Private()
|
Song::Private::Private()
|
||||||
@ -214,6 +279,130 @@ Song::Song(FileRefFactory* factory)
|
|||||||
factory_(factory) {
|
factory_(factory) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Song::~Song() {
|
||||||
|
}
|
||||||
|
|
||||||
|
Song& Song::operator =(const Song& other) {
|
||||||
|
d = other.d;
|
||||||
|
factory_ = other.factory_;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Song::is_valid() const { return d->valid_; }
|
||||||
|
bool Song::is_unavailable() const { return d->unavailable_; }
|
||||||
|
int Song::id() const { return d->id_; }
|
||||||
|
const QString& Song::title() const { return d->title_; }
|
||||||
|
const QString& Song::album() const { return d->album_; }
|
||||||
|
const QString& Song::artist() const { return d->artist_; }
|
||||||
|
const QString& Song::albumartist() const { return d->albumartist_; }
|
||||||
|
const QString& Song::effective_albumartist() const { return d->albumartist_.isEmpty() ? d->artist_ : d->albumartist_; }
|
||||||
|
const QString& Song::playlist_albumartist() const { return is_compilation() ? d->albumartist_ : effective_albumartist(); }
|
||||||
|
const QString& Song::composer() const { return d->composer_; }
|
||||||
|
int Song::track() const { return d->track_; }
|
||||||
|
int Song::disc() const { return d->disc_; }
|
||||||
|
float Song::bpm() const { return d->bpm_; }
|
||||||
|
int Song::year() const { return d->year_; }
|
||||||
|
const QString& Song::genre() const { return d->genre_; }
|
||||||
|
const QString& Song::comment() const { return d->comment_; }
|
||||||
|
bool Song::is_compilation() const {
|
||||||
|
return (d->compilation_ || d->sampler_ || d->forced_compilation_on_)
|
||||||
|
&& ! d->forced_compilation_off_;
|
||||||
|
}
|
||||||
|
float Song::rating() const { return d->rating_; }
|
||||||
|
int Song::playcount() const { return d->playcount_; }
|
||||||
|
int Song::skipcount() const { return d->skipcount_; }
|
||||||
|
int Song::lastplayed() const { return d->lastplayed_; }
|
||||||
|
int Song::score() const { return d->score_; }
|
||||||
|
const QString& Song::cue_path() const { return d->cue_path_; }
|
||||||
|
bool Song::has_cue() const { return !d->cue_path_.isEmpty(); }
|
||||||
|
qint64 Song::beginning_nanosec() const { return d->beginning_; }
|
||||||
|
qint64 Song::end_nanosec() const { return d->end_; }
|
||||||
|
qint64 Song::length_nanosec() const { return d->end_ - d->beginning_; }
|
||||||
|
int Song::bitrate() const { return d->bitrate_; }
|
||||||
|
int Song::samplerate() const { return d->samplerate_; }
|
||||||
|
int Song::directory_id() const { return d->directory_id_; }
|
||||||
|
const QUrl& Song::url() const { return d->url_; }
|
||||||
|
const QString& Song::basefilename() const { return d->basefilename_; }
|
||||||
|
uint Song::mtime() const { return d->mtime_; }
|
||||||
|
uint Song::ctime() const { return d->ctime_; }
|
||||||
|
int Song::filesize() const { return d->filesize_; }
|
||||||
|
Song::FileType Song::filetype() const { return d->filetype_; }
|
||||||
|
bool Song::is_stream() const { return d->filetype_ == Type_Stream; }
|
||||||
|
bool Song::is_cdda() const { return d->filetype_ == Type_Cdda; }
|
||||||
|
const QString& Song::art_automatic() const { return d->art_automatic_; }
|
||||||
|
const QString& Song::art_manual() const { return d->art_manual_; }
|
||||||
|
bool Song::has_manually_unset_cover() const { return d->art_manual_ == kManuallyUnsetCover; }
|
||||||
|
void Song::manually_unset_cover() { d->art_manual_ = kManuallyUnsetCover; }
|
||||||
|
bool Song::has_embedded_cover() const { return d->art_automatic_ == kEmbeddedCover; }
|
||||||
|
void Song::set_embedded_cover() { d->art_automatic_ = kEmbeddedCover; }
|
||||||
|
const QImage& Song::image() const { return d->image_; }
|
||||||
|
void Song::set_id(int id) { d->id_ = id; }
|
||||||
|
void Song::set_valid(bool v) { d->valid_ = v; }
|
||||||
|
void Song::set_title(const QString& v) { d->title_ = v; }
|
||||||
|
void Song::set_album(const QString& v) { d->album_ = v; }
|
||||||
|
void Song::set_artist(const QString& v) { d->artist_ = v; }
|
||||||
|
void Song::set_albumartist(const QString& v) { d->albumartist_ = v; }
|
||||||
|
void Song::set_composer(const QString& v) { d->composer_ = v; }
|
||||||
|
void Song::set_track(int v) { d->track_ = v; }
|
||||||
|
void Song::set_disc(int v) { d->disc_ = v; }
|
||||||
|
void Song::set_bpm(float v) { d->bpm_ = v; }
|
||||||
|
void Song::set_year(int v) { d->year_ = v; }
|
||||||
|
void Song::set_genre(const QString& v) { d->genre_ = v; }
|
||||||
|
void Song::set_comment(const QString& v) { d->comment_ = v; }
|
||||||
|
void Song::set_compilation(bool v) { d->compilation_ = v; }
|
||||||
|
void Song::set_sampler(bool v) { d->sampler_ = v; }
|
||||||
|
void Song::set_beginning_nanosec(qint64 v) { d->beginning_ = qMax(0ll, v); }
|
||||||
|
void Song::set_end_nanosec(qint64 v) { d->end_ = v; }
|
||||||
|
void Song::set_length_nanosec(qint64 v) { d->end_ = d->beginning_ + v; }
|
||||||
|
void Song::set_bitrate(int v) { d->bitrate_ = v; }
|
||||||
|
void Song::set_samplerate(int v) { d->samplerate_ = v; }
|
||||||
|
void Song::set_mtime(int v) { d->mtime_ = v; }
|
||||||
|
void Song::set_ctime(int v) { d->ctime_ = v; }
|
||||||
|
void Song::set_filesize(int v) { d->filesize_ = v; }
|
||||||
|
void Song::set_filetype(FileType v) { d->filetype_ = v; }
|
||||||
|
void Song::set_art_automatic(const QString& v) { d->art_automatic_ = v; }
|
||||||
|
void Song::set_art_manual(const QString& v) { d->art_manual_ = v; }
|
||||||
|
void Song::set_image(const QImage& i) { d->image_ = i; }
|
||||||
|
void Song::set_forced_compilation_on(bool v) { d->forced_compilation_on_ = v; }
|
||||||
|
void Song::set_forced_compilation_off(bool v) { d->forced_compilation_off_ = v; }
|
||||||
|
void Song::set_rating(float v) { d->rating_ = v; }
|
||||||
|
void Song::set_playcount(int v) { d->playcount_ = v; }
|
||||||
|
void Song::set_skipcount(int v) { d->skipcount_ = v; }
|
||||||
|
void Song::set_lastplayed(int v) { d->lastplayed_ = v; }
|
||||||
|
void Song::set_score(int v) { d->score_ = qBound(0, v, 100); }
|
||||||
|
void Song::set_cue_path(const QString& v) { d->cue_path_ = v; }
|
||||||
|
void Song::set_unavailable(bool v) { d->unavailable_ = v; }
|
||||||
|
void Song::set_url(const QUrl& v) { d->url_ = v; }
|
||||||
|
void Song::set_basefilename(const QString& v) { d->basefilename_ = v; }
|
||||||
|
void Song::set_directory_id(int v) { d->directory_id_ = v; }
|
||||||
|
|
||||||
|
QString Song::JoinSpec(const QString& table) {
|
||||||
|
return Prepend(table + ".", kColumns).join(", ");
|
||||||
|
}
|
||||||
|
|
||||||
|
QString Song::TextForFiletype(FileType type) {
|
||||||
|
switch (type) {
|
||||||
|
case Song::Type_Asf: return QObject::tr("Windows Media audio");
|
||||||
|
case Song::Type_Flac: return QObject::tr("Flac");
|
||||||
|
case Song::Type_Mp4: return QObject::tr("MP4 AAC");
|
||||||
|
case Song::Type_Mpc: return QObject::tr("MPC");
|
||||||
|
case Song::Type_Mpeg: return QObject::tr("MP3"); // Not technically correct
|
||||||
|
case Song::Type_OggFlac: return QObject::tr("Ogg Flac");
|
||||||
|
case Song::Type_OggSpeex: return QObject::tr("Ogg Speex");
|
||||||
|
case Song::Type_OggVorbis: return QObject::tr("Ogg Vorbis");
|
||||||
|
case Song::Type_Aiff: return QObject::tr("AIFF");
|
||||||
|
case Song::Type_Wav: return QObject::tr("Wav");
|
||||||
|
case Song::Type_TrueAudio: return QObject::tr("TrueAudio");
|
||||||
|
case Song::Type_Cdda: return QObject::tr("CDDA");
|
||||||
|
|
||||||
|
case Song::Type_Stream: return QObject::tr("Stream");
|
||||||
|
|
||||||
|
case Song::Type_Unknown:
|
||||||
|
default:
|
||||||
|
return QObject::tr("Unknown");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Song::Init(const QString& title, const QString& artist,
|
void Song::Init(const QString& title, const QString& artist,
|
||||||
const QString& album, qint64 length_nanosec) {
|
const QString& album, qint64 length_nanosec) {
|
||||||
d->valid_ = true;
|
d->valid_ = true;
|
||||||
@ -264,7 +453,7 @@ bool Song::HasProperMediaFile() const {
|
|||||||
qLog(Warning) << "HasProperMediaFile() on GUI thread!";
|
qLog(Warning) << "HasProperMediaFile() on GUI thread!";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
QMutexLocker l(&taglib_mutex_);
|
QMutexLocker l(&sTaglibMutex);
|
||||||
scoped_ptr<TagLib::FileRef> fileref(factory_->GetFileRef(d->url_.toLocalFile()));
|
scoped_ptr<TagLib::FileRef> fileref(factory_->GetFileRef(d->url_.toLocalFile()));
|
||||||
|
|
||||||
return !fileref->isNull() && fileref->tag();
|
return !fileref->isNull() && fileref->tag();
|
||||||
@ -284,7 +473,7 @@ void Song::InitFromFile(const QString& filename, int directory_id) {
|
|||||||
QFileInfo info(filename);
|
QFileInfo info(filename);
|
||||||
d->basefilename_ = info.fileName();
|
d->basefilename_ = info.fileName();
|
||||||
|
|
||||||
QMutexLocker l(&taglib_mutex_);
|
QMutexLocker l(&sTaglibMutex);
|
||||||
scoped_ptr<TagLib::FileRef> fileref(factory_->GetFileRef(filename));
|
scoped_ptr<TagLib::FileRef> fileref(factory_->GetFileRef(filename));
|
||||||
|
|
||||||
if(fileref->isNull()) {
|
if(fileref->isNull()) {
|
||||||
@ -371,12 +560,12 @@ void Song::InitFromFile(const QString& filename, int directory_id) {
|
|||||||
}
|
}
|
||||||
} else if (TagLib::Ogg::Vorbis::File* file = dynamic_cast<TagLib::Ogg::Vorbis::File*>(fileref->file())) {
|
} else if (TagLib::Ogg::Vorbis::File* file = dynamic_cast<TagLib::Ogg::Vorbis::File*>(fileref->file())) {
|
||||||
if (file->tag()) {
|
if (file->tag()) {
|
||||||
ParseOggTag(file->tag()->fieldListMap(), NULL, &disc, &compilation);
|
d->ParseOggTag(file->tag()->fieldListMap(), NULL, &disc, &compilation);
|
||||||
}
|
}
|
||||||
d->comment_ = Decode(tag->comment());
|
d->comment_ = Decode(tag->comment());
|
||||||
} else if (TagLib::FLAC::File* file = dynamic_cast<TagLib::FLAC::File*>(fileref->file())) {
|
} else if (TagLib::FLAC::File* file = dynamic_cast<TagLib::FLAC::File*>(fileref->file())) {
|
||||||
if ( file->xiphComment() ) {
|
if ( file->xiphComment() ) {
|
||||||
ParseOggTag(file->xiphComment()->fieldListMap(), NULL, &disc, &compilation);
|
d->ParseOggTag(file->xiphComment()->fieldListMap(), NULL, &disc, &compilation);
|
||||||
#ifdef TAGLIB_HAS_FLAC_PICTURELIST
|
#ifdef TAGLIB_HAS_FLAC_PICTURELIST
|
||||||
if (!file->pictureList().isEmpty()) {
|
if (!file->pictureList().isEmpty()) {
|
||||||
set_embedded_cover();
|
set_embedded_cover();
|
||||||
@ -475,19 +664,20 @@ void Song::ParseFMPSFrame(const QString& name, const QString& value) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Song::ParseOggTag(const TagLib::Ogg::FieldListMap& map, const QTextCodec* codec,
|
void Song::Private::ParseOggTag(const TagLib::Ogg::FieldListMap& map,
|
||||||
|
const QTextCodec* codec,
|
||||||
QString* disc, QString* compilation) {
|
QString* disc, QString* compilation) {
|
||||||
if (!map["COMPOSER"].isEmpty())
|
if (!map["COMPOSER"].isEmpty())
|
||||||
d->composer_ = Decode(map["COMPOSER"].front(), codec);
|
composer_ = Decode(map["COMPOSER"].front(), codec);
|
||||||
|
|
||||||
if (!map["ALBUMARTIST"].isEmpty()) {
|
if (!map["ALBUMARTIST"].isEmpty()) {
|
||||||
d->albumartist_ = Decode(map["ALBUMARTIST"].front(), codec);
|
albumartist_ = Decode(map["ALBUMARTIST"].front(), codec);
|
||||||
} else if (!map["ALBUM ARTIST"].isEmpty()) {
|
} else if (!map["ALBUM ARTIST"].isEmpty()) {
|
||||||
d->albumartist_ = Decode(map["ALBUM ARTIST"].front(), codec);
|
albumartist_ = Decode(map["ALBUM ARTIST"].front(), codec);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!map["BPM"].isEmpty() )
|
if (!map["BPM"].isEmpty() )
|
||||||
d->bpm_ = TStringToQString( map["BPM"].front() ).trimmed().toFloat();
|
bpm_ = TStringToQString( map["BPM"].front() ).trimmed().toFloat();
|
||||||
|
|
||||||
if (!map["DISCNUMBER"].isEmpty() )
|
if (!map["DISCNUMBER"].isEmpty() )
|
||||||
*disc = TStringToQString( map["DISCNUMBER"].front() ).trimmed();
|
*disc = TStringToQString( map["DISCNUMBER"].front() ).trimmed();
|
||||||
@ -496,7 +686,7 @@ void Song::ParseOggTag(const TagLib::Ogg::FieldListMap& map, const QTextCodec* c
|
|||||||
*compilation = TStringToQString( map["COMPILATION"].front() ).trimmed();
|
*compilation = TStringToQString( map["COMPILATION"].front() ).trimmed();
|
||||||
|
|
||||||
if (!map["COVERART"].isEmpty())
|
if (!map["COVERART"].isEmpty())
|
||||||
set_embedded_cover();
|
art_automatic_ = kEmbeddedCover;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Song::GuessFileType(TagLib::FileRef* fileref) {
|
void Song::GuessFileType(TagLib::FileRef* fileref) {
|
||||||
@ -1194,10 +1384,6 @@ void Song::SetTextFrame(const QString& id, const QString& value,
|
|||||||
tag->addFrame(frame);
|
tag->addFrame(frame);
|
||||||
}
|
}
|
||||||
|
|
||||||
TagLib::String QStringToTaglibString(const QString& s) {
|
|
||||||
return TagLib::String(s.toUtf8().constData(), TagLib::String::UTF8);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Song::IsEditable() const {
|
bool Song::IsEditable() const {
|
||||||
return d->valid_ && !d->url_.isEmpty() && !is_stream() &&
|
return d->valid_ && !d->url_.isEmpty() && !is_stream() &&
|
||||||
d->filetype_ != Type_Unknown && !has_cue();
|
d->filetype_ != Type_Unknown && !has_cue();
|
||||||
@ -1208,7 +1394,7 @@ bool Song::Save() const {
|
|||||||
if (filename.isNull())
|
if (filename.isNull())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
QMutexLocker l(&taglib_mutex_);
|
QMutexLocker l(&sTaglibMutex);
|
||||||
scoped_ptr<TagLib::FileRef> fileref(factory_->GetFileRef(filename));
|
scoped_ptr<TagLib::FileRef> fileref(factory_->GetFileRef(filename));
|
||||||
|
|
||||||
if (!fileref || fileref->isNull()) // The file probably doesn't exist
|
if (!fileref || fileref->isNull()) // The file probably doesn't exist
|
||||||
@ -1282,7 +1468,7 @@ QImage Song::LoadEmbeddedArt(const QString& filename) {
|
|||||||
if (filename.isEmpty())
|
if (filename.isEmpty())
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
QMutexLocker l(&taglib_mutex_);
|
QMutexLocker l(&sTaglibMutex);
|
||||||
|
|
||||||
#ifdef Q_OS_WIN32
|
#ifdef Q_OS_WIN32
|
||||||
TagLib::FileRef ref(filename.toStdWString().c_str());
|
TagLib::FileRef ref(filename.toStdWString().c_str());
|
||||||
|
292
src/core/song.h
292
src/core/song.h
@ -20,48 +20,28 @@
|
|||||||
|
|
||||||
#include <QFuture>
|
#include <QFuture>
|
||||||
#include <QImage>
|
#include <QImage>
|
||||||
#include <QList>
|
|
||||||
#include <QMetaType>
|
#include <QMetaType>
|
||||||
#include <QSharedData>
|
|
||||||
#include <QSharedDataPointer>
|
#include <QSharedDataPointer>
|
||||||
#include <QSqlQuery>
|
|
||||||
#include <QString>
|
|
||||||
#include <QUrl>
|
|
||||||
#include <QVariantMap>
|
#include <QVariantMap>
|
||||||
|
|
||||||
#include <xiphcomment.h>
|
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "timeconstants.h"
|
|
||||||
#include "engines/engine_fwd.h"
|
#include "engines/engine_fwd.h"
|
||||||
|
|
||||||
|
class QSqlQuery;
|
||||||
|
class QUrl;
|
||||||
|
|
||||||
#ifdef HAVE_LIBGPOD
|
#ifdef HAVE_LIBGPOD
|
||||||
# include <gpod/itdb.h>
|
struct _Itdb_Track;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_LIBMTP
|
#ifdef HAVE_LIBMTP
|
||||||
# include <libmtp.h>
|
struct LIBMTP_track_struct;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef Q_OS_WIN32
|
#ifdef Q_OS_WIN32
|
||||||
struct IWMDMMetaData;
|
struct IWMDMMetaData;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Taglib pulls in some windows headers that #define all sorts of nasties.
|
|
||||||
// Undef those here.
|
|
||||||
#ifdef RemoveDirectory
|
|
||||||
# undef RemoveDirectory
|
|
||||||
#endif
|
|
||||||
#ifdef AddJob
|
|
||||||
# undef AddJob
|
|
||||||
#endif
|
|
||||||
#ifdef LoadIcon
|
|
||||||
# undef LoadIcon
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
class SqlRow;
|
|
||||||
|
|
||||||
#ifdef HAVE_LIBLASTFM
|
#ifdef HAVE_LIBLASTFM
|
||||||
namespace lastfm {
|
namespace lastfm {
|
||||||
class Track;
|
class Track;
|
||||||
@ -77,6 +57,8 @@ namespace TagLib {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class SqlRow;
|
||||||
|
|
||||||
|
|
||||||
class FileRefFactory {
|
class FileRefFactory {
|
||||||
public:
|
public:
|
||||||
@ -95,6 +77,7 @@ class Song {
|
|||||||
Song();
|
Song();
|
||||||
Song(const Song& other);
|
Song(const Song& other);
|
||||||
Song(FileRefFactory* factory);
|
Song(FileRefFactory* factory);
|
||||||
|
~Song();
|
||||||
|
|
||||||
static const QStringList kColumns;
|
static const QStringList kColumns;
|
||||||
static const QString kColumnSpec;
|
static const QString kColumnSpec;
|
||||||
@ -153,13 +136,13 @@ class Song {
|
|||||||
void MergeFromSimpleMetaBundle(const Engine::SimpleMetaBundle& bundle);
|
void MergeFromSimpleMetaBundle(const Engine::SimpleMetaBundle& bundle);
|
||||||
|
|
||||||
#ifdef HAVE_LIBGPOD
|
#ifdef HAVE_LIBGPOD
|
||||||
void InitFromItdb(const Itdb_Track* track, const QString& prefix);
|
void InitFromItdb(const _Itdb_Track* track, const QString& prefix);
|
||||||
void ToItdb(Itdb_Track* track) const;
|
void ToItdb(_Itdb_Track* track) const;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_LIBMTP
|
#ifdef HAVE_LIBMTP
|
||||||
void InitFromMTP(const LIBMTP_track_t* track, const QString& host);
|
void InitFromMTP(const LIBMTP_track_struct* track, const QString& host);
|
||||||
void ToMTP(LIBMTP_track_t* track) const;
|
void ToMTP(LIBMTP_track_struct* track) const;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef Q_OS_WIN32
|
#ifdef Q_OS_WIN32
|
||||||
@ -179,72 +162,69 @@ class Song {
|
|||||||
void ToXesam(QVariantMap* map) const;
|
void ToXesam(QVariantMap* map) const;
|
||||||
|
|
||||||
// Simple accessors
|
// Simple accessors
|
||||||
bool is_valid() const { return d->valid_; }
|
bool is_valid() const;
|
||||||
bool is_unavailable() const { return d->unavailable_; }
|
bool is_unavailable() const;
|
||||||
int id() const { return d->id_; }
|
int id() const;
|
||||||
|
|
||||||
const QString& title() const { return d->title_; }
|
const QString& title() const;
|
||||||
const QString& album() const { return d->album_; }
|
const QString& album() const;
|
||||||
const QString& artist() const { return d->artist_; }
|
const QString& artist() const;
|
||||||
const QString& albumartist() const { return d->albumartist_; }
|
const QString& albumartist() const;
|
||||||
const QString& effective_albumartist() const { return d->albumartist_.isEmpty() ? d->artist_ : d->albumartist_; }
|
const QString& effective_albumartist() const;
|
||||||
// Playlist views are special because you don't want to fill in album artists automatically for
|
// Playlist views are special because you don't want to fill in album artists automatically for
|
||||||
// compilations, but you do for normal albums:
|
// compilations, but you do for normal albums:
|
||||||
const QString& playlist_albumartist() const { return is_compilation() ? d->albumartist_ : effective_albumartist(); }
|
const QString& playlist_albumartist() const;
|
||||||
const QString& composer() const { return d->composer_; }
|
const QString& composer() const;
|
||||||
int track() const { return d->track_; }
|
int track() const;
|
||||||
int disc() const { return d->disc_; }
|
int disc() const;
|
||||||
float bpm() const { return d->bpm_; }
|
float bpm() const;
|
||||||
int year() const { return d->year_; }
|
int year() const;
|
||||||
const QString& genre() const { return d->genre_; }
|
const QString& genre() const;
|
||||||
const QString& comment() const { return d->comment_; }
|
const QString& comment() const;
|
||||||
bool is_compilation() const {
|
bool is_compilation() const;
|
||||||
return (d->compilation_ || d->sampler_ || d->forced_compilation_on_)
|
float rating() const;
|
||||||
&& ! d->forced_compilation_off_;
|
int playcount() const;
|
||||||
}
|
int skipcount() const;
|
||||||
float rating() const { return d->rating_; }
|
int lastplayed() const;
|
||||||
int playcount() const { return d->playcount_; }
|
int score() const;
|
||||||
int skipcount() const { return d->skipcount_; }
|
|
||||||
int lastplayed() const { return d->lastplayed_; }
|
|
||||||
int score() const { return d->score_; }
|
|
||||||
|
|
||||||
const QString& cue_path() const { return d->cue_path_; }
|
const QString& cue_path() const;
|
||||||
bool has_cue() const { return !d->cue_path_.isEmpty(); }
|
bool has_cue() const;
|
||||||
|
|
||||||
qint64 beginning_nanosec() const { return d->beginning_; }
|
qint64 beginning_nanosec() const;
|
||||||
qint64 end_nanosec() const { return d->end_; }
|
qint64 end_nanosec() const;
|
||||||
|
|
||||||
qint64 length_nanosec() const { return d->end_ - d->beginning_; }
|
qint64 length_nanosec() const;
|
||||||
|
|
||||||
int bitrate() const { return d->bitrate_; }
|
int bitrate() const;
|
||||||
int samplerate() const { return d->samplerate_; }
|
int samplerate() const;
|
||||||
|
|
||||||
int directory_id() const { return d->directory_id_; }
|
int directory_id() const;
|
||||||
const QUrl& url() const { return d->url_; }
|
const QUrl& url() const;
|
||||||
const QString& basefilename() const { return d->basefilename_; }
|
const QString& basefilename() const;
|
||||||
uint mtime() const { return d->mtime_; }
|
uint mtime() const;
|
||||||
uint ctime() const { return d->ctime_; }
|
uint ctime() const;
|
||||||
int filesize() const { return d->filesize_; }
|
int filesize() const;
|
||||||
FileType filetype() const { return d->filetype_; }
|
FileType filetype() const;
|
||||||
bool is_stream() const { return d->filetype_ == Type_Stream; }
|
bool is_stream() const;
|
||||||
bool is_cdda() const { return d->filetype_ == Type_Cdda; }
|
bool is_cdda() const;
|
||||||
|
|
||||||
const QString& art_automatic() const { return d->art_automatic_; }
|
const QString& art_automatic() const;
|
||||||
const QString& art_manual() const { return d->art_manual_; }
|
const QString& art_manual() const;
|
||||||
|
|
||||||
// Returns true if this Song had it's cover manually unset by user.
|
// Returns true if this Song had it's cover manually unset by user.
|
||||||
bool has_manually_unset_cover() const { return d->art_manual_ == kManuallyUnsetCover; }
|
bool has_manually_unset_cover() const;
|
||||||
// This method represents an explicit request to unset this song's
|
// This method represents an explicit request to unset this song's
|
||||||
// cover.
|
// cover.
|
||||||
void manually_unset_cover() { d->art_manual_ = kManuallyUnsetCover; }
|
void manually_unset_cover();
|
||||||
|
|
||||||
// Returns true if this song (it's media file) has an embedded cover.
|
// Returns true if this song (it's media file) has an embedded cover.
|
||||||
bool has_embedded_cover() const { return d->art_automatic_ == kEmbeddedCover; }
|
bool has_embedded_cover() const;
|
||||||
// Sets a flag saying that this song (it's media file) has an embedded
|
// Sets a flag saying that this song (it's media file) has an embedded
|
||||||
// cover.
|
// cover.
|
||||||
void set_embedded_cover() { d->art_automatic_ = kEmbeddedCover; }
|
void set_embedded_cover();
|
||||||
|
|
||||||
const QImage& image() const { return d->image_; }
|
const QImage& image() const;
|
||||||
|
|
||||||
// Pretty accessors
|
// Pretty accessors
|
||||||
QString PrettyTitle() const;
|
QString PrettyTitle() const;
|
||||||
@ -259,49 +239,49 @@ class Song {
|
|||||||
bool Save() const;
|
bool Save() const;
|
||||||
QFuture<bool> BackgroundSave() const;
|
QFuture<bool> BackgroundSave() const;
|
||||||
|
|
||||||
void set_id(int id) { d->id_ = id; }
|
void set_id(int id);
|
||||||
void set_valid(bool v) { d->valid_ = v; }
|
void set_valid(bool v);
|
||||||
void set_title(const QString& v) { d->title_ = v; }
|
void set_title(const QString& v);
|
||||||
|
|
||||||
void set_album(const QString& v) { d->album_ = v; }
|
void set_album(const QString& v);
|
||||||
void set_artist(const QString& v) { d->artist_ = v; }
|
void set_artist(const QString& v);
|
||||||
void set_albumartist(const QString& v) { d->albumartist_ = v; }
|
void set_albumartist(const QString& v);
|
||||||
void set_composer(const QString& v) { d->composer_ = v; }
|
void set_composer(const QString& v);
|
||||||
void set_track(int v) { d->track_ = v; }
|
void set_track(int v);
|
||||||
void set_disc(int v) { d->disc_ = v; }
|
void set_disc(int v);
|
||||||
void set_bpm(float v) { d->bpm_ = v; }
|
void set_bpm(float v);
|
||||||
void set_year(int v) { d->year_ = v; }
|
void set_year(int v);
|
||||||
void set_genre(const QString& v) { d->genre_ = v; }
|
void set_genre(const QString& v);
|
||||||
void set_genre_id3(int id);
|
void set_genre_id3(int id);
|
||||||
void set_comment(const QString& v) { d->comment_ = v; }
|
void set_comment(const QString& v);
|
||||||
void set_compilation(bool v) { d->compilation_ = v; }
|
void set_compilation(bool v);
|
||||||
void set_sampler(bool v) { d->sampler_ = v; }
|
void set_sampler(bool v);
|
||||||
void set_beginning_nanosec(qint64 v) { d->beginning_ = qMax(0ll, v); }
|
void set_beginning_nanosec(qint64 v);
|
||||||
void set_end_nanosec(qint64 v) { d->end_ = v; }
|
void set_end_nanosec(qint64 v);
|
||||||
void set_length_nanosec(qint64 v) { d->end_ = d->beginning_ + v; }
|
void set_length_nanosec(qint64 v);
|
||||||
void set_bitrate(int v) { d->bitrate_ = v; }
|
void set_bitrate(int v);
|
||||||
void set_samplerate(int v) { d->samplerate_ = v; }
|
void set_samplerate(int v);
|
||||||
void set_mtime(int v) { d->mtime_ = v; }
|
void set_mtime(int v);
|
||||||
void set_ctime(int v) { d->ctime_ = v; }
|
void set_ctime(int v);
|
||||||
void set_filesize(int v) { d->filesize_ = v; }
|
void set_filesize(int v);
|
||||||
void set_filetype(FileType v) { d->filetype_ = v; }
|
void set_filetype(FileType v);
|
||||||
void set_art_automatic(const QString& v) { d->art_automatic_ = v; }
|
void set_art_automatic(const QString& v);
|
||||||
void set_art_manual(const QString& v) { d->art_manual_ = v; }
|
void set_art_manual(const QString& v);
|
||||||
void set_image(const QImage& i) { d->image_ = i; }
|
void set_image(const QImage& i);
|
||||||
void set_forced_compilation_on(bool v) { d->forced_compilation_on_ = v; }
|
void set_forced_compilation_on(bool v);
|
||||||
void set_forced_compilation_off(bool v) { d->forced_compilation_off_ = v; }
|
void set_forced_compilation_off(bool v);
|
||||||
void set_rating(float v) { d->rating_ = v; }
|
void set_rating(float v);
|
||||||
void set_playcount(int v) { d->playcount_ = v; }
|
void set_playcount(int v);
|
||||||
void set_skipcount(int v) { d->skipcount_ = v; }
|
void set_skipcount(int v);
|
||||||
void set_lastplayed(int v) { d->lastplayed_ = v; }
|
void set_lastplayed(int v);
|
||||||
void set_score(int v) { d->score_ = qBound(0, v, 100); }
|
void set_score(int v);
|
||||||
void set_cue_path(const QString& v) { d->cue_path_ = v; }
|
void set_cue_path(const QString& v);
|
||||||
void set_unavailable(bool v) { d->unavailable_ = v; }
|
void set_unavailable(bool v);
|
||||||
|
|
||||||
// Setters that should only be used by tests
|
// Setters that should only be used by tests
|
||||||
void set_url(const QUrl& v) { d->url_ = v; }
|
void set_url(const QUrl& v);
|
||||||
void set_basefilename(const QString& v) { d->basefilename_ = v; }
|
void set_basefilename(const QString& v);
|
||||||
void set_directory_id(int v) { d->directory_id_ = v; }
|
void set_directory_id(int v);
|
||||||
|
|
||||||
// Comparison functions
|
// Comparison functions
|
||||||
bool IsMetadataEqual(const Song& other) const;
|
bool IsMetadataEqual(const Song& other) const;
|
||||||
@ -314,6 +294,8 @@ class Song {
|
|||||||
// you need to hash the key to do fast lookups.
|
// you need to hash the key to do fast lookups.
|
||||||
QString AlbumKey() const;
|
QString AlbumKey() const;
|
||||||
|
|
||||||
|
Song& operator=(const Song& other);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void GuessFileType(TagLib::FileRef* fileref);
|
void GuessFileType(TagLib::FileRef* fileref);
|
||||||
static bool Save(const Song& song);
|
static bool Save(const Song& song);
|
||||||
@ -324,86 +306,14 @@ class Song {
|
|||||||
void ParseFMPSFrame(const QString& name, const QString& value);
|
void ParseFMPSFrame(const QString& name, const QString& value);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct Private : public QSharedData {
|
struct Private;
|
||||||
Private();
|
|
||||||
|
|
||||||
bool valid_;
|
|
||||||
int id_;
|
|
||||||
|
|
||||||
QString title_;
|
|
||||||
QString album_;
|
|
||||||
QString artist_;
|
|
||||||
QString albumartist_;
|
|
||||||
QString composer_;
|
|
||||||
int track_;
|
|
||||||
int disc_;
|
|
||||||
float bpm_;
|
|
||||||
int year_;
|
|
||||||
QString genre_;
|
|
||||||
QString comment_;
|
|
||||||
bool compilation_; // From the file tag
|
|
||||||
bool sampler_; // From the library scanner
|
|
||||||
bool forced_compilation_on_; // Set by the user
|
|
||||||
bool forced_compilation_off_; // Set by the user
|
|
||||||
|
|
||||||
float rating_;
|
|
||||||
int playcount_;
|
|
||||||
int skipcount_;
|
|
||||||
int lastplayed_;
|
|
||||||
int score_;
|
|
||||||
|
|
||||||
// The beginning of the song in seconds. In case of single-part media
|
|
||||||
// streams, this will equal to 0. In case of multi-part streams on the
|
|
||||||
// other hand, this will mark the beginning of a section represented by
|
|
||||||
// this Song object. This is always greater than 0.
|
|
||||||
qint64 beginning_;
|
|
||||||
// The end of the song in seconds. In case of single-part media
|
|
||||||
// streams, this will equal to the song's length. In case of multi-part
|
|
||||||
// streams on the other hand, this will mark the end of a section
|
|
||||||
// represented by this Song object.
|
|
||||||
// This may be negative indicating that the length of this song is
|
|
||||||
// unknown.
|
|
||||||
qint64 end_;
|
|
||||||
|
|
||||||
int bitrate_;
|
|
||||||
int samplerate_;
|
|
||||||
|
|
||||||
int directory_id_;
|
|
||||||
QUrl url_;
|
|
||||||
QString basefilename_;
|
|
||||||
int mtime_;
|
|
||||||
int ctime_;
|
|
||||||
int filesize_;
|
|
||||||
FileType filetype_;
|
|
||||||
|
|
||||||
// If the song has a CUE, this contains it's path.
|
|
||||||
QString cue_path_;
|
|
||||||
|
|
||||||
// Filenames to album art for this song.
|
|
||||||
QString art_automatic_; // Guessed by LibraryWatcher
|
|
||||||
QString art_manual_; // Set by the user - should take priority
|
|
||||||
|
|
||||||
QImage image_;
|
|
||||||
|
|
||||||
// Whether this song was loaded from a file using taglib.
|
|
||||||
bool init_from_file_;
|
|
||||||
// Whether our encoding guesser thinks these tags might be incorrectly encoded.
|
|
||||||
bool suspicious_tags_;
|
|
||||||
|
|
||||||
// Whether the song does not exist on the file system anymore, but is still
|
|
||||||
// stored in the database so as to remember the user's metadata.
|
|
||||||
bool unavailable_;
|
|
||||||
};
|
|
||||||
|
|
||||||
void ParseOggTag(const TagLib::Ogg::FieldListMap& map, const QTextCodec* codec, QString* disc, QString* compilation);
|
|
||||||
|
|
||||||
private:
|
|
||||||
QSharedDataPointer<Private> d;
|
QSharedDataPointer<Private> d;
|
||||||
|
|
||||||
FileRefFactory* factory_;
|
FileRefFactory* factory_;
|
||||||
|
|
||||||
static TagLibFileRefFactory kDefaultFactory;
|
static TagLibFileRefFactory kDefaultFactory;
|
||||||
|
|
||||||
static QMutex taglib_mutex_;
|
static QMutex sTaglibMutex;
|
||||||
};
|
};
|
||||||
Q_DECLARE_METATYPE(Song);
|
Q_DECLARE_METATYPE(Song);
|
||||||
|
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
#include "songloader.h"
|
#include "songloader.h"
|
||||||
#include "core/logging.h"
|
#include "core/logging.h"
|
||||||
#include "core/song.h"
|
#include "core/song.h"
|
||||||
|
#include "core/timeconstants.h"
|
||||||
#include "library/librarybackend.h"
|
#include "library/librarybackend.h"
|
||||||
#include "library/sqlrow.h"
|
#include "library/sqlrow.h"
|
||||||
#include "playlistparsers/parserbase.h"
|
#include "playlistparsers/parserbase.h"
|
||||||
|
@ -21,10 +21,11 @@
|
|||||||
#include "core/backgroundthread.h"
|
#include "core/backgroundthread.h"
|
||||||
#include "core/song.h"
|
#include "core/song.h"
|
||||||
|
|
||||||
#include <QObject>
|
|
||||||
#include <QImage>
|
#include <QImage>
|
||||||
#include <QMutex>
|
#include <QMutex>
|
||||||
|
#include <QObject>
|
||||||
#include <QQueue>
|
#include <QQueue>
|
||||||
|
#include <QUrl>
|
||||||
|
|
||||||
class NetworkAccessManager;
|
class NetworkAccessManager;
|
||||||
class QNetworkReply;
|
class QNetworkReply;
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
|
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
#include <QTemporaryFile>
|
#include <QTemporaryFile>
|
||||||
|
#include <QUrl>
|
||||||
|
|
||||||
ArtLoader::ArtLoader(QObject* parent)
|
ArtLoader::ArtLoader(QObject* parent)
|
||||||
: QObject(parent),
|
: QObject(parent),
|
||||||
|
@ -15,10 +15,10 @@
|
|||||||
along with Clementine. If not, see <http://www.gnu.org/licenses/>.
|
along with Clementine. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include <QMutexLocker>
|
#include <QMutexLocker>
|
||||||
|
|
||||||
#include "core/logging.h"
|
#include "core/logging.h"
|
||||||
|
#include "core/timeconstants.h"
|
||||||
#include "library/librarybackend.h"
|
#include "library/librarybackend.h"
|
||||||
#include "library/librarymodel.h"
|
#include "library/librarymodel.h"
|
||||||
|
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#include <plist/plist.h>
|
#include <plist/plist.h>
|
||||||
|
|
||||||
#include <QCoreApplication>
|
#include <QCoreApplication>
|
||||||
|
#include <QUrl>
|
||||||
#include <QtDebug>
|
#include <QtDebug>
|
||||||
|
|
||||||
iMobileDeviceConnection::iMobileDeviceConnection(const QString& uuid)
|
iMobileDeviceConnection::iMobileDeviceConnection(const QString& uuid)
|
||||||
|
@ -25,6 +25,8 @@
|
|||||||
|
|
||||||
#include <boost/scoped_ptr.hpp>
|
#include <boost/scoped_ptr.hpp>
|
||||||
|
|
||||||
|
struct LIBMTP_mtpdevice_struct;
|
||||||
|
|
||||||
class MtpConnection;
|
class MtpConnection;
|
||||||
class MtpLoader;
|
class MtpLoader;
|
||||||
|
|
||||||
@ -57,9 +59,9 @@ private slots:
|
|||||||
void LoadFinished();
|
void LoadFinished();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool GetSupportedFiletypes(QList<Song::FileType>* ret, LIBMTP_mtpdevice_t* device);
|
bool GetSupportedFiletypes(QList<Song::FileType>* ret, LIBMTP_mtpdevice_struct* device);
|
||||||
int GetFreeSpace(LIBMTP_mtpdevice_t* device);
|
int GetFreeSpace(LIBMTP_mtpdevice_struct* device);
|
||||||
int GetCapacity(LIBMTP_mtpdevice_t* device);
|
int GetCapacity(LIBMTP_mtpdevice_struct* device);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static bool sInitialisedLibMTP;
|
static bool sInitialisedLibMTP;
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
#include "ui/iconloader.h"
|
#include "ui/iconloader.h"
|
||||||
|
|
||||||
#include <QIcon>
|
#include <QIcon>
|
||||||
|
#include <QUrl>
|
||||||
|
|
||||||
const char* UrlSearchProvider::kUrlRegex = "^[a-zA-Z][a-zA-Z0-9+-.]*://";
|
const char* UrlSearchProvider::kUrlRegex = "^[a-zA-Z][a-zA-Z0-9+-.]*://";
|
||||||
|
|
||||||
|
@ -26,6 +26,7 @@
|
|||||||
#include "core/network.h"
|
#include "core/network.h"
|
||||||
#include "core/scopedtransaction.h"
|
#include "core/scopedtransaction.h"
|
||||||
#include "core/taskmanager.h"
|
#include "core/taskmanager.h"
|
||||||
|
#include "core/timeconstants.h"
|
||||||
#include "globalsearch/globalsearch.h"
|
#include "globalsearch/globalsearch.h"
|
||||||
#include "globalsearch/librarysearchprovider.h"
|
#include "globalsearch/librarysearchprovider.h"
|
||||||
#include "library/librarybackend.h"
|
#include "library/librarybackend.h"
|
||||||
|
@ -26,6 +26,7 @@
|
|||||||
#include "core/player.h"
|
#include "core/player.h"
|
||||||
#include "core/song.h"
|
#include "core/song.h"
|
||||||
#include "core/taskmanager.h"
|
#include "core/taskmanager.h"
|
||||||
|
#include "core/timeconstants.h"
|
||||||
#include "globalsearch/globalsearch.h"
|
#include "globalsearch/globalsearch.h"
|
||||||
#include "globalsearch/librarysearchprovider.h"
|
#include "globalsearch/librarysearchprovider.h"
|
||||||
#include "library/librarymodel.h"
|
#include "library/librarymodel.h"
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
#include "core/logging.h"
|
#include "core/logging.h"
|
||||||
#include "core/player.h"
|
#include "core/player.h"
|
||||||
#include "core/taskmanager.h"
|
#include "core/taskmanager.h"
|
||||||
|
#include "core/timeconstants.h"
|
||||||
#include "core/utilities.h"
|
#include "core/utilities.h"
|
||||||
#include "globalsearch/globalsearch.h"
|
#include "globalsearch/globalsearch.h"
|
||||||
#include "globalsearch/spotifysearchprovider.h"
|
#include "globalsearch/spotifysearchprovider.h"
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
|
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
#include <QSet>
|
#include <QSet>
|
||||||
|
#include <QUrl>
|
||||||
|
|
||||||
#include "directory.h"
|
#include "directory.h"
|
||||||
#include "libraryquery.h"
|
#include "libraryquery.h"
|
||||||
|
@ -19,9 +19,11 @@
|
|||||||
#include "musicbrainzclient.h"
|
#include "musicbrainzclient.h"
|
||||||
#include "musicdnsclient.h"
|
#include "musicdnsclient.h"
|
||||||
#include "tagfetcher.h"
|
#include "tagfetcher.h"
|
||||||
|
#include "core/timeconstants.h"
|
||||||
|
|
||||||
#include <QFuture>
|
#include <QFuture>
|
||||||
#include <QFutureWatcher>
|
#include <QFutureWatcher>
|
||||||
|
#include <QUrl>
|
||||||
#include <QtConcurrentMap>
|
#include <QtConcurrentMap>
|
||||||
|
|
||||||
TagFetcher::TagFetcher(QObject* parent)
|
TagFetcher::TagFetcher(QObject* parent)
|
||||||
|
@ -27,6 +27,7 @@
|
|||||||
#include "songplaylistitem.h"
|
#include "songplaylistitem.h"
|
||||||
#include "core/logging.h"
|
#include "core/logging.h"
|
||||||
#include "core/modelfuturewatcher.h"
|
#include "core/modelfuturewatcher.h"
|
||||||
|
#include "core/timeconstants.h"
|
||||||
#include "internet/jamendoplaylistitem.h"
|
#include "internet/jamendoplaylistitem.h"
|
||||||
#include "internet/jamendoservice.h"
|
#include "internet/jamendoservice.h"
|
||||||
#include "internet/magnatuneplaylistitem.h"
|
#include "internet/magnatuneplaylistitem.h"
|
||||||
|
@ -27,7 +27,7 @@
|
|||||||
#include "library/library.h"
|
#include "library/library.h"
|
||||||
#include "library/libraryplaylistitem.h"
|
#include "library/libraryplaylistitem.h"
|
||||||
|
|
||||||
|
#include <QSqlQuery>
|
||||||
#include <QtConcurrentRun>
|
#include <QtConcurrentRun>
|
||||||
#include <QtDebug>
|
#include <QtDebug>
|
||||||
|
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
|
|
||||||
#include "cueparser.h"
|
#include "cueparser.h"
|
||||||
#include "core/logging.h"
|
#include "core/logging.h"
|
||||||
|
#include "core/timeconstants.h"
|
||||||
|
|
||||||
#include <QBuffer>
|
#include <QBuffer>
|
||||||
#include <QDateTime>
|
#include <QDateTime>
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
|
|
||||||
#include "m3uparser.h"
|
#include "m3uparser.h"
|
||||||
#include "core/logging.h"
|
#include "core/logging.h"
|
||||||
|
#include "core/timeconstants.h"
|
||||||
|
|
||||||
#include <QBuffer>
|
#include <QBuffer>
|
||||||
#include <QtDebug>
|
#include <QtDebug>
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
|
|
||||||
#include "plsparser.h"
|
#include "plsparser.h"
|
||||||
#include "core/logging.h"
|
#include "core/logging.h"
|
||||||
|
#include "core/timeconstants.h"
|
||||||
|
|
||||||
#include <QTextStream>
|
#include <QTextStream>
|
||||||
#include <QtDebug>
|
#include <QtDebug>
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "xspfparser.h"
|
#include "xspfparser.h"
|
||||||
|
#include "core/timeconstants.h"
|
||||||
|
|
||||||
#include <QDomDocument>
|
#include <QDomDocument>
|
||||||
#include <QFile>
|
#include <QFile>
|
||||||
|
@ -279,7 +279,7 @@ msgstr ""
|
|||||||
msgid "AAC 64k"
|
msgid "AAC 64k"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: core/song.cpp:140
|
#: core/song.cpp:393
|
||||||
msgid "AIFF"
|
msgid "AIFF"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -486,7 +486,7 @@ msgstr ""
|
|||||||
msgid "After copying..."
|
msgid "After copying..."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: playlist/playlist.cpp:1103 ui/organisedialog.cpp:52
|
#: playlist/playlist.cpp:1104 ui/organisedialog.cpp:52
|
||||||
#: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129
|
#: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129
|
||||||
#: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155
|
#: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155
|
||||||
#: ../bin/src/ui_albumcoversearcher.h:110
|
#: ../bin/src/ui_albumcoversearcher.h:110
|
||||||
@ -499,12 +499,12 @@ msgstr ""
|
|||||||
msgid "Album (ideal loudness for all tracks)"
|
msgid "Album (ideal loudness for all tracks)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: playlist/playlist.cpp:1109 ui/organisedialog.cpp:55
|
#: playlist/playlist.cpp:1110 ui/organisedialog.cpp:55
|
||||||
#: ../bin/src/ui_edittagdialog.h:658
|
#: ../bin/src/ui_edittagdialog.h:658
|
||||||
msgid "Album artist"
|
msgid "Album artist"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: internet/jamendoservice.cpp:410
|
#: internet/jamendoservice.cpp:411
|
||||||
msgid "Album info on jamendo.com..."
|
msgid "Album info on jamendo.com..."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -641,7 +641,7 @@ msgstr ""
|
|||||||
msgid "Are you sure you want to reset this song's statistics?"
|
msgid "Are you sure you want to reset this song's statistics?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: playlist/playlist.cpp:1102 ui/organisedialog.cpp:53
|
#: playlist/playlist.cpp:1103 ui/organisedialog.cpp:53
|
||||||
#: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130
|
#: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130
|
||||||
#: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156
|
#: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156
|
||||||
#: ../bin/src/ui_albumcoversearcher.h:106
|
#: ../bin/src/ui_albumcoversearcher.h:106
|
||||||
@ -709,7 +709,7 @@ msgstr ""
|
|||||||
msgid "Average image size"
|
msgid "Average image size"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: playlist/playlist.cpp:1118 ui/organisedialog.cpp:59
|
#: playlist/playlist.cpp:1119 ui/organisedialog.cpp:59
|
||||||
#: ../bin/src/ui_edittagdialog.h:638
|
#: ../bin/src/ui_edittagdialog.h:638
|
||||||
msgid "BPM"
|
msgid "BPM"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -755,7 +755,7 @@ msgstr ""
|
|||||||
msgid "Biography from %1"
|
msgid "Biography from %1"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: playlist/playlist.cpp:1119 ../bin/src/ui_edittagdialog.h:640
|
#: playlist/playlist.cpp:1120 ../bin/src/ui_edittagdialog.h:640
|
||||||
msgid "Bit rate"
|
msgid "Bit rate"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -798,7 +798,7 @@ msgstr ""
|
|||||||
msgid "Buttons"
|
msgid "Buttons"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: core/song.cpp:143
|
#: core/song.cpp:396
|
||||||
msgid "CDDA"
|
msgid "CDDA"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -973,7 +973,7 @@ msgstr ""
|
|||||||
msgid "Comma separated list of class:level, level is 0-3"
|
msgid "Comma separated list of class:level, level is 0-3"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: playlist/playlist.cpp:1128 smartplaylists/searchterm.cpp:279
|
#: playlist/playlist.cpp:1129 smartplaylists/searchterm.cpp:279
|
||||||
#: ui/organisedialog.cpp:62 ../bin/src/ui_edittagdialog.h:661
|
#: ui/organisedialog.cpp:62 ../bin/src/ui_edittagdialog.h:661
|
||||||
msgid "Comment"
|
msgid "Comment"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -986,7 +986,7 @@ msgstr ""
|
|||||||
msgid "Complete tags automatically..."
|
msgid "Complete tags automatically..."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: playlist/playlist.cpp:1110 ui/organisedialog.cpp:56
|
#: playlist/playlist.cpp:1111 ui/organisedialog.cpp:56
|
||||||
#: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145
|
#: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145
|
||||||
#: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:659
|
#: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:659
|
||||||
msgid "Composer"
|
msgid "Composer"
|
||||||
@ -1000,7 +1000,7 @@ msgstr ""
|
|||||||
msgid "Configure Last.fm..."
|
msgid "Configure Last.fm..."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: internet/magnatuneservice.cpp:273
|
#: internet/magnatuneservice.cpp:274
|
||||||
msgid "Configure Magnatune..."
|
msgid "Configure Magnatune..."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -1008,7 +1008,7 @@ msgstr ""
|
|||||||
msgid "Configure Shortcuts"
|
msgid "Configure Shortcuts"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: internet/spotifyservice.cpp:490
|
#: internet/spotifyservice.cpp:491
|
||||||
msgid "Configure Spotify..."
|
msgid "Configure Spotify..."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -1029,7 +1029,7 @@ msgstr ""
|
|||||||
msgid "Connect device"
|
msgid "Connect device"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: internet/spotifyservice.cpp:245
|
#: internet/spotifyservice.cpp:246
|
||||||
msgid "Connecting to Spotify"
|
msgid "Connecting to Spotify"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -1233,11 +1233,11 @@ msgstr ""
|
|||||||
msgid "Dance"
|
msgid "Dance"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: playlist/playlist.cpp:1126 ../bin/src/ui_edittagdialog.h:649
|
#: playlist/playlist.cpp:1127 ../bin/src/ui_edittagdialog.h:649
|
||||||
msgid "Date created"
|
msgid "Date created"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: playlist/playlist.cpp:1125 ../bin/src/ui_edittagdialog.h:648
|
#: playlist/playlist.cpp:1126 ../bin/src/ui_edittagdialog.h:648
|
||||||
msgid "Date modified"
|
msgid "Date modified"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -1295,7 +1295,7 @@ msgstr ""
|
|||||||
msgid "Delete the original files"
|
msgid "Delete the original files"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: core/deletefiles.cpp:49
|
#: core/deletefiles.cpp:50
|
||||||
msgid "Deleting files"
|
msgid "Deleting files"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -1372,7 +1372,7 @@ msgstr ""
|
|||||||
msgid "Disabled"
|
msgid "Disabled"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: playlist/playlist.cpp:1106 ui/organisedialog.cpp:58
|
#: playlist/playlist.cpp:1107 ui/organisedialog.cpp:58
|
||||||
#: ../bin/src/ui_edittagdialog.h:655
|
#: ../bin/src/ui_edittagdialog.h:655
|
||||||
msgid "Disc"
|
msgid "Disc"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -1434,11 +1434,11 @@ msgstr ""
|
|||||||
msgid "Download membership"
|
msgid "Download membership"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: internet/magnatuneservice.cpp:269
|
#: internet/magnatuneservice.cpp:270
|
||||||
msgid "Download this album"
|
msgid "Download this album"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: internet/jamendoservice.cpp:412
|
#: internet/jamendoservice.cpp:413
|
||||||
msgid "Download this album..."
|
msgid "Download this album..."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -1450,11 +1450,11 @@ msgstr ""
|
|||||||
msgid "Downloading Icecast directory"
|
msgid "Downloading Icecast directory"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: internet/jamendoservice.cpp:182
|
#: internet/jamendoservice.cpp:183
|
||||||
msgid "Downloading Jamendo catalogue"
|
msgid "Downloading Jamendo catalogue"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: internet/magnatuneservice.cpp:154
|
#: internet/magnatuneservice.cpp:155
|
||||||
msgid "Downloading Magnatune catalogue"
|
msgid "Downloading Magnatune catalogue"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -1462,7 +1462,7 @@ msgstr ""
|
|||||||
msgid "Downloading Spotify plugin"
|
msgid "Downloading Spotify plugin"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: musicbrainz/tagfetcher.cpp:99
|
#: musicbrainz/tagfetcher.cpp:101
|
||||||
msgid "Downloading metadata"
|
msgid "Downloading metadata"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -1478,7 +1478,7 @@ msgstr ""
|
|||||||
msgid "Dynamic mode is on"
|
msgid "Dynamic mode is on"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: internet/jamendoservice.cpp:110 library/library.cpp:88
|
#: internet/jamendoservice.cpp:111 library/library.cpp:88
|
||||||
msgid "Dynamic random mix"
|
msgid "Dynamic random mix"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -1602,11 +1602,11 @@ msgstr ""
|
|||||||
msgid "Error connecting MTP device"
|
msgid "Error connecting MTP device"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ui/organiseerrordialog.cpp:53
|
#: ui/organiseerrordialog.cpp:55
|
||||||
msgid "Error copying songs"
|
msgid "Error copying songs"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ui/organiseerrordialog.cpp:58
|
#: ui/organiseerrordialog.cpp:60
|
||||||
msgid "Error deleting songs"
|
msgid "Error deleting songs"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -1729,19 +1729,19 @@ msgstr ""
|
|||||||
msgid "File formats"
|
msgid "File formats"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: playlist/playlist.cpp:1121 ../bin/src/ui_edittagdialog.h:650
|
#: playlist/playlist.cpp:1122 ../bin/src/ui_edittagdialog.h:650
|
||||||
msgid "File name"
|
msgid "File name"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: playlist/playlist.cpp:1122
|
#: playlist/playlist.cpp:1123
|
||||||
msgid "File name (without path)"
|
msgid "File name (without path)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: playlist/playlist.cpp:1123 ../bin/src/ui_edittagdialog.h:644
|
#: playlist/playlist.cpp:1124 ../bin/src/ui_edittagdialog.h:644
|
||||||
msgid "File size"
|
msgid "File size"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: playlist/playlist.cpp:1124 ../bin/src/ui_groupbydialog.h:133
|
#: playlist/playlist.cpp:1125 ../bin/src/ui_groupbydialog.h:133
|
||||||
#: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159
|
#: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159
|
||||||
#: ../bin/src/ui_edittagdialog.h:646
|
#: ../bin/src/ui_edittagdialog.h:646
|
||||||
msgid "File type"
|
msgid "File type"
|
||||||
@ -1775,7 +1775,7 @@ msgstr ""
|
|||||||
msgid "Find songs in your library that match the criteria you specify."
|
msgid "Find songs in your library that match the criteria you specify."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: musicbrainz/tagfetcher.cpp:52
|
#: musicbrainz/tagfetcher.cpp:54
|
||||||
msgid "Fingerprinting song"
|
msgid "Fingerprinting song"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -1787,7 +1787,7 @@ msgstr ""
|
|||||||
msgid "First level"
|
msgid "First level"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: core/song.cpp:133
|
#: core/song.cpp:386
|
||||||
msgid "Flac"
|
msgid "Flac"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -1874,7 +1874,7 @@ msgstr ""
|
|||||||
msgid "General settings"
|
msgid "General settings"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: playlist/playlist.cpp:1108 ui/organisedialog.cpp:61
|
#: playlist/playlist.cpp:1109 ui/organisedialog.cpp:61
|
||||||
#: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147
|
#: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147
|
||||||
#: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:660
|
#: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:660
|
||||||
msgid "Genre"
|
msgid "Genre"
|
||||||
@ -2023,7 +2023,7 @@ msgstr ""
|
|||||||
msgid "Icons on top"
|
msgid "Icons on top"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: musicbrainz/tagfetcher.cpp:83
|
#: musicbrainz/tagfetcher.cpp:85
|
||||||
msgid "Identifying song"
|
msgid "Identifying song"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -2057,7 +2057,7 @@ msgid ""
|
|||||||
"time a song finishes."
|
"time a song finishes."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: internet/spotifyservice.cpp:346
|
#: internet/spotifyservice.cpp:347
|
||||||
msgid "Inbox"
|
msgid "Inbox"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -2133,27 +2133,27 @@ msgstr ""
|
|||||||
msgid "Invalid username and/or password"
|
msgid "Invalid username and/or password"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: internet/jamendoservice.cpp:123
|
#: internet/jamendoservice.cpp:124
|
||||||
msgid "Jamendo"
|
msgid "Jamendo"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: internet/jamendoservice.cpp:106
|
#: internet/jamendoservice.cpp:107
|
||||||
msgid "Jamendo Most Listened Tracks"
|
msgid "Jamendo Most Listened Tracks"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: internet/jamendoservice.cpp:104
|
#: internet/jamendoservice.cpp:105
|
||||||
msgid "Jamendo Top Tracks"
|
msgid "Jamendo Top Tracks"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: internet/jamendoservice.cpp:100
|
#: internet/jamendoservice.cpp:101
|
||||||
msgid "Jamendo Top Tracks of the Month"
|
msgid "Jamendo Top Tracks of the Month"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: internet/jamendoservice.cpp:102
|
#: internet/jamendoservice.cpp:103
|
||||||
msgid "Jamendo Top Tracks of the Week"
|
msgid "Jamendo Top Tracks of the Week"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: internet/jamendoservice.cpp:166
|
#: internet/jamendoservice.cpp:167
|
||||||
msgid "Jamendo database"
|
msgid "Jamendo database"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -2205,7 +2205,7 @@ msgstr ""
|
|||||||
msgid "Large sidebar"
|
msgid "Large sidebar"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: library/library.cpp:66 playlist/playlist.cpp:1115
|
#: library/library.cpp:66 playlist/playlist.cpp:1116
|
||||||
#: ../bin/src/ui_edittagdialog.h:641
|
#: ../bin/src/ui_edittagdialog.h:641
|
||||||
msgid "Last played"
|
msgid "Last played"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -2284,7 +2284,7 @@ msgstr ""
|
|||||||
msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc."
|
msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: playlist/playlist.cpp:1104 ui/organisedialog.cpp:63
|
#: playlist/playlist.cpp:1105 ui/organisedialog.cpp:63
|
||||||
#: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:636
|
#: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:636
|
||||||
msgid "Length"
|
msgid "Length"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -2430,7 +2430,7 @@ msgstr ""
|
|||||||
msgid "Lyrics from %1"
|
msgid "Lyrics from %1"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: core/song.cpp:136 ../bin/src/ui_transcodersettingspage.h:159
|
#: core/song.cpp:389 ../bin/src/ui_transcodersettingspage.h:159
|
||||||
msgid "MP3"
|
msgid "MP3"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -2442,15 +2442,15 @@ msgstr ""
|
|||||||
msgid "MP3 96k"
|
msgid "MP3 96k"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: core/song.cpp:134
|
#: core/song.cpp:387
|
||||||
msgid "MP4 AAC"
|
msgid "MP4 AAC"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: core/song.cpp:135
|
#: core/song.cpp:388
|
||||||
msgid "MPC"
|
msgid "MPC"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: internet/magnatuneservice.cpp:99 ../bin/src/ui_magnatunesettingspage.h:154
|
#: internet/magnatuneservice.cpp:100 ../bin/src/ui_magnatunesettingspage.h:154
|
||||||
msgid "Magnatune"
|
msgid "Magnatune"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -2466,7 +2466,7 @@ msgstr ""
|
|||||||
msgid "Main profile (MAIN)"
|
msgid "Main profile (MAIN)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: internet/spotifyservice.cpp:495
|
#: internet/spotifyservice.cpp:496
|
||||||
msgid "Make playlist available offline"
|
msgid "Make playlist available offline"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -2663,7 +2663,7 @@ msgstr ""
|
|||||||
msgid "Newest tracks"
|
msgid "Newest tracks"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ui/edittagdialog.cpp:158 ui/trackselectiondialog.cpp:47
|
#: ui/edittagdialog.cpp:158 ui/trackselectiondialog.cpp:48
|
||||||
msgid "Next"
|
msgid "Next"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -2754,15 +2754,15 @@ msgstr ""
|
|||||||
msgid "OSD Preview"
|
msgid "OSD Preview"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: core/song.cpp:137
|
#: core/song.cpp:390
|
||||||
msgid "Ogg Flac"
|
msgid "Ogg Flac"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: core/song.cpp:138
|
#: core/song.cpp:391
|
||||||
msgid "Ogg Speex"
|
msgid "Ogg Speex"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: core/song.cpp:139 ../bin/src/ui_magnatunedownloaddialog.h:139
|
#: core/song.cpp:392 ../bin/src/ui_magnatunedownloaddialog.h:139
|
||||||
#: ../bin/src/ui_magnatunesettingspage.h:170
|
#: ../bin/src/ui_magnatunesettingspage.h:170
|
||||||
msgid "Ogg Vorbis"
|
msgid "Ogg Vorbis"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -2773,7 +2773,7 @@ msgstr ""
|
|||||||
|
|
||||||
#: internet/digitallyimportedservicebase.cpp:178
|
#: internet/digitallyimportedservicebase.cpp:178
|
||||||
#: internet/groovesharkservice.cpp:503 internet/icecastservice.cpp:300
|
#: internet/groovesharkservice.cpp:503 internet/icecastservice.cpp:300
|
||||||
#: internet/jamendoservice.cpp:414 internet/magnatuneservice.cpp:271
|
#: internet/jamendoservice.cpp:415 internet/magnatuneservice.cpp:272
|
||||||
#: internet/somafmservice.cpp:84
|
#: internet/somafmservice.cpp:84
|
||||||
#, qt-format
|
#, qt-format
|
||||||
msgid "Open %1 in browser"
|
msgid "Open %1 in browser"
|
||||||
@ -2826,11 +2826,11 @@ msgstr ""
|
|||||||
msgid "Organise files..."
|
msgid "Organise files..."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: core/organise.cpp:63
|
#: core/organise.cpp:64
|
||||||
msgid "Organising files"
|
msgid "Organising files"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ui/trackselectiondialog.cpp:164
|
#: ui/trackselectiondialog.cpp:165
|
||||||
msgid "Original tags"
|
msgid "Original tags"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -2854,7 +2854,7 @@ msgstr ""
|
|||||||
msgid "Overwrite existing files"
|
msgid "Overwrite existing files"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: internet/jamendoservice.cpp:209
|
#: internet/jamendoservice.cpp:210
|
||||||
msgid "Parsing Jamendo catalogue"
|
msgid "Parsing Jamendo catalogue"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -2905,7 +2905,7 @@ msgstr ""
|
|||||||
msgid "Play artist radio..."
|
msgid "Play artist radio..."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: playlist/playlist.cpp:1113 ../bin/src/ui_edittagdialog.h:637
|
#: playlist/playlist.cpp:1114 ../bin/src/ui_edittagdialog.h:637
|
||||||
msgid "Play count"
|
msgid "Play count"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -3061,7 +3061,7 @@ msgstr ""
|
|||||||
msgid "Preview"
|
msgid "Preview"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ui/edittagdialog.cpp:157 ui/trackselectiondialog.cpp:46
|
#: ui/edittagdialog.cpp:157 ui/trackselectiondialog.cpp:47
|
||||||
msgid "Previous"
|
msgid "Previous"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -3153,7 +3153,7 @@ msgstr ""
|
|||||||
msgid "Rate the current song 5 stars"
|
msgid "Rate the current song 5 stars"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: playlist/playlist.cpp:1112 ../bin/src/ui_edittagdialog.h:645
|
#: playlist/playlist.cpp:1113 ../bin/src/ui_edittagdialog.h:645
|
||||||
msgid "Rating"
|
msgid "Rating"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -3161,7 +3161,7 @@ msgstr ""
|
|||||||
msgid "Really cancel?"
|
msgid "Really cancel?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: internet/jamendoservice.cpp:415 internet/magnatuneservice.cpp:272
|
#: internet/jamendoservice.cpp:416 internet/magnatuneservice.cpp:273
|
||||||
msgid "Refresh catalogue"
|
msgid "Refresh catalogue"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -3325,7 +3325,7 @@ msgstr ""
|
|||||||
msgid "Safely remove the device after copying"
|
msgid "Safely remove the device after copying"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: playlist/playlist.cpp:1120 ../bin/src/ui_edittagdialog.h:642
|
#: playlist/playlist.cpp:1121 ../bin/src/ui_edittagdialog.h:642
|
||||||
msgid "Sample rate"
|
msgid "Sample rate"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -3361,7 +3361,7 @@ msgstr ""
|
|||||||
msgid "Save this stream in the Internet tab"
|
msgid "Save this stream in the Internet tab"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ui/edittagdialog.cpp:618 ui/trackselectiondialog.cpp:249
|
#: ui/edittagdialog.cpp:618 ui/trackselectiondialog.cpp:250
|
||||||
msgid "Saving tracks"
|
msgid "Saving tracks"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -3369,7 +3369,7 @@ msgstr ""
|
|||||||
msgid "Scalable sampling rate profile (SSR)"
|
msgid "Scalable sampling rate profile (SSR)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: playlist/playlist.cpp:1116 ../bin/src/ui_edittagdialog.h:643
|
#: playlist/playlist.cpp:1117 ../bin/src/ui_edittagdialog.h:643
|
||||||
msgid "Score"
|
msgid "Score"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -3395,23 +3395,23 @@ msgstr ""
|
|||||||
msgid "Search Icecast stations"
|
msgid "Search Icecast stations"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: internet/jamendoservice.cpp:421
|
#: internet/jamendoservice.cpp:422
|
||||||
msgid "Search Jamendo"
|
msgid "Search Jamendo"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: internet/magnatuneservice.cpp:278
|
#: internet/magnatuneservice.cpp:279
|
||||||
msgid "Search Magnatune"
|
msgid "Search Magnatune"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: internet/spotifysearchplaylisttype.cpp:32 internet/spotifyservice.cpp:603
|
#: internet/spotifysearchplaylisttype.cpp:32 internet/spotifyservice.cpp:604
|
||||||
msgid "Search Spotify"
|
msgid "Search Spotify"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: internet/spotifyservice.cpp:337
|
#: internet/spotifyservice.cpp:338
|
||||||
msgid "Search Spotify (opens a new tab)"
|
msgid "Search Spotify (opens a new tab)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: internet/spotifyservice.cpp:488
|
#: internet/spotifyservice.cpp:489
|
||||||
msgid "Search Spotify (opens a new tab)..."
|
msgid "Search Spotify (opens a new tab)..."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -3663,7 +3663,7 @@ msgstr ""
|
|||||||
msgid "Skip backwards in playlist"
|
msgid "Skip backwards in playlist"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: playlist/playlist.cpp:1114 ../bin/src/ui_edittagdialog.h:639
|
#: playlist/playlist.cpp:1115 ../bin/src/ui_edittagdialog.h:639
|
||||||
msgid "Skip count"
|
msgid "Skip count"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -3743,7 +3743,7 @@ msgstr ""
|
|||||||
msgid "Spotify"
|
msgid "Spotify"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: internet/spotifyservice.cpp:178
|
#: internet/spotifyservice.cpp:179
|
||||||
msgid "Spotify login error"
|
msgid "Spotify login error"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -3759,7 +3759,7 @@ msgstr ""
|
|||||||
msgid "Standard"
|
msgid "Standard"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: internet/spotifyservice.cpp:342
|
#: internet/spotifyservice.cpp:343
|
||||||
msgid "Starred"
|
msgid "Starred"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -3811,7 +3811,7 @@ msgstr ""
|
|||||||
msgid "Stopped"
|
msgid "Stopped"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: core/song.cpp:145
|
#: core/song.cpp:398
|
||||||
msgid "Stream"
|
msgid "Stream"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -3828,7 +3828,7 @@ msgstr ""
|
|||||||
msgid "Successfully written %1"
|
msgid "Successfully written %1"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ui/trackselectiondialog.cpp:168
|
#: ui/trackselectiondialog.cpp:169
|
||||||
msgid "Suggested tags"
|
msgid "Suggested tags"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -3854,15 +3854,15 @@ msgstr ""
|
|||||||
msgid "Switch provider"
|
msgid "Switch provider"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: internet/spotifyservice.cpp:514
|
#: internet/spotifyservice.cpp:515
|
||||||
msgid "Syncing Spotify inbox"
|
msgid "Syncing Spotify inbox"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: internet/spotifyservice.cpp:509
|
#: internet/spotifyservice.cpp:510
|
||||||
msgid "Syncing Spotify playlist"
|
msgid "Syncing Spotify playlist"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: internet/spotifyservice.cpp:518
|
#: internet/spotifyservice.cpp:519
|
||||||
msgid "Syncing Spotify starred tracks"
|
msgid "Syncing Spotify starred tracks"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -3935,13 +3935,13 @@ msgstr ""
|
|||||||
msgid "There was a problem fetching the metadata from Magnatune"
|
msgid "There was a problem fetching the metadata from Magnatune"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ui/organiseerrordialog.cpp:54
|
#: ui/organiseerrordialog.cpp:56
|
||||||
msgid ""
|
msgid ""
|
||||||
"There were problems copying some songs. The following files could not be "
|
"There were problems copying some songs. The following files could not be "
|
||||||
"copied:"
|
"copied:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ui/organiseerrordialog.cpp:59
|
#: ui/organiseerrordialog.cpp:61
|
||||||
msgid ""
|
msgid ""
|
||||||
"There were problems deleting some songs. The following files could not be "
|
"There were problems deleting some songs. The following files could not be "
|
||||||
"deleted:"
|
"deleted:"
|
||||||
@ -3972,7 +3972,7 @@ msgstr ""
|
|||||||
msgid "Third level"
|
msgid "Third level"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: internet/jamendoservice.cpp:166
|
#: internet/jamendoservice.cpp:167
|
||||||
msgid ""
|
msgid ""
|
||||||
"This action will create a database which could be as big as 150 MB.\n"
|
"This action will create a database which could be as big as 150 MB.\n"
|
||||||
"Do you want to continue anyway?"
|
"Do you want to continue anyway?"
|
||||||
@ -4034,7 +4034,7 @@ msgstr ""
|
|||||||
msgid "Timezone"
|
msgid "Timezone"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: playlist/playlist.cpp:1101 ui/organisedialog.cpp:51
|
#: playlist/playlist.cpp:1102 ui/organisedialog.cpp:51
|
||||||
#: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142
|
#: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142
|
||||||
#: ../bin/src/ui_edittagdialog.h:652 ../bin/src/ui_trackselectiondialog.h:211
|
#: ../bin/src/ui_edittagdialog.h:652 ../bin/src/ui_trackselectiondialog.h:211
|
||||||
msgid "Title"
|
msgid "Title"
|
||||||
@ -4072,7 +4072,7 @@ msgstr ""
|
|||||||
msgid "Total network requests made"
|
msgid "Total network requests made"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: playlist/playlist.cpp:1105 ui/organisedialog.cpp:57
|
#: playlist/playlist.cpp:1106 ui/organisedialog.cpp:57
|
||||||
#: ../bin/src/ui_edittagdialog.h:653 ../bin/src/ui_trackselectiondialog.h:212
|
#: ../bin/src/ui_edittagdialog.h:653 ../bin/src/ui_trackselectiondialog.h:212
|
||||||
msgid "Track"
|
msgid "Track"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -4098,7 +4098,7 @@ msgstr ""
|
|||||||
msgid "Transcoding options"
|
msgid "Transcoding options"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: core/song.cpp:142
|
#: core/song.cpp:395
|
||||||
msgid "TrueAudio"
|
msgid "TrueAudio"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -4127,7 +4127,7 @@ msgstr ""
|
|||||||
msgid "Unable to download %1 (%2)"
|
msgid "Unable to download %1 (%2)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: core/song.cpp:149 globalsearch/globalsearchitemdelegate.cpp:166
|
#: core/song.cpp:402 globalsearch/globalsearchitemdelegate.cpp:166
|
||||||
#: globalsearch/globalsearchitemdelegate.cpp:173 library/librarymodel.cpp:297
|
#: globalsearch/globalsearchitemdelegate.cpp:173 library/librarymodel.cpp:297
|
||||||
#: library/librarymodel.cpp:302 library/librarymodel.cpp:926
|
#: library/librarymodel.cpp:302 library/librarymodel.cpp:926
|
||||||
#: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:381
|
#: playlist/playlistdelegates.cpp:306 playlist/playlistmanager.cpp:381
|
||||||
@ -4306,7 +4306,7 @@ msgstr ""
|
|||||||
msgid "WMA"
|
msgid "WMA"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: core/song.cpp:141
|
#: core/song.cpp:394
|
||||||
msgid "Wav"
|
msgid "Wav"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -4379,7 +4379,7 @@ msgstr ""
|
|||||||
msgid "Windows Media 64k"
|
msgid "Windows Media 64k"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: core/song.cpp:132
|
#: core/song.cpp:385
|
||||||
msgid "Windows Media audio"
|
msgid "Windows Media audio"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -4387,7 +4387,7 @@ msgstr ""
|
|||||||
msgid "Would you like to run a full rescan right now?"
|
msgid "Would you like to run a full rescan right now?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: playlist/playlist.cpp:1107 ui/organisedialog.cpp:60
|
#: playlist/playlist.cpp:1108 ui/organisedialog.cpp:60
|
||||||
#: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148
|
#: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148
|
||||||
#: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:657
|
#: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:657
|
||||||
msgid "Year"
|
msgid "Year"
|
||||||
@ -4464,7 +4464,7 @@ msgstr ""
|
|||||||
msgid "You do not have a Spotify Premium account."
|
msgid "You do not have a Spotify Premium account."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: internet/spotifyservice.cpp:164
|
#: internet/spotifyservice.cpp:165
|
||||||
msgid ""
|
msgid ""
|
||||||
"You have been logged out of Spotify, please re-enter your password in the "
|
"You have been logged out of Spotify, please re-enter your password in the "
|
||||||
"Settings dialog."
|
"Settings dialog."
|
||||||
|
@ -18,6 +18,8 @@
|
|||||||
#include "organiseerrordialog.h"
|
#include "organiseerrordialog.h"
|
||||||
#include "ui_organiseerrordialog.h"
|
#include "ui_organiseerrordialog.h"
|
||||||
|
|
||||||
|
#include <QUrl>
|
||||||
|
|
||||||
OrganiseErrorDialog::OrganiseErrorDialog(QWidget *parent)
|
OrganiseErrorDialog::OrganiseErrorDialog(QWidget *parent)
|
||||||
: QDialog(parent),
|
: QDialog(parent),
|
||||||
ui_(new Ui_OrganiseErrorDialog)
|
ui_(new Ui_OrganiseErrorDialog)
|
||||||
|
@ -24,6 +24,7 @@
|
|||||||
#include <QPushButton>
|
#include <QPushButton>
|
||||||
#include <QShortcut>
|
#include <QShortcut>
|
||||||
#include <QTreeWidget>
|
#include <QTreeWidget>
|
||||||
|
#include <QUrl>
|
||||||
#include <QtConcurrentRun>
|
#include <QtConcurrentRun>
|
||||||
#include <QtDebug>
|
#include <QtDebug>
|
||||||
|
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
#include "playlistparsers/playlistparser.h"
|
#include "playlistparsers/playlistparser.h"
|
||||||
|
|
||||||
#include <QBuffer>
|
#include <QBuffer>
|
||||||
|
#include <QUrl>
|
||||||
|
|
||||||
class AsxIniParserTest : public ::testing::Test {
|
class AsxIniParserTest : public ::testing::Test {
|
||||||
protected:
|
protected:
|
||||||
|
@ -19,9 +19,11 @@
|
|||||||
#include "gmock/gmock-matchers.h"
|
#include "gmock/gmock-matchers.h"
|
||||||
#include "gtest/gtest.h"
|
#include "gtest/gtest.h"
|
||||||
|
|
||||||
|
#include "core/timeconstants.h"
|
||||||
#include "playlistparsers/asxparser.h"
|
#include "playlistparsers/asxparser.h"
|
||||||
|
|
||||||
#include <QBuffer>
|
#include <QBuffer>
|
||||||
|
#include <QUrl>
|
||||||
|
|
||||||
using ::testing::HasSubstr;
|
using ::testing::HasSubstr;
|
||||||
|
|
||||||
|
@ -21,8 +21,11 @@
|
|||||||
#include "test_utils.h"
|
#include "test_utils.h"
|
||||||
#include "mock_taglib.h"
|
#include "mock_taglib.h"
|
||||||
|
|
||||||
|
#include "core/timeconstants.h"
|
||||||
#include "playlistparsers/cueparser.h"
|
#include "playlistparsers/cueparser.h"
|
||||||
|
|
||||||
|
#include <QUrl>
|
||||||
|
|
||||||
class CueParserTest : public ::testing::Test {
|
class CueParserTest : public ::testing::Test {
|
||||||
protected:
|
protected:
|
||||||
static void SetUpTestCase() {
|
static void SetUpTestCase() {
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
#include "test_utils.h"
|
#include "test_utils.h"
|
||||||
#include "mock_taglib.h"
|
#include "mock_taglib.h"
|
||||||
|
|
||||||
|
#include "core/timeconstants.h"
|
||||||
#include "playlistparsers/m3uparser.h"
|
#include "playlistparsers/m3uparser.h"
|
||||||
|
|
||||||
#include <QBuffer>
|
#include <QBuffer>
|
||||||
|
@ -19,6 +19,9 @@
|
|||||||
#include "test_utils.h"
|
#include "test_utils.h"
|
||||||
|
|
||||||
#include "core/organiseformat.h"
|
#include "core/organiseformat.h"
|
||||||
|
#include "core/timeconstants.h"
|
||||||
|
|
||||||
|
#include <QUrl>
|
||||||
|
|
||||||
class OrganiseFormatTest : public ::testing::Test {
|
class OrganiseFormatTest : public ::testing::Test {
|
||||||
protected:
|
protected:
|
||||||
|
@ -18,11 +18,13 @@
|
|||||||
#include "test_utils.h"
|
#include "test_utils.h"
|
||||||
#include "gtest/gtest.h"
|
#include "gtest/gtest.h"
|
||||||
|
|
||||||
|
#include "core/timeconstants.h"
|
||||||
#include "playlistparsers/plsparser.h"
|
#include "playlistparsers/plsparser.h"
|
||||||
|
|
||||||
#include <QBuffer>
|
#include <QBuffer>
|
||||||
#include <QFile>
|
#include <QFile>
|
||||||
#include <QTemporaryFile>
|
#include <QTemporaryFile>
|
||||||
|
#include <QUrl>
|
||||||
#include <QtDebug>
|
#include <QtDebug>
|
||||||
|
|
||||||
#include <boost/shared_ptr.hpp>
|
#include <boost/shared_ptr.hpp>
|
||||||
|
@ -19,9 +19,11 @@
|
|||||||
#include "gmock/gmock-matchers.h"
|
#include "gmock/gmock-matchers.h"
|
||||||
#include "gtest/gtest.h"
|
#include "gtest/gtest.h"
|
||||||
|
|
||||||
|
#include "core/timeconstants.h"
|
||||||
#include "playlistparsers/xspfparser.h"
|
#include "playlistparsers/xspfparser.h"
|
||||||
|
|
||||||
#include <QBuffer>
|
#include <QBuffer>
|
||||||
|
#include <QUrl>
|
||||||
|
|
||||||
using ::testing::HasSubstr;
|
using ::testing::HasSubstr;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user