Пример #1
0
void scrobsub_start(const char* _artist, const char* _track, unsigned int _duration, const char* _album, unsigned int _track_number, const char* _mbid)
{
    if(_duration>9999) _duration = 9999;
    if(_track_number>99) _track_number = 99;
    
    if(relay){
        scrobsub_relay_start(_artist, _track, _duration);
        state = SCROBSUB_PLAYING;
        return;
    }

    if (!session_id && !handshake())
        return;
    if (state != SCROBSUB_STOPPED)
        submit();
    
    state = SCROBSUB_PLAYING;
    
    free(mbid);
    mbid = strdup(_mbid);
    duration = _duration;
    track_number = _track_number;
    rating = ' ';
    scrobsub_change_metadata(_artist, _track, _album);
    start_time = now();
    pause_time = 0;

    //TODO don't submit track number if 0

    #define POST_DATA_LENGTH 32+4+2+N+2+6*3
#if SCROBSUB_NO_C99
    char* post_data = (char*)alloca(POST_DATA_LENGTH); //alloca discouraged on BSD
#else
    char post_data[POST_DATA_LENGTH];
#endif    
    for(int x = 0; x < 2; ++x){
        snprintf(post_data, sizeof(post_data),
                               "s=%s"
                              "&a=%s"
                              "&t=%s"
                              "&b=%s"
                              "&l=%d"
                              "&n=%d"
                              "&m=%s",
                              session_id,
                              artist,
                              track,
                              album,
                              duration,
                              track_number,
                              mbid);
        char response[256];
        scrobsub_post(response, np_url, post_data);
        if(ok(response))
            break;
        handshake();
    }
}
Пример #2
0
static void submit()
{    
    //TODO check track is valid to submit
    
    if(state == SCROBSUB_PAUSED)
        scrobsub_resume(); //sets pause time correctly
    //FIXME the second resolution issue can introduce rounding errors
    if(now()-(start_time+pause_time) < scrobble_time(duration))
        return;
    
    int n = 32+N+4+2+10+1+1 +2+9*6;
#if SCROBSUB_NO_C99
    char* post_data = (char*)alloca(n); //alloca discouraged on BSD
#else
    char post_data[n];
#endif
    
    n = snprintf(post_data, n,
                     "s=%s"
                 "&a[0]=%s"
                 "&t[0]=%s"
                 "&b[0]=%s"
                 "&l[0]=%d"
                 "&n[0]=%d"
                 "&m[0]=%s"
                 "&i[0]=%d"
                 "&o[0]=%c"
                 "&r[0]=%c",
                 session_id, artist, track, album, duration, track_number, mbid, start_time, 'P', rating);
    
    for (int x=0; x<2; ++x){    
        char response[128];
        scrobsub_post(response, submit_url, post_data);
        
        if(ok(response)) break;
        printf("E: %s: %s%s", __FUNCTION__, response, post_data);
        if(strcmp(response, "BADSESSION\n") != 0) break;
        handshake();
    }
}
Пример #3
0
void scrobsub_start(const char* _artist, const char* _track, const char* _album, unsigned int _duration, unsigned int _track_number, const char* _mbid)
{
    if (!session_id)
        handshake();
    if (state != SCROBSUB_STOPPED)
        submit();
    
    state = SCROBSUB_PLAYING;
    
    artist = strdup(_artist);
    track = strdup(_track);
    album = strdup(_album);
    mbid = strdup(_mbid);
    duration = _duration;
    track_number = _track_number;

#if !SCROBSUB_NO_RELAY
    if(use_the_moose()){
        moose_push(artist, track, album, mbid, duration, track_number);
        return;
    }
#endif

    start_time = now();

    if(!enabled)return;
    
    //TODO, don't emit np if user is skipping fast, then you need a timer
    //    static time_t previous_np = 0;
    //    time_t time = now();
    //    if(time - previous_np < 4)
    
    if(duration>9999) duration = 9999;
    if(track_number>99) track_number = 99;
    
    N = strlen(artist)+strlen(track)+strlen(album)+strlen(mbid);
    int n = 32+4+2+N +2+6*3;
    char post_data[n];
    snprintf(post_data, n, "s=%s"
                          "&a=%s"
                          "&t=%s"
                          "&b=%s"
                          "&l=%d"
                          "&n=%d"
                          "&m=%s",
                          session_id,
                          artist,
                          track,
                          album,
                          duration,
                          track_number,
                          mbid);
    
    for(int x = 0; x < 2; ++x){
        char response[256];
        scrobsub_post(response, np_url, post_data);
        if(ok(response))
            break;
        handshake();
    }
}
Пример #4
0
void scrobsub_start(const char* _artist, const char* _track, unsigned int _duration, const char* _album, unsigned int _track_number, const char* _mbid)
{
    if(_duration>9999) _duration = 9999;
    if(_track_number>99) _track_number = 99;
    
    if(relay){
        scrobsub_relay_start(_artist, _track, _duration);
        state = SCROBSUB_PLAYING;
        return;
    }
 
    if (!scrobsub_session_key)
        return; //TODO
    if (!session_id)
        handshake();
    if (state != SCROBSUB_STOPPED)
        submit();
    
    state = SCROBSUB_PLAYING;
    
    free(mbid);
    mbid = strdup(_mbid);
    duration = _duration;
    track_number = _track_number;
    rating = ' ';
    scrobsub_change_metadata(_artist, _track, _album);
    start_time = now();    
    
    //TODO, don't emit np if user is skipping fast, then you need a timer
    //    static time_t previous_np = 0;
    //    time_t time = now();
    //    if(time - previous_np < 4)
    //NOTE I pushed this into our GUIs, maybe that is all that matters
    
    //TODO don't submit track number if 0

    #define POST_DATA_LENGTH 32+4+2+N+2+6*3
#if SCROBSUB_NO_C99
    char* post_data = (char*)alloca(POST_DATA_LENGTH); //alloca discouraged on BSD
#else
    char post_data[POST_DATA_LENGTH];
#endif    
    snprintf(post_data, sizeof(post_data),
                           "s=%s"
                          "&a=%s"
                          "&t=%s"
                          "&b=%s"
                          "&l=%d"
                          "&n=%d"
                          "&m=%s",
                          session_id,
                          artist,
                          track,
                          album,
                          duration,
                          track_number,
                          mbid);
    
    for(int x = 0; x < 2; ++x){
        char response[256];
        scrobsub_post(response, np_url, post_data);
        if(ok(response))
            break;
        handshake();
    }
}