}\r
}\r
\r
+ class DateStatus {\r
+ Date programDate;\r
+ Calendar prevStartTime = null;\r
+ final static int START_TIME=1;\r
+ final static int END_TIME=2;\r
+ public DateStatus(Date date) {\r
+ reset(date);\r
+ }\r
+ public void reset(Date date) {\r
+ this.programDate = date;\r
+ this.prevStartTime = null;\r
+ }\r
+ }\r
+ \r
public RTL(int sourceId, Config config) {\r
super(sourceId, config);\r
if(debug) {\r
* </uitzending_data>\r
\r
*/\r
- private void fetchDetail(Programme prog, Date date, String id) throws Exception {\r
+ private void fetchDetail(Programme prog, DateStatus dateStatus, String id) throws Exception {\r
URL url = detailUrl(id);\r
Thread.sleep(config.niceMilliseconds);\r
Document xml = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(url.openStream());\r
String value = "\"" + sub.getTextContent().replaceAll("\\s", " ") + "\"";\r
result[index] = value;\r
}\r
- handleNode(prog, date, subnodes.item(j));\r
+ handleNode(prog, dateStatus, subnodes.item(j));\r
} catch (RTLException e) {\r
System.out.println(e.getMessage());\r
Transformer t = TransformerFactory.newInstance().newTransformer();\r
}\r
\r
\r
- private void handleNode(Programme prog, Date date, Node n) throws RTLException, DOMException, SQLException {\r
+ private void handleNode(Programme prog, DateStatus dateStatus, Node n) throws RTLException, DOMException, SQLException {\r
if (n.getNodeType() != Node.ELEMENT_NODE) {\r
throw new RTLException("Ignoring non-element node " + n.getNodeName());\r
}\r
if (tag.equals("genre")) {\r
prog.addCategory(config.translateCategory(e.getTextContent()));\r
} else if (tag.equals("eindtijd")) {\r
- prog.endTime = parseTime(date, e.getTextContent());\r
+ prog.endTime = parseTime(e.getTextContent(), dateStatus, DateStatus.END_TIME);\r
} else if (tag.equals("omroep")) {\r
} else if (tag.equals("kijkwijzer")) {\r
//System.out.println("Kijkwijzer: \"" + e.getTextContent() + "\"");\r
Document xml = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(url.openStream());\r
Element root = xml.getDocumentElement();\r
Date date = new SimpleDateFormat("yyyy-MM-dd").parse(root.getAttribute("date"));\r
+ DateStatus dateStatus = new DateStatus(date);\r
//System.out.println("date: " + date);\r
String json = root.getTextContent();\r
//System.out.println("json: " + json);\r
JSONObject o = JSONObject.fromObject( json );\r
+ String prevChannel = null;\r
for( Object k: o.keySet()) {\r
String id = genericChannelId(k.toString());\r
if(!channelMap.containsKey(id)) {\r
//if (!config.quiet) System.out.println("Skipping programmes for channel " + id);\r
continue;\r
}\r
+ if (!id.equals(prevChannel)) {\r
+ dateStatus.reset(date);\r
+ prevChannel = id;\r
+ }\r
JSONArray j = (JSONArray) o.get(k);\r
//System.out.println(k.toString()+": "+j.toString());\r
//System.out.println("Channel name:" + j.get(0));\r
stats.cacheMisses++;\r
prog = new Programme();\r
prog.addTitle(title);\r
- prog.startTime = parseTime(date, starttime);\r
+ prog.startTime = parseTime(starttime, dateStatus, DateStatus.START_TIME);\r
prog.channel = channelMap.get(id).getXmltvChannelId();\r
if (config.fetchDetails) {\r
- fetchDetail(prog, date, programme_id);\r
+ fetchDetail(prog, dateStatus, programme_id);\r
}\r
cache.put(getId(), programme_id, prog);\r
} else {\r
super.close();\r
}\r
\r
- // FIXME probably not correct in all cases, maybe make use \r
- // of the order of the programmes?\r
- private Date parseTime(Date date, String time) {\r
+ // Assumption: programmes are more-or-less in ascending order by start time\r
+ private Date parseTime(String time, DateStatus status, int mode) {\r
Calendar result = Calendar.getInstance();\r
- result.setTime(date);\r
+ result.setTime(status.programDate);\r
String[] parts = time.split(":");\r
if(parts.length != 2) {\r
- \r
+ if (!config.quiet)System.out.println("Wrong time format " + time); \r
+ // ignore\r
}\r
- int hour = Integer.parseInt(parts[0]);\r
- if (hour<5) {\r
- result.add(Calendar.DAY_OF_MONTH, 1); // early tomorrow morning\r
- }\r
- result.set(Calendar.HOUR_OF_DAY, hour);\r
+ result.set(Calendar.HOUR_OF_DAY, Integer.parseInt(parts[0]));\r
result.set(Calendar.MINUTE, Integer.parseInt(parts[1]));\r
+ Calendar prev = status.prevStartTime;\r
+ // Check if the start time of a new program is at most one hour before the start time of \r
+ // the previous one. End time of a program should be at or after the start time of the \r
+ // program. Else, assume it's on the next day.\r
+ if (prev != null) {\r
+ if (mode == DateStatus.START_TIME){ \r
+ prev.add(Calendar.HOUR_OF_DAY, -1);\r
+ }\r
+ if (result.before(prev)) {\r
+ result.add(Calendar.DAY_OF_MONTH, 1); \r
+ }\r
+ }\r
+ if (mode==DateStatus.START_TIME) {\r
+ status.prevStartTime = result;\r
+ }\r
return result.getTime();\r
}\r
\r
* @throws FileNotFoundException \r
*/\r
public static void main(String[] args) throws FileNotFoundException {\r
+ /*\r
Calendar result = Calendar.getInstance();\r
Calendar d = Calendar.getInstance();\r
try {\r
// TODO Auto-generated catch block\r
e1.printStackTrace();\r
}\r
+ */\r
debug = true;\r
Config config = Config.getDefaultConfig();\r
config.niceMilliseconds = 50;\r