diff options
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | src/input/input_http.c | 27 |
2 files changed, 31 insertions, 0 deletions
@@ -1,3 +1,7 @@ +xine-lib (1.1.8) (Unreleased) + * Send a channel changed event to the frontend when receiving the SYNC + string from last.fm streaming server. + xine-lib (1.1.7) * Support libdca (new name for libdts) by shuffling around the dts.h file. * Add support for MDHD version 1 atom in demux_qt. [bug #1679398] diff --git a/src/input/input_http.c b/src/input/input_http.c index 6e8932700..d28fa75ab 100644 --- a/src/input/input_http.c +++ b/src/input/input_http.c @@ -64,6 +64,7 @@ #define TAG_ICY_NOTICE2 "icy-notice2:" #define TAG_ICY_METAINT "icy-metaint:" #define TAG_CONTENT_TYPE "Content-Type:" +#define TAG_LASTFM_SERVER "Server: last.fm Streaming Server" typedef struct { input_plugin_t input_plugin; @@ -94,6 +95,9 @@ typedef struct { char preview[MAX_PREVIEW_SIZE]; off_t preview_size; + /* Last.FM streaming server */ + unsigned char is_lastfm; + /* ShoutCast */ int shoutcast_mode; int shoutcast_metaint; @@ -383,6 +387,25 @@ static off_t http_plugin_read_int (http_input_plugin_t *this, if (nlen < 0) goto error; + /* Identify SYNC string for last.fm, this is limited to last.fm + * streaming servers to avoid hitting on tracks metadata for other + * servers. + */ + if ( this->is_lastfm && + memmem(&buf[read_bytes], nlen, "SYNC", 4) != NULL ) { + /* Tell frontend to update the UI */ + const xine_event_t event = { + .type = XINE_EVENT_UI_CHANNELS_CHANGED, + .stream = this->stream, + .data = NULL, + .data_length = 0 + }; + + lprintf("SYNC from last.fm server received\n"); + + xine_event_send(this->stream, &event); + } + this->shoutcast_pos += nlen; } @@ -907,6 +930,10 @@ static int http_plugin_open (input_plugin_t *this_gen ) { this->is_nsv = 1; } } + if ( !strncasecmp(this->buf, TAG_LASTFM_SERVER, sizeof(TAG_LASTFM_SERVER)-1) ) { + lprintf("last.fm streaming server detected\n"); + this->is_lastfm = 1; + } } if (len == -1) |