mirror of
https://github.com/owntone/owntone-server.git
synced 2024-12-29 08:33:23 -05:00
[smartpl] Added rule for enum tags like data_kind and media_kind to
avoid having magic numbers like "media_kind = 1" in smartplaylists. Enum rules are defined like "media_kind is music" with a fixed set of valid values after the "is" keyword.
This commit is contained in:
parent
659f9c09bb
commit
8376180fd6
@ -41,6 +41,7 @@ crit : LPAR expression RPAR -> expression
|
|||||||
| STRTAG (INCLUDES|IS) STR
|
| STRTAG (INCLUDES|IS) STR
|
||||||
| INTTAG INTBOOL INT
|
| INTTAG INTBOOL INT
|
||||||
| DATETAG (AFTER|BEFORE) dateval
|
| DATETAG (AFTER|BEFORE) dateval
|
||||||
|
| ENUMTAG IS ENUMVAL
|
||||||
;
|
;
|
||||||
|
|
||||||
dateval : DATE
|
dateval : DATE
|
||||||
@ -62,20 +63,26 @@ STRTAG : 'artist'
|
|||||||
| 'type'
|
| 'type'
|
||||||
;
|
;
|
||||||
|
|
||||||
|
INTTAG : 'play_count'
|
||||||
|
| 'rating'
|
||||||
|
| 'year'
|
||||||
|
| 'compilation'
|
||||||
|
;
|
||||||
|
|
||||||
|
DATETAG : 'time_added'
|
||||||
|
| 'time_played'
|
||||||
|
;
|
||||||
|
|
||||||
|
ENUMTAG : 'data_kind'
|
||||||
|
| 'media_kind'
|
||||||
|
;
|
||||||
|
|
||||||
INCLUDES : 'includes'
|
INCLUDES : 'includes'
|
||||||
;
|
;
|
||||||
|
|
||||||
IS : 'is'
|
IS : 'is'
|
||||||
;
|
;
|
||||||
|
|
||||||
INTTAG : 'data_kind'
|
|
||||||
| 'media_kind'
|
|
||||||
| 'play_count'
|
|
||||||
| 'rating'
|
|
||||||
| 'year'
|
|
||||||
| 'compilation'
|
|
||||||
;
|
|
||||||
|
|
||||||
INTBOOL : (GREATER|GREATEREQUAL|LESS|LESSEQUAL|EQUAL)
|
INTBOOL : (GREATER|GREATEREQUAL|LESS|LESSEQUAL|EQUAL)
|
||||||
;
|
;
|
||||||
|
|
||||||
@ -99,10 +106,6 @@ fragment
|
|||||||
EQUAL : '='
|
EQUAL : '='
|
||||||
;
|
;
|
||||||
|
|
||||||
DATETAG : 'time_added'
|
|
||||||
| 'time_played'
|
|
||||||
;
|
|
||||||
|
|
||||||
AFTER : 'after'
|
AFTER : 'after'
|
||||||
;
|
;
|
||||||
|
|
||||||
@ -144,6 +147,17 @@ DATINTERVAL : 'days'
|
|||||||
| 'years'
|
| 'years'
|
||||||
;
|
;
|
||||||
|
|
||||||
|
ENUMVAL : 'music'
|
||||||
|
| 'movie'
|
||||||
|
| 'podcast'
|
||||||
|
| 'audiobook'
|
||||||
|
| 'tvshow'
|
||||||
|
| 'file'
|
||||||
|
| 'url'
|
||||||
|
| 'spotify'
|
||||||
|
| 'pipe'
|
||||||
|
;
|
||||||
|
|
||||||
STR : '"' ~('"')+ '"'
|
STR : '"' ~('"')+ '"'
|
||||||
;
|
;
|
||||||
|
|
||||||
|
@ -34,6 +34,7 @@ options {
|
|||||||
#include <sqlite3.h>
|
#include <sqlite3.h>
|
||||||
|
|
||||||
#include "logger.h"
|
#include "logger.h"
|
||||||
|
#include "db.h"
|
||||||
}
|
}
|
||||||
|
|
||||||
@members {
|
@members {
|
||||||
@ -145,6 +146,62 @@ expression returns [ pANTLR3_STRING result ]
|
|||||||
$result->append8($result, " > ");
|
$result->append8($result, " > ");
|
||||||
$result->append8($result, str);
|
$result->append8($result, str);
|
||||||
}
|
}
|
||||||
|
| ENUMTAG IS ENUMVAL
|
||||||
|
{
|
||||||
|
pANTLR3_UINT8 tag;
|
||||||
|
pANTLR3_UINT8 val;
|
||||||
|
char str[20];
|
||||||
|
|
||||||
|
sprintf(str, "1=1");
|
||||||
|
|
||||||
|
tag = $ENUMTAG.text->chars;
|
||||||
|
val = $ENUMVAL.text->chars;
|
||||||
|
if (strcmp((char *)tag, "media_kind") == 0)
|
||||||
|
{
|
||||||
|
if (strcmp((char *)val, "music") == 0)
|
||||||
|
{
|
||||||
|
sprintf(str, "f.media_kind = \%d", MEDIA_KIND_MUSIC);
|
||||||
|
}
|
||||||
|
else if (strcmp((char *)val, "movie") == 0)
|
||||||
|
{
|
||||||
|
sprintf(str, "f.media_kind = \%d", MEDIA_KIND_MOVIE);
|
||||||
|
}
|
||||||
|
else if (strcmp((char *)val, "podcast") == 0)
|
||||||
|
{
|
||||||
|
sprintf(str, "f.media_kind = \%d", MEDIA_KIND_PODCAST);
|
||||||
|
}
|
||||||
|
else if (strcmp((char *)val, "audiobook") == 0)
|
||||||
|
{
|
||||||
|
sprintf(str, "f.media_kind = \%d", MEDIA_KIND_AUDIOBOOK);
|
||||||
|
}
|
||||||
|
else if (strcmp((char *)val, "tvshow") == 0)
|
||||||
|
{
|
||||||
|
sprintf(str, "f.media_kind = \%d", MEDIA_KIND_TVSHOW);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (strcmp((char *)tag, "data_kind") == 0)
|
||||||
|
{
|
||||||
|
if (strcmp((char *)val, "file") == 0)
|
||||||
|
{
|
||||||
|
sprintf(str, "f.data_kind = \%d", DATA_KIND_FILE);
|
||||||
|
}
|
||||||
|
else if (strcmp((char *)val, "url") == 0)
|
||||||
|
{
|
||||||
|
sprintf(str, "f.data_kind = \%d", DATA_KIND_URL);
|
||||||
|
}
|
||||||
|
else if (strcmp((char *)val, "spotify") == 0)
|
||||||
|
{
|
||||||
|
sprintf(str, "f.data_kind = \%d", DATA_KIND_SPOTIFY);
|
||||||
|
}
|
||||||
|
else if (strcmp((char *)val, "pipe") == 0)
|
||||||
|
{
|
||||||
|
sprintf(str, "f.data_kind = \%d", DATA_KIND_PIPE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = $ENUMTAG.text->factory->newRaw($ENUMTAG.text->factory);
|
||||||
|
$result->append8($result, str);
|
||||||
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
dateval returns [ int result ]
|
dateval returns [ int result ]
|
||||||
|
Loading…
Reference in New Issue
Block a user