From f824f3b3c122cd6fbf11ed09ca95f27a5892f542 Mon Sep 17 00:00:00 2001 From: JP Date: Tue, 13 Mar 2012 10:39:39 +0100 Subject: [PATCH] Properly implement --configure some refactoring cleanup html from programme description --- .../src/org/vanbest/xmltv/Channel.java | 2 + .../src/org/vanbest/xmltv/Config.java | 77 ++++++++++++++----- .../src/org/vanbest/xmltv/Main.java | 56 +++++++++++++- .../org/vanbest/xmltv/ProgrammeDetails.java | 11 ++- .../src/org/vanbest/xmltv/TvGids.java | 30 ++++---- 5 files changed, 134 insertions(+), 42 deletions(-) diff --git a/tv_grab_nl_java/src/org/vanbest/xmltv/Channel.java b/tv_grab_nl_java/src/org/vanbest/xmltv/Channel.java index 9f06133..5182d10 100644 --- a/tv_grab_nl_java/src/org/vanbest/xmltv/Channel.java +++ b/tv_grab_nl_java/src/org/vanbest/xmltv/Channel.java @@ -5,6 +5,8 @@ public class Channel { String name; String shortName; String iconUrl; + boolean selected; + public Channel(int id, String name, String shortName) { this.id = id; this.name = name; diff --git a/tv_grab_nl_java/src/org/vanbest/xmltv/Config.java b/tv_grab_nl_java/src/org/vanbest/xmltv/Config.java index 9ad9e60..666acac 100644 --- a/tv_grab_nl_java/src/org/vanbest/xmltv/Config.java +++ b/tv_grab_nl_java/src/org/vanbest/xmltv/Config.java @@ -25,7 +25,10 @@ public class Config { FileUtils.forceMkdir(configFile.getParentFile()); PrintWriter out = new PrintWriter(new OutputStreamWriter( new FileOutputStream( configFile ))); for(Channel c: channels) { - out.print(c.id + ": " + escape(c.name)); + if (!c.selected) { + out.print("#"); + } + out.print("channel: " + c.id + ": " + escape(c.name)); if (c.iconUrl != null) { out.print(" : " + escape(c.iconUrl)); } @@ -36,16 +39,19 @@ public class Config { public static String unescape(String s) { String result = s.trim(); - result = result.substring(1, result.length()-1); - result = result.replaceAll("\\\"", "\""); + if (result.charAt(0)=='"') { + result = result.substring(1, result.length()-1); + result = result.replaceAll("\\:",":").replaceAll("\\\"", "\""); + } return result; } public static String escape(String s) { - return "\"" + s.replaceAll("\"", "\\\"") + "\""; + return "\"" + s.replaceAll("\"", "\\\"").replaceAll(":", "\\:") + "\""; } - - public static String[] splitLine(String s) { + + + public static String[] old_splitLine(String s) { int colon = 0; while (true) { colon = s.indexOf(':', colon+1); @@ -76,24 +82,54 @@ public class Config { String[] parts = {id,name,icon}; return parts; } + public static List splitLine(String s) { + int colon = 0; + int prev = 0; + List parts = new ArrayList(5); + while (true) { + // Find first unescaped colon + while (true) { + colon = s.indexOf(':', prev); + if (colon<0 || s.charAt(colon-1) != '\\') { + break; + } + } + if (colon<0) { + // Last part + parts.add(unescape(s.substring(prev))); + break; + } else { + parts.add(unescape(s.substring(prev,colon))); + prev = colon+1; + } + } + return parts; + } - public static Config readConfig(File file) throws IOException { + public static Config readConfig(File file) { Config result = new Config(); - BufferedReader reader = new BufferedReader( new InputStreamReader( new FileInputStream( file))); - List channels = new ArrayList(); - while(true) { - String s = reader.readLine(); - if(s==null) break; - if (!s.contains(":")) continue; - if (s.startsWith("#")) continue; - String[] parts = splitLine(s); - Channel c = new Channel(Integer.parseInt(parts[0]), parts[1], ""); - if (parts.length>2) { - c.setIconUrl(parts[2]); + try { + BufferedReader reader = new BufferedReader( new InputStreamReader( new FileInputStream( file))); + List channels = new ArrayList(); + while(true) { + String s = reader.readLine(); + if(s==null) break; + if (!s.contains(":")) continue; + if (s.startsWith("#")) continue; + List parts = splitLine(s); + if (parts.get(0).toLowerCase().equals("channel")) { + Channel c = new Channel(Integer.parseInt(parts.get(1)), parts.get(2), ""); + if (parts.size()>3) { + c.setIconUrl(parts.get(3)); + } + channels.add(c); + } } - channels.add(c); + result.setChannels(channels); + } catch (IOException e) { + e.printStackTrace(); + System.out.println("Cannot read configuration file, continuing with empty configuration"); } - result.setChannels(channels); return result; } @@ -102,3 +138,4 @@ public class Config { } } + diff --git a/tv_grab_nl_java/src/org/vanbest/xmltv/Main.java b/tv_grab_nl_java/src/org/vanbest/xmltv/Main.java index 7b042cd..0d0a6d6 100644 --- a/tv_grab_nl_java/src/org/vanbest/xmltv/Main.java +++ b/tv_grab_nl_java/src/org/vanbest/xmltv/Main.java @@ -1,9 +1,11 @@ package org.vanbest.xmltv; +import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; +import java.io.InputStreamReader; import java.io.PrintStream; import java.io.PrintWriter; import java.util.ArrayList; @@ -42,6 +44,12 @@ public class Main { public void run() throws FactoryConfigurationError, Exception { Config config = Config.readConfig(configFile); + if (!quiet) { + System.out.println("Fetching programme data for days " + this.offset + "-" + (this.offset+this.days-1)); + System.out.println("... from " + config.channels.size() + " channels"); + System.out.println("... using cache file " + cacheFile.getCanonicalPath()); + } + XmlTvWriter writer = new XmlTvWriter(outputWriter); writer.writeChannels(config.channels); @@ -70,13 +78,50 @@ public class Main { } writer.close(); + if (!quiet) { + System.out.println("Number of fetch errors: " + gids.fetchErrors); + } } - public void configure() { + public void configure() throws IOException { TvGids gids = new TvGids(cacheFile); List channels = gids.getChannels(); - //System.out.println(channels); + + BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); + boolean all = false; + boolean none = false; + for (Channel c: channels) { + System.out.print("add channel " + c.id + " (" + c.name + ") [[y]es,[n]o,[a]ll,[none] (default=yes)] "); + if (all) { + c.selected = true; + System.out.println("Y"); + continue; + } + if (none) { + c.selected = false; + System.out.println("N"); + continue; + } + while(true) { + String s = reader.readLine().toLowerCase(); + if ( s.isEmpty() || s.startsWith("y")) { + c.selected = true; + break; + } else if ( s.startsWith("a")) { + c.selected = true; + all = true; + break; + } else if ( s.startsWith("none")) { + c.selected = false; + none = true; + break; + } else if ( s.startsWith("n")) { + c.selected = false; + break; + } + } + } Config config = new Config(); config.setChannels(channels); @@ -144,7 +189,12 @@ public class Main { System.exit(0); } if (line.hasOption("n")) { - configure(); + try { + configure(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } System.exit(0); } diff --git a/tv_grab_nl_java/src/org/vanbest/xmltv/ProgrammeDetails.java b/tv_grab_nl_java/src/org/vanbest/xmltv/ProgrammeDetails.java index 6cf663d..2638c5c 100644 --- a/tv_grab_nl_java/src/org/vanbest/xmltv/ProgrammeDetails.java +++ b/tv_grab_nl_java/src/org/vanbest/xmltv/ProgrammeDetails.java @@ -21,15 +21,22 @@ public class ProgrammeDetails implements Serializable { this.genre = org.apache.commons.lang.StringEscapeUtils.unescapeHtml(genre); this.synop = org.apache.commons.lang.StringEscapeUtils.unescapeHtml(synop); if ((synop == null || synop.isEmpty()) && ( genre == null || (!genre.toLowerCase().equals("movies") && !genre.toLowerCase().equals("film")))) { - //System.out.println("Splitting title: \"" + p.titel + "\""); String[] parts = p.titel.split("[[:space:]]*:[[:space:]]*", 2); if (parts.length >= 2 ) { titel = parts[0].trim(); p.titel = titel; synop = parts[1].trim(); - //System.out.println("Splitting title to : \"" + p.titel + "\"; synop: \"" + synop + "\""); + System.out.println("Splitting title to : \"" + p.titel + "\"; synop: \"" + synop + "\""); } } + this.synop = this.synop.replaceAll("
", " "); + this.synop = this.synop.replaceAll("
", " "); + this.synop = this.synop.replaceAll("

", " "); + this.synop = this.synop.replaceAll("

", " "); + this.synop = this.synop.replaceAll("", " "); + this.synop = this.synop.replaceAll("", " "); + this.synop = this.synop.replaceAll("", " "); + this.synop = this.synop.replaceAll("", " "); this.presentatie = org.apache.commons.lang.StringEscapeUtils.unescapeHtml(presentatie); this.acteursnamen_rolverdeling = org.apache.commons.lang.StringEscapeUtils.unescapeHtml(acteursnamen_rolverdeling); this.regisseur = org.apache.commons.lang.StringEscapeUtils.unescapeHtml(regisseur); diff --git a/tv_grab_nl_java/src/org/vanbest/xmltv/TvGids.java b/tv_grab_nl_java/src/org/vanbest/xmltv/TvGids.java index db49ff1..33b3900 100644 --- a/tv_grab_nl_java/src/org/vanbest/xmltv/TvGids.java +++ b/tv_grab_nl_java/src/org/vanbest/xmltv/TvGids.java @@ -32,6 +32,7 @@ public class TvGids { ProgrammeCache cache; static boolean initialised = false; + int fetchErrors = 0; public TvGids(File cacheFile) { cache = new ProgrammeCache(cacheFile); @@ -147,12 +148,7 @@ public class TvGids { Programme p = (Programme) JSONObject.toBean(programme, Programme.class); p.fixup(); if (fetchDetails) { - p.details = cache.getDetails(p.db_id); - if ( p.details == null ) { - p.details = getDetails(p.db_id); - p.details.fixup(p); - cache.add(p.db_id, p.details); - } + fillDetails(p); } p.channel = c; result.add( p ); @@ -163,12 +159,7 @@ public class TvGids { JSONObject programme = programs.getJSONObject(o.toString()); Programme p = (Programme) JSONObject.toBean(programme, Programme.class); if (fetchDetails) { - try { - p.details = getDetails(p.db_id); - } catch (Exception e) { - e.printStackTrace(); - continue; - } + fillDetails(p); } p.channel = c; result.add( p ); @@ -187,15 +178,20 @@ public class TvGids { String s; while ((s = reader.readLine()) != null) json.append(s); } catch (IOException e) { + fetchErrors++; throw new Exception("Error getting program data from url " + url, e); } return JSONObject.fromObject( json.toString() ); } - private ProgrammeDetails getDetails(String db_id) throws Exception { - URL url = detailUrl(db_id); - JSONObject json = fetchJSON(url); - //System.out.println( json ); - return (ProgrammeDetails) JSONObject.toBean(json, ProgrammeDetails.class); + private void fillDetails(Programme p) throws Exception { + p.details = cache.getDetails(p.db_id); + if ( p.details == null ) { + URL url = detailUrl(p.db_id); + JSONObject json = fetchJSON(url); + p.details = (ProgrammeDetails) JSONObject.toBean(json, ProgrammeDetails.class); + p.details.fixup(p); + cache.add(p.db_id, p.details); + } } } -- 2.39.5