[vlc-devel] [PATCH 3/3] Audioscrobbler: Remove the old protocol version 2.0

Samuel Pitoiset samuel.pitoiset at gmail.com
Fri Feb 24 23:17:37 CET 2012


crap!

I'm sorry the commit message is wrong...

"Audioscrobbler: Remove the old protocol version 1.2" is better.

I will not remove the protocol introduced in the previous patch. :)

On Fri, Feb 24, 2012 at 11:08 PM, Samuel Pitoiset <samuel.pitoiset at gmail.com
> wrote:

> ---
>  modules/misc/audioscrobbler.c |  418
> +----------------------------------------
>  1 files changed, 4 insertions(+), 414 deletions(-)
>
> diff --git a/modules/misc/audioscrobbler.c b/modules/misc/audioscrobbler.c
> index 9acd92d..ba9ed53 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
> @@ -778,7 +777,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;
> @@ -986,211 +985,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.fmplugin.");
> -        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)
> @@ -1382,7 +1176,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;
> @@ -1476,207 +1270,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 successfull :)");
> -                    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
>
>


-- 
Best regards,
Samuel Pitoiset.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/vlc-devel/attachments/20120224/a70f4428/attachment.html>


More information about the vlc-devel mailing list