tagnavi.config: Add support for "basename" in formats and conditions --- apps/tagcache.c | 20 ++++++++++++++++++-- apps/tagcache.h | 4 ++-- apps/tagtree.c | 14 +++++++++++++- 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/apps/tagcache.c b/apps/tagcache.c index a3585fe..d990028 100644 --- a/apps/tagcache.c +++ b/apps/tagcache.c @@ -869,6 +869,10 @@ static long check_virtual_tags(int tag, int idx_id, - find_tag(tag_commitid, idx_id, idx) - 1; break; + case tag_virt_basename: + tag = tag_filename; /* return filename; caller handles basename */ + /* FALLTHRU */ + default: data = find_tag(tag, idx_id, idx); } @@ -1009,7 +1013,8 @@ static bool check_clauses(struct tagcache_search *tcs, if (!TAGCACHE_IS_NUMERIC(clause->tag)) { - if (clause->tag == tag_filename) + if (clause->tag == tag_filename + || clause->tag == tag_virt_basename) { retrieve(tcs, idx, tag_filename, buf, sizeof buf); } @@ -1027,7 +1032,11 @@ static bool check_clauses(struct tagcache_search *tcs, if (!TAGCACHE_IS_NUMERIC(clause->tag)) { - int fd = tcs->idxfd[clause->tag]; + int tag = clause->tag; + if (tag == tag_virt_basename) + tag = tag_filename; + + int fd = tcs->idxfd[tag]; lseek(fd, seek, SEEK_SET); ecread_tagfile_entry(fd, &tfe); if (tfe.tag_length >= (int)sizeof(buf)) @@ -1045,6 +1054,13 @@ static bool check_clauses(struct tagcache_search *tcs, } } + if (clause->tag == tag_virt_basename) + { + char *basename = strrchr(str, '/'); + if (basename) + str = basename + 1; + } + if (!check_against_clause(seek, str, clause)) { /* Clause failed -- try finding a logical-or clause */ diff --git a/apps/tagcache.h b/apps/tagcache.h index 6f23bfc..18d44a4 100644 --- a/apps/tagcache.h +++ b/apps/tagcache.h @@ -36,7 +36,7 @@ enum tag_type { tag_artist = 0, tag_album, tag_genre, tag_title, /* Real tags end here, count them. */ TAG_COUNT, /* Virtual tags */ - tag_virt_length_min, tag_virt_length_sec, + tag_virt_basename, tag_virt_length_min, tag_virt_length_sec, tag_virt_playtime_min, tag_virt_playtime_sec, tag_virt_entryage, tag_virt_autoscore }; @@ -103,7 +103,7 @@ enum tag_type { tag_artist = 0, tag_album, tag_genre, tag_title, (1LU << tag_tracknumber) | (1LU << tag_length) | (1LU << tag_bitrate) | \ (1LU << tag_playcount) | (1LU << tag_rating) | (1LU << tag_playtime) | \ (1LU << tag_lastplayed) | (1LU << tag_commitid) | (1LU << tag_mtime) | \ - (1LU << tag_lastoffset) | \ + (1LU << tag_lastoffset) | (1LU << tag_virt_basename) | \ (1LU << tag_virt_length_min) | (1LU << tag_virt_length_sec) | \ (1LU << tag_virt_playtime_min) | (1LU << tag_virt_playtime_sec) | \ (1LU << tag_virt_entryage) | (1LU << tag_virt_autoscore)) diff --git a/apps/tagtree.c b/apps/tagtree.c index 1924da8..d6c7cd6 100644 --- a/apps/tagtree.c +++ b/apps/tagtree.c @@ -236,6 +236,7 @@ static int get_tag(int *tag) MATCH(tag, buf, "Ps", tag_virt_playtime_sec); MATCH(tag, buf, "title", tag_title); MATCH(tag, buf, "filename", tag_filename); + MATCH(tag, buf, "basename", tag_virt_basename); MATCH(tag, buf, "tracknum", tag_tracknumber); MATCH(tag, buf, "discnum", tag_discnumber); MATCH(tag, buf, "year", tag_year); @@ -1070,12 +1071,23 @@ static int format_str(struct tagcache_search *tcs, struct display_format *fmt, else { /* Need to fetch the tag data. */ - if (!tagcache_retrieve(tcs, tcs->idx_id, fmt->tags[parpos], + int tag = fmt->tags[parpos]; + char *str; + + if (!tagcache_retrieve(tcs, tcs->idx_id, + (tag == tag_virt_basename ? + tag_filename : tag), &buf[buf_pos], buf_size - buf_pos)) { logf("retrieve failed"); return -3; } + + if (tag == tag_virt_basename + && (str = strrchr(&buf[buf_pos], '/')) != NULL) + { + memmove(&buf[buf_pos], str + 1, strlen(str)); + } } buf_pos += strlen(&buf[buf_pos]); parpos++; -- 1.7.1