[ please cc: me! i'm not on the list now. thanks! ] hi,
my favorite mp3 player (alsaplayer) does not have satisfying functionality for managing playlists. and i don't think winamp is much better on this either. so below is an invitation for tips managing mp3 playlists. i find for now the old unix way doing things is pretty satisfying. ;) i use this command line for playing a sigle mp3: $ alsaplayer-text -l 100 -n some.mp3 > /dev/null i will write the above line simply as ``playmp3 some.mp3'' below. 1) to play all the mp3s in the archive in a random order. rand is a small c program i wrote to randomize lines. (src attached below. it's pretty amazing there is no standard tools to do this?) $ find . -name '*.mp3' | rand | awk '/^.*$/ { system("playmp3 \"" $0 "\"") }' 2) to get rid of .m3u files, i just have to arrange my mp3 in different directories. and use hardlinks if i want to listen a song in different collections. i.e. in different .m3u files. using hardlinks and directories, i find this is way better than messing with .m3u files. what do you feel? (i understand windoze guys cannot play this way. ;) 3) to cycling around a .m3u is pretty obvious for you unix guys there now, isn't it. ;) cheers,
/* This is rand version 0.1 GNU GPL protected. Report bugs and suggestions to zhaoway <[EMAIL PROTECTED]> */ #define _GNU_SOURCE #include <stdio.h> #include <stdlib.h> #include <time.h> struct item { char *str; struct item *next; struct item *prev; } *first; /* count the lines */ int lines; void die(char *str) { fprintf(stderr, "rand: die! %s\n", str); exit(1); } void read_items(void) { struct item *last, *this; size_t zero = 0; lines = 0; first = (struct item *) malloc(sizeof(struct item)); if (first == NULL) die("not enough memory!"); first->str = NULL; first->next = first; first->prev = first; this = first; last = NULL; /* getline() is _GNU_SOURCE */ while (getline(&(this->str), &zero, stdin) != -1) { if (last != NULL) last->next = this; last = this; this = (struct item *) malloc(sizeof(struct item)); if (this == NULL) die("not enough memory!"); this->str = NULL; this->next = first; this->prev = last; lines++; } first->prev = last; free(this); } void disp_items(void) { struct item *this; int count = lines; if (first == NULL) return; else this = first; while (count-- > 0) { printf("%s", this->str); this = this->next; } } void rand_items(void) { int num, count = lines; struct item *this, *last = NULL; if (first == NULL) return; else this = first; srand(time(0)); while (count > 0) { num = rand() % count--; while (num-- > 0) this = this->next; this->prev->next = this->next; this->next->prev = this->prev; if (last != NULL) { last->next = this; this->prev = last; } else first = this; last = this; this = this->next; } first->prev = last; if (last != NULL) last->next = first; } int main(int argc, char *argv[]) { read_items(); rand_items(); disp_items(); return(0); }