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(); } }
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(); } }
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(); } }
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(); } }