static gboolean
soundmenu_lastfm_connect_idle (gpointer data)
{
	SoundmenuLastfm *lastfm = data;

	if (g_str_empty0(lastfm->lastfm_user) ||
	    g_str_empty0(lastfm->lastfm_pass))
		return FALSE;

	lastfm->session_id = LASTFM_init(LASTFM_API_KEY, LASTFM_SECRET);
	if (lastfm->session_id != NULL) {
	    lastfm->status = LASTFM_login (lastfm->session_id,
		                               lastfm->lastfm_user,
		                               lastfm->lastfm_pass);

		if (lastfm->status != LASTFM_STATUS_OK) {
			LASTFM_dinit(lastfm->session_id);
			lastfm->session_id = NULL;
		}
	}

	soundmenu_update_lastfm_menu (lastfm);

	return FALSE;
}
void
lastfm_track_unlove_action (GtkWidget *widget, SoundmenuPlugin *soundmenu)
{
	Mpris2Metadata *metadata = NULL;
	SoundmenuLastfm *lastfm = NULL;
	LastfmData *data = NULL;

	if (mpris2_client_get_playback_status (soundmenu->mpris2) == STOPPED)
		return;

	lastfm = soundmenu->clastfm;

	if (lastfm->status != LASTFM_STATUS_OK) {
		g_critical("No connection Last.fm has been established.");
		return;
	}

	metadata = mpris2_client_get_metadata (soundmenu->mpris2);
	if (g_str_empty0(mpris2_metadata_get_artist(metadata)) ||
	    g_str_empty0(mpris2_metadata_get_title(metadata)))
		return;

	data = soundmenu_lastfm_data_new (soundmenu, metadata, 0);
	set_watch_cursor (GTK_WIDGET(soundmenu->plugin));
	soundmenu_async_launch(do_lastfm_current_song_unlove,
	                       soundmenu_async_set_idle_message,
	                       data);
}
void
soundmenu_update_playback_lastfm (SoundmenuPlugin *soundmenu)
{
	Mpris2Metadata *metadata = NULL;
	LastfmData *data1 = NULL, *data2 = NULL;
	gint length, delay_time;
	time_t started_t;

	SoundmenuLastfm *lastfm = soundmenu->clastfm;

	if (lastfm->scroble_handler_id) {
		g_source_remove (lastfm->scroble_handler_id);
		lastfm->scroble_handler_id = 0;
	}
	if (lastfm->update_handler_id) {
		g_source_remove (lastfm->update_handler_id);
		lastfm->update_handler_id = 0;
	}

	if (mpris2_client_get_playback_status (soundmenu->mpris2) != PLAYING)
		return;

	if (lastfm->status != LASTFM_STATUS_OK)
		return;

	metadata = mpris2_client_get_metadata (soundmenu->mpris2);

	if (g_str_empty0(mpris2_metadata_get_artist(metadata)) ||
	    g_str_empty0(mpris2_metadata_get_album(metadata)))
		return;

	length = mpris2_metadata_get_length (metadata);
	if (length < 30)
		return;

	time (&started_t);

	data1 = soundmenu_lastfm_data_new (soundmenu, metadata, started_t);
	lastfm->update_handler_id =
		g_timeout_add_seconds_full (G_PRIORITY_DEFAULT_IDLE, WAIT_UPDATE,
		                            soundmenu_lastfm_now_playing_handler, data1,
		                            NULL);

	data2 = soundmenu_lastfm_data_new (soundmenu, metadata, started_t);
	delay_time = ((length / 2) > 240) ? 240 : (length / 2);
	lastfm->scroble_handler_id =
		g_timeout_add_seconds_full (G_PRIORITY_DEFAULT_IDLE, delay_time,
		                            soundmenu_lastfm_scrobble_handler, data2,
		                            NULL);
}
Ejemplo n.º 4
0
static void
gb_source_view_update_search (GbSourceView *view)
{
   GbSourceViewPrivate *priv;
   GRegexCompileFlags flags = 0;
   GtkTextBuffer *buffer;
   GtkTextIter begin;
   GtkTextIter end;
   GMatchInfo *match_info = NULL;
   GtkTextTag *search_tag;
   gboolean has_matches = FALSE;
   GRegex *regex = NULL;
   gchar *text;
   gchar *escaped;

   g_assert(GB_IS_SOURCE_VIEW(view));

   priv = view->priv;

   buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(view));
   gtk_text_buffer_get_bounds(buffer, &begin, &end);

   search_tag = gb_source_view_ref_search_tag(view);
   gtk_text_buffer_remove_tag(buffer, search_tag, &begin, &end);

   if (g_str_empty0(priv->search_text) && !priv->search_regex) {
      goto cleanup;
   }

   if (priv->search_text) {
      if (!priv->search_case_sensitive) {
         flags = G_REGEX_CASELESS;
      }
      escaped = g_regex_escape_string(priv->search_text, -1);
      regex = g_regex_new(escaped, flags, 0, NULL);
      g_free(escaped);
   } else if (priv->search_regex) {
      regex = g_regex_ref(priv->search_regex);
   }

   if (regex) {
      text = gtk_text_buffer_get_text(buffer, &begin, &end, TRUE);
      if (g_regex_match(regex, text, 0, &match_info)) {
         guint count;
         guint i;
         gint begin_pos;
         gint end_pos;

         do {
            count = g_match_info_get_match_count(match_info);
            for (i = 0; i < count; i++) {
               if (g_match_info_fetch_pos(match_info, i, &begin_pos, &end_pos)) {
                  gtk_text_buffer_get_iter_at_offset(buffer, &begin, begin_pos);
                  gtk_text_buffer_get_iter_at_offset(buffer, &end, end_pos);
                  gtk_text_buffer_apply_tag(buffer, search_tag, &begin, &end);
                  has_matches = TRUE;
               }
            }
         } while (g_match_info_next(match_info, NULL));
      }
      g_match_info_free(match_info);
      g_regex_unref(regex);
      g_free(text);
   }

cleanup:
   if (priv->has_matches != has_matches) {
      priv->has_matches = has_matches;
      g_object_notify_by_pspec(G_OBJECT(view), gParamSpecs[PROP_HAS_MATCHES]);
   }

   gtk_widget_queue_draw(GTK_WIDGET(view));
   g_object_unref(search_tag);
}