aboutsummaryrefslogtreecommitdiff
path: root/src/qmmpui/metadataformatter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/qmmpui/metadataformatter.cpp')
-rw-r--r--src/qmmpui/metadataformatter.cpp65
1 files changed, 64 insertions, 1 deletions
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++;