ref: 4d09041fff14c843f08fcf027a7302164d78719c
parent: 6f58415a9781a09a52c40a6b1f1f3bd88cfaedc1
author: Sigrid Haflínudóttir <ftrvxmtrx@gmail.com>
date: Wed Dec 18 15:26:33 EST 2019
mkplist: use bio; prioritize composers and lead performers over any other id3v2-specific tags
--- a/mkplist.c
+++ b/mkplist.c
@@ -1,5 +1,6 @@
#include <u.h>
#include <libc.h>
+#include <bio.h>
#include <tags.h>
#include "plist.h"
@@ -11,10 +12,12 @@
#define MAX(a, b) (a > b ? a : b)
-static int fd;
+static Biobuf *bf;
static Meta *curr;
static Meta *all;
static int numall;
+static int firstiscomposer;
+static int keepfirstartist;
static void
freemeta(Meta *m)
@@ -49,9 +52,9 @@
}
static void
-cb(Tagctx *ctx, int t, const char *v, int offset, int size, Tagread f)
+cb(Tagctx *ctx, int t, const char *k, const char *v, int offset, int size, Tagread f)
{
- int i;
+ int i, iscomposer;
USED(ctx);
@@ -58,6 +61,19 @@
switch(t){
case Tartist:
if(curr->numartist < Maxartist){
+ iscomposer = strcmp(k, "TCM") == 0 || strcmp(k, "TCOM") == 0;
+ /* prefer lead performer/soloist, helps when TP2/TPE2 is the first one and is set to "VA" */
+ /* always put composer first, if available */
+ if(iscomposer || (!keepfirstartist && (strcmp(k, "TP1") == 0 || strcmp(k, "TPE1") == 0))) {
+ if(curr->numartist > 0)
+ curr->artist[curr->numartist] = curr->artist[curr->numartist-1];
+ curr->artist[0] = strdup(v);
+ curr->numartist++;
+ keepfirstartist = 1;
+ firstiscomposer = iscomposer;
+ return;
+ }
+
for(i = 0; i < curr->numartist; i++){
if(cistrcmp(curr->artist[i], v) == 0)
return;
@@ -96,7 +112,7 @@
ctxread(Tagctx *ctx, void *buf, int cnt)
{
USED(ctx);
- return read(fd, buf, cnt);
+ return Bread(bf, buf, cnt);
}
static int
@@ -103,7 +119,7 @@
ctxseek(Tagctx *ctx, int offset, int whence)
{
USED(ctx);
- return seek(fd, offset, whence);
+ return Bseek(bf, offset, whence);
}
static char buf[4096];
@@ -162,11 +178,12 @@
if((d->mode & DMDIR) == 0){
ctx.filename = path;
- if((fd = open(path, OREAD)) < 0)
+ if((bf = Bopen(path, OREAD)) == nil)
fprint(2, "%s: %r\n", path);
else if((curr = newmeta()) == nil)
sysfatal("no memory");
else{
+ firstiscomposer = keepfirstartist = 0;
if(tagsget(&ctx) != 0)
fprint(2, "%s: no tags\n", path);
if(ctx.duration == 0)
@@ -181,7 +198,7 @@
curr->path = strdup(path);
curr->duration = ctx.duration;
}
- close(fd);
+ Bterm(bf);
}else if(depth < Maxdepth){ /* recurse into the directory */
scan(dir, depth+1);
path = *dir;