diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2018-04-25 19:02:17 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2018-04-25 19:02:17 +0000 |
| commit | 646e72f41adb1916f1c24f057b39bed4d7b949c6 (patch) | |
| tree | 1e8eb279b017ef1370d9df685a387c874d67c105 | |
| parent | 2f766cd3906b2a9534321d955589cd4d9212b175 (diff) | |
| download | qmmp-646e72f41adb1916f1c24f057b39bed4d7b949c6.tar.gz qmmp-646e72f41adb1916f1c24f057b39bed4d7b949c6.tar.bz2 qmmp-646e72f41adb1916f1c24f057b39bed4d7b949c6.zip | |
prepare for new metadata api iplementation (compilation is broken,
latest working revision: 7935)
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@7936 90c681e8-e032-0410-971d-27865f9a5e38
27 files changed, 204 insertions, 394 deletions
diff --git a/src/plugins/Engines/Engines.pro b/src/plugins/Engines/Engines.pro index 1dddcfd5d..abd780457 100644 --- a/src/plugins/Engines/Engines.pro +++ b/src/plugins/Engines/Engines.pro @@ -1,4 +1,4 @@ include(../../../qmmp.pri) -SUBDIRS += mplayer +#SUBDIRS += mplayer TEMPLATE = subdirs diff --git a/src/plugins/General/General.pro b/src/plugins/General/General.pro index 03727ba7d..93207f5d1 100644 --- a/src/plugins/General/General.pro +++ b/src/plugins/General/General.pro @@ -1,20 +1,20 @@ include(../../../qmmp.pri) -SUBDIRS += statusicon \ - notifier \ - lyrics \ - scrobbler \ - fileops \ - covermanager \ - streambrowser \ - trackchange \ - hotkey \ - copypaste \ - rgscan -unix:SUBDIRS += mpris \ - kdenotify \ - converter \ - gnomehotkey +SUBDIRS += statusicon +# notifier \ +# lyrics \ +# scrobbler \ +# fileops \ +# covermanager \ +# streambrowser \ +# trackchange \ +# hotkey \ +# copypaste \ +# rgscan +#unix:SUBDIRS += mpris \ +# kdenotify \ +# converter \ +# gnomehotkey contains(CONFIG, UDISKS2_PLUGIN){ unix:SUBDIRS += udisks2 diff --git a/src/plugins/Input/Input.pro b/src/plugins/Input/Input.pro index 498c5ff60..ea63c61d0 100644 --- a/src/plugins/Input/Input.pro +++ b/src/plugins/Input/Input.pro @@ -1,53 +1,53 @@ include(../../../qmmp.pri) TEMPLATE = subdirs -SUBDIRS += vorbis cue sndfile wavpack +#SUBDIRS += vorbis cue sndfile wavpack contains(CONFIG, WITH_MAD)|contains(CONFIG, WITH_MPG123){ SUBDIRS += mpeg } contains(CONFIG, FLAC_PLUGIN){ - SUBDIRS += flac + #SUBDIRS += flac } contains(CONFIG, MUSEPACK_PLUGIN){ - SUBDIRS += mpc + #SUBDIRS += mpc } contains(CONFIG, MODPLUG_PLUGIN){ - SUBDIRS += modplug + #SUBDIRS += modplug } contains(CONFIG, FFMPEG_PLUGIN){ - SUBDIRS += ffmpeg + #SUBDIRS += ffmpeg } contains(CONFIG, GME_PLUGIN){ - SUBDIRS += gme + #SUBDIRS += gme } contains(CONFIG, OPUS_PLUGIN){ - SUBDIRS += opus + #SUBDIRS += opus } contains(CONFIG, CDAUDIO_PLUGIN){ - SUBDIRS += cdaudio + #SUBDIRS += cdaudio } contains(CONFIG, SID_PLUGIN){ - SUBDIRS += sid + #SUBDIRS += sid } unix{ contains(CONFIG, AAC_PLUGIN){ - SUBDIRS += aac + #SUBDIRS += aac } contains(CONFIG, WILDMIDI_PLUGIN){ - SUBDIRS += wildmidi + #SUBDIRS += wildmidi } contains(CONFIG, ARCHIVE_PLUGIN){ @@ -57,7 +57,7 @@ contains(CONFIG, ARCHIVE_PLUGIN){ TAGLIB_VER_MIN = $$member(TAGLIB_VERSION, 1) greaterThan(TAGLIB_VER_MAJ, 1) | equals(TAGLIB_VER_MAJ, 1) { - greaterThan(TAGLIB_VER_MIN, 10):SUBDIRS += archive + #greaterThan(TAGLIB_VER_MIN, 10):SUBDIRS += archive } else { message("Archive plugin requires at least TagLib 1.11") } diff --git a/src/plugins/Input/mpeg/decodermpegfactory.cpp b/src/plugins/Input/mpeg/decodermpegfactory.cpp index 54e671f86..b435417d4 100644 --- a/src/plugins/Input/mpeg/decodermpegfactory.cpp +++ b/src/plugins/Input/mpeg/decodermpegfactory.cpp @@ -32,6 +32,10 @@ #include <taglib/tfile.h> #include <taglib/mpegfile.h> #include <taglib/tfilestream.h> +#include <taglib/id3v2tag.h> +#include <taglib/id3v2header.h> +#include <taglib/textidentificationframe.h> +#include <taglib/id3v2framefactory.h> #include "mpegmetadatamodel.h" #include "replaygainreader.h" #include "settingsdialog.h" @@ -43,6 +47,9 @@ #endif #include "decodermpegfactory.h" + +#define CSTR_TO_QSTR(str,utf) codec->toUnicode(str.toCString(utf)).trimmed() + // DecoderMPEGFactory DecoderMPEGFactory::DecoderMPEGFactory() @@ -197,15 +204,18 @@ Decoder *DecoderMPEGFactory::create(const QString &url, QIODevice *input) return d; } -QList<FileInfo *> DecoderMPEGFactory::createPlayList(const QString &fileName, bool useMetaData, QStringList *) +QList<TrackInfo *> DecoderMPEGFactory::createPlayList(const QString &fileName, TrackInfo::Parts parts, QStringList *) { - FileInfo *info = new FileInfo(fileName); + TrackInfo *info = new TrackInfo(fileName); TagLib::Tag *tag = 0; TagLib::FileStream stream(QStringToFileName(fileName), true); TagLib::MPEG::File fileRef(&stream, TagLib::ID3v2::FrameFactory::instance()); - if (useMetaData) + if(fileRef.audioProperties()) + info->setDuration(fileRef.audioProperties()->lengthInMilliseconds()); + + if (parts && TrackInfo::MetaData) { QSettings settings(Qmmp::configFile(), QSettings::IniFormat); settings.beginGroup("MPEG"); @@ -217,65 +227,54 @@ QList<FileInfo *> DecoderMPEGFactory::createPlayList(const QString &fileName, bo tag_array[1] = settings.value("tag_2", SettingsDialog::APE).toInt(); tag_array[2] = settings.value("tag_3", SettingsDialog::ID3v1).toInt(); - QByteArray name; + QByteArray codecName; for (int i = 0; i < 3; ++i) { + codecName.clear(); switch ((uint) tag_array[i]) { case SettingsDialog::ID3v1: - codec = QTextCodec::codecForName(settings.value("ID3v1_encoding","ISO-8859-1") - .toByteArray ()); + codecName = settings.value("ID3v1_encoding","ISO-8859-1").toByteArray(); tag = fileRef.ID3v1Tag(); break; case SettingsDialog::ID3v2: - name = settings.value("ID3v2_encoding","UTF-8").toByteArray (); - if (name.contains("UTF")) - codec = QTextCodec::codecForName ("UTF-8"); - else - codec = QTextCodec::codecForName(name); + codecName = settings.value("ID3v2_encoding","UTF-8").toByteArray (); tag = fileRef.ID3v2Tag(); break; case SettingsDialog::APE: - codec = QTextCodec::codecForName ("UTF-8"); + codecName = "UTF-8"; tag = fileRef.APETag(); break; case SettingsDialog::Disabled: break; } if (tag && !tag->isEmpty()) + { + if(codecName.contains("UTF")) + codecName = "UTF-8"; + if(!codecName.isEmpty()) + codec = QTextCodec::codecForName(codecName); break; + } } settings.endGroup(); if(m_using_rusxmms) - codec = QTextCodec::codecForName ("UTF-8"); + codec = QTextCodec::codecForName("UTF-8"); if (!codec) - codec = QTextCodec::codecForName ("UTF-8"); + codec = QTextCodec::codecForName("UTF-8"); if (tag && codec) { - bool utf = codec->name ().contains("UTF"); - TagLib::String album = tag->album(); - TagLib::String artist = tag->artist(); - TagLib::String comment = tag->comment(); - TagLib::String genre = tag->genre(); - TagLib::String title = tag->title(); - - info->setMetaData(Qmmp::ALBUM, - codec->toUnicode(album.toCString(utf)).trimmed()); - info->setMetaData(Qmmp::ARTIST, - codec->toUnicode(artist.toCString(utf)).trimmed()); - info->setMetaData(Qmmp::COMMENT, - codec->toUnicode(comment.toCString(utf)).trimmed()); - info->setMetaData(Qmmp::GENRE, - codec->toUnicode(genre.toCString(utf)).trimmed()); - info->setMetaData(Qmmp::TITLE, - codec->toUnicode(title.toCString(utf)).trimmed()); - info->setMetaData(Qmmp::YEAR, - tag->year()); - info->setMetaData(Qmmp::TRACK, - tag->track()); + bool utf = codec->name().contains("UTF"); + info->setValue(Qmmp::ALBUM, CSTR_TO_QSTR(tag->album(), utf)); + info->setValue(Qmmp::ARTIST, CSTR_TO_QSTR(tag->artist(), utf)); + info->setValue(Qmmp::COMMENT, CSTR_TO_QSTR(tag->comment(), utf)); + info->setValue(Qmmp::GENRE, CSTR_TO_QSTR(tag->genre(), utf)); + info->setValue(Qmmp::TITLE, CSTR_TO_QSTR(tag->title(), utf)); + info->setValue(Qmmp::YEAR, tag->year()); + info->setValue(Qmmp::TRACK, tag->track()); if(tag == fileRef.ID3v2Tag()) { @@ -283,39 +282,90 @@ QList<FileInfo *> DecoderMPEGFactory::createPlayList(const QString &fileName, bo { TagLib::String albumArtist; albumArtist = fileRef.ID3v2Tag()->frameListMap()["TPE2"].front()->toString(); - info->setMetaData(Qmmp::ALBUMARTIST, - codec->toUnicode(albumArtist.toCString(utf)).trimmed()); + info->setValue(Qmmp::ALBUMARTIST, CSTR_TO_QSTR(albumArtist, utf)); } if(!fileRef.ID3v2Tag()->frameListMap()["TCOM"].isEmpty()) { TagLib::String composer; composer = fileRef.ID3v2Tag()->frameListMap()["TCOM"].front()->toString(); - info->setMetaData(Qmmp::COMPOSER, - codec->toUnicode(composer.toCString(utf)).trimmed()); + info->setValue(Qmmp::COMPOSER, CSTR_TO_QSTR(composer, utf)); } if(!fileRef.ID3v2Tag()->frameListMap()["TPOS"].isEmpty()) { TagLib::String disc = fileRef.ID3v2Tag()->frameListMap()["TPOS"].front()->toString(); - info->setMetaData(Qmmp::DISCNUMBER, QString(disc.toCString()).trimmed()); + info->setValue(Qmmp::DISCNUMBER, CSTR_TO_QSTR(disc, utf)); } } else if(tag == fileRef.APETag()) { TagLib::APE::Item fld; if(!(fld = fileRef.APETag()->itemListMap()["ALBUM ARTIST"]).isEmpty()) - info->setMetaData(Qmmp::ALBUMARTIST, - QString::fromUtf8(fld.toString().toCString(true)).trimmed()); + info->setValue(Qmmp::ALBUMARTIST, CSTR_TO_QSTR(fld.toString(), true)); if(!(fld = fileRef.APETag()->itemListMap()["COMPOSER"]).isEmpty()) - info->setMetaData(Qmmp::COMPOSER, - QString::fromUtf8(fld.toString().toCString(true)).trimmed()); + info->setValue(Qmmp::COMPOSER, CSTR_TO_QSTR(fld.toString(), true)); } } } - if (fileRef.audioProperties()) - info->setLength(fileRef.audioProperties()->length()); - QList <FileInfo*> list; - list << info; - return list; + + if(parts & TrackInfo::Properties) + { + info->setValue(Qmmp::BITRATE, fileRef.audioProperties()->bitrate()); + info->setValue(Qmmp::SAMPLERATE, fileRef.audioProperties()->sampleRate()); + info->setValue(Qmmp::CHANNELS, fileRef.audioProperties()->channels()); + info->setValue(Qmmp::BITS_PER_SAMPLE, 16); + switch(fileRef.audioProperties()->version()) + { + case TagLib::MPEG::Header::Version1: + info->setValue(Qmmp::FORMAT_NAME, QString("MPEG-1 layer %1").arg(fileRef.audioProperties()->layer())); + break; + case TagLib::MPEG::Header::Version2: + info->setValue(Qmmp::FORMAT_NAME, QString("MPEG-2 layer %1").arg(fileRef.audioProperties()->layer())); + break; + case TagLib::MPEG::Header::Version2_5: + info->setValue(Qmmp::FORMAT_NAME, QString("MPEG-2.5 layer %1").arg(fileRef.audioProperties()->layer())); + } + } + + if(parts & TrackInfo::ReplayGainInfo) + { + if(fileRef.ID3v2Tag() && !fileRef.ID3v2Tag()->isEmpty()) + { + TagLib::ID3v2::Tag *tag = fileRef.ID3v2Tag(); + TagLib::ID3v2::UserTextIdentificationFrame* frame = 0; + TagLib::ID3v2::FrameList frames = tag->frameList("TXXX"); + for(TagLib::ID3v2::FrameList::Iterator it = frames.begin(); it != frames.end(); ++it) + { + frame = dynamic_cast<TagLib::ID3v2::UserTextIdentificationFrame*>(*it); + if(!frame || frame->fieldList().size() < 2) + continue; + + TagLib::String desc = frame->description().upper(); + if (desc == "REPLAYGAIN_TRACK_GAIN") + info->setValue(Qmmp::REPLAYGAIN_TRACK_GAIN, TStringToQString(frame->fieldList()[1])); + else if (desc == "REPLAYGAIN_TRACK_PEAK") + info->setValue(Qmmp::REPLAYGAIN_TRACK_PEAK, TStringToQString(frame->fieldList()[1])); + else if (desc == "REPLAYGAIN_ALBUM_GAIN") + info->setValue(Qmmp::REPLAYGAIN_ALBUM_GAIN, TStringToQString(frame->fieldList()[1])); + else if (desc == "REPLAYGAIN_ALBUM_PEAK") + info->setValue(Qmmp::REPLAYGAIN_ALBUM_PEAK, TStringToQString(frame->fieldList()[1])); + } + } + if(info->replayGainInfo().isEmpty() && fileRef.APETag() && !fileRef.APETag()->isEmpty()) + { + TagLib::APE::Tag *tag = fileRef.APETag(); + TagLib::APE::ItemListMap items = tag->itemListMap(); + if (items.contains("REPLAYGAIN_TRACK_GAIN")) + info->setValue(Qmmp::REPLAYGAIN_TRACK_GAIN,TStringToQString(items["REPLAYGAIN_TRACK_GAIN"].values()[0])); + if (items.contains("REPLAYGAIN_TRACK_PEAK")) + info->setValue(Qmmp::REPLAYGAIN_TRACK_PEAK,TStringToQString(items["REPLAYGAIN_TRACK_PEAK"].values()[0])); + if (items.contains("REPLAYGAIN_ALBUM_GAIN")) + info->setValue(Qmmp::REPLAYGAIN_ALBUM_GAIN,TStringToQString(items["REPLAYGAIN_ALBUM_GAIN"].values()[0])); + if (items.contains("REPLAYGAIN_ALBUM_PEAK")) + info->setValue(Qmmp::REPLAYGAIN_ALBUM_PEAK,TStringToQString(items["REPLAYGAIN_ALBUM_PEAK"].values()[0])); + } + } + + return QList<TrackInfo*>() << info; } MetaDataModel* DecoderMPEGFactory::createMetaDataModel(const QString &path, QObject *parent) diff --git a/src/plugins/Input/mpeg/decodermpegfactory.h b/src/plugins/Input/mpeg/decodermpegfactory.h index 5fd13dbe4..6bea0eee6 100644 --- a/src/plugins/Input/mpeg/decodermpegfactory.h +++ b/src/plugins/Input/mpeg/decodermpegfactory.h @@ -20,15 +20,7 @@ #ifndef DECODERMPEGFACTORY_H #define DECODERMPEGFACTORY_H -#include <QObject> -#include <QString> -#include <QIODevice> -#include <QWidget> - -#include <qmmp/decoder.h> -#include <qmmp/output.h> #include <qmmp/decoderfactory.h> -#include <qmmp/metadatamodel.h> class DecoderMPEGFactory : public QObject, DecoderFactory @@ -42,7 +34,7 @@ public: bool canDecode(QIODevice *input) const; const DecoderProperties properties() const; Decoder *create(const QString &path, QIODevice *input); - QList<FileInfo *> createPlayList(const QString &fileName, bool useMetaData, QStringList *); + QList<TrackInfo *> createPlayList(const QString &fileName, TrackInfo::Parts parts, QStringList *); MetaDataModel* createMetaDataModel(const QString &path, QObject *parent = 0); void showSettings(QWidget *parent); void showAbout(QWidget *parent); diff --git a/src/qmmp/abstractengine.h b/src/qmmp/abstractengine.h index 6ce043ac0..2b59527d9 100644 --- a/src/qmmp/abstractengine.h +++ b/src/qmmp/abstractengine.h @@ -30,6 +30,7 @@ class QIODevice; class InputSource; class QmmpPluginCache; +class EngineFactory; /*! @brief The AbstractEngine class provides the base interface class of audio audio engines. diff --git a/src/qmmp/decoder.h b/src/qmmp/decoder.h index 1b4883e84..dbaea31ae 100644 --- a/src/qmmp/decoder.h +++ b/src/qmmp/decoder.h @@ -11,13 +11,12 @@ #include <QList> #include <QMap> #include <QIODevice> -#include "fileinfo.h" #include "qmmp.h" #include "audioparameters.h" #include "channelmap.h" -#include "decoderfactory.h" class QmmpPluginCache; +class DecoderFactory; /*! @brief The Decoder class provides the base interface class of audio decoders. * @author Brad Hughes <bhughes@trolltech.com> diff --git a/src/qmmp/decoderfactory.h b/src/qmmp/decoderfactory.h index 07ad75df4..f4fe8f943 100644 --- a/src/qmmp/decoderfactory.h +++ b/src/qmmp/decoderfactory.h @@ -21,24 +21,20 @@ #ifndef DECODERFACTORY_H #define DECODERFACTORY_H +#include <QObject> +#include <QString> +#include <QIODevice> +#include <QTranslator> +#include <QStringList> #include "qmmp_export.h" - -class QObject; -class QString; -class QIODevice; -class QWidget; -class QTranslator; -class QStringList; - -class Decoder; -class Output; -class FileInfo; -class MetaDataModel; +#include "decoder.h" +#include "metadatamodel.h" +#include "trackinfo.h" /*! @brief Helper class to store input plugin properties. * @author Ilya Kotov <forkotov02@ya.ru> */ -class QMMP_EXPORT DecoderProperties +class DecoderProperties { public: /*! @@ -88,14 +84,14 @@ public: */ virtual Decoder *create(const QString &path, QIODevice *input = 0) = 0; /*! - * Extracts metadata and audio information from file \b path and returns a list of FileInfo items. + * Extracts metadata and audio information from file \b path and returns a list of \b TrackInfo items. * One file may contain several playlist items (for example: cda disk or flac with embedded cue) * @param fileName File path. - * @param useMetaData Metadata usage (\b true - use, \b - do not use) + * @param parts parts of metadata which should be extracted from file * @param ignoredPaths Pointer to a list of the files which should be ignored by the recursive search * (useful to exclude cue data files from playlist) */ - virtual QList<FileInfo *> createPlayList(const QString &fileName, bool useMetaData, QStringList *ignoredPaths) = 0; + virtual QList<TrackInfo *> createPlayList(const QString &fileName, TrackInfo::Parts parts, QStringList *ignoredPaths) = 0; /*! * Creats metadata object, which provides full access to file tags. * @param path File path. diff --git a/src/qmmp/enginefactory.h b/src/qmmp/enginefactory.h index b41e6ffc6..d8b697f9d 100644 --- a/src/qmmp/enginefactory.h +++ b/src/qmmp/enginefactory.h @@ -21,16 +21,17 @@ #ifndef EMGINEFACTORY_H #define EMGINEFACTORY_H +#include <QStringList> +#include <QList> +#include <QMap> +#include <QIODevice> +#include <QTranslator> #include "qmmp_export.h" +#include "qmmp.h" +#include "trackinfo.h" +#include "abstractengine.h" +#include "metadatamodel.h" -class QObject; -class QString; -class QIODevice; -class QWidget; -class QTranslator; -class QStringList; -class MetaDataModel; -class FileInfo; class AbstractEngine; /*! @brief Helper class to store custom audio engine properies. @@ -83,11 +84,10 @@ public: * Extracts metadata and audio information from file \b path and returns a list of FileInfo items. * One file may contain several playlist items (for example: cda disk or flac with embedded cue) * @param fileName File path. - * @param useMetaData Metadata usage (\b true - use, \b - do not use) * @param ignoredPaths Pointer to a list of the files which should be ignored by the recursive search * (useful to exclude cue data files from playlist) */ - virtual QList<FileInfo *> createPlayList(const QString &fileName, bool useMetaData, QStringList *ignoredPaths) = 0; + virtual QList<TrackInfo *> createPlayList(const QString &fileName, TrackInfo::Parts parts, QStringList *ignoredPaths) = 0; /*! * Creats metadata object, which provides full access to file tags. * @param path File path. diff --git a/src/qmmp/fileinfo.cpp b/src/qmmp/fileinfo.cpp deleted file mode 100644 index c813d003e..000000000 --- a/src/qmmp/fileinfo.cpp +++ /dev/null @@ -1,122 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2008-2018 by Ilya Kotov * - * forkotov02@ya.ru * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - ***************************************************************************/ -#include "fileinfo.h" - -FileInfo::FileInfo(const QString &path) -{ - m_path = path; - m_length = 0; - m_metaData.insert(Qmmp::URL, path); -} - -FileInfo::FileInfo(const FileInfo &other) -{ - *this = other; -} - -FileInfo::~FileInfo() -{} - -FileInfo &FileInfo::operator=(const FileInfo &info) -{ - setLength(info.length()); - setMetaData(info.metaData()); - setPath(info.path()); - return *this; -} - -bool FileInfo::operator==(const FileInfo &info) const -{ - return metaData () == info.metaData () && - length () == info.length () && - path() == info.path(); -} - -bool FileInfo::operator!=(const FileInfo &info) const -{ - return !operator==(info); -} - -qint64 FileInfo::length () const -{ - return m_length; -} - -const QString FileInfo::metaData(Qmmp::MetaData key) const -{ - return m_metaData[key]; -} - -const QMap<Qmmp::MetaData, QString> &FileInfo::metaData() const -{ - return m_metaData; -} - -void FileInfo::setMetaData(const QMap<Qmmp::MetaData, QString> &metaData) -{ - m_metaData = metaData; - if(m_metaData.value(Qmmp::URL).isEmpty()) - m_metaData.insert(Qmmp::URL, m_path); - - foreach(QString value, m_metaData.values()) //remove empty keys - { - if (value.isEmpty() || value == "0") - m_metaData.remove(m_metaData.key(value)); - } -} - -bool FileInfo::isEmpty() const -{ - return m_metaData.isEmpty(); //TODO add correct test -} - -const QString FileInfo::path() const -{ - return m_path; -} - -void FileInfo::setLength(qint64 length) -{ - m_length = length; -} - -void FileInfo::setMetaData(Qmmp::MetaData key, const QString &value) -{ - if (value.isEmpty() || value == "0") - return; - - //extract track number from "Track Number/Total Tracks Number" string - if((key == Qmmp::TRACK || key == Qmmp::DISCNUMBER) && value.contains("/")) - m_metaData.insert(key, value.section("/",0,0)); - else - m_metaData.insert(key, value); -} - -void FileInfo::setMetaData(Qmmp::MetaData key, int value) -{ - if(value != 0) - m_metaData.insert(key, QString::number(value)); -} - -void FileInfo::setPath(const QString &path) -{ - m_path = path; - m_metaData.insert(Qmmp::URL, path); -} diff --git a/src/qmmp/fileinfo.h b/src/qmmp/fileinfo.h deleted file mode 100644 index 2b13170ed..000000000 --- a/src/qmmp/fileinfo.h +++ /dev/null @@ -1,106 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2008-2018 by Ilya Kotov * - * forkotov02@ya.ru * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - ***************************************************************************/ -#ifndef FILEINFO_H -#define FILEINFO_H - -#include <QString> -#include <QMap> -#include <QUrl> - -#include "qmmp.h" - -/*! @brief The FileInfo class stores metadata and audio information about media file or stream. - * @author Ilya Kotov <forkotov02@ya.ru> - */ -class QMMP_EXPORT FileInfo -{ -public: - /*! - * Constructs a new empty FileInfo that with file \b path - */ - FileInfo(const QString &path = QString()); - /*! - * Constructs a new FileInfo that is a copy of the given \b info - */ - FileInfo(const FileInfo &info); - /*! - * Destructor. - */ - ~FileInfo(); - /*! - * Makes a copy of the given \b info - */ - FileInfo &operator=(const FileInfo &info); - /*! - * Returns \b true if this FileInfo object refers to \b info; otherwise returns \b false. - */ - bool operator==(const FileInfo &info) const; - /*! - * Returns \b false if this FileInfo object refers to \b info; otherwise returns \b true. - */ - bool operator!=(const FileInfo &info) const; - /*! - * Returnds file duration in seconds. - */ - qint64 length () const; - /*! - * Returns the metdata string associated with the given \b key. - */ - const QString metaData(Qmmp::MetaData key) const; - /*! - * Returns all meta data in map. - */ - const QMap<Qmmp::MetaData, QString> &metaData() const; - /*! - * Returns \b true if stream/file has no metadata, otherwise returns \b false - */ - bool isEmpty() const; - /*! - * Returns file path or stream url. - */ - const QString path() const; - /*! - * Sets file duration to \b length in seconds. - */ - void setLength(qint64 length); - /*! - * Sets metadata \b key to \b value - */ - void setMetaData(Qmmp::MetaData key, const QString &value); - /*! - * Sets metadata \b key to \b value (integer is converted to string) - */ - void setMetaData(Qmmp::MetaData key, int value); - /*! - * Changes all metadata to \b metaData - */ - void setMetaData(const QMap <Qmmp::MetaData, QString> &metaData); - /*! - * Sets file path or stream url to \b path - */ - void setPath(const QString &path); - -private: - QMap<Qmmp::MetaData, QString> m_metaData; - qint64 m_length; - QString m_path; -}; - -#endif diff --git a/src/qmmp/metadatamanager.cpp b/src/qmmp/metadatamanager.cpp index ca54b85bf..9a401578d 100644 --- a/src/qmmp/metadatamanager.cpp +++ b/src/qmmp/metadatamanager.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2009-2016 by Ilya Kotov * + * Copyright (C) 2009-2018 by Ilya Kotov * * forkotov02@ya.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -47,9 +47,9 @@ MetaDataManager::~MetaDataManager() m_instance = 0; } -QList <FileInfo *> MetaDataManager::createPlayList(const QString &fileName, bool useMetaData, QStringList *ignoredPaths) const +QList<TrackInfo *> MetaDataManager::createPlayList(const QString &fileName, TrackInfo::Parts parts, QStringList *ignoredPaths) const { - QList <FileInfo *> list; + QList <TrackInfo *> list; DecoderFactory *fact = 0; EngineFactory *efact = 0; QStringList dummyList; @@ -61,9 +61,9 @@ QList <FileInfo *> MetaDataManager::createPlayList(const QString &fileName, bool if(!QFile::exists(fileName)) return list; else if((fact = Decoder::findByFilePath(fileName, m_settings->determineFileTypeByContent()))) - return fact->createPlayList(fileName, useMetaData, ignoredPaths); + return fact->createPlayList(fileName, parts, ignoredPaths); else if((efact = AbstractEngine::findByFilePath(fileName))) - return efact->createPlayList(fileName, useMetaData, ignoredPaths); + return efact->createPlayList(fileName, parts, ignoredPaths); return list; } else @@ -71,13 +71,13 @@ QList <FileInfo *> MetaDataManager::createPlayList(const QString &fileName, bool QString scheme = fileName.section("://",0,0); if(InputSource::protocols().contains(scheme)) { - list << new FileInfo(fileName); + list << new TrackInfo(fileName); return list; } foreach(fact, Decoder::factories()) { if(fact->properties().protocols.contains(scheme) && Decoder::isEnabled(fact)) - return fact->createPlayList(fileName, useMetaData, ignoredPaths); + return fact->createPlayList(fileName, parts, ignoredPaths); } } return list; diff --git a/src/qmmp/metadatamanager.h b/src/qmmp/metadatamanager.h index a5e8cd7a1..64947c739 100644 --- a/src/qmmp/metadatamanager.h +++ b/src/qmmp/metadatamanager.h @@ -26,7 +26,7 @@ #include <QPixmap> #include <QDir> #include <QMutex> -#include "fileinfo.h" +#include "trackinfo.h" #include "metadatamodel.h" class DecoderFactory; @@ -53,11 +53,10 @@ public: * Extracts metadata and audio information from file \b path and returns a list of FileInfo items. * One file may contain several playlist items (for example: cda disk or flac with embedded cue) * @param path Source file path. - * @param useMetaData Metadata usage (\b true - use, \b - do not use) * @param ignoredPaths Pointer to a list of the files which should be ignored by the recursive search * (useful to exclude cue data files from playlist) */ - QList <FileInfo *> createPlayList(const QString &path, bool useMetaData = true, QStringList *ignoredPaths = 0) const; + QList <TrackInfo *> createPlayList(const QString &path, TrackInfo::Parts parts = TrackInfo::MetaData, QStringList *ignoredPaths = 0) const; /*! * Creats metadata object, which provides full access to file tags. * @param url File path or URL. diff --git a/src/qmmp/qmmp.pro b/src/qmmp/qmmp.pro index 7881e71d3..f67045e72 100644 --- a/src/qmmp/qmmp.pro +++ b/src/qmmp/qmmp.pro @@ -15,7 +15,6 @@ HEADERS += \ effectfactory.h \ statehandler.h \ qmmp.h \ - fileinfo.h \ metadatamodel.h \ tagmodel.h \ abstractengine.h \ @@ -41,7 +40,8 @@ HEADERS += \ audioconverter.h \ dithering_p.h \ visualbuffer_p.h \ - qmmp_export.h + qmmp_export.h \ + trackinfo.h SOURCES += recycler.cpp \ decoder.cpp \ output.cpp \ @@ -53,7 +53,6 @@ SOURCES += recycler.cpp \ effect.cpp \ statehandler.cpp \ qmmp.cpp \ - fileinfo.cpp \ volumecontrol.cpp \ metadatamodel.cpp \ tagmodel.cpp \ @@ -75,7 +74,8 @@ SOURCES += recycler.cpp \ channelconverter.cpp \ volume.cpp \ dithering.cpp \ - visualbuffer.cpp + visualbuffer.cpp \ + trackinfo.cpp unix:TARGET = ../../lib/qmmp win32:TARGET = ../../../bin/qmmp diff --git a/src/qmmp/qmmpaudioengine.cpp b/src/qmmp/qmmpaudioengine.cpp index 5b9ce9104..455771648 100644 --- a/src/qmmp/qmmpaudioengine.cpp +++ b/src/qmmp/qmmpaudioengine.cpp @@ -596,7 +596,7 @@ void QmmpAudioEngine::sendMetaData() QString url = m_inputs.value(m_decoder)->url(); if (QFile::exists(url)) //send metadata for local files only { - QList <FileInfo *> list = MetaDataManager::instance()->createPlayList(url, true); + QList <TrackInfo *> list = MetaDataManager::instance()->createPlayList(url, TrackInfo::MetaData); if (!list.isEmpty()) { StateHandler::instance()->dispatch(list[0]->metaData()); diff --git a/src/qmmp/trackinfo.cpp b/src/qmmp/trackinfo.cpp index 1bf07d84d..91749110b 100644 --- a/src/qmmp/trackinfo.cpp +++ b/src/qmmp/trackinfo.cpp @@ -76,17 +76,17 @@ const QString TrackInfo::path() const return m_path; } -const QString &TrackInfo::operator [](Qmmp::MetaData key) const +const QString &TrackInfo::value(Qmmp::MetaData key) const { return m_metaData.find(key).value(); } -const QString &TrackInfo::operator [](Qmmp::TrackProperty key) const +const QString &TrackInfo::value(Qmmp::TrackProperty key) const { return m_properties.find(key).value(); } -const double &TrackInfo::operator [](Qmmp::ReplayGainKey key) const +const double &TrackInfo::value(Qmmp::ReplayGainKey key) const { return m_replayGainInfo.find(key).value(); } diff --git a/src/qmmp/trackinfo.h b/src/qmmp/trackinfo.h index 575025b20..cd8b3bac9 100644 --- a/src/qmmp/trackinfo.h +++ b/src/qmmp/trackinfo.h @@ -22,6 +22,7 @@ #include <QMap> #include <QString> +#include <QVariant> #include "qmmp.h" class QMMP_EXPORT TrackInfo @@ -36,7 +37,7 @@ public: NoParts = 0x0, MetaData = 0x1, Properties = 0x2, - ReplayGain = 0x4 + ReplayGainInfo = 0x4 }; Q_DECLARE_FLAGS(Parts, Part) @@ -47,9 +48,9 @@ public: qint64 duration () const; bool isEmpty() const; const QString path() const; - const QString &operator [](Qmmp::MetaData key) const; - const QString &operator [](Qmmp::TrackProperty key) const; - const double &operator [](Qmmp::ReplayGainKey key) const; + const QString &value(Qmmp::MetaData key) const; + const QString &value(Qmmp::TrackProperty key) const; + const double &value(Qmmp::ReplayGainKey key) const; const QMap<Qmmp::MetaData, QString> &metaData() const; const QMap<Qmmp::TrackProperty, QString> &properties() const; const QMap<Qmmp::ReplayGainKey, double> &replayGainInfo() const; diff --git a/src/qmmpui/detailsdialog.cpp b/src/qmmpui/detailsdialog.cpp index 91d5fa23b..386fd9676 100644 --- a/src/qmmpui/detailsdialog.cpp +++ b/src/qmmpui/detailsdialog.cpp @@ -137,7 +137,7 @@ void DetailsDialog::updatePage() m_ui->pathEdit->setText(m_path); //load metadata and create metadata model - QList <FileInfo *> flist = MetaDataManager::instance()->createPlayList(m_path, true); + QList <TrackInfo *> flist = MetaDataManager::instance()->createPlayList(m_path, TrackInfo::MetaData); if(!flist.isEmpty() && QFile::exists(m_track->url())) m_metaData = flist.at(0)->metaData(); else diff --git a/src/qmmpui/fileloader.cpp b/src/qmmpui/fileloader.cpp index 5ff69f583..c9c13da68 100644 --- a/src/qmmpui/fileloader.cpp +++ b/src/qmmpui/fileloader.cpp @@ -44,9 +44,9 @@ FileLoader::~FileLoader() QList<PlayListTrack *> FileLoader::processFile(const QString &path, QStringList *ignoredPaths) { QList<PlayListTrack *> tracks; - QList <FileInfo *> infoList = MetaDataManager::instance()->createPlayList(path, m_use_meta, ignoredPaths); + QList <TrackInfo *> infoList = MetaDataManager::instance()->createPlayList(path, TrackInfo::MetaData, ignoredPaths); - foreach (FileInfo *info, infoList) + foreach (TrackInfo *info, infoList) { tracks.append(new PlayListTrack(info)); } @@ -61,7 +61,8 @@ void FileLoader::insertPlayList(const QString &fmt, const QByteArray &contents, while (!tracks.isEmpty() && !m_finished) { PlayListTrack *t = tracks.takeFirst(); - QList <FileInfo *> infoList = MetaDataManager::instance()->createPlayList(t->url(), m_use_meta); + QList <TrackInfo *> infoList = MetaDataManager::instance()->createPlayList(t->url(), + m_use_meta ? TrackInfo::MetaData : TrackInfo::NoParts); if(infoList.count() != 1) //invalid or unsupported track { qDeleteAll(infoList); @@ -70,8 +71,8 @@ void FileLoader::insertPlayList(const QString &fmt, const QByteArray &contents, continue; } - FileInfo *info = infoList.first(); - if(!info->metaData(Qmmp::ALBUM).isEmpty() && !info->metaData(Qmmp::ARTIST).isEmpty()) + TrackInfo *info = infoList.first(); + if(!info->value(Qmmp::ALBUM).isEmpty() && !info->value(Qmmp::ARTIST).isEmpty()) t->updateMetaData(infoList.first()); emit newTracksToInsert(before, QList<PlayListTrack *>() << t); @@ -89,7 +90,7 @@ void FileLoader::insertPlayList(const QString &path, PlayListItem *before) while (!tracks.isEmpty() && !m_finished) { PlayListTrack *t = tracks.takeFirst(); - QList <FileInfo *> infoList = MetaDataManager::instance()->createPlayList(t->url(), m_use_meta); + QList <TrackInfo *> infoList = MetaDataManager::instance()->createPlayList(t->url(), m_use_meta ? TrackInfo::MetaData : TrackInfo::NoParts); if(infoList.count() != 1) //invalid or unsupported track { qDeleteAll(infoList); @@ -98,8 +99,8 @@ void FileLoader::insertPlayList(const QString &path, PlayListItem *before) continue; } - FileInfo *info = infoList.first(); - if(!info->metaData(Qmmp::ALBUM).isEmpty() && !info->metaData(Qmmp::ARTIST).isEmpty()) + TrackInfo *info = infoList.first(); + if(!info->value(Qmmp::ALBUM).isEmpty() && !info->value(Qmmp::ARTIST).isEmpty()) t->updateMetaData(infoList.first()); emit newTracksToInsert(before, QList<PlayListTrack *>() << t); diff --git a/src/qmmpui/metadataformatter.cpp b/src/qmmpui/metadataformatter.cpp index 812021720..cd030dfc1 100644 --- a/src/qmmpui/metadataformatter.cpp +++ b/src/qmmpui/metadataformatter.cpp @@ -106,9 +106,9 @@ QString MetaDataFormatter::format(const QMap<Qmmp::MetaData, QString> &metaData, return evalute(&m_nodes, &metaData, length, track).trimmed(); } -QString MetaDataFormatter::format(const FileInfo *info, int track) const +QString MetaDataFormatter::format(const TrackInfo *info, int track) const { - return format(info->metaData(), info->length(), track); + return format(info->metaData(), info->duration(), track); } QString MetaDataFormatter::formatLength(qint64 length, bool hideZero) diff --git a/src/qmmpui/metadataformatter.h b/src/qmmpui/metadataformatter.h index 8bcfe72cb..9cbcf1de2 100644 --- a/src/qmmpui/metadataformatter.h +++ b/src/qmmpui/metadataformatter.h @@ -26,7 +26,6 @@ #include <QList> #include <qmmpui/playlisttrack.h> #include <qmmp/qmmp.h> -#include <qmmp/fileinfo.h> #include "qmmpui_export.h" /*! @brief The MetaDataFormatter formats metadata using templates. @@ -79,11 +78,11 @@ public: */ QString format(const QMap<Qmmp::MetaData, QString> &metaData, qint64 length = 0, int track = 0) const; /*! - * Converts metadata of \b FileInfo pointer \b info to one string using template. - * \param info pointer to \b FileInfo object. + * Converts metadata of \b TrackInfo pointer \b info to one string using template. + * \param info pointer to \b TrackInfo object. * \param track Index of track. */ - QString format(const FileInfo *info, int track = 0) const; + QString format(const TrackInfo *info, int track = 0) const; /*! * Returns formatted length (example: 05:02:03). * \param length Length in seconds. diff --git a/src/qmmpui/playlistitem.h b/src/qmmpui/playlistitem.h index 92e30bfe6..3599c6269 100644 --- a/src/qmmpui/playlistitem.h +++ b/src/qmmpui/playlistitem.h @@ -21,7 +21,6 @@ #define PLAYLISTITEM_H #include <QMap> -#include <qmmp/fileinfo.h> #include <qmmp/qmmp.h> #include "qmmpui_export.h" diff --git a/src/qmmpui/playlistmanager.cpp b/src/qmmpui/playlistmanager.cpp index 2f24b709f..f18322b93 100644 --- a/src/qmmpui/playlistmanager.cpp +++ b/src/qmmpui/playlistmanager.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2009-2017 by Ilya Kotov * + * Copyright (C) 2009-2018 by Ilya Kotov * * forkotov02@ya.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -24,7 +24,7 @@ #include <QDir> #include <QTimer> #include <QSettings> -#include <qmmp/fileinfo.h> +#include <qmmp/trackinfo.h> #include "qmmpuisettings.h" #include "playlistmanager.h" diff --git a/src/qmmpui/playlistmodel.h b/src/qmmpui/playlistmodel.h index 734b0de18..73f49ec1f 100644 --- a/src/qmmpui/playlistmodel.h +++ b/src/qmmpui/playlistmodel.h @@ -27,6 +27,7 @@ #include <QQueue> #include <QPointer> #include <QVector> +#include <QUrl> #include "playlistitem.h" #include "playlisttrack.h" #include "playlistgroup.h" diff --git a/src/qmmpui/playlisttask.cpp b/src/qmmpui/playlisttask.cpp index 8ca027ade..482478b42 100644 --- a/src/qmmpui/playlisttask.cpp +++ b/src/qmmpui/playlisttask.cpp @@ -448,8 +448,8 @@ void PlayListTask::run() foreach (QFileInfo f, l) { QStringList ignored; - foreach (FileInfo *info, mm->createPlayList(f.canonicalFilePath(), - QmmpUiSettings::instance()->useMetadata(), + foreach (TrackInfo *info, mm->createPlayList(f.canonicalFilePath(), + QmmpUiSettings::instance()->useMetadata() ? TrackInfo::MetaData : TrackInfo::NoParts, &ignored)) { m_new_tracks << new PlayListTrack(info); diff --git a/src/qmmpui/playlisttrack.cpp b/src/qmmpui/playlisttrack.cpp index c9c838622..d182e9945 100644 --- a/src/qmmpui/playlisttrack.cpp +++ b/src/qmmpui/playlisttrack.cpp @@ -53,13 +53,13 @@ PlayListTrack::PlayListTrack(const PlayListTrack &other) : QMap<Qmmp::MetaData, m_formattedLength = other.m_formattedLength; } -PlayListTrack::PlayListTrack(FileInfo *info) : QMap<Qmmp::MetaData, QString>(info->metaData()), +PlayListTrack::PlayListTrack(TrackInfo *info) : QMap<Qmmp::MetaData, QString>(info->metaData()), PlayListItem() { m_track_index = -1; m_settings = QmmpUiSettings::instance(); m_helper = MetaDataHelper::instance(); - m_length = info->length(); + m_length = info->duration(); insert(Qmmp::URL, info->path()); m_refCount = 0; m_sheduledForDeletion = false; @@ -91,9 +91,9 @@ void PlayListTrack::updateMetaData(const QMap <Qmmp::MetaData, QString> &metaDat formatGroup(); } -void PlayListTrack::updateMetaData(FileInfo *info) +void PlayListTrack::updateMetaData(TrackInfo *info) { - m_length = info->length(); + m_length = info->duration(); QMap <Qmmp::MetaData, QString>::operator =(info->metaData()); insert(Qmmp::URL, info->path()); m_formattedTitles.clear(); @@ -103,10 +103,10 @@ void PlayListTrack::updateMetaData(FileInfo *info) void PlayListTrack::updateMetaData() { - QList <FileInfo *> list = MetaDataManager::instance()->createPlayList(value(Qmmp::URL)); + QList <TrackInfo *> list = MetaDataManager::instance()->createPlayList(value(Qmmp::URL)); if(!list.isEmpty() && !list.at(0)->path().contains("://")) { - FileInfo *info = list.at(0); + TrackInfo *info = list.at(0); updateMetaData(info); } qDeleteAll(list); diff --git a/src/qmmpui/playlisttrack.h b/src/qmmpui/playlisttrack.h index 57bbb58a1..d7dd90073 100644 --- a/src/qmmpui/playlisttrack.h +++ b/src/qmmpui/playlisttrack.h @@ -22,8 +22,8 @@ #include <QMap> #include <QStringList> -#include <qmmp/fileinfo.h> #include <qmmp/qmmp.h> +#include <qmmp/trackinfo.h> #include "playlistitem.h" #include "qmmpui_export.h" @@ -49,7 +49,7 @@ public: * Constructs plalist item with given metadata. * @param info Media file information. */ - PlayListTrack(FileInfo *info); + PlayListTrack(TrackInfo *info); /*! * Object destructor. */ @@ -90,9 +90,9 @@ public: void updateMetaData(const QMap <Qmmp::MetaData, QString> &metaData); /*! * Updates current metadata. - * @param info Media file information. + * @param info Track information. */ - void updateMetaData(FileInfo *info); + void updateMetaData(TrackInfo *info); /*! * Gets new metadata from file (works for local files only). */ |
