Fix Lasf.fm API 1.x compatibility. User may disable new option APIFIX

in case it breaks compatibility with alternative services.

PR:		220992
Submitted by:	Eugene Zheganin
Approved by:	az (mentor)
This commit is contained in:
Eugene Grosbein 2017-07-25 09:08:31 +00:00
parent 4db2bc3041
commit e9bef0ebb9
Notes: svn2git 2021-03-31 03:12:20 +00:00
svn path=/head/; revision=446563
2 changed files with 202 additions and 2 deletions

View file

@ -3,7 +3,7 @@
PORTNAME= xmms2-scrobbler
PORTVERSION= 0.4.0
PORTREVISION= 3
PORTREVISION= 4
CATEGORIES= audio
MASTER_SITES= ftp://ftp.code-monkey.de/pub/${PORTNAME}/
@ -24,7 +24,11 @@ PORTDOCS= README
SUB_FILES= pkg-message
OPTIONS_DEFINE= DOCS
OPTIONS_DEFINE= APIFIX DOCS
OPTIONS_DEFAULT= APIFIX DOCS
APIFIX_DESC= Apply fix for Last.fm API 1.x
APIFIX_EXTRA_PATCHES_ON= ${FILESDIR}/extra-patch-xmms2-scrobbler.c
post-install:
@${STRIP_CMD} ${STAGEDIR}${PREFIX}/bin/xmms2-scrobbler

View file

@ -0,0 +1,196 @@
--- src/xmms2-scrobbler.c.orig 2009-12-30 17:04:01 UTC
+++ src/xmms2-scrobbler.c
@@ -140,93 +140,126 @@ signal_handler (int sig)
keep_running = false;
}
-static size_t
-handle_handshake_reponse (void *rawptr, size_t size, size_t nmemb,
- void *data)
-{
- Server *server = data;
- size_t total = size * nmemb, left = total;
- char *ptr = rawptr, *newline;
- int len;
+char * get_line_from_response (char *answer, int lfpos) {
+ int lfpositions[10];
+ int i, k, lfcounter, start, end, resultlen;
- newline = memchr (ptr, '\n', left);
- if (!newline) {
- fprintf (stderr, "no newline (1)\n");
- return total;
- }
+ char *result;
- *newline = 0;
+#ifdef DEBUG
+ fprintf (stderr, "DEBUG: got string: %s\n", answer);
+#endif
- if (strcmp (ptr, "OK")) {
- fprintf (stderr, "handshake failed\n");
- return total;
+ /* marking the string */
+ i = 0;
+ lfcounter = 0;
+ while (answer[i] != '\0') {
+ if (answer[i] == '\n' && lfcounter < 10) {
+ lfpositions[lfcounter] = i;
+ lfcounter++;
+#ifdef DEBUG
+ fprintf (stderr, "DEBUG: got LF location: %d\n", i);
+#endif
}
+ i++;
+ }
+ /* getting the actual line */
+ /* getting the size of it */
- len = newline - ptr + 1;
+ start = lfpos - 1;
+ end = lfpos;
+#ifdef DEBUG
+ if (start >= 0) {
+ fprintf (stderr, "DEBUG: requested line starts at char no. %d and ends at %d.\n", lfpositions[start], lfpositions[end]);
+ } else {
+ fprintf (stderr, "DEBUG: requested line starts at the start of string and ends at char no. %d.\n", lfpositions[end]);
+ }
+#endif
- left -= len;
- ptr += len;
+ if (start >= 0) {
+ resultlen = lfpositions[end] - lfpositions[start] + 1;
+ } else {
+ resultlen = lfpositions[end] + 1;
+ }
+#ifdef DEBUG
+ fprintf (stderr, "DEBUG: requested line will need %d bytes.\n", resultlen);
+#endif
+ result = malloc(resultlen);
+ bzero(result, resultlen);
- newline = memchr (ptr, '\n', left);
- if (!newline) {
- fprintf (stderr, "no newline (1)\n");
- return total;
+ /* bytecopying the line */
+#ifdef DEBUG
+ if (start >= 0) {
+ fprintf (stderr, "DEBUG: copying the string from char no. %d to %d.\n", lfpositions[start], lfpositions[end]);
+ } else {
+ fprintf (stderr, "DEBUG: copying the string from the beginning to char no. %d.\n", lfpositions[end]);
+ }
+#endif
+ k = 0;
+ if (start >= 0) {
+ i = lfpositions[start];
+ } else {
+ i = 0;
+ }
+ while (i < lfpositions[end]) {
+ /* don't copy LF themselves */
+ if (answer[i] != '\n') {
+ result[k] = answer[i];
+ k++;
}
+ i++;
+ }
- *newline = 0;
-
- len = newline - ptr + 1;
+#ifdef DEBUG
+ fprintf (stderr, "DEBUG: returning string: %s\n", result);
+#endif
+ return(result);
+}
- if (len > 255) {
- fprintf (stderr, "session ID is too long (%i characters)\n", len);
- return total;
- }
+static size_t
+handle_handshake_reponse (void *rawptr, size_t size, size_t nmemb,
+ void *data)
+{
+ Server *server;
+ size_t total, left;
+ char *ptr, *status, *sessionid, *np_url, *subm_url;
- strcpy (server->session_id, ptr);
+ server = data;
+ ptr = rawptr;
+ total = size * nmemb;
+ left = total;
- left -= len;
- ptr += len;
+#ifdef DEBUG
+ fprintf (stderr, "DEBUG: got string \"%s\".\n", rawptr);
+#endif
- /* now playing URL */
- newline = memchr (ptr, '\n', left);
- if (!newline) {
- fprintf (stderr, "no newline (2)\n");
- return total;
+ status = get_line_from_response(rawptr, 0);
+
+ if (strcmp(status, "OK") != 0) {
+ fprintf (stderr, "WARNING: handshake failed: %s.\n", status);
+ return(total);
}
- *newline = 0;
-
- len = newline - ptr + 1;
-
- if (len > 255) {
- fprintf (stderr, "now_playing URL is too long "
- "(%i characters)\n", len);
- return total;
+ sessionid = get_line_from_response(rawptr, 3);
+ if (strlen(sessionid) > 255) {
+ fprintf (stderr, "ERROR: session ID is too long (%ld characters).\n", strlen(sessionid));
+ return(total);
}
+ strcpy (server->session_id, sessionid);
- strcpy (server->np_url, ptr);
-
- left -= len;
- ptr += len;
-
- /* submission URL */
- newline = memchr (ptr, '\n', left);
- if (!newline) {
- printf("no newline (3)\n");
- return total;
+ np_url = get_line_from_response(rawptr, 6);
+ if (strlen(np_url) > 255) {
+ fprintf (stderr, "ERROR: nowplaying URL is too long (%ld characters).\n", strlen(np_url));
+ return(total);
}
+ strcpy (server->np_url, np_url);
- *newline = 0;
-
- len = newline - ptr + 1;
-
- if (len > 255) {
- fprintf (stderr, "submission URL is too long "
- "(%i characters)\n", len);
- return total;
+ subm_url = get_line_from_response(rawptr, 9);
+ if (strlen(sessionid) > 255) {
+ fprintf (stderr, "ERROR: submission URL is too long (%ld characters).\n", strlen(subm_url));
+ return(total);
}
-
- strcpy (server->subm_url, ptr);
+ strcpy (server->subm_url, subm_url);
fprintf (stderr, "got:\n'%s' '%s' '%s'\n",
server->session_id, server->np_url, server->subm_url);