static void ws_love_cb(SoupSession *session, SoupMessage *message, void *user_data) { sr_session_t *s = user_data; struct sr_session_priv *priv = s->priv; sr_track_t *t; if (!SOUP_STATUS_IS_SUCCESSFUL(message->status_code)) { priv->api_problems = true; return; } g_mutex_lock(priv->love_queue_mutex); t = g_queue_pop_head(priv->love_queue); g_mutex_unlock(priv->love_queue_mutex); sr_track_free(t); priv->api_problems = false; if (!g_queue_is_empty(priv->love_queue)) /* still need to submit more */ ws_love(s); }
static inline void check_last(sr_session_t *s, int timestamp) { struct sr_session_priv *priv = s->priv; sr_track_t *c; int playtime; c = priv->last_track; if (!c) return; if (c->rating == 'L' && priv->session_key) { g_mutex_lock(priv->love_queue_mutex); g_queue_push_tail(priv->love_queue, sr_track_dup(c)); g_mutex_unlock(priv->love_queue_mutex); if (!priv->api_problems) ws_love(s); } playtime = timestamp - c->timestamp; /* did the last track played long enough? */ if ((playtime >= 240 || playtime >= c->length / 2) && c->length > 30) g_queue_push_tail(priv->queue, c); else sr_track_free(c); priv->last_track = NULL; }
void sr_session_love(sr_session_t *s, const char *artist, const char *title, int on) { struct sr_session_priv *priv = s->priv; sr_track_t *t; t = sr_track_new(); t->artist = g_strdup(artist); t->title = g_strdup(title); g_mutex_lock(priv->love_queue_mutex); g_queue_push_tail(priv->love_queue, t); g_mutex_unlock(priv->love_queue_mutex); if (!priv->api_problems) ws_love(s, on); }
void sr_session_handshake(sr_session_t *s) { struct sr_session_priv *priv = s->priv; gchar *auth, *tmp; glong timestamp; gchar *handshake_url; SoupMessage *message; GTimeVal time_val; g_get_current_time(&time_val); timestamp = time_val.tv_sec; tmp = g_strdup_printf("%s%li", priv->hash_pwd, timestamp); auth = g_compute_checksum_for_string(G_CHECKSUM_MD5, tmp, -1); g_free(tmp); handshake_url = g_strdup_printf("%s&p=1.2.1&c=%s&v=%s&u=%s&t=%li&a=%s", priv->url, priv->client_id, priv->client_ver, priv->user, timestamp, auth); message = soup_message_new("GET", handshake_url); soup_session_queue_message(priv->soup, message, handshake_cb, s); g_free(handshake_url); g_free(auth); if (priv->api_key) { if (!priv->session_key) ws_auth(s); else ws_love(s); } }