From e98a3f6525a570913d1f957c12773cd1f1047aca Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Fri, 25 Nov 2005 14:27:56 +0100 Subject: [PATCH] OPML import support for categories (rewritten using domxml) --- opml.php | 161 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 86 insertions(+), 75 deletions(-) diff --git a/opml.php b/opml.php index 89634025c..9f76797b6 100644 --- a/opml.php +++ b/opml.php @@ -15,7 +15,7 @@ require_once "db.php"; require_once "db-prefs.php"; -// $_SESSION["uid"] = PLACEHOLDER_UID; // FIXME: placeholder + $owner_uid = $_SESSION["uid"]; $link = db_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME); @@ -75,58 +75,6 @@ print ""; } - function startElement($parser, $name, $attrs) { - - if ($name == "OUTLINE") { - if ($name == "OUTLINE") { - - $title = $attrs["TEXT"]; - $url = $attrs["XMLURL"]; - - if (!$title) { - $title = $attrs['TITLE']; - } - } - - /* this is suboptimal */ - - $link = db_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME); - - if (!$link) return; - - $title = db_escape_string_2($title, $link); - $url = db_escape_string_2($url, $link); - - if (!$title || !$url) return; - - print "Feed $title ($url)... "; - - $result = db_query($link, "SELECT id FROM ttrss_feeds WHERE - (title = '$title' OR feed_url = '$url') AND owner_uid = ".$_SESSION["uid"]); - - if ($result && db_num_rows($result) > 0) { - - print " Already imported.
"; - - } else { - - $result = db_query($link, "INSERT INTO ttrss_feeds (title, feed_url,owner_uid) VALUES - ('$title', '$url', '".$_SESSION["uid"]."')"); - - print "Done.
"; - - } - - if ($link) db_close($link); - - } - } - - function endElement($parser, $name) { - - - } - if ($op == "Import") { print " @@ -145,39 +93,102 @@ } if (is_file($_FILES['opml_file']['tmp_name'])) { - - $xml_parser = xml_parser_create(); + $dom = domxml_open_file($_FILES['opml_file']['tmp_name']); - xml_set_element_handler($xml_parser, "startElement", "endElement"); + if ($dom) { + $root = $dom->document_element(); - $fp = fopen($_FILES['opml_file']['tmp_name'], "r"); + $body = $root->get_elements_by_tagname('body'); - if ($fp) { + if ($body[0]) { + $body = $body[0]; - while ($data = fread($fp, 4096)) { + $outlines = $body->get_elements_by_tagname('outline'); - if (!xml_parse($xml_parser, $data, feof($fp))) { + $active_category = ''; + + foreach ($outlines as $outline) { + $feed_title = $outline->get_attribute('text'); + $cat_title = $outline->get_attribute('title'); + $feed_url = $outline->get_attribute('xmlUrl'); + + if ($cat_title) { + $active_category = $cat_title; + + db_query($link, "BEGIN"); + + $result = db_query($link, "SELECT id FROM + ttrss_feed_categories WHERE title = '$cat_title' AND + owner_uid = '$owner_uid' LIMIT 1"); + + if (db_num_rows($result) == 0) { + + print "Adding category $cat_title...
"; + + db_query($link, "INSERT INTO ttrss_feed_categories + (title,owner_uid) VALUES ('$cat_title', '$owner_uid')"); + } + + db_query($link, "COMMIT"); + } + +// print "$active_category : $feed_title : $xmlurl
"; + + if (!$feed_title || !$feed_url) continue; + + db_query($link, "BEGIN"); + + $cat_id = null; + + if ($active_category) { + + $result = db_query($link, "SELECT id FROM + ttrss_feed_categories WHERE title = '$active_category' AND + owner_uid = '$owner_uid' LIMIT 1"); + + if (db_num_rows($result) == 1) { + $cat_id = db_fetch_result($result, 0, "id"); + } + } + + $result = db_query($link, "SELECT id FROM ttrss_feeds WHERE + (title = '$feed_title' OR feed_url = '$feed_url') + AND owner_uid = '$owner_uid'"); + + print "Feed $feed_title ($feed_url)... "; + + if (db_num_rows($result) > 0) { + print " Already imported.
"; + } else { + + if ($cat_id) { + $add_query = "INSERT INTO ttrss_feeds + (title, feed_url, owner_uid, cat_id) VALUES + ('$feed_title', '$feed_url', '$owner_uid', '$cat_id')"; + + } else { + $add_query = "INSERT INTO ttrss_feeds + (title, feed_url, owner_uid) VALUES + ('$feed_title', '$feed_url', '$owner_uid')"; + + } + + db_query($link, $add_query); + + print "Done.
"; + } - print sprintf("Unable to parse OPML file, XML error: %s at line %d", - xml_error_string(xml_get_error_code($xml_parser)), - xml_get_current_line_number($xml_parser)); - - print "

- Return to preferences"; - - return; - + db_query($link, "COMMIT"); } + + } else { + print "Error: can't find body element."; } - - xml_parser_free($xml_parser); - fclose($fp); - } else { - print("Error: Could not open OPML input."); + print "Error while parsing document."; } - } else { + } else { print "Error: please upload OPML file."; }