]> www.vanbest.org Git - tv_grab_nl_java/commitdiff
Initial checkin
authorJan-Pascal van Best <janpascal@vanbest.org>
Sat, 10 Mar 2012 12:52:10 +0000 (13:52 +0100)
committerJan-Pascal van Best <janpascal@vanbest.org>
Sat, 10 Mar 2012 12:52:10 +0000 (13:52 +0100)
tv_grab_nl_java/.classpath [new file with mode: 0644]
tv_grab_nl_java/.project [new file with mode: 0644]
tv_grab_nl_java/.settings/org.eclipse.jdt.core.prefs [new file with mode: 0644]
tv_grab_nl_java/.settings/org.eclipse.m2e.core.prefs [new file with mode: 0644]
tv_grab_nl_java/pom.xml [new file with mode: 0644]
tv_grab_nl_java/src/org/vanbest/xmltv/Channel.java [new file with mode: 0644]
tv_grab_nl_java/src/org/vanbest/xmltv/Main.java [new file with mode: 0644]
tv_grab_nl_java/src/org/vanbest/xmltv/Programme.java [new file with mode: 0644]
tv_grab_nl_java/src/org/vanbest/xmltv/ProgrammeDetails.java [new file with mode: 0644]
tv_grab_nl_java/src/org/vanbest/xmltv/TvGids.java [new file with mode: 0644]
tv_grab_nl_java/src/org/vanbest/xmltv/XmlTvWriter.java [new file with mode: 0644]

diff --git a/tv_grab_nl_java/.classpath b/tv_grab_nl_java/.classpath
new file mode 100644 (file)
index 0000000..591744a
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+       <classpathentry kind="src" path="src"/>
+       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+       <classpathentry exported="true" kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER"/>
+       <classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/tv_grab_nl_java/.project b/tv_grab_nl_java/.project
new file mode 100644 (file)
index 0000000..2851774
--- /dev/null
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>tv_grab_nl_java</name>
+       <comment></comment>
+       <projects>
+       </projects>
+       <buildSpec>
+               <buildCommand>
+                       <name>org.eclipse.jdt.core.javabuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.m2e.core.maven2Builder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+       </buildSpec>
+       <natures>
+               <nature>org.eclipse.m2e.core.maven2Nature</nature>
+               <nature>org.eclipse.jdt.core.javanature</nature>
+       </natures>
+</projectDescription>
diff --git a/tv_grab_nl_java/.settings/org.eclipse.jdt.core.prefs b/tv_grab_nl_java/.settings/org.eclipse.jdt.core.prefs
new file mode 100644 (file)
index 0000000..8be742f
--- /dev/null
@@ -0,0 +1,13 @@
+#Fri Mar 09 20:00:25 CET 2012
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
+org.eclipse.jdt.core.compiler.source=1.5
diff --git a/tv_grab_nl_java/.settings/org.eclipse.m2e.core.prefs b/tv_grab_nl_java/.settings/org.eclipse.m2e.core.prefs
new file mode 100644 (file)
index 0000000..9d3a7c9
--- /dev/null
@@ -0,0 +1,5 @@
+#Fri Mar 09 20:00:15 CET 2012
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/tv_grab_nl_java/pom.xml b/tv_grab_nl_java/pom.xml
new file mode 100644 (file)
index 0000000..390fb9d
--- /dev/null
@@ -0,0 +1,14 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>org.vanbest.xmltv.tv_grab_nl_java</groupId>
+  <artifactId>tv_grab_nl_java</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <dependencies>
+       <dependency>
+               <groupId>net.sf.json-lib</groupId>
+               <artifactId>json-lib</artifactId>
+               <version>2.4</version>
+               <classifier>jdk15</classifier>
+       </dependency>
+  </dependencies>
+</project>
\ No newline at end of file
diff --git a/tv_grab_nl_java/src/org/vanbest/xmltv/Channel.java b/tv_grab_nl_java/src/org/vanbest/xmltv/Channel.java
new file mode 100644 (file)
index 0000000..f414491
--- /dev/null
@@ -0,0 +1,15 @@
+package org.vanbest.xmltv;
+
+public class Channel {
+       int id;
+    String name;
+    String shortName;
+    public Channel(int id, String name, String shortName) {
+       this.id = id;
+       this.name = name;
+       this.shortName = shortName;
+       }
+    public String toString() {
+       return "id: " + id + "; name: " + name + "; shortName: " + shortName;
+    }
+}
diff --git a/tv_grab_nl_java/src/org/vanbest/xmltv/Main.java b/tv_grab_nl_java/src/org/vanbest/xmltv/Main.java
new file mode 100644 (file)
index 0000000..105c2d3
--- /dev/null
@@ -0,0 +1,35 @@
+package org.vanbest.xmltv;
+
+import java.util.List;
+import java.util.Set;
+
+public class Main {
+       
+       /**
+        * @param args
+        */
+       public static void main(String[] args) {
+               List<Channel> channels = TvGids.getChannels();
+               System.out.println(channels);
+               
+               try {
+                       System.out.println(TvGids.programmeUrl(channels, 0));
+                       
+                       List<Channel> myChannels = channels.subList(0,  2);
+                       Set<Programme> programmes = TvGids.getProgrammes(myChannels, 0, true);
+                       
+                       System.out.println( programmes );
+                       
+                       XmlTvWriter writer = new XmlTvWriter(System.out);
+                       writer.writeChannels(myChannels);
+                       System.out.flush();
+                       
+               } catch (Exception e) {
+                       // TODO Auto-generated catch block
+                       e.printStackTrace();
+               }
+               
+               
+       }
+
+}
diff --git a/tv_grab_nl_java/src/org/vanbest/xmltv/Programme.java b/tv_grab_nl_java/src/org/vanbest/xmltv/Programme.java
new file mode 100644 (file)
index 0000000..ea75fd1
--- /dev/null
@@ -0,0 +1,113 @@
+package org.vanbest.xmltv;
+
+import java.util.Date;
+
+public class Programme {
+         public String getDb_id() {
+               return db_id;
+       }
+
+       public void setDb_id(String db_id) {
+               this.db_id = db_id;
+       }
+
+       public String getTitel() {
+               return titel;
+       }
+
+       public void setTitel(String titel) {
+               this.titel = titel;
+       }
+
+       public String getGenre() {
+               return genre;
+       }
+
+       public void setGenre(String genre) {
+               this.genre = genre;
+       }
+
+       public String getSoort() {
+               return soort;
+       }
+
+       public void setSoort(String soort) {
+               this.soort = soort;
+       }
+
+       public String getKijkwijzer() {
+               return kijkwijzer;
+       }
+
+       public void setKijkwijzer(String kijkwijzer) {
+               this.kijkwijzer = kijkwijzer;
+       }
+
+       public String getArtikel_id() {
+               return artikel_id;
+       }
+
+       public void setArtikel_id(String artikel_id) {
+               this.artikel_id = artikel_id;
+       }
+
+       public Date getDatum_start() {
+               return datum_start;
+       }
+
+       public void setDatum_start(Date datum_start) {
+               this.datum_start = datum_start;
+       }
+
+       public Date getDatum_end() {
+               return datum_end;
+       }
+
+       public void setDatum_end(Date datum_end) {
+               this.datum_end = datum_end;
+       }
+
+       public boolean isIs_hightlight() {
+               return is_hightlight;
+       }
+
+       public void setIs_hightlight(boolean is_hightlight) {
+               this.is_hightlight = is_hightlight;
+       }
+
+       public String getHighlight_afbeelding() {
+               return highlight_afbeelding;
+       }
+
+       public void setHighlight_afbeelding(String highlight_afbeelding) {
+               this.highlight_afbeelding = highlight_afbeelding;
+       }
+
+       String db_id;
+         String titel;
+         String genre;
+         String soort;
+         String kijkwijzer;
+         String artikel_id;
+         Date datum_start;
+         Date datum_end;
+         boolean is_hightlight;
+         String highlight_afbeelding;
+         ProgrammeDetails details = null;
+         
+         public String toString() {
+                 StringBuffer s = new StringBuffer();
+                 s.append("id: " + db_id + ";");
+                 s.append("titel: " + titel + ";");
+                 s.append("genre: " + genre + ";");
+                 s.append("soort: " + soort + ";");
+                 s.append("kijkwijzer: " + kijkwijzer+ ";");
+                 s.append("artikel_id: " + artikel_id + ";");
+                 s.append("datum_start: " + datum_start + ";");
+                 s.append("datum_end: " + datum_end + ";");
+                 if (details != null) s.append("details:" + details.toString() );
+                 s.append("\n");
+                 
+                 return s.toString();
+         }
+}
diff --git a/tv_grab_nl_java/src/org/vanbest/xmltv/ProgrammeDetails.java b/tv_grab_nl_java/src/org/vanbest/xmltv/ProgrammeDetails.java
new file mode 100644 (file)
index 0000000..7dc2783
--- /dev/null
@@ -0,0 +1,97 @@
+package org.vanbest.xmltv;
+
+public class ProgrammeDetails {
+       String db_id;
+       String titel;
+       String datum;
+       String btijd;
+       String etijd;
+       String synop;
+       String kijkwijzer;
+       String genre;
+       String presentatie;
+       String acteursnamen_rolverdeling;
+       String regisseur;
+       String zender_id;
+       public String getDb_id() {
+               return db_id;
+       }
+       public void setDb_id(String db_id) {
+               this.db_id = db_id;
+       }
+       public String getTitel() {
+               return titel;
+       }
+       public void setTitel(String titel) {
+               this.titel = titel;
+       }
+       public String getDatum() {
+               return datum;
+       }
+       public void setDatum(String datum) {
+               this.datum = datum;
+       }
+       public String getBtijd() {
+               return btijd;
+       }
+       public void setBtijd(String btijd) {
+               this.btijd = btijd;
+       }
+       public String getEtijd() {
+               return etijd;
+       }
+       public void setEtijd(String etijd) {
+               this.etijd = etijd;
+       }
+       public String getSynop() {
+               return synop;
+       }
+       public void setSynop(String synop) {
+               this.synop = synop;
+       }
+       public String getKijkwijzer() {
+               return kijkwijzer;
+       }
+       public void setKijkwijzer(String kijkwijzer) {
+               this.kijkwijzer = kijkwijzer;
+       }
+       public String getGenre() {
+               return genre;
+       }
+       public void setGenre(String genre) {
+               this.genre = genre;
+       }
+       public String getPresentatie() {
+               return presentatie;
+       }
+       public void setPresentatie(String presentatie) {
+               this.presentatie = presentatie;
+       }
+       public String getActeursnamen_rolverdeling() {
+               return acteursnamen_rolverdeling;
+       }
+       public void setActeursnamen_rolverdeling(String acteursnamen_rolverdeling) {
+               this.acteursnamen_rolverdeling = acteursnamen_rolverdeling;
+       }
+       public String getRegisseur() {
+               return regisseur;
+       }
+       public void setRegisseur(String regisseur) {
+               this.regisseur = regisseur;
+       }
+       public String getZender_id() {
+               return zender_id;
+       }
+       public void setZender_id(String zender_id) {
+               this.zender_id = zender_id;
+       }
+       @Override
+       public String toString() {
+               return "ProgrammeDetails [db_id=" + db_id + ", titel=" + titel
+                               + ", datum=" + datum + ", btijd=" + btijd + ", etijd=" + etijd
+                               + ", synop=" + synop + ", kijkwijzer=" + kijkwijzer
+                               + ", genre=" + genre + ", presentatie=" + presentatie
+                               + ", acteursnamen_rolverdeling=" + acteursnamen_rolverdeling
+                               + ", regisseur=" + regisseur + ", zender_id=" + zender_id + "]";
+       }
+}
diff --git a/tv_grab_nl_java/src/org/vanbest/xmltv/TvGids.java b/tv_grab_nl_java/src/org/vanbest/xmltv/TvGids.java
new file mode 100644 (file)
index 0000000..44d4921
--- /dev/null
@@ -0,0 +1,145 @@
+package org.vanbest.xmltv;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+
+import net.sf.ezmorph.object.DateMorpher;
+import net.sf.json.JSONArray;
+import net.sf.json.JSONObject;
+import net.sf.json.util.JSONUtils;
+
+public class TvGids {
+
+       static String channels_url="http://www.tvgids.nl/json/lists/channels.php";
+       static String programme_base_url="http://www.tvgids.nl/json/lists/programs.php";
+       static String detail_base_url = "http://www.tvgids.nl/json/lists/program.php";
+
+       static public List<Channel> getChannels() {
+               List<Channel> result = new ArrayList<Channel>(10);
+               URL url = null;
+               try {
+                       url = new URL(channels_url);
+               } catch (MalformedURLException e) {
+                       // TODO Auto-generated catch block
+                       e.printStackTrace();
+               }
+               /*
+               StringBuffer json = new StringBuffer();
+               try {
+
+                       BufferedReader reader = new BufferedReader( new InputStreamReader( url.openStream()));
+
+                       String s;
+                       while ((s = reader.readLine()) != null) {
+                               json.append(s);
+                            }
+               } catch (IOException e) {
+                       // TODO Auto-generated catch block
+                       e.printStackTrace();
+               }
+               */
+               String json = "[{'id':'1','name':'Nederland 1','name_short':'Ned 1'},{'id':'2','name':'Nederland 2','name_short':'Ned 2'},{'id':'3','name':'Nederland 3','name_short':'Ned 3'},{'id':'4','name':'RTL 4','name_short':'RTL 4'},{'id':'31','name':'RTL 5','name_short':'RTL 5'},{'id':'46','name':'RTL 7','name_short':'RTL 7'},{'id':'92','name':'RTL 8','name_short':'RTL 8'},{'id':'36','name':'SBS 6','name_short':'SBS 6'},{'id':'37','name':'NET 5','name_short':'NET 5'},{'id':'34','name':'Veronica','name_short':'Veronica'},{'id':'29','name':'Discovery Channel','name_short':'Discovery'},{'id':'18','name':'National Geographic','name_short':'NGC'},{'id':'84','name':'Het Gesprek','name_short':'HetGesprek'},{'id':'406','name':'NostalgieNet','name_short':'Nost Net'},{'id':'5','name':'E&eacute;n','name_short':'E&eacute;n'},{'id':'6','name':'KETNET/Canvas','name_short':'KET/Can'},{'id':'25','name':'MTV','name_short':'MTV'},{'id':'405','name':'TLC','name_short':'tlc'},{'id':'91','name':'Comedy Central','name_short':'Com. Centr.'},{'id':'49','name':'VTM','name_short':'VTM'},{'id':'59','name':'2BE','name_short':'2BE'},{'id':'89','name':'Nickelodeon','name_short':'Nick'},{'id':'60','name':'VT4','name_short':'VT4'},{'id':'90','name':'BVN','name_short':'BVN'},{'id':'404','name':'FOXlife','name_short':'FOXlife'},{'id':'7','name':'BBC 1','name_short':'BBC 1'},{'id':'8','name':'BBC 2','name_short':'BBC 2'},{'id':'86','name':'BBC World','name_short':'BBC W'},{'id':'9','name':'ARD','name_short':'ARD'},{'id':'10','name':'ZDF','name_short':'ZDF'},{'id':'13','name':'NDR Fernsehen','name_short':'NDR'},{'id':'14','name':'S&uuml;dwest Fernsehen','name_short':'SWF'},{'id':'12','name':'WDR Fernsehen','name_short':'WDR'},{'id':'50','name':'3Sat','name_short':'3Sat'},{'id':'28','name':'Sat 1','name_short':'Sat 1'},{'id':'11','name':'RTL','name_short':'RTL'},{'id':'58','name':'PRO 7','name_short':'PRO 7'},{'id':'15','name':'RTBF La 1','name_short':'RTBF La1'},{'id':'16','name':'RTBF La 2','name_short':'RTBF La2'},{'id':'17','name':'TV 5','name_short':'TV 5'},{'id':'27','name':'Rai Uno','name_short':'Rai Uno'},{'id':'32','name':'TRT int.','name_short':'TRT'},{'id':'40','name':'AT 5','name_short':'AT 5'},{'id':'24','name':'Film 1 Premiere','name_short':'Film1 Prem.'},{'id':'39','name':'Film 1 Family','name_short':'Film1 Fam.'},{'id':'107','name':'Film 1 Festival','name_short':'Film1 Fest.'},{'id':'35','name':'TMF','name_short':'TMF'},{'id':'73','name':'Mezzo','name_short':'Mezzo'},{'id':'21','name':'Cartoon Network','name_short':'Cart. Net.'},{'id':'26','name':'CNN','name_short':'CNN'},{'id':'19','name':'Eurosport','name_short':'Eurosport'},{'id':'99','name':'Sport1','name_short':'Sport1'},{'id':'20','name':'TCM','name_short':'TCM'},{'id':'65','name':'Animal Planet','name_short':'Animal Pl.'},{'id':'87','name':'TV E','name_short':'TVE'},{'id':'38','name':'ARTE','name_short':'ARTE'},{'id':'103','name':'RTV Noord-Holland','name_short':'RTV N-H'},{'id':'100','name':'RTV Utrecht','name_short':'Utrecht'},{'id':'101','name':'RTV West','name_short':'RTV West'},{'id':'102','name':'RTV Rijnmond','name_short':'Rijnmond'},{'id':'104','name':'BBC Entertainment','name_short':'BBC E'},{'id':'105','name':'Private Spice','name_short':'Private Sp.'},{'id':'93','name':'13TH STREET','name_short':'13TH ST'},{'id':'94','name':'Syfy','name_short':'Syfy'},{'id':'109','name':'Omrop Frysl&acirc;n','name_short':'Frysl&acirc;n'},{'id':'112','name':'Omroep Gelderland','name_short':'Gelderland'},{'id':'115','name':'L1 TV','name_short':'L1 TV'},{'id':'110','name':'RTV Drenthe','name_short':'Drenthe'},{'id':'113','name':'Omroep Flevoland','name_short':'Flevoland'},{'id':'116','name':'Omroep Zeeland','name_short':'Zeeland'},{'id':'108','name':'RTV Noord','name_short':'RTV Noord'},{'id':'111','name':'RTV Oost','name_short':'RTV Oost'},{'id':'114','name':'Omroep Brabant','name_short':'Brabant'},{'id':'67','name':'Consumenten 24','name_short':'Cons24'},{'id':'81','name':'HollandDoc 24','name_short':'HolDoc24'},{'id':'314','name':'Journaal 24','name_short':'Journaal24'},{'id':'316','name':'Best 24','name_short':'Best24'},{'id':'401','name':'Playboy TV','name_short':'Playboy'},{'id':'306','name':'Discovery Science','name_short':'Disc. Sc.'},{'id':'403','name':'Goed TV','name_short':'Goed TV'},{'id':'303','name':'Hallmark','name_short':'Hallmark'},{'id':'300','name':'BBC 3','name_short':'BBC 3'},{'id':'310','name':'3voor12 Portal','name_short':''},{'id':'64','name':'Familie 24','name_short':'Fam24'},{'id':'69','name':'Sterren 24','name_short':'Sterren24'},{'id':'82','name':'Geschiedenis 24','name_short':'Gesch24'},{'id':'312','name':'Nick Jr.','name_short':'Nick Jr.'},{'id':'311','name':'Disney XD','name_short':'Disney XD'},{'id':'317','name':'Comedy Family','name_short':'Com. Fam.'},{'id':'402','name':'Adult Channel','name_short':'Adult'},{'id':'305','name':'Discovery World','name_short':'Disc. World'},{'id':'308','name':'3voor12 Central','name_short':''},{'id':'148','name':'Eredivisie Live','name_short':'Eredivisie'},{'id':'66','name':'HumorTV 24','name_short':'Humor24'},{'id':'70','name':'Cultura 24','name_short':'Cult24'},{'id':'83','name':'3voor12','name_short':''},{'id':'313','name':'Boomerang','name_short':'Boomerang'},{'id':'315','name':'Zone Reality','name_short':'ZoneReality'},{'id':'400','name':'Hustler TV','name_short':'Hustler'},{'id':'307','name':'Discovery Travel &amp; Living','name_short':'Disc T&amp;L'},{'id':'304','name':'MGM','name_short':'MGM'},{'id':'301','name':'BBC 4','name_short':'BBC 4'},{'id':'309','name':'3voor12 On Stage','name_short':''},{'id':'33','name':'Spirit 24','name_short':'Spirit24'}]";
+
+               JSONArray jsonArray = JSONArray.fromObject( json.toString() );  
+               // System.out.println( jsonArray );  
+               
+               for( int i=0; i<jsonArray.size(); i++ ) {
+                       JSONObject zender = jsonArray.getJSONObject(i);
+                       //System.out.println( "id: " + zender.getString("id"));
+                       //System.out.println( "name: " + zender.getString("name"));
+                       result.add( new Channel(zender.getInt("id"), zender.getString("name"), zender.getString("name_short")));
+               }
+
+               return result;
+               
+       }
+       
+       public static URL programmeUrl(List<Channel> channels, int day) throws Exception {
+               StringBuilder s = new StringBuilder(programme_base_url);
+               if (channels.size() < 1) {
+                       throw new Exception("should have at least one channel");
+               }
+               s.append("?channels=");
+               boolean first = true;
+               for(Channel i: channels) {
+                       if (first) {
+                               s.append(i.id);
+                               first = false;
+                       } else {
+                               s.append(","+i.id);
+                       }
+               }
+               s.append("&day=");
+               s.append(day);
+               
+               return new URL(s.toString());
+       }
+       
+       public static URL detailUrl(String id) throws Exception {
+               StringBuilder s = new StringBuilder(detail_base_url);
+               s.append("?id=");
+               s.append(id);
+               return new URL(s.toString());
+       }
+       
+               
+       static public Set<Programme> getProgrammes(List<Channel> channels, int day, boolean fetchDetails) throws Exception {
+               Set<Programme> result = new HashSet<Programme>();
+               URL url = programmeUrl(channels, day);
+
+               JSONObject jsonObject = fetchJSON(url);  
+               System.out.println( jsonObject );  
+               
+               String[] formats = {"yyyy-MM-dd HH:mm:ss"};
+               JSONUtils.getMorpherRegistry().registerMorpher( new DateMorpher(formats, new Locale("nl")));
+
+               for( Channel i: channels) {
+                       JSONObject programs = jsonObject.getJSONObject(""+i.id);
+                       System.out.println( programs );
+
+                       for( Object o: programs.keySet() ) {
+                               JSONObject programme = programs.getJSONObject(o.toString());
+                               Programme p = (Programme) JSONObject.toBean(programme, Programme.class);
+                               if (fetchDetails) {
+                                       p.details = getDetails(p.db_id);
+                               }
+                               result.add( p );
+                       }
+               }
+
+               return result;
+       }
+       
+       private static JSONObject fetchJSON(URL url) throws Exception {
+               Thread.sleep(100);
+               StringBuffer json = new StringBuffer();
+               try {
+                       BufferedReader reader = new BufferedReader( new InputStreamReader( url.openStream()));
+                       String s;
+                       while ((s = reader.readLine()) != null) json.append(s);
+               } catch (IOException e) {
+                       throw new Exception("Error getting program data", e);
+               }
+               return JSONObject.fromObject( json.toString() );  
+       }
+
+       private static ProgrammeDetails getDetails(String db_id) throws Exception {
+               Set<Programme> result = new HashSet<Programme>();
+               URL url = detailUrl(db_id);
+               JSONObject json = fetchJSON(url);
+               //System.out.println( json );  
+               ProgrammeDetails d = (ProgrammeDetails) JSONObject.toBean(json, ProgrammeDetails.class);
+               return d;
+       }
+}
diff --git a/tv_grab_nl_java/src/org/vanbest/xmltv/XmlTvWriter.java b/tv_grab_nl_java/src/org/vanbest/xmltv/XmlTvWriter.java
new file mode 100644 (file)
index 0000000..a22dfef
--- /dev/null
@@ -0,0 +1,64 @@
+package org.vanbest.xmltv;
+
+import java.io.OutputStream;
+import java.util.List;
+
+import javax.xml.stream.FactoryConfigurationError;
+import javax.xml.stream.XMLStreamWriter;
+import javax.xml.stream.XMLOutputFactory;
+import javax.xml.stream.XMLEventFactory;
+import javax.xml.stream.XMLStreamException;
+
+/*
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE tv SYSTEM "xmltv.dtd">
+<tv generator-info-url="http://www.caliban.org/ruby/xmltv_upc.shtml" source-info-url="http://tvgids.upc.nl/TV/" source-info-name="UPC TV Guide" generator-info-name="tv_grab_nl_upc $Id: tv_grab_nl_upc,v 1.228 2011/04/05 07:33:12 ianmacd Exp $">
+
+<channel id="16.chello.nl">
+<display-name lang="nl">
+Comedy C.\Kindernet
+</display-name>
+</channel>
+
+*/
+
+public class XmlTvWriter {
+
+       private XMLStreamWriter writer;
+       private XMLEventFactory eventFactory;
+       
+       public XmlTvWriter(OutputStream os) throws XMLStreamException, FactoryConfigurationError {
+               this.writer = XMLOutputFactory.newInstance().createXMLStreamWriter(os);
+               this.eventFactory = XMLEventFactory.newInstance();
+               
+               writer.writeStartDocument();
+               writer.writeCharacters("\n");
+               writer.writeDTD("<!DOCTYPE tv SYSTEM \"xmltv.dtd\">");
+               writer.writeCharacters("\n");
+               writer.writeStartElement("tv");
+               writer.writeAttribute("generator-info-url","http://www.caliban.org/ruby/xmltv_upc.shtml");
+               writer.writeAttribute("source-info-url", "http://tvgids.nl/");
+               writer.writeAttribute("source-info-name", "TvGids.nl");
+               writer.writeAttribute("generator-info-name", "tv_grab_nl_java $Id: tv_grab_nl_java,v 1.228 2011/04/05 07:33:12 ianmacd Exp $");
+               writer.writeCharacters("\n");
+       }
+       
+       public void writeChannels(List<Channel> channels) throws XMLStreamException {
+               for(Channel c: channels) {
+                       writer.writeStartElement("channel");
+                       writer.writeAttribute("id", ""+c.id);
+                       writer.writeStartElement("display-name");
+                       writer.writeAttribute("lang", "nl");
+                       writer.writeCharacters(c.name);
+                       writer.writeEndElement();
+                       writer.writeEndElement();
+                       writer.writeCharacters("\n");
+               }
+       }
+       
+       public void close() throws XMLStreamException {
+               writer.writeEndElement();
+               writer.writeEndDocument();
+               writer.flush();
+       }
+}