[vlc-devel] [PATCH 3/3] Audioscrobbler: Remove the old protocol version 1.2.
Samuel Pitoiset
samuel.pitoiset at gmail.com
Fri Mar 9 19:31:19 CET 2012
---
modules/misc/audioscrobbler.c | 419 +----------------------------------------
1 file changed, 4 insertions(+), 415 deletions(-)
diff --git a/modules/misc/audioscrobbler.c b/modules/misc/audioscrobbler.c
index fd0ec4c..277408e 100644
--- a/modules/misc/audioscrobbler.c
+++ b/modules/misc/audioscrobbler.c
@@ -22,11 +22,10 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
-/* audioscrobbler protocol version: 1.2
- * http://www.audioscrobbler.net/development/protocol/
+/* audioscrobbler protocol version: 2.0
+ * http://www.last.fm/api/scrobbling
*
* TODO: "Now Playing" feature (not mandatory)
- * Update to new API? http://www.lastfm.fr/api
*/
/*****************************************************************************
* Preamble
@@ -723,7 +722,7 @@ static char *BuildSignedRequest(intf_thread_t *p_this, vlc_array_t *p_params,
/*****************************************************************************
* Handshake : Init audioscrobbler connection
*****************************************************************************/
-static int NewHandshake(intf_thread_t *p_this)
+static int Handshake(intf_thread_t *p_this)
{
char *psz_username, *psz_password, *psz_auth_token;
char *psz_scrobbler_url, *psz_handshake_url;
@@ -931,211 +930,6 @@ proto:
return VLC_EGENERIC;
}
-/*****************************************************************************
- * Handshake : Init audioscrobbler connection
- *****************************************************************************/
-static int Handshake(intf_thread_t *p_this)
-{
- char *psz_username, *psz_password;
- char *psz_scrobbler_url;
- time_t timestamp;
- char psz_timestamp[21];
-
- struct md5_s p_struct_md5;
-
- stream_t *p_stream;
- char *psz_handshake_url;
- uint8_t p_buffer[1024];
- char *p_buffer_pos;
-
- int i_ret;
- char *psz_url;
-
- intf_thread_t *p_intf = (intf_thread_t*) p_this;
- intf_sys_t *p_sys = p_this->p_sys;
-
- psz_username = var_InheritString(p_this, "lastfm-username");
- if (!psz_username)
- return VLC_ENOMEM;
-
- psz_password = var_InheritString(p_this, "lastfm-password");
- if (!psz_password)
- {
- free(psz_username);
- return VLC_ENOMEM;
- }
-
- /* username or password have not been setup */
- if (!*psz_username || !*psz_password)
- {
- free(psz_username);
- free(psz_password);
- return VLC_ENOVAR;
- }
-
- time(×tamp);
-
- /* generates a md5 hash of the password */
- InitMD5(&p_struct_md5);
- AddMD5(&p_struct_md5, (uint8_t*) psz_password, strlen(psz_password));
- EndMD5(&p_struct_md5);
-
- free(psz_password);
-
- char *psz_password_md5 = psz_md5_hash(&p_struct_md5);
- if (!psz_password_md5)
- {
- free(psz_username);
- return VLC_ENOMEM;
- }
-
- snprintf(psz_timestamp, sizeof(psz_timestamp), "%"PRIu64,
- (uint64_t)timestamp);
-
- /* generates a md5 hash of :
- * - md5 hash of the password, plus
- * - timestamp in clear text
- */
- InitMD5(&p_struct_md5);
- AddMD5(&p_struct_md5, (uint8_t*) psz_password_md5, 32);
- AddMD5(&p_struct_md5, (uint8_t*) psz_timestamp, strlen(psz_timestamp));
- EndMD5(&p_struct_md5);
- free(psz_password_md5);
-
- char *psz_auth_token = psz_md5_hash(&p_struct_md5);
- if (!psz_auth_token)
- {
- free(psz_username);
- return VLC_ENOMEM;
- }
-
- psz_scrobbler_url = var_InheritString(p_this, "scrobbler-url");
- if (!psz_scrobbler_url)
- {
- free(psz_username);
- return VLC_ENOMEM;
- }
-
- i_ret = asprintf(&psz_handshake_url,
- "http://%s/?hs=true&p=1.2&c="CLIENT_NAME"&v="CLIENT_VERSION"&u=%s&t=%s&a=%s"
- , psz_scrobbler_url, psz_username, psz_timestamp, psz_auth_token);
-
- free(psz_scrobbler_url);
- free(psz_username);
- if (i_ret == -1)
- return VLC_ENOMEM;
-
- /* send the http handshake request */
- p_stream = stream_UrlNew(p_intf, psz_handshake_url);
- free(psz_handshake_url);
-
- if (!p_stream)
- return VLC_EGENERIC;
-
- /* read answer */
- i_ret = stream_Read(p_stream, p_buffer, sizeof(p_buffer) - 1);
- if (i_ret == 0)
- {
- stream_Delete(p_stream);
- return VLC_EGENERIC;
- }
- p_buffer[i_ret] = '\0';
- stream_Delete(p_stream);
-
- p_buffer_pos = strstr((char*) p_buffer, "FAILED ");
- if (p_buffer_pos)
- {
- /* handshake request failed, sorry */
- msg_Err(p_this, "last.fm handshake failed: %s", p_buffer_pos + 7);
- return VLC_EGENERIC;
- }
-
- if (strstr((char*) p_buffer, "BADAUTH"))
- {
- /* authentication failed, bad username/password combination */
- dialog_Fatal(p_this,
- _("last.fm: Authentication failed"),
- "%s", _("last.fm username or password is incorrect. "
- "Please verify your settings and relaunch VLC."));
- return VLC_AUDIOSCROBBLER_EFATAL;
- }
-
- if (strstr((char*) p_buffer, "BANNED"))
- {
- /* oops, our version of vlc has been banned by last.fm servers */
- msg_Err(p_intf, "This version of VLC has been banned by last.fm. "
- "You should upgrade VLC, or disable the last.fm plugin.");
- return VLC_AUDIOSCROBBLER_EFATAL;
- }
-
- if (strstr((char*) p_buffer, "BADTIME"))
- {
- /* The system clock isn't good */
- msg_Err(p_intf, "last.fm handshake failed because your clock is too "
- "much shifted. Please correct it, and relaunch VLC.");
- return VLC_AUDIOSCROBBLER_EFATAL;
- }
-
- p_buffer_pos = strstr((char*) p_buffer, "OK");
- if (!p_buffer_pos)
- goto proto;
-
- p_buffer_pos = strstr(p_buffer_pos, "\n");
- if (!p_buffer_pos || strlen(p_buffer_pos) < 33)
- goto proto;
- p_buffer_pos++; /* we skip the '\n' */
-
- /* save the session ID */
- memcpy(p_sys->psz_auth_token, p_buffer_pos, 32);
- p_sys->psz_auth_token[32] = '\0';
-
- p_buffer_pos = strstr(p_buffer_pos, "http://");
- if (!p_buffer_pos || strlen(p_buffer_pos) == 7)
- goto proto;
-
- /* We need to read the nowplaying url */
- p_buffer_pos += 7; /* we skip "http://" */
-#if 0 //NOT USED
- psz_url = strndup(p_buffer_pos, strcspn(p_buffer_pos, "\n"));
- if (!psz_url)
- goto oom;
-
- switch(ParseURL(psz_url, &p_sys->psz_nowp_host,
- &p_sys->psz_nowp_file, &p_sys->i_nowp_port))
- {
- case VLC_ENOMEM:
- goto oom;
- case VLC_EGENERIC:
- goto proto;
- case VLC_SUCCESS:
- default:
- break;
- }
-#endif
- p_buffer_pos = strstr(p_buffer_pos, "http://");
- if (!p_buffer_pos || strlen(p_buffer_pos) == 7)
- goto proto;
-
- /* We need to read the submission url */
- p_buffer_pos += 7; /* we skip "http://" */
- psz_url = strndup(p_buffer_pos, strcspn(p_buffer_pos, "\n"));
- if (!psz_url)
- goto oom;
-
- /* parse the submission url */
- vlc_UrlParse(&p_sys->p_submit_url, psz_url, 0);
- free(psz_url);
-
- return VLC_SUCCESS;
-
-oom:
- return VLC_ENOMEM;
-
-proto:
- msg_Err(p_intf, "Handshake: can't recognize server protocol");
- return VLC_EGENERIC;
-}
-
static void HandleInterval(mtime_t *next, unsigned int *i_interval)
{
if (*i_interval == 0)
@@ -1327,7 +1121,7 @@ proto:
/*****************************************************************************
* Run : call Handshake() then submit songs
*****************************************************************************/
-static void NewRun(intf_thread_t *p_this)
+static void Run(intf_thread_t *p_this)
{
int canc = vlc_savecancel();
bool b_handshaked = false;
@@ -1420,208 +1214,3 @@ static void NewRun(intf_thread_t *p_this)
}
vlc_restorecancel(canc);
}
-
-/*****************************************************************************
- * Run : call Handshake() then submit songs
- *****************************************************************************/
-static void Run(intf_thread_t *p_intf)
-{
- uint8_t p_buffer[1024];
- int canc = vlc_savecancel();
- bool b_handshaked = false;
-
- /* data about audioscrobbler session */
- mtime_t next_exchange; /**< when can we send data */
- unsigned int i_interval; /**< waiting interval (secs)*/
-
- intf_sys_t *p_sys = p_intf->p_sys;
-
- /* main loop */
- for (;;)
- {
- vlc_restorecancel(canc);
- vlc_mutex_lock(&p_sys->lock);
- mutex_cleanup_push(&p_sys->lock);
-
- do
- vlc_cond_wait(&p_sys->wait, &p_sys->lock);
- while (mdate() < next_exchange);
-
- vlc_cleanup_run();
- canc = vlc_savecancel();
-
- /* handshake if needed */
- if (!b_handshaked)
- {
- msg_Dbg(p_intf, "Handshaking with last.fm ...");
-
- switch(Handshake(p_intf))
- {
- case VLC_ENOMEM:
- return;
-
- case VLC_ENOVAR:
- /* username not set */
- dialog_Fatal(p_intf,
- _("Last.fm username not set"),
- "%s", _("Please set a username or disable the "
- "audioscrobbler plugin, and restart VLC.\n"
- "Visit http://www.last.fm/join/ to get an account.")
- );
- return;
-
- case VLC_SUCCESS:
- msg_Dbg(p_intf, "Handshake successful :)");
- b_handshaked = true;
- i_interval = 0;
- next_exchange = mdate();
- break;
-
- case VLC_AUDIOSCROBBLER_EFATAL:
- msg_Warn(p_intf, "Exiting...");
- return;
-
- case VLC_EGENERIC:
- default:
- /* protocol error : we'll try later */
- HandleInterval(&next_exchange, &i_interval);
- break;
- }
- /* if handshake failed let's restart the loop */
- if (!b_handshaked)
- continue;
- }
-
- msg_Dbg(p_intf, "Going to submit some data...");
- char *psz_submit;
- if (asprintf(&psz_submit, "s=%s", p_sys->psz_auth_token) == -1)
- return;
-
- /* forge the HTTP POST request */
- vlc_mutex_lock(&p_sys->lock);
- audioscrobbler_song_t *p_song;
- for (int i_song = 0 ; i_song < p_sys->i_songs ; i_song++)
- {
- char *psz_submit_song, *psz_submit_tmp;
- p_song = &p_sys->p_queue[i_song];
- if (asprintf(&psz_submit_song,
- "&a%%5B%d%%5D=%s"
- "&t%%5B%d%%5D=%s"
- "&i%%5B%d%%5D=%u"
- "&o%%5B%d%%5D=P"
- "&r%%5B%d%%5D="
- "&l%%5B%d%%5D=%d"
- "&b%%5B%d%%5D=%s"
- "&n%%5B%d%%5D=%s"
- "&m%%5B%d%%5D=%s",
- i_song, p_song->psz_a,
- i_song, p_song->psz_t,
- i_song, (unsigned)p_song->date, /* HACK: %ju (uintmax_t) unsupported on Windows */
- i_song,
- i_song,
- i_song, p_song->i_l,
- i_song, p_song->psz_b,
- i_song, p_song->psz_n,
- i_song, p_song->psz_m
- ) == -1)
- { /* Out of memory */
- vlc_mutex_unlock(&p_sys->lock);
- return;
- }
- psz_submit_tmp = psz_submit;
- if (asprintf(&psz_submit, "%s%s",
- psz_submit_tmp, psz_submit_song) == -1)
- { /* Out of memory */
- free(psz_submit_tmp);
- free(psz_submit_song);
- vlc_mutex_unlock(&p_sys->lock);
- return;
- }
- free(psz_submit_song);
- free(psz_submit_tmp);
- }
- vlc_mutex_unlock(&p_sys->lock);
-
- int i_post_socket = net_ConnectTCP(p_intf, p_sys->p_submit_url.psz_host,
- p_sys->p_submit_url.i_port);
-
- if (i_post_socket == -1)
- {
- /* If connection fails, we assume we must handshake again */
- HandleInterval(&next_exchange, &i_interval);
- b_handshaked = false;
- free(psz_submit);
- continue;
- }
-
- /* we transmit the data */
- int i_net_ret = net_Printf(p_intf, i_post_socket, NULL,
- "POST %s HTTP/1.1\n"
- "Accept-Encoding: identity\n"
- "Content-length: %zu\n"
- "Connection: close\n"
- "Content-type: application/x-www-form-urlencoded\n"
- "Host: %s\n"
- "User-agent: VLC media player/"VERSION"\r\n"
- "\r\n"
- "%s\r\n"
- "\r\n",
- p_sys->p_submit_url.psz_path, strlen(psz_submit),
- p_sys->p_submit_url.psz_host, psz_submit
- );
-
- free(psz_submit);
- if (i_net_ret == -1)
- {
- /* If connection fails, we assume we must handshake again */
- HandleInterval(&next_exchange, &i_interval);
- b_handshaked = false;
- continue;
- }
-
- i_net_ret = net_Read(p_intf, i_post_socket, NULL,
- p_buffer, sizeof(p_buffer) - 1, false);
- if (i_net_ret <= 0)
- {
- /* if we get no answer, something went wrong : try again */
- continue;
- }
-
- net_Close(i_post_socket);
- p_buffer[i_net_ret] = '\0';
-
- char *failed = strstr((char *) p_buffer, "FAILED");
- if (failed)
- {
- msg_Warn(p_intf, "%s", failed);
- HandleInterval(&next_exchange, &i_interval);
- continue;
- }
-
- if (strstr((char *) p_buffer, "BADSESSION"))
- {
- msg_Err(p_intf, "Authentication failed (BADSESSION), are you connected to last.fm with another program ?");
- b_handshaked = false;
- HandleInterval(&next_exchange, &i_interval);
- continue;
- }
-
- if (strstr((char *) p_buffer, "OK"))
- {
- for (int i = 0; i < p_sys->i_songs; i++)
- DeleteSong(&p_sys->p_queue[i]);
- p_sys->i_songs = 0;
- i_interval = 0;
- next_exchange = mdate();
- msg_Dbg(p_intf, "Submission successful!");
- }
- else
- {
- msg_Err(p_intf, "Authentication failed, handshaking again (%s)",
- p_buffer);
- b_handshaked = false;
- HandleInterval(&next_exchange, &i_interval);
- }
- }
- vlc_restorecancel(canc);
-}
--
1.7.9.3
More information about the vlc-devel
mailing list