diff options
Diffstat (limited to 'src')
30 files changed, 168 insertions, 119 deletions
diff --git a/src/plugins/CommandLineOptions/StatusOption/statusoption.cpp b/src/plugins/CommandLineOptions/StatusOption/statusoption.cpp index ecb0f8b37..79d2b64bd 100644 --- a/src/plugins/CommandLineOptions/StatusOption/statusoption.cpp +++ b/src/plugins/CommandLineOptions/StatusOption/statusoption.cpp @@ -71,7 +71,7 @@ QString StatusOption::executeCommand(const QString &opt_str, const QStringList & out += "TRACK = %n\n"; out += "FILE = %f"; MetaDataFormatter formatter(out); - out = formatter.format(core->metaData(), core->duration()); + out = formatter.format(&core->trackInfo()); } out += "\n"; } @@ -79,7 +79,7 @@ QString StatusOption::executeCommand(const QString &opt_str, const QStringList & { QString t = args.join(" "); MetaDataFormatter formatter(t); - out = formatter.format(core->metaData(), core->duration()); + out = formatter.format(&core->trackInfo()); out += "\n"; } else if(opt_str == "--nowplaying-syntax") diff --git a/src/plugins/Effect/filewriter/filewriterplugin.cpp b/src/plugins/Effect/filewriter/filewriterplugin.cpp index f7646d0a4..ecc0d1ba7 100644 --- a/src/plugins/Effect/filewriter/filewriterplugin.cpp +++ b/src/plugins/Effect/filewriter/filewriterplugin.cpp @@ -40,13 +40,13 @@ void FileWriterPlugin::configure(quint32 srate, ChannelMap map) { Effect::configure(srate, map); if(SoundCore::instance()->state() == Qmmp::Playing || SoundCore::instance()->state() == Qmmp::Paused) - init(SoundCore::instance()->metaData()); + init(SoundCore::instance()->trackInfo()); } void FileWriterPlugin::applyEffect(Buffer *b) { - if(!b->metaData.isNull()) - init(*b->metaData); + if(!b->trackInfo.isNull()) + init(*b->trackInfo); if(!m_inited || !b->samples) return; @@ -110,7 +110,7 @@ void FileWriterPlugin::applyEffect(Buffer *b) } } -void FileWriterPlugin::init(const QMap<Qmmp::MetaData, QString> &metaData) +void FileWriterPlugin::init(const TrackInfo &info) { deinit(); @@ -120,10 +120,10 @@ void FileWriterPlugin::init(const QMap<Qmmp::MetaData, QString> &metaData) outDir = settings.value("FileWriter/out_dir", outDir).toString(); QString fileName = settings.value("FileWriter/file_name", "%p%if(%p&%t, - ,)%t").toString(); if(fileName.isEmpty()) - fileName = metaData[Qmmp::URL].section("/", 1); + fileName = info.path().section("/", 1); MetaDataFormatter formatter(fileName); - fileName = formatter.format(metaData, SoundCore::instance()->duration()); + fileName = formatter.format(&info); if(!fileName.endsWith(".ogg", Qt::CaseInsensitive)) fileName.append(".ogg"); @@ -173,8 +173,8 @@ void FileWriterPlugin::init(const QMap<Qmmp::MetaData, QString> &metaData) int i = 0; while(tag_map[i].key != Qmmp::UNKNOWN) { - if(!metaData[tag_map[i].key].isEmpty()) - vorbis_comment_add_tag(&m_vc, tag_map[i].tag, metaData.value(tag_map[i].key).toUtf8().constData()); + if(!info.value(tag_map[i].key).isEmpty()) + vorbis_comment_add_tag(&m_vc, tag_map[i].tag, info.value(tag_map[i].key).toUtf8().constData()); i++; } diff --git a/src/plugins/Effect/filewriter/filewriterplugin.h b/src/plugins/Effect/filewriter/filewriterplugin.h index ebf0c6f39..1ec1174bd 100644 --- a/src/plugins/Effect/filewriter/filewriterplugin.h +++ b/src/plugins/Effect/filewriter/filewriterplugin.h @@ -37,7 +37,7 @@ public: void applyEffect(Buffer *b); private: - void init(const QMap<Qmmp::MetaData, QString> &metaData); + void init(const TrackInfo &info); void deinit(); void sendHeader(); diff --git a/src/plugins/General/statusicon/statusicon.cpp b/src/plugins/General/statusicon/statusicon.cpp index 86a260324..a4b96b7d3 100644 --- a/src/plugins/General/statusicon/statusicon.cpp +++ b/src/plugins/General/statusicon/statusicon.cpp @@ -124,21 +124,21 @@ void StatusIcon::setState(Qmmp::State state) void StatusIcon::showMetaData() { - QMap<Qmmp::MetaData, QString> meta = m_core->metaData(); - if(m_splitFileName && meta[Qmmp::TITLE].isEmpty() && !meta[Qmmp::URL].contains("://")) + TrackInfo info = m_core->trackInfo(); + if(m_splitFileName && info.value(Qmmp::TITLE).isEmpty() && !info.path().contains("://")) { - QString name = QFileInfo(meta[Qmmp::URL]).completeBaseName(); + QString name = QFileInfo(info.path()).completeBaseName(); if(name.contains("-")) { - meta[Qmmp::TITLE] = name.section('-',1,1).trimmed(); - if(meta[Qmmp::ARTIST].isEmpty()) - meta[Qmmp::ARTIST] = name.section('-',0,0).trimmed(); + info.setValue(Qmmp::TITLE, name.section('-',1,1).trimmed()); + if(info.value(Qmmp::ARTIST).isEmpty()) + info.setValue(Qmmp::ARTIST, name.section('-',0,0).trimmed()); } } - QString message = m_messageFormatter.format(meta, m_core->duration()); + QString message = m_messageFormatter.format(&info); if (message.isEmpty()) - message = meta[Qmmp::URL].section('/',-1); + message = info.path().section('/',-1); if (m_showMessage) m_tray->showMessage (tr("Now Playing"), message, @@ -146,9 +146,9 @@ void StatusIcon::showMetaData() if(m_showToolTip) { - message = m_toolTipFormatter.format(meta, m_core->duration()); + message = m_toolTipFormatter.format(&info); if(message.isEmpty()) - message = meta[Qmmp::URL].section('/',-1); + message = info.path().section('/',-1); m_tray->setToolTip(message); } } diff --git a/src/plugins/General/statusicon/statusiconpopupwidget.cpp b/src/plugins/General/statusicon/statusiconpopupwidget.cpp index e219d4122..e74492fb0 100644 --- a/src/plugins/General/statusicon/statusiconpopupwidget.cpp +++ b/src/plugins/General/statusicon/statusiconpopupwidget.cpp @@ -100,7 +100,7 @@ void StatusIconPopupWidget::updateMetaData(const QString &message) m_textLabel->setText(message); if(core->state() == Qmmp::Playing || core->state() == Qmmp::Paused) { - QPixmap cover = MetaDataManager::instance()->getCover(core->metaData(Qmmp::URL)); + QPixmap cover = MetaDataManager::instance()->getCover(core->trackInfo().path()); m_cover->show(); m_bar->show(); if(cover.isNull()) diff --git a/src/plugins/Output/shout/shoutoutput.cpp b/src/plugins/Output/shout/shoutoutput.cpp index 15bafb570..6be627357 100644 --- a/src/plugins/Output/shout/shoutoutput.cpp +++ b/src/plugins/Output/shout/shoutoutput.cpp @@ -196,7 +196,7 @@ void ShoutOutput::drain() void ShoutOutput::reset() {} -void ShoutOutput::setMetaData(const QMap<Qmmp::MetaData, QString> &metaData) +void ShoutOutput::setTrackInfo(const QMap<Qmmp::MetaData, QString> &metaData) { vorbis_comment_clear(&m_vc); diff --git a/src/plugins/Output/shout/shoutoutput.h b/src/plugins/Output/shout/shoutoutput.h index 71ff2dea0..5c0bc6d2c 100644 --- a/src/plugins/Output/shout/shoutoutput.h +++ b/src/plugins/Output/shout/shoutoutput.h @@ -37,7 +37,7 @@ public: qint64 writeAudio(unsigned char *data, qint64 maxSize); void drain(); void reset(); - void setMetaData(const QMap<Qmmp::MetaData, QString> &metaData); + void setTrackInfo(const QMap<Qmmp::MetaData, QString> &metaData); private: void sendHeader(); diff --git a/src/plugins/Transports/http/httpstreamreader.cpp b/src/plugins/Transports/http/httpstreamreader.cpp index be051a89b..25fa2729b 100644 --- a/src/plugins/Transports/http/httpstreamreader.cpp +++ b/src/plugins/Transports/http/httpstreamreader.cpp @@ -390,7 +390,6 @@ void HttpStreamReader::checkBuffer() { metaData.insert(Qmmp::TITLE, m_stream.header.value("icy-name")); metaData.insert(Qmmp::GENRE, m_stream.header.value("icy-genre")); - metaData.insert(Qmmp::URL, m_url); m_parent->addMetaData(metaData); } sendStreamInfo(m_codec); @@ -480,7 +479,6 @@ void HttpStreamReader::parseICYMetaData(char *data, qint64 size) else metaData.insert(Qmmp::TITLE, codec->toUnicode(m_stream.header.value("icy-name"))); metaData.insert(Qmmp::GENRE, codec->toUnicode(m_stream.header.value("icy-genre"))); - metaData.insert(Qmmp::URL, m_url); m_parent->addMetaData(metaData); sendStreamInfo(codec); m_meta_sent = true; diff --git a/src/plugins/Transports/mms/mmsstreamreader.cpp b/src/plugins/Transports/mms/mmsstreamreader.cpp index 503879654..73bb1bdbb 100644 --- a/src/plugins/Transports/mms/mmsstreamreader.cpp +++ b/src/plugins/Transports/mms/mmsstreamreader.cpp @@ -199,9 +199,9 @@ void MMSStreamReader::checkBuffer() { m_ready = true; qDebug("MMSStreamReader: ready"); - QMap<Qmmp::MetaData, QString> metaData; + /*QMap<Qmmp::MetaData, QString> metaData; metaData.insert(Qmmp::URL, m_url); - m_parent->addMetaData(metaData); + m_parent->addMetaData(metaData);*/ emit ready(); } else if (!m_ready) diff --git a/src/plugins/Ui/qsui/mainwindow.cpp b/src/plugins/Ui/qsui/mainwindow.cpp index f872c7186..7fb0db61b 100644 --- a/src/plugins/Ui/qsui/mainwindow.cpp +++ b/src/plugins/Ui/qsui/mainwindow.cpp @@ -894,7 +894,7 @@ void MainWindow::showMetaData() { PlayListModel *model = m_pl_manager->currentPlayList(); PlayListTrack *track = model->currentTrack(); - if(track && track->path() == m_core->metaData().value(Qmmp::URL)) + if(track && track->path() == m_core->trackInfo().path()) { setWindowTitle(m_titleFormatter.format(track)); } diff --git a/src/plugins/Ui/skinned/mainwindow.cpp b/src/plugins/Ui/skinned/mainwindow.cpp index 388f1d71c..8229f8a53 100644 --- a/src/plugins/Ui/skinned/mainwindow.cpp +++ b/src/plugins/Ui/skinned/mainwindow.cpp @@ -203,7 +203,7 @@ void MainWindow::showState(Qmmp::State state) void MainWindow::showMetaData() { PlayListTrack *track = m_pl_manager->currentPlayList()->currentTrack(); - if (track && track->path() == m_core->metaData().value(Qmmp::URL)) + if (track && track->path() == m_core->trackInfo().path()) { setWindowTitle(m_titleFormatter.format(track)); } diff --git a/src/plugins/Ui/skinned/textscroller.cpp b/src/plugins/Ui/skinned/textscroller.cpp index ffd69ad2e..5a22049b5 100644 --- a/src/plugins/Ui/skinned/textscroller.cpp +++ b/src/plugins/Ui/skinned/textscroller.cpp @@ -253,7 +253,7 @@ void TextScroller::processMetaData() { if(m_core->state() == Qmmp::Playing) { - m_titleText = m_formater.format(m_core->metaData(), m_core->duration()); + m_titleText = m_formater.format(&m_core->trackInfo()); updateText(); } } diff --git a/src/qmmp/buffer.h b/src/qmmp/buffer.h index cd49619a7..f9fe83f10 100644 --- a/src/qmmp/buffer.h +++ b/src/qmmp/buffer.h @@ -7,9 +7,9 @@ #ifndef __buffer_h #define __buffer_h -#include <QMap> #include <QSharedPointer> #include <stddef.h> +#include "trackinfo.h" #include "qmmp.h" #define QMMP_BLOCK_FRAMES 512 @@ -47,7 +47,7 @@ public: size_t samples; /*!< Audio data size in samples */ size_t size; /*!< Buffer size in samples */ unsigned int rate; /*!< Buffer bitrate */ - QSharedPointer<QMap<Qmmp::MetaData, QString> > metaData; /*!< A pointer to the new metadata if available */ + QSharedPointer<TrackInfo> trackInfo; }; diff --git a/src/qmmp/output.cpp b/src/qmmp/output.cpp index 4bbb59dcd..faddeb2fb 100644 --- a/src/qmmp/output.cpp +++ b/src/qmmp/output.cpp @@ -65,9 +65,9 @@ void Output::suspend() void Output::resume() {} -void Output::setMetaData(const QMap<Qmmp::MetaData, QString> &metaData) +void Output::setTrackInfo(const TrackInfo &info) { - Q_UNUSED(metaData); + Q_UNUSED(info); } Output::~Output() diff --git a/src/qmmp/output.h b/src/qmmp/output.h index 880f256fa..8ab26b235 100644 --- a/src/qmmp/output.h +++ b/src/qmmp/output.h @@ -13,6 +13,7 @@ #include <QMap> #include "outputfactory.h" #include "audioparameters.h" +#include "trackinfo.h" #include "channelmap.h" class QTimer; @@ -75,12 +76,8 @@ public: * Resumes processing audio data. */ virtual void resume(); - /*! - * Sets metadata for output. - * Default implementation does nothing. - * Reimplement this function to receive metadata. - */ - virtual void setMetaData(const QMap<Qmmp::MetaData, QString> &metaData); + + virtual void setTrackInfo(const TrackInfo &info); /*! * Returns selected audio parameters. */ diff --git a/src/qmmp/outputwriter.cpp b/src/qmmp/outputwriter.cpp index 373b065c6..ce3cd2036 100644 --- a/src/qmmp/outputwriter.cpp +++ b/src/qmmp/outputwriter.cpp @@ -315,8 +315,8 @@ void OutputWriter::run() { if(b->rate) m_kbps = b->rate; - if(b->metaData) - m_output->setMetaData(*b->metaData); + if(b->trackInfo) + m_output->setTrackInfo(*b->trackInfo); } } diff --git a/src/qmmp/qmmp.h b/src/qmmp/qmmp.h index 34c09b905..f61856848 100644 --- a/src/qmmp/qmmp.h +++ b/src/qmmp/qmmp.h @@ -73,8 +73,7 @@ public: COMPOSER, /*!< Composer */ YEAR, /*!< Year */ TRACK, /*!< Track number */ - DISCNUMBER,/*!< Disc number */ - URL /*!< Stream url or local file path */ + DISCNUMBER /*!< Disc number */ }; /*! * Track properties diff --git a/src/qmmp/qmmpaudioengine.cpp b/src/qmmp/qmmpaudioengine.cpp index 455771648..3cf6b5b18 100644 --- a/src/qmmp/qmmpaudioengine.cpp +++ b/src/qmmp/qmmpaudioengine.cpp @@ -283,8 +283,8 @@ void QmmpAudioEngine::stop() qint64 QmmpAudioEngine::produceSound(unsigned char *data, qint64 size, quint32 brate) { Buffer *b = m_output->recycler()->get(); - b->metaData = m_metaData; - m_metaData.clear(); + b->trackInfo = m_trackInfo; + m_trackInfo.clear(); size_t sz = size < m_bks ? size : m_bks; size_t samples = sz / m_sample_size; @@ -345,7 +345,7 @@ void QmmpAudioEngine::run() { mutex()->lock (); m_next = false; - m_metaData.clear(); + m_trackInfo.clear(); qint64 len = 0; int delay = 0; if(m_decoders.isEmpty()) @@ -380,16 +380,19 @@ void QmmpAudioEngine::run() if(m_decoder->hasMetaData()) { QMap<Qmmp::MetaData, QString> m = m_decoder->takeMetaData(); - m[Qmmp::URL] = m_inputs[m_decoder]->url(); - StateHandler::instance()->dispatch(m); - m_metaData = QSharedPointer<QMap<Qmmp::MetaData, QString> >(new QMap<Qmmp::MetaData, QString>(m)); + TrackInfo info(m_inputs[m_decoder]->url()); + info.setValues(m); + StateHandler::instance()->dispatch(info); + m_trackInfo = QSharedPointer<TrackInfo>(new TrackInfo(info)); + } if(m_inputs[m_decoder]->hasMetaData()) { QMap<Qmmp::MetaData, QString> m = m_inputs[m_decoder]->takeMetaData(); - m[Qmmp::URL] = m_inputs[m_decoder]->url(); - StateHandler::instance()->dispatch(m); - m_metaData = QSharedPointer<QMap<Qmmp::MetaData, QString> >(new QMap<Qmmp::MetaData, QString>(m)); + TrackInfo info(m_inputs[m_decoder]->url()); + info.setValues(m); + StateHandler::instance()->dispatch(info); + m_trackInfo = QSharedPointer<TrackInfo>(new TrackInfo(info)); } if(m_inputs[m_decoder]->hasStreamInfo()) StateHandler::instance()->dispatch(m_inputs[m_decoder]->takeStreamInfo()); @@ -599,10 +602,10 @@ void QmmpAudioEngine::sendMetaData() QList <TrackInfo *> list = MetaDataManager::instance()->createPlayList(url, TrackInfo::MetaData); if (!list.isEmpty()) { - StateHandler::instance()->dispatch(list[0]->metaData()); - m_metaData = QSharedPointer<QMap<Qmmp::MetaData, QString> >(new QMap<Qmmp::MetaData, QString>(list[0]->metaData())); - while (!list.isEmpty()) - delete list.takeFirst(); + StateHandler::instance()->dispatch(*list.first()); + m_trackInfo = QSharedPointer<TrackInfo>(list.first()); + while(list.size() > 1) + delete list.takeLast(); } } } diff --git a/src/qmmp/qmmpaudioengine_p.h b/src/qmmp/qmmpaudioengine_p.h index 5efa831ab..a8eea6590 100644 --- a/src/qmmp/qmmpaudioengine_p.h +++ b/src/qmmp/qmmpaudioengine_p.h @@ -26,6 +26,7 @@ #include <atomic> #include <QSharedPointer> #include "abstractengine.h" +#include "trackinfo.h" #include "audioparameters.h" class QIODevice; @@ -96,7 +97,7 @@ private: AudioParameters m_ap; bool m_next; bool m_muted; - QSharedPointer<QMap<Qmmp::MetaData, QString> > m_metaData; + QSharedPointer<TrackInfo> m_trackInfo; static QmmpAudioEngine *m_instance; ReplayGain *m_replayGain; QmmpSettings *m_settings; diff --git a/src/qmmp/qmmpevents_p.h b/src/qmmp/qmmpevents_p.h index 8fd316f70..63cbb0f40 100644 --- a/src/qmmp/qmmpevents_p.h +++ b/src/qmmp/qmmpevents_p.h @@ -90,7 +90,7 @@ private: QHash<QString, QString> m_streamInfo; }; -class TrackInfoEvent : QEvent +class TrackInfoEvent : public QEvent { public: TrackInfoEvent(const TrackInfo &info); diff --git a/src/qmmp/statehandler.cpp b/src/qmmp/statehandler.cpp index 716af2528..3a5fde734 100644 --- a/src/qmmp/statehandler.cpp +++ b/src/qmmp/statehandler.cpp @@ -92,7 +92,39 @@ void StateHandler::dispatch(qint64 length) m_mutex.unlock(); } -void StateHandler::dispatch(const QMap<Qmmp::MetaData, QString> &metaData) +void StateHandler::dispatch(const TrackInfo &info) +{ + QMutexLocker locker(&m_mutex); + if(info.isEmpty()) + { + qWarning("StateHandler: empty metadata"); + return; + } + if(m_state != Qmmp::Playing && m_state != Qmmp::Paused) + { + qWarning("StateHandler: metadata is ignored"); + return; + } + + if(m_info.isEmpty() || m_info.path() == info.path()) + { + TrackInfo tmp = m_info; + if(info.parts() & TrackInfo::MetaData) + tmp.setValues(info.metaData()); + if(info.parts() & TrackInfo::Properties) + tmp.setValues(info.properties()); + if(info.parts() & TrackInfo::ReplayGainInfo) + tmp.setValues(info.replayGainInfo()); + + if(m_info != tmp) + { + m_info = tmp; + qApp->postEvent(parent(), new TrackInfoEvent(m_info)); + } + } +} + +/*void StateHandler::dispatch(const QMap<Qmmp::MetaData, QString> &metaData) { m_mutex.lock(); QMap<Qmmp::MetaData, QString> tmp = metaData; @@ -132,7 +164,7 @@ void StateHandler::dispatch(const QMap<Qmmp::MetaData, QString> &metaData) } m_mutex.unlock(); -} +}*/ void StateHandler::dispatch(const QHash<QString, QString> &info) { diff --git a/src/qmmp/statehandler.h b/src/qmmp/statehandler.h index a98be51f7..d41738134 100644 --- a/src/qmmp/statehandler.h +++ b/src/qmmp/statehandler.h @@ -63,7 +63,8 @@ public: /*! * Sends metadata \b metaData */ - void dispatch(const QMap<Qmmp::MetaData, QString> &metaData); + //void dispatch(const QMap<Qmmp::MetaData, QString> &metaData); + void dispatch(const TrackInfo &info); /*! * Sends stream information \b info */ diff --git a/src/qmmp/trackinfo.cpp b/src/qmmp/trackinfo.cpp index 6183649dc..ed067077d 100644 --- a/src/qmmp/trackinfo.cpp +++ b/src/qmmp/trackinfo.cpp @@ -32,7 +32,6 @@ TrackInfo::TrackInfo(const QString &path) m_path = path; m_duration = 0; m_parts = NoParts; - m_metaData.insert(Qmmp::URL, path); } TrackInfo::TrackInfo(const TrackInfo &other) @@ -56,7 +55,9 @@ TrackInfo &TrackInfo::operator=(const TrackInfo &info) bool TrackInfo::operator==(const TrackInfo &info) const { - return m_metaData == info.metaData () && + return m_duration == info.duration() && + m_path == info.path() && + m_metaData == info.metaData () && m_properties == info.properties() && m_replayGainInfo == info.replayGainInfo() && m_parts == info.parts(); @@ -201,7 +202,6 @@ void TrackInfo::updateValues(const QMap<Qmmp::ReplayGainKey, double> &replayGain void TrackInfo::setPath(const QString &path) { m_path = path; - m_metaData.insert(Qmmp::URL, path); } void TrackInfo::setParts(Parts parts) diff --git a/src/qmmpui/detailsdialog.cpp b/src/qmmpui/detailsdialog.cpp index 6d6676765..e87b44693 100644 --- a/src/qmmpui/detailsdialog.cpp +++ b/src/qmmpui/detailsdialog.cpp @@ -197,7 +197,7 @@ void DetailsDialog::printInfo() if(m_metaData[Qmmp::DISCNUMBER] != "0") formattedText += formatRow(tr("Disc number"), m_metaData[Qmmp::DISCNUMBER]); //stream information - if(core->state() == Qmmp::Playing && core->url() == m_metaData.value(Qmmp::URL)) + /*if(core->state() == Qmmp::Playing && core->url() == m_metaData.value(Qmmp::URL)) { if(!core->streamInfo().isEmpty()) { @@ -210,7 +210,7 @@ void DetailsDialog::printInfo() foreach(QString key, core->streamInfo().keys()) formattedText += formatRow(key, core->streamInfo().value(key)); } - } + }*/ //audio info if(!m_metaDataModel) { diff --git a/src/qmmpui/mediaplayer.cpp b/src/qmmpui/mediaplayer.cpp index a2581e694..b4f72aa09 100644 --- a/src/qmmpui/mediaplayer.cpp +++ b/src/qmmpui/mediaplayer.cpp @@ -207,7 +207,7 @@ void MediaPlayer::updateMetaData() qDebug("== end of metadata =="); PlayListModel *pl = m_pl_manager->currentPlayList(); - if (pl->currentTrack() && pl->currentTrack()->path() == m_core->metaData().value(Qmmp::URL)) + if (pl->currentTrack() && pl->currentTrack()->path() == m_core->trackInfo().path()) { pl->currentTrack()->updateMetaData(m_core->metaData()); pl->updateMetaData(); diff --git a/src/qmmpui/metadataformatter.cpp b/src/qmmpui/metadataformatter.cpp index bb019b442..2b1174cfd 100644 --- a/src/qmmpui/metadataformatter.cpp +++ b/src/qmmpui/metadataformatter.cpp @@ -59,7 +59,7 @@ MetaDataFormatter::MetaDataFormatter(const QString &pattern) m_fieldNames.insert("y", Qmmp::YEAR); m_fieldNames.insert("n", Qmmp::TRACK); m_fieldNames.insert("D", Qmmp::DISCNUMBER); - m_fieldNames.insert("F", Qmmp::URL); + m_fieldNames.insert("F", Param::PATH); m_fieldNames.insert("NN", Param::TWO_DIGIT_TRACK); m_fieldNames.insert("l", Param::DURATION); m_fieldNames.insert("f", Param::FILE_NAME); @@ -98,17 +98,17 @@ const QString MetaDataFormatter::pattern() const QString MetaDataFormatter::format(const PlayListTrack *item) const { - return format(item->metaData(), item->duration(), item->trackIndex()); + return format(item->metaData(), item->path(), item->duration(), item->trackIndex()); } -QString MetaDataFormatter::format(const QMap<Qmmp::MetaData, QString> &metaData, qint64 duration, int track) const +QString MetaDataFormatter::format(const QMap<Qmmp::MetaData, QString> &metaData, const QString &path, qint64 duration, int track) const { - return evalute(&m_nodes, &metaData, duration, track).trimmed(); + return evalute(&m_nodes, &metaData, &path, duration, track).trimmed(); } QString MetaDataFormatter::format(const TrackInfo *info, int track) const { - return format(info->metaData(), info->duration(), track); + return format(info->metaData(), info->path(), info->duration(), track); } QString MetaDataFormatter::formatDuration(qint64 duration, bool hideZero, bool showMs) @@ -398,7 +398,8 @@ void MetaDataFormatter::parseEscape(QList<MetaDataFormatter::Node> *nodes, QStri nodes->append(node); } -QString MetaDataFormatter::evalute(const QList<Node> *nodes, const QMap<Qmmp::MetaData, QString> *metaData, qint64 length, int track) const +QString MetaDataFormatter::evalute(const QList<Node> *nodes, const QMap<Qmmp::MetaData, QString> *metaData, + const QString *path, qint64 length, int track) const { QString out; for(int i = 0; i < nodes->count(); ++i) @@ -407,56 +408,57 @@ QString MetaDataFormatter::evalute(const QList<Node> *nodes, const QMap<Qmmp::Me if(node.command == Node::PRINT_TEXT) { Param p = node.params.first(); - out.append(printParam(&p, metaData, length, track)); + out.append(printParam(&p, metaData, path, length, track)); } else if(node.command == Node::IF_KEYWORD) { - QString var1 = printParam(&node.params[0], metaData, length, track); + QString var1 = printParam(&node.params[0], metaData, path, length, track); if(var1.isEmpty() || var1 == "0") - out.append(printParam(&node.params[2], metaData, length, track)); + out.append(printParam(&node.params[2], metaData, path, length, track)); else - out.append(printParam(&node.params[1], metaData, length, track)); + out.append(printParam(&node.params[1], metaData, path, length, track)); } else if(node.command == Node::AND_OPERATOR) { - QString var1 = printParam(&node.params[0], metaData, length, track); - QString var2 = printParam(&node.params[1], metaData, length, track); + QString var1 = printParam(&node.params[0], metaData, path, length, track); + QString var2 = printParam(&node.params[1], metaData, path, length, track); if(!var1.isEmpty() && !var2.isEmpty()) out.append("1"); } else if(node.command == Node::OR_OPERATOR) { - QString var1 = printParam(&node.params[0], metaData, length, track); + QString var1 = printParam(&node.params[0], metaData, path, length, track); if(!var1.isEmpty()) out.append("1"); else { - QString var2 = printParam(&node.params[1], metaData, length, track); + QString var2 = printParam(&node.params[1], metaData, path, length, track); if(!var2.isEmpty()) out.append("1"); } } else if(node.command == Node::DIR_FUNCTION) { - out.append(metaData->value(Qmmp::URL).section('/', -node.params[0].number - 2, -node.params[0].number - 2)); + out.append(path->section('/', -node.params[0].number - 2, -node.params[0].number - 2)); } } return out; } -QString MetaDataFormatter::printParam(MetaDataFormatter::Param *p, const QMap<Qmmp::MetaData, QString> *metaData, qint64 length, int track) const +QString MetaDataFormatter::printParam(MetaDataFormatter::Param *p, const QMap<Qmmp::MetaData, QString> *metaData, + const QString *path, qint64 length, int track) const { switch (p->type) { case Param::FIELD: - return printField(p->field, metaData, length, track); + return printField(p->field, metaData, path, length, track); break; case Param::TEXT: return p->text; break; case Param::NODES: - return evalute(&p->children, metaData, length, track); + return evalute(&p->children, metaData, path, length, track); break; default: break; @@ -464,26 +466,31 @@ QString MetaDataFormatter::printParam(MetaDataFormatter::Param *p, const QMap<Qm return QString(); } -QString MetaDataFormatter::printField(int field, const QMap<Qmmp::MetaData, QString> *metaData, qint64 length, int track) const +QString MetaDataFormatter::printField(int field, const QMap<Qmmp::MetaData, QString> *metaData, + const QString *path, qint64 length, int track) const { - if(field >= Qmmp::TITLE && field <= Qmmp::URL) + if(field >= Qmmp::TITLE && field <= Qmmp::DISCNUMBER) { if(field == Qmmp::TITLE) { QString title = metaData->value(Qmmp::TITLE); if(title.isEmpty()) //using file name if title is empty { - title = metaData->value(Qmmp::URL).section('/',-1); + title = path->section('/',-1); title = title.left(title.lastIndexOf('.')); } if(title.isEmpty()) //using full path if file name is empty - title = metaData->value(Qmmp::URL); + title = *path; return title; } return metaData->value((Qmmp::MetaData) field); } + else if(field == Param::PATH) + { + return *path; + } else if(field == Param::TWO_DIGIT_TRACK) { return QString("%1").arg(metaData->value(Qmmp::TRACK),2,'0'); @@ -494,7 +501,7 @@ QString MetaDataFormatter::printField(int field, const QMap<Qmmp::MetaData, QStr } else if(field == Param::FILE_NAME) { - return metaData->value(Qmmp::URL).section('/',-1); + return path->section('/',-1); } else if(field == Param::TRACK_INDEX) { diff --git a/src/qmmpui/metadataformatter.h b/src/qmmpui/metadataformatter.h index d0446183d..49e317be0 100644 --- a/src/qmmpui/metadataformatter.h +++ b/src/qmmpui/metadataformatter.h @@ -76,7 +76,7 @@ public: * @param duration Duration in milliseconds seconds. * @param track Index of track. */ - QString format(const QMap<Qmmp::MetaData, QString> &metaData, qint64 duration = 0, int track = 0) const; + QString format(const QMap<Qmmp::MetaData, QString> &metaData, const QString &path, qint64 duration = 0, int track = 0) const; /*! * Converts metadata of \b TrackInfo pointer \b info to one string using template. * \param info pointer to \b TrackInfo object. @@ -121,7 +121,8 @@ private: //extra fields enum { - TWO_DIGIT_TRACK = Qmmp::URL + 1, + PATH = Qmmp::DISCNUMBER + 1, + TWO_DIGIT_TRACK, DURATION, FILE_NAME, TRACK_INDEX @@ -139,9 +140,9 @@ private: void parseText(QList<Node> *nodes, QString::const_iterator *i, QString::const_iterator end); void parseEscape(QList<Node> *nodes, QString::const_iterator *i, QString::const_iterator end); - QString evalute(const QList<Node> *nodes, const QMap<Qmmp::MetaData, QString> *metaData, qint64 length, int track) const; - QString printParam(Param *p, const QMap<Qmmp::MetaData, QString> *metaData, qint64 length, int track) const; - QString printField(int field, const QMap<Qmmp::MetaData, QString> *metaData, qint64 length, int track) const; + QString evalute(const QList<Node> *nodes, const QMap<Qmmp::MetaData, QString> *metaData, const QString *path, qint64 length, int track) const; + QString printParam(Param *p, const QMap<Qmmp::MetaData, QString> *metaData, const QString *path, qint64 length, int track) const; + QString printField(int field, const QMap<Qmmp::MetaData, QString> *metaData, const QString *path, qint64 length, int track) const; QString dumpNode(Node node) const; diff --git a/src/qmmpui/playlistparser.cpp b/src/qmmpui/playlistparser.cpp index 3f72b4cbc..cb2f144ae 100644 --- a/src/qmmpui/playlistparser.cpp +++ b/src/qmmpui/playlistparser.cpp @@ -129,20 +129,20 @@ QList<PlayListTrack *> PlayListParser::loadPlaylist(const QString &f_name) return tracks; } - QString url; + QString path; foreach (PlayListTrack *t, tracks) { - url = t->value(Qmmp::URL); + path = t->path(); - if(url.contains("://")) + if(path.contains("://")) continue; - if(QFileInfo(url).isRelative()) - url.prepend(QFileInfo(f_name).canonicalPath () + "/"); + if(QFileInfo(path).isRelative()) + path.prepend(QFileInfo(f_name).canonicalPath () + "/"); - url.replace("\\","/"); - url.replace("//","/"); - t->setValue(Qmmp::URL, url); + path.replace("\\","/"); + path.replace("//","/"); + t->setPath(path); } return tracks; } diff --git a/src/qmmpui/playlisttask.cpp b/src/qmmpui/playlisttask.cpp index 052f7006e..d43e6c9c1 100644 --- a/src/qmmpui/playlisttask.cpp +++ b/src/qmmpui/playlisttask.cpp @@ -116,12 +116,12 @@ PlayListTask::PlayListTask(QObject *parent) : QThread(parent) m_sort_keys.insert(PlayListModel::ALBUM, Qmmp::ALBUM); m_sort_keys.insert(PlayListModel::ARTIST, Qmmp::ARTIST); m_sort_keys.insert(PlayListModel::ALBUMARTIST, Qmmp::ALBUMARTIST); - m_sort_keys.insert(PlayListModel::FILENAME, Qmmp::URL); - m_sort_keys.insert(PlayListModel::PATH_AND_FILENAME, Qmmp::URL); + m_sort_keys.insert(PlayListModel::FILENAME, Qmmp::UNKNOWN); + m_sort_keys.insert(PlayListModel::PATH_AND_FILENAME, Qmmp::UNKNOWN); m_sort_keys.insert(PlayListModel::DATE, Qmmp::YEAR); m_sort_keys.insert(PlayListModel::TRACK, Qmmp::TRACK); - m_sort_keys.insert(PlayListModel::FILE_CREATION_DATE, Qmmp::URL); - m_sort_keys.insert(PlayListModel::FILE_MODIFICATION_DATE, Qmmp::URL); + m_sort_keys.insert(PlayListModel::FILE_CREATION_DATE, Qmmp::UNKNOWN); + m_sort_keys.insert(PlayListModel::FILE_MODIFICATION_DATE, Qmmp::UNKNOWN); } PlayListTask::~PlayListTask() @@ -146,7 +146,12 @@ void PlayListTask::sort(QList<PlayListTrack *> tracks, int mode) { TrackField *f = new TrackField; f->track = t; - f->value = (mode == PlayListModel::GROUP) ? t->groupName() : t->value(key); + if(mode == PlayListModel::GROUP) + f->value = t->groupName(); + else if(key == Qmmp::UNKNOWN) + f->value = t->path(); + else + f->value = t->value(key); if(m_align_groups) f->groupName = t->groupName(); m_fields.append(f); @@ -174,7 +179,12 @@ void PlayListTask::sortSelection(QList<PlayListTrack *> tracks, int mode) TrackField *f = new TrackField; f->track = tracks[i]; - f->value = (mode == PlayListModel::GROUP) ? f->track->groupName() : f->track->value(key); + if(mode == PlayListModel::GROUP) + f->value = f->track->groupName(); + else if(key == Qmmp::UNKNOWN) + f->value = f->track->path(); + else + f->value = f->track->value(key); m_fields.append(f); m_indexes.append(i); } @@ -221,7 +231,7 @@ void PlayListTask::removeInvalidTracks(QList<PlayListTrack *> tracks, PlayListTr { TrackField *f = new TrackField; f->track = tracks[i]; - f->value = f->track->value(Qmmp::URL); + f->value = f->track->path(); m_fields.append(f); } MetaDataManager::instance()->prepareForAnotherThread(); @@ -242,7 +252,7 @@ void PlayListTask::removeDuplicates(QList<PlayListTrack *> tracks, PlayListTrack { TrackField *f = new TrackField; f->track = tracks[i]; - f->value = f->track->value(Qmmp::URL); + f->value = f->track->path(); m_fields.append(f); } MetaDataManager::instance()->prepareForAnotherThread(); @@ -263,7 +273,7 @@ void PlayListTask::refresh(QList<PlayListTrack *> tracks, PlayListTrack *current { TrackField *f = new TrackField; f->track = tracks[i]; - f->value = f->track->value(Qmmp::URL); + f->value = f->track->path(); m_fields.append(f); } MetaDataManager::instance()->prepareForAnotherThread(); diff --git a/src/qmmpui/playlisttrack.cpp b/src/qmmpui/playlisttrack.cpp index 6840ee62b..8e0a57df1 100644 --- a/src/qmmpui/playlisttrack.cpp +++ b/src/qmmpui/playlisttrack.cpp @@ -98,10 +98,10 @@ void PlayListTrack::updateMetaData(TrackInfo *info) void PlayListTrack::updateMetaData() { - QList <TrackInfo *> list = MetaDataManager::instance()->createPlayList(value(Qmmp::URL)); - if(!list.isEmpty() && !list.at(0)->path().contains("://")) + QList <TrackInfo *> list = MetaDataManager::instance()->createPlayList(path()); + if(!list.isEmpty() && !list.first()->path().contains("://")) { - TrackInfo *info = list.at(0); + TrackInfo *info = list.first(); updateMetaData(info); } qDeleteAll(list); @@ -234,9 +234,9 @@ void PlayListTrack::formatTitle(int column) if(m_formattedTitles.count() == 1) { if (m_formattedTitles[column].isEmpty()) - m_formattedTitles[column] = value(Qmmp::URL).section('/',-1); + m_formattedTitles[column] = path().section('/',-1); if (m_formattedTitles[column].isEmpty()) - m_formattedTitles[column] = value(Qmmp::URL); + m_formattedTitles[column] = path(); } if (m_settings->convertUnderscore()) m_formattedTitles[column].replace("_", " "); |
