[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(&timestamp);
-
-    /* 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