aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/plugins/CommandLineOptions/StatusOption/statusoption.cpp7
-rw-r--r--src/qmmpui/metadataformatter.cpp65
-rw-r--r--src/qmmpui/metadataformatter.h11
-rw-r--r--src/qmmpui/metadataformattermenu.cpp15
4 files changed, 95 insertions, 3 deletions
diff --git a/src/plugins/CommandLineOptions/StatusOption/statusoption.cpp b/src/plugins/CommandLineOptions/StatusOption/statusoption.cpp
index a536daa6b..9bc6d72ec 100644
--- a/src/plugins/CommandLineOptions/StatusOption/statusoption.cpp
+++ b/src/plugins/CommandLineOptions/StatusOption/statusoption.cpp
@@ -100,6 +100,13 @@ QString StatusOption::executeCommand(const QString &opt_str, const QStringList &
out += tr("%F - full path") + "\n";
out += tr("%y - year") + "\n";
out += tr("%l - duration") + "\n";
+ out += tr("%{bitrate} - bitrate") + "\n";
+ out += tr("%{samplerate} - sample rate") + "\n";
+ out += tr("%{channels} - number of channels") + "\n";
+ out += tr("%{samplesize} - bits per sample") + "\n";
+ out += tr("%{format} - format name") + "\n";
+ out += tr("%{decoder} - decoder name") + "\n";
+ out += tr("%{filesize} - file size") + "\n";
out += tr("%if(A&B&C,D,E) - condition") + "\n";
out += tr("%dir(n) - directory name located on n levels above");
}
diff --git a/src/qmmpui/metadataformatter.cpp b/src/qmmpui/metadataformatter.cpp
index 84a426ce1..5373b0059 100644
--- a/src/qmmpui/metadataformatter.cpp
+++ b/src/qmmpui/metadataformatter.cpp
@@ -1,5 +1,5 @@
/***************************************************************************
- * Copyright (C) 2015-2017 by Ilya Kotov *
+ * Copyright (C) 2015-2018 by Ilya Kotov *
* forkotov02@ya.ru *
* *
* This program is free software; you can redistribute it and/or modify *
@@ -37,6 +37,13 @@ Syntax:
%y - year,
%l - duration,
%I - track index,
+%{bitrate} - bitrate,
+%{samplerate} - sample rate,
+%{channels} - number of channels,
+%{samplesize} - bits per sample,
+%{format} - format name,
+%{decoder} - decoder name,
+%{filesize} - file size,
%if(A,B,C) or %if(A&B&C,D,E) - condition,
%dir(n) - Name of the directory located on n levels above.
*/
@@ -64,6 +71,13 @@ MetaDataFormatter::MetaDataFormatter(const QString &pattern)
m_fieldNames.insert("l", Param::DURATION);
m_fieldNames.insert("f", Param::FILE_NAME);
m_fieldNames.insert("I", Param::TRACK_INDEX);
+ m_propertyNames.insert("bitrate", Qmmp::BITRATE);
+ m_propertyNames.insert("samplerate", Qmmp::SAMPLERATE);
+ m_propertyNames.insert("channels", Qmmp::CHANNELS);
+ m_propertyNames.insert("samplesize", Qmmp::BITS_PER_SAMPLE);
+ m_propertyNames.insert("format", Qmmp::FORMAT_NAME);
+ m_propertyNames.insert("decoder", Qmmp::DECODER);
+ m_propertyNames.insert("filesize", Qmmp::FILE_SIZE);
if(!pattern.isEmpty())
setPattern(pattern);
@@ -168,6 +182,39 @@ bool MetaDataFormatter::parseField(QList<Node> *nodes, QString::const_iterator *
return false;
}
+bool MetaDataFormatter::parseProperty(QList<Node> *nodes, QString::const_iterator *i, QString::const_iterator end)
+{
+ if((*i) + 1 == end || (*i) + 2 == end)
+ return false;
+
+ if((**i) != QChar('{'))
+ return false;
+
+ (*i)++; //skip '{'
+
+ QString propertyName;
+
+ while((*i) != end && (**i) != QChar('}'))
+ {
+ propertyName.append((**i));
+ (*i)++;
+ }
+
+ int field = m_propertyNames.value(propertyName, Qmmp::UNKNOWN);
+ if(field != Qmmp::UNKNOWN)
+ {
+ Node node;
+ node.command = Node::PRINT_TEXT;
+ Param param;
+ param.type = Param::PROPERTY;
+ param.field = field;
+ node.params.append(param);
+ nodes->append(node);
+ return true;
+ }
+ return false;
+}
+
bool MetaDataFormatter::parseIf(QList<MetaDataFormatter::Node> *nodes, QString::const_iterator *i, QString::const_iterator end)
{
if((*i) + 1 == end || (*i) + 2 == end)
@@ -452,6 +499,9 @@ QString MetaDataFormatter::printParam(MetaDataFormatter::Param *p, const TrackIn
case Param::FIELD:
return printField(p->field, info, trackIndex);
break;
+ case Param::PROPERTY:
+ return printProperty(p->field, info);
+ break;
case Param::TEXT:
return p->text;
break;
@@ -507,6 +557,11 @@ QString MetaDataFormatter::printField(int field, const TrackInfo *info, int trac
return QString();
}
+QString MetaDataFormatter::printProperty(int field, const TrackInfo *info) const
+{
+ return info->value((Qmmp::TrackProperty) field);
+}
+
QString MetaDataFormatter::dumpNode(MetaDataFormatter::Node node) const
{
QString str;
@@ -524,6 +579,8 @@ QString MetaDataFormatter::dumpNode(MetaDataFormatter::Node node) const
{
if(p.type == Param::FIELD)
params.append(QString("FIELD:%1").arg(p.field));
+ else if(p.type == Param::PROPERTY)
+ params.append(QString("PROPERTY:%1").arg(p.field));
else if(p.type == Param::TEXT)
params.append(QString("TEXT:%1").arg(p.text));
else if(p.type == Param::NUMERIC)
@@ -568,6 +625,12 @@ QList<MetaDataFormatter::Node> MetaDataFormatter::compile(const QString &expr)
continue;
}
+ if(parseProperty(&nodes, &i, expr.constEnd()))
+ {
+ i++;
+ continue;
+ }
+
if(parseIf(&nodes, &i, expr.constEnd()))
{
i++;
diff --git a/src/qmmpui/metadataformatter.h b/src/qmmpui/metadataformatter.h
index 00dede227..1a582b91c 100644
--- a/src/qmmpui/metadataformatter.h
+++ b/src/qmmpui/metadataformatter.h
@@ -53,6 +53,13 @@ public:
* %y - year,
* %l - duration,
* %I - track index,
+ * %{bitrate} - bitrate,
+ * %{samplerate} - sample rate,
+ * %{channels} - number of channels,
+ * %{samplesize} - bits per sample,
+ * %{format} - format name,
+ * %{decoder} - decoder name,
+ * %{filesize} - file size,
* %if(A,B,C) or %if(A&B&C,D,E) - condition,
* %dir(n) - Name of the directory located on \b n levels above.
*/
@@ -108,6 +115,7 @@ private:
{
enum {
FIELD = 0,
+ PROPERTY,
TEXT,
NUMERIC,
NODES
@@ -130,6 +138,7 @@ private:
};
bool parseField(QList<Node> *nodes, QString::const_iterator *i, QString::const_iterator end);
+ bool parseProperty(QList<Node> *nodes, QString::const_iterator *i, QString::const_iterator end);
bool parseIf(QList<Node> *nodes, QString::const_iterator *i, QString::const_iterator end);
bool parseDir(QList<Node> *nodes, QString::const_iterator *i, QString::const_iterator end);
void parseText(QList<Node> *nodes, QString::const_iterator *i, QString::const_iterator end);
@@ -138,6 +147,7 @@ private:
QString evalute(const QList<Node> *nodes, const TrackInfo *info, int trackIndex) const;
QString printParam(Param *p, const TrackInfo *info, int trackIndex) const;
QString printField(int field, const TrackInfo *info, int trackIndex) const;
+ QString printProperty(int field, const TrackInfo *info) const;
QString dumpNode(Node node) const;
@@ -145,6 +155,7 @@ private:
QString m_pattern;
QList<MetaDataFormatter::Node> m_nodes;
QMap<QString, int> m_fieldNames;
+ QMap<QString, int> m_propertyNames;
};
#endif // METADATAFORMATTER2_H
diff --git a/src/qmmpui/metadataformattermenu.cpp b/src/qmmpui/metadataformattermenu.cpp
index cb946e73c..ca411d1cc 100644
--- a/src/qmmpui/metadataformattermenu.cpp
+++ b/src/qmmpui/metadataformattermenu.cpp
@@ -1,5 +1,5 @@
/***************************************************************************
- * Copyright (C) 2017 by Ilya Kotov *
+ * Copyright (C) 2017-2018 by Ilya Kotov *
* forkotov02@ya.ru *
* *
* This program is free software; you can redistribute it and/or modify *
@@ -35,10 +35,10 @@ MetaDataFormatterMenu::MetaDataFormatterMenu(Type type, QWidget *parent) :
addAction(tr("Genre"))->setData("%g");
addAction(tr("Comment"))->setData("%c");
addAction(tr("Composer"))->setData("%C");
- addAction(tr("Duration"))->setData("%l");
addAction(tr("Disc Number"))->setData("%D");
if(type == TITLE_MENU)
{
+ addAction(tr("Duration"))->setData("%l");
addAction(tr("File Name"))->setData("%f");
addAction(tr("File Path"))->setData("%F");
}
@@ -46,6 +46,17 @@ MetaDataFormatterMenu::MetaDataFormatterMenu(Type type, QWidget *parent) :
addAction(tr("Condition"))->setData("%if(%p&%t,%p - %t,%f)");
addAction(tr("Artist - Title"))->setData("%if(%p,%p - %t,%t)");
addAction(tr("Parent Directory Name"))->setData("%dir(0)");
+ addSeparator();
+ addAction(tr("Bitrate"))->setData("%{bitrate}");
+ addAction(tr("Sample Rate"))->setData("%{samplerate}");
+ addAction(tr("Number of Channels"))->setData("%{channels}");
+ addAction(tr("Sample Size"))->setData("%{samplesize}");
+ addAction(tr("Format"))->setData("%{format}");
+ addAction(tr("Decoder"))->setData("%{decoder}");
+ if(type == TITLE_MENU)
+ {
+ addAction(tr("File Size"))->setData("%{filesize}");
+ }
connect(this, SIGNAL(triggered (QAction *)), SLOT(onActionTriggered(QAction*)));
}