TotemPlParserResult totem_pl_parser_add_rss (TotemPlParser *parser, GFile *file, GFile *base_file, TotemPlParseData *parse_data, gpointer data) { xml_node_t* doc, *channel; char *contents; gsize size; if (g_file_load_contents (file, NULL, &contents, &size, NULL, NULL) == FALSE) return TOTEM_PL_PARSER_RESULT_ERROR; doc = totem_pl_parser_parse_xml_relaxed (contents, size); if (doc == NULL) { g_free (contents); return TOTEM_PL_PARSER_RESULT_ERROR; } /* If the document has no name */ if (doc->name == NULL || (g_ascii_strcasecmp (doc->name , "rss") != 0 && g_ascii_strcasecmp (doc->name , "rss\n") != 0)) { g_free (contents); xml_parser_free_tree (doc); return TOTEM_PL_PARSER_RESULT_ERROR; } for (channel = doc->child; channel != NULL; channel = channel->next) { if (g_ascii_strcasecmp (channel->name, "channel") == 0) { char *uri; uri = g_file_get_uri (file); parse_rss_items (parser, uri, channel); g_free (uri); /* One channel per file */ break; } } g_free (contents); xml_parser_free_tree (doc); return TOTEM_PL_PARSER_RESULT_SUCCESS; }
TotemPlParserResult totem_pl_parser_add_opml (TotemPlParser *parser, GFile *file, GFile *base_file, TotemPlParseData *parse_data, gpointer data) { xml_node_t* doc; char *contents, *uri; gsize size; if (g_file_load_contents (file, NULL, &contents, &size, NULL, NULL) == FALSE) return TOTEM_PL_PARSER_RESULT_ERROR; doc = totem_pl_parser_parse_xml_relaxed (contents, size); if (doc == NULL) { g_free (contents); return TOTEM_PL_PARSER_RESULT_ERROR; } /* If the document has no name */ if (doc->name == NULL || g_ascii_strcasecmp (doc->name , "opml") != 0) { g_free (contents); xml_parser_free_tree (doc); return TOTEM_PL_PARSER_RESULT_ERROR; } uri = g_file_get_uri (file); parse_opml_head_body (parser, uri, doc); g_free (uri); g_free (contents); xml_parser_free_tree (doc); return TOTEM_PL_PARSER_RESULT_SUCCESS; }
static TotemPlParserResult totem_pl_parser_add_quicktime_metalink (TotemPlParser *parser, GFile *file, GFile *base_file, TotemPlParseData *parse_data, gpointer data) { xml_node_t *doc, *node; gsize size; char *contents; const char *item_uri, *autoplay; gboolean found; if (g_str_has_prefix (data, "RTSPtext") != FALSE || g_str_has_prefix (data, "rtsptext") != FALSE) { return totem_pl_parser_add_quicktime_rtsptext (parser, file, base_file, parse_data, data); } if (g_str_has_prefix (data, "SMILtext") != FALSE) { char *contents; gsize size; TotemPlParserResult retval; if (g_file_load_contents (file, NULL, &contents, &size, NULL, NULL) == FALSE) return TOTEM_PL_PARSER_RESULT_ERROR; retval = totem_pl_parser_add_smil_with_data (parser, file, base_file, contents + strlen ("SMILtext"), size - strlen ("SMILtext")); g_free (contents); return retval; } if (g_file_load_contents (file, NULL, &contents, &size, NULL, NULL) == FALSE) return TOTEM_PL_PARSER_RESULT_ERROR; doc = totem_pl_parser_parse_xml_relaxed (contents, size); if (doc == NULL) { g_free (contents); return TOTEM_PL_PARSER_RESULT_ERROR; } g_free (contents); /* Check for quicktime type */ for (node = doc, found = FALSE; node != NULL; node = node->next) { const char *type; if (node->name == NULL) continue; if (g_ascii_strcasecmp (node->name , "?quicktime") != 0) continue; type = xml_parser_get_property (node, "type"); if (g_ascii_strcasecmp ("application/x-quicktime-media-link", type) != 0) continue; found = TRUE; } if (found == FALSE) { xml_parser_free_tree (doc); return TOTEM_PL_PARSER_RESULT_ERROR; } if (!doc || !doc->name || g_ascii_strcasecmp (doc->name, "embed") != 0) { xml_parser_free_tree (doc); return TOTEM_PL_PARSER_RESULT_ERROR; } item_uri = xml_parser_get_property (doc, "src"); if (!item_uri) { xml_parser_free_tree (doc); return TOTEM_PL_PARSER_RESULT_ERROR; } autoplay = xml_parser_get_property (doc, "autoplay"); /* Add a default as per the QuickTime docs */ if (autoplay == NULL) autoplay = "true"; totem_pl_parser_add_uri (parser, TOTEM_PL_PARSER_FIELD_URI, item_uri, TOTEM_PL_PARSER_FIELD_AUTOPLAY, autoplay, NULL); xml_parser_free_tree (doc); return TOTEM_PL_PARSER_RESULT_SUCCESS; }