]> www.vanbest.org Git - tv_grab_nl_java/commitdiff
Fixes RTL date wraps after midnight (fixes #5)
authorJan-Pascal van Best <janpascal@vanbest.org>
Fri, 20 Apr 2012 14:50:53 +0000 (16:50 +0200)
committerJan-Pascal van Best <janpascal@vanbest.org>
Fri, 20 Apr 2012 14:50:53 +0000 (16:50 +0200)
src/main/java/org/vanbest/xmltv/RTL.java

index ac6ca50d0be300e6ceeb25729e2198abc8368d46..f0856ff3009449cf2a7c3c344049c4add6e29234 100644 (file)
@@ -78,6 +78,20 @@ public class RTL extends AbstractEPGSource implements EPGSource  {
                }\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
@@ -164,7 +178,7 @@ public class RTL extends AbstractEPGSource implements EPGSource  {
         * </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
@@ -194,7 +208,7 @@ public class RTL extends AbstractEPGSource implements EPGSource  {
                                                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
@@ -214,7 +228,7 @@ public class RTL extends AbstractEPGSource implements EPGSource  {
        }\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
@@ -238,7 +252,7 @@ public class RTL extends AbstractEPGSource implements EPGSource  {
                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
@@ -291,16 +305,22 @@ public class RTL extends AbstractEPGSource implements EPGSource  {
                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
@@ -317,10 +337,10 @@ public class RTL extends AbstractEPGSource implements EPGSource  {
                                        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
@@ -336,21 +356,32 @@ public class RTL extends AbstractEPGSource implements EPGSource  {
                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
@@ -367,6 +398,7 @@ public class RTL extends AbstractEPGSource implements EPGSource  {
         * @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
@@ -386,6 +418,7 @@ public class RTL extends AbstractEPGSource implements EPGSource  {
                        // TODO Auto-generated catch block\r
                        e1.printStackTrace();\r
                }\r
+               */\r
                debug = true;\r
                Config config = Config.getDefaultConfig();\r
                config.niceMilliseconds = 50;\r