Skip to content

Commit

Permalink
Merge branch 'master' into dreambox
Browse files Browse the repository at this point in the history
  • Loading branch information
Jonas Kramer committed Feb 28, 2009
2 parents c5e927f + 6971228 commit 3c1a687
Show file tree
Hide file tree
Showing 4 changed files with 79 additions and 74 deletions.
2 changes: 1 addition & 1 deletion source/include/playlist.h
Expand Up @@ -19,7 +19,7 @@ struct playlist {
};

extern int expand(struct playlist *);
extern int parsexspf(struct playlist *, const char *);
extern int parsexspf(struct playlist *, char *);

extern void freelist(struct playlist *);
extern void freenode(struct tracknode **);
Expand Down
8 changes: 6 additions & 2 deletions source/play.c
Expand Up @@ -104,6 +104,8 @@ mkpath(char *path)
}

int playback(FILE * streamfd) {
const char * freetrack = NULL;

killed = 0;
signal(SIGUSR1, sighand);

Expand Down Expand Up @@ -161,8 +163,10 @@ int playback(FILE * streamfd) {
ioctl(data.audiofd, SOUND_PCM_WRITE_BITS, & arg);
#endif

if(haskey(& track, "freeTrackURL") && haskey(& rc, "download")) {
char *dnam;
freetrack = value(& track, "freeTrackURL");

if(freetrack && strlen(freetrack) > 0 && haskey(& rc, "download")) {
char * dnam;
int rv;

data.path = strdup(meta(value(& rc, "download"), M_RELAXPATH, & track));
Expand Down
119 changes: 51 additions & 68 deletions source/playlist.c
Expand Up @@ -65,109 +65,92 @@ void trim(char* string){
}


int parsexspf(struct playlist * list, const char * xml) {
char * ptr;
int parsexspf(struct playlist * list, char * xml) {
char * ptr = xml;
unsigned i, tracks = 0;
char * track;

assert(list != NULL);
assert(xml != NULL);

if((ptr = strcasestr(xml, "<title>")) != NULL) {
char * track, * radio = NULL;
while((track = strcasestr(ptr, "<track>")) != NULL) {
struct tracknode * node = NULL;
char * next = strcasestr(track + 7, "<track>"), * duration;

radio = strndup(ptr + 7, strcasestr(xml, "</title>") - ptr - 7);
assert(radio != NULL);
const char * tags [] = {
"location", "title", "album", "creator", "duration", "image",
"lastfm:trackauth",
};

if(list->title != NULL) {
free(list->title);
list->title = NULL;
}

decode(radio, & list->title);
unhtml(list->title);
free(radio);

while((track = strcasestr(ptr, "<track>")) != NULL) {
struct tracknode * node = NULL;
char * next = strcasestr(track + 7, "<track>"), * duration;
const char * links [] = { "artistpage", "albumpage", "trackpage", "freeTrackURL", };

const char * tags [] = {
"location", "title", "album", "creator", "duration", "image",
"lastfm:trackauth",
};

const char * links [] = { "artistpage", "albumpage", "trackpage", "freeTrackURL", };
if(next)
* (next - 1) = 0;

node = malloc(sizeof(struct tracknode));
assert(node != NULL);

if(next)
* (next - 1) = 0;
memset(node, 0, sizeof(struct tracknode));

node = malloc(sizeof(struct tracknode));
assert(node != NULL);
for(i = 0; i < (sizeof(tags) / sizeof(char *)); ++i) {
char begin[32] = { 0 }, end[32] = { 0 };

memset(node, 0, sizeof(struct tracknode));
sprintf(begin, "<%s>", tags[i]);
sprintf(end, "</%s>", tags[i]);

for(i = 0; i < (sizeof(tags) / sizeof(char *)); ++i) {
char begin[32] = { 0 }, end[32] = { 0 };

sprintf(begin, "<%s>", tags[i]);
sprintf(end, "</%s>", tags[i]);

if((ptr = strcasestr(track, begin)) != NULL) {
char * text = strndup(
if((ptr = strcasestr(track, begin)) != NULL) {
char * text = strndup(
ptr + strlen(begin),
(strcasestr(ptr, end)) - (ptr + strlen(begin))
);
);

assert(text != NULL);
assert(text != NULL);

unhtml(text);
set(& node->track, tags[i], text);
free(text);
}
unhtml(text);
set(& node->track, tags[i], text);
free(text);
}
}

for(i = 0; i < (sizeof(links) / sizeof(char *)); ++i) {
char begin[64] = { 0 };
for(i = 0; i < (sizeof(links) / sizeof(char *)); ++i) {
char begin[64] = { 0 };

sprintf(begin, "<link rel=\"http://www.last.fm/%s\">", links[i]);
sprintf(begin, "<link rel=\"http://www.last.fm/%s\">", links[i]);

if((ptr = strcasestr(track, begin)) != NULL) {
char * text = strndup(
if((ptr = strcasestr(track, begin)) != NULL) {
char * text = strndup(
ptr + strlen(begin),
(strcasestr(ptr, "</link>")) - (ptr + strlen(begin))
);
);

assert(text != NULL);
assert(text != NULL);

set(& node->track, links[i], text);
free(text);
}
set(& node->track, links[i], text);
free(text);
}
}

trim(list->title);
set(& node->track, "station", list->title);

duration = strdup(value(& node->track, "duration"));
if(duration != NULL) {
duration[strlen(duration) - 3] = 0;
set(& node->track, "duration", duration);
}
trim(list->title);
set(& node->track, "station", list->title);

push(list, node);
duration = strdup(value(& node->track, "duration"));
if(duration != NULL) {
duration[strlen(duration) - 3] = 0;
set(& node->track, "duration", duration);
}

++tracks;
push(list, node);

if(!next)
break;
++tracks;

ptr = next;
}
if(!next)
break;

return !0;
ptr = next;
}

return 0;
return 1;
}


Expand Down
24 changes: 21 additions & 3 deletions source/service.c
Expand Up @@ -36,7 +36,6 @@ pid_t playfork = 0; /* PID of the decoding & playing process, if running */
struct playlist playlist;
char * currentStation = NULL;


int authenticate(const char * username, const char * password) {
const unsigned char * md5;
char hexmd5[32 + 1] = { 0 }, url[512] = { 0 }, ** response;
Expand Down Expand Up @@ -93,7 +92,7 @@ int authenticate(const char * username, const char * password) {


int station(const char * stationURL) {
char url[512] = { 0 }, * encodedURL = NULL, ** response;
char url[512] = { 0 }, * encodedURL = NULL, ** response, name[512];
unsigned i = 0, retval = !0, regular = !0;
const char * fmt;
const char * types[4] = {"play", "preview", "track", "playlist"};
Expand All @@ -115,20 +114,30 @@ int station(const char * stationURL) {
}
}

/* Do nothing if the station is already played. */
else if(currentStation && !strcmp(currentStation, stationURL)) {
return 0;
}

puts("\rDelayed.");
nextstation = strdup(stationURL);

return 0;
}

/* Do nothing if the station is already played. */
else if(currentStation && !strcmp(currentStation, stationURL)) {
return 0;
}

freelist(& playlist);

if(!haskey(& data, "session")) {
fputs("Not authenticated, yet.\n", stderr);
return 0;
}

if(!stationURL)
if(!stationURL || !strlen(stationURL))
return 0;

if(!strncasecmp(stationURL, "lastfm://", 9))
Expand Down Expand Up @@ -166,9 +175,18 @@ int station(const char * stationURL) {
if(regular) {
for(i = 0; response[i]; ++i) {
char status[64] = { 0 };

if(sscanf(response[i], "response=%63[^\r\n]", status) > 0)
if(!strncmp(status, "FAILED", 6))
retval = 0;

if(sscanf(response[i], "stationname=%127[^\r\n]", name) > 0) {
if(playlist.title != NULL)
free(playlist.title);

decode(name, & playlist.title);
unhtml(playlist.title);
}
}

purge(response);
Expand Down

0 comments on commit 3c1a687

Please sign in to comment.