static void process_results (RBPodcastSearchITunes *search, JsonParser *parser) { JsonObject *container; JsonArray *results; guint i; container = json_node_get_object (json_parser_get_root (parser)); results = json_node_get_array (json_object_get_member (container, "results")); for (i = 0; i < json_array_get_length (results); i++) { JsonObject *feed; RBPodcastChannel *channel; feed = json_array_get_object_element (results, i); /* check wrapperType==track, kind==podcast ? */ channel = g_new0 (RBPodcastChannel, 1); channel->url = g_strdup (json_object_get_string_member (feed, "collectionViewUrl")); channel->title = g_strdup (json_object_get_string_member (feed, "collectionName")); channel->author = g_strdup (json_object_get_string_member (feed, "artistName")); channel->img = g_strdup (json_object_get_string_member (feed, "artworkUrl100")); /* 100? */ channel->is_opml = FALSE; channel->num_posts = json_object_get_int_member (feed, "trackCount"); rb_debug ("got result %s (%s)", channel->title, channel->url); rb_podcast_search_result (RB_PODCAST_SEARCH (search), channel); rb_podcast_parse_channel_free (channel); } }
static gboolean remove_all_feeds_cb (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, RBPodcastAddDialog *dialog) { RBPodcastChannel *channel; gtk_tree_model_get (model, iter, FEED_COLUMN_PARSED_FEED, &channel, -1); rb_podcast_parse_channel_free (channel); return FALSE; }
static void process_results (RBPodcastSearchMiroGuide *search, JsonParser *parser) { JsonArray *results; guint i; results = json_node_get_array (json_parser_get_root (parser)); for (i = 0; i < json_array_get_length (results); i++) { JsonObject *feed; JsonArray *items; RBPodcastChannel *channel; int j; feed = json_array_get_object_element (results, i); channel = g_new0 (RBPodcastChannel, 1); channel->url = g_strdup (json_object_get_string_member (feed, "url")); channel->title = g_strdup (json_object_get_string_member (feed, "name")); channel->author = g_strdup (json_object_get_string_member (feed, "publisher")); /* hrm */ channel->img = g_strdup (json_object_get_string_member (feed, "thumbnail_url")); channel->is_opml = FALSE; rb_debug ("feed %d: url %s, name \"%s\"", i, channel->url, channel->title); items = json_object_get_array_member (feed, "item"); for (j = 0; j < json_array_get_length (items); j++) { JsonObject *episode = json_array_get_object_element (items, j); RBPodcastItem *item; item = g_new0 (RBPodcastItem, 1); item->title = g_strdup (json_object_get_string_member (episode, "name")); item->url = g_strdup (json_object_get_string_member (episode, "url")); item->description = g_strdup (json_object_get_string_member (episode, "description")); item->pub_date = totem_pl_parser_parse_date (json_object_get_string_member (episode, "date"), FALSE); item->filesize = json_object_get_int_member (episode, "size"); rb_debug ("item %d: title \"%s\", url %s", j, item->title, item->url); channel->posts = g_list_prepend (channel->posts, item); } channel->posts = g_list_reverse (channel->posts); rb_debug ("finished parsing items"); rb_podcast_search_result (RB_PODCAST_SEARCH (search), channel); rb_podcast_parse_channel_free (channel); } }
static gboolean parse_finished (ParseThreadData *data) { if (data->reset_count != data->dialog->priv->reset_count) { rb_debug ("dialog reset while parsing"); rb_podcast_parse_channel_free (data->channel); g_object_unref (data->dialog); g_clear_error (&data->error); g_free (data->url); g_free (data); return FALSE; } if (data->error != NULL) { gtk_label_set_label (GTK_LABEL (data->dialog->priv->info_bar_message), _("Unable to load the feed. Check your network connection.")); gtk_widget_show (data->dialog->priv->info_bar); } else { gtk_widget_hide (data->dialog->priv->info_bar); } if (data->channel->is_opml) { GList *l; /* convert each item into its own channel */ for (l = data->channel->posts; l != NULL; l = l->next) { RBPodcastChannel *channel; RBPodcastItem *item; item = l->data; channel = g_new0 (RBPodcastChannel, 1); channel->url = g_strdup (item->url); channel->title = g_strdup (item->title); /* none of the other fields get populated anyway */ insert_search_result (data->dialog, channel, FALSE); } rb_podcast_parse_channel_free (data->channel); } else if (data->existing) { /* find the row for the feed, replace the channel */ GtkTreeIter iter; gboolean found = FALSE; if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (data->dialog->priv->feed_model), &iter)) { do { RBPodcastChannel *channel; gtk_tree_model_get (GTK_TREE_MODEL (data->dialog->priv->feed_model), &iter, FEED_COLUMN_PARSED_FEED, &channel, -1); if (g_strcmp0 (channel->url, data->url) == 0) { gtk_list_store_set (data->dialog->priv->feed_model, &iter, FEED_COLUMN_PARSED_FEED, data->channel, -1); found = TRUE; rb_podcast_parse_channel_free (channel); break; } } while (gtk_tree_model_iter_next (GTK_TREE_MODEL (data->dialog->priv->feed_model), &iter)); } /* if the row is selected, create entries for the channel contents */ if (found == FALSE) { rb_podcast_parse_channel_free (data->channel); } else if (data->dialog->priv->have_selection) { GtkTreePath *a; GtkTreePath *b; a = gtk_tree_model_get_path (GTK_TREE_MODEL (data->dialog->priv->feed_model), &iter); b = gtk_tree_model_get_path (GTK_TREE_MODEL (data->dialog->priv->feed_model), &data->dialog->priv->selected_feed); if (gtk_tree_path_compare (a, b) == 0) { add_posts_for_feed (data->dialog, data->channel); } gtk_tree_path_free (a); gtk_tree_path_free (b); } } else { /* model owns data->channel now */ insert_search_result (data->dialog, data->channel, data->single); } g_object_unref (data->dialog); g_clear_error (&data->error); g_free (data->url); g_free (data); return FALSE; }