class AMCImporter : Object { public bool parse_file (string filename) { Xml.Doc* doc; bool parsed = false; doc = Xml.Parser.parse_file (filename); if (doc != null) parsed = parse_xml (doc); delete doc; return parsed; } public bool parse_xml (Xml.Doc *doc) { Xml.Node* root; root = doc->get_root_element (); if (root == null) return false; if (root->name != "AntMovieCatalog") return false; for (Xml.Node* catalog = root->children; catalog != null; catalog = catalog->next) { if (catalog->name == "text") continue; if (catalog->name != "Catalog") { warning ("Unknown node '%s'\n", catalog->name); continue; } parse_catalog (catalog); } return true; } private void parse_catalog (Xml.Node* catalog) { for (Xml.Node* node = catalog->children; node != null; node = node->next) { if (node->name == "text") continue; if (node->name == "Properties") continue; if (node->name != "Contents") { warning ("Unknown node '%s'\n", node->name); continue; } for (Xml.Node* movie = node->children; movie != null; movie = movie->next) { if (movie->name == "text") continue; if (movie->name != "Movie") { warning ("Unknown node '%s'\n", movie->name); continue; } parse_movie (movie); } } } private void parse_movie (Xml.Node *movie) { var m = new Movie (); // Actors // AudioFormat print ("GENRES: %s\n", movie->get_prop ("Category")); parse_genres (movie->get_prop ("Category"), out m.genres); // Checked // Comments // Country // Description // Director // Disks // FormattedTitle // Languages // m.runtime = movie->get_prop ("Length") * 60; // Number m.title = movie->get_prop ("OriginalTitle"); // Picture m.rating = movie->get_prop ("Rating").to_int () * 10; // Subtitles // TranslatedTitle // VideoFormat m.year = movie->get_prop ("Year").to_int (); movie_available (m); } private void parse_genres (string genres_string, out Genres genres) { string[] genre = genres_string.replace (",", " ").replace("|", " ").split (" "); for (int i = 0; i < genre.length; i++) genres.field |= Genres.genre_bit (genre[i]); } public signal void movie_available (Movie movie); } class AMCExporter : Object { public bool write_file (string filename, List movies) { Xml.TextWriter writer; writer = new Xml.TextWriter.filename (filename); if (writer == null) return false; writer.start_document ("1.0", "iso-8859-1"); writer.write_comment ("Cinaest Export in Ant Movie Catalog database format"); writer.start_element ("AntMovieCatalog"); writer.write_attribute ("Date", "now"); writer.write_attribute ("Format", "35"); writer.write_attribute ("Version", "3.5.1 (2007-09-22)"); writer.start_element ("Catalog"); writer.write_element ("Properties", ""); writer.start_element ("Contents"); foreach (unowned Movie movie in movies) { writer.start_element ("Movie"); writer.write_attribute ("Actors", ""); writer.write_attribute ("AudioFormat", ""); writer.write_attribute ("Category", movie.genres.to_string ()); writer.write_attribute ("Checked", ""); writer.write_attribute ("Comments", ""); writer.write_attribute ("Country", ""); writer.write_attribute ("Description", ""); writer.write_attribute ("Director", ""); writer.write_attribute ("Disks", ""); writer.write_attribute ("FormattedTitle", ""); writer.write_attribute ("Languages", ""); writer.write_attribute ("Length", ""); // (m.runtime + 30) / 60; writer.write_attribute ("Number", ""); writer.write_attribute ("OriginalTitle", movie.title); writer.write_attribute ("Picture", ""); writer.write_attribute ("Rating", (movie.rating / 10).to_string ()); writer.write_attribute ("Subtitles", ""); writer.write_attribute ("TranslatedTitle", ""); writer.write_attribute ("VideoFormat", ""); writer.write_attribute ("Year", (movie.year > 0) ? movie.year.to_string () : ""); writer.end_element (); } writer.end_element (); writer.end_element (); writer.end_element (); writer.flush (); return true; } }