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 | 149 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 80 insertions(+), 69 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,109 +75,120 @@ print ""; } - function startElement($parser, $name, $attrs) { + if ($op == "Import") { - if ($name == "OUTLINE") { - if ($name == "OUTLINE") { + print " + + + +

Importing OPML...

+
"; - $title = $attrs["TEXT"]; - $url = $attrs["XMLURL"]; + if (WEB_DEMO_MODE) { + print "OPML import is disabled in demo-mode."; + print "

+ Return to preferences

"; - if (!$title) { - $title = $attrs['TITLE']; - } - } + return; + } - /* this is suboptimal */ + if (is_file($_FILES['opml_file']['tmp_name'])) { + $dom = domxml_open_file($_FILES['opml_file']['tmp_name']); - $link = db_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME); + if ($dom) { + $root = $dom->document_element(); - if (!$link) return; + $body = $root->get_elements_by_tagname('body'); - $title = db_escape_string_2($title, $link); - $url = db_escape_string_2($url, $link); + if ($body[0]) { + $body = $body[0]; - if (!$title || !$url) return; + $outlines = $body->get_elements_by_tagname('outline'); - print "Feed $title ($url)... "; + $active_category = ''; - $result = db_query($link, "SELECT id FROM ttrss_feeds WHERE - (title = '$title' OR feed_url = '$url') AND owner_uid = ".$_SESSION["uid"]); + foreach ($outlines as $outline) { + $feed_title = $outline->get_attribute('text'); + $cat_title = $outline->get_attribute('title'); + $feed_url = $outline->get_attribute('xmlUrl'); - if ($result && db_num_rows($result) > 0) { - - print " Already imported.
"; + if ($cat_title) { + $active_category = $cat_title; - } else { - - $result = db_query($link, "INSERT INTO ttrss_feeds (title, feed_url,owner_uid) VALUES - ('$title', '$url', '".$_SESSION["uid"]."')"); + 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"); - print "Done.
"; + if (db_num_rows($result) == 0) { - } + print "Adding category $cat_title...
"; - if ($link) db_close($link); + db_query($link, "INSERT INTO ttrss_feed_categories + (title,owner_uid) VALUES ('$cat_title', '$owner_uid')"); + } - } - } + db_query($link, "COMMIT"); + } - function endElement($parser, $name) { +// print "$active_category : $feed_title : $xmlurl
"; + if (!$feed_title || !$feed_url) continue; - } + db_query($link, "BEGIN"); - if ($op == "Import") { + $cat_id = null; - print " - - - -

Importing OPML...

-
"; + if ($active_category) { - if (WEB_DEMO_MODE) { - print "OPML import is disabled in demo-mode."; - print "

- Return to preferences

"; + $result = db_query($link, "SELECT id FROM + ttrss_feed_categories WHERE title = '$active_category' AND + owner_uid = '$owner_uid' LIMIT 1"); - return; - } + if (db_num_rows($result) == 1) { + $cat_id = db_fetch_result($result, 0, "id"); + } + } - if (is_file($_FILES['opml_file']['tmp_name'])) { - - $xml_parser = xml_parser_create(); + $result = db_query($link, "SELECT id FROM ttrss_feeds WHERE + (title = '$feed_title' OR feed_url = '$feed_url') + AND owner_uid = '$owner_uid'"); - xml_set_element_handler($xml_parser, "startElement", "endElement"); + print "Feed $feed_title ($feed_url)... "; - $fp = fopen($_FILES['opml_file']['tmp_name'], "r"); + if (db_num_rows($result) > 0) { + print " Already imported.
"; + } else { - if ($fp) { + 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')"; - while ($data = fread($fp, 4096)) { + } else { + $add_query = "INSERT INTO ttrss_feeds + (title, feed_url, owner_uid) VALUES + ('$feed_title', '$feed_url', '$owner_uid')"; - if (!xml_parse($xml_parser, $data, feof($fp))) { + } + + 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"); } - } - - xml_parser_free($xml_parser); - fclose($fp); + } else { + print "Error: can't find body element."; + } } else { - print("Error: Could not open OPML input."); + print "Error while parsing document."; } - } else { + } else { print "Error: please upload OPML file."; }