TvProgs.java

_Pete_ 08.07.04 14:41

Hakee tv ohjelmat telkku.com:sta

 Tekstiversio  Arvo: 3 (3 ääntä)  Äänestä: +  -
HttpPageFetcher luokka käyttää hyväkseen täältä löytyvää kirjasto:

http://www.do.org/products/parser/

Käytä näin:

1) talleta tästä kolme luokkaa omiin tiedostoihinsa

2) imuroi tarvittava kirjasto paketti (HtmlStreamTokenizer.zip), pura se ja kopio lib/arthurdo.jar tiedosto samaan hakemistoon kuin  java lähdekoodit

nyt pitäisi samassa hakemistossa olla tiedostot:

HttpPageFetcher.java  TvProgram.java  TvProgs.java  arthurdo.jar

3) käännä:

javac -classpath ".;arthurdo.jar" TvProgs.java

4) aja:

java -classpath ".;arthurdo.jar" TvProgs
Programs fetched!
[3] Thu Jul 08 10:10:00 EEST 2004 - TV1 -> Tv-uutiset
[317] Thu Jul 08 14:15:00 EEST 2004 - TV2 -> Tohtori Ben Casey
[613] Thu Jul 08 13:35:00 EEST 2004 - MTV3 -> MTV3 Chat
[894] Thu Jul 08 14:00:00 EEST 2004 - Nelonen -> Sailrace-mobiilipeli
[1112] Thu Jul 08 14:30:00 EEST 2004 - SubTV -> Peliputki: Polttopallo

//===============================================//

/*
 * COPYRIGHT 2004 Petri Airio
 *
 * All rights reserved.
 *
 */


import java.io.BufferedReader;
import java.io.IOException;
import java.io.StringReader;
import java.util.Collections;
import java.util.Calendar;
import java.util.Enumeration;
import java.util.Vector;

/**
 * TvProgs
 *
 * $Revision: 1.1 $
 * @author Petri Airio
 */


public class TvProgs {

  //~ Instance/static variables ..............................................

  private final static String[] CHANNELS
    = {"TV1", "TV2", "MTV3", "Nelonen", "SubTV"};

  private Vector _programs;

  //~ Constructors ...........................................................


  //~ Methods ................................................................

  public TvProgram getProgram(String channel, Calendar time) {
    TvProgram tp = null;
    for (int xx = _programs.size() - 1; xx != 0; xx--) {
      tp = (TvProgram) _programs.get(xx);
      if (tp.getChannel().equalsIgnoreCase(channel)) {
        Calendar cal = tp.getStartTime();
        if (time.after(cal)) {
          return tp;
        }
      }
    }
    return null;
  }

  public TvProgram getNextProgram(String channel, TvProgram prg) {
    TvProgram tp = null;
    Enumeration eNum = _programs.elements();
    boolean found = false;
    while (eNum.hasMoreElements()) {
      tp = (TvProgram) eNum.nextElement();
      if (tp == prg) {
        found = true;
        break;
      }
    }
    if (found == true) {
      while (eNum.hasMoreElements()) {
        tp = (TvProgram) eNum.nextElement();
        if (tp.getChannel().equalsIgnoreCase(prg.getChannel())) {
          return tp;
        }
      }
    }
    return null;
  }

  public void update() {
    String url = "http://www.telkku.com/ohjelmatiedot";

    StringBuffer bufs[] = new StringBuffer[CHANNELS.length];
    for (int xx = 0; xx < bufs.length; xx++) {
      bufs[xx] = new StringBuffer();
    }

    for (int t = 0; t < 10; t++) {

      String urli = url + t + "0";
      if (t == 0) {
        urli += "m";
      }
      urli += ".shtml";

      HttpPageFetcher pf = null;
      try {
        pf = new HttpPageFetcher(urli);
      } catch (Exception e) {
        System.out.println("INVALID URL: " + url);
      }

      String l = null;
      StringBuffer sb = null;
      Vector blocks = new Vector();;
      while (pf.hasMoreLines()) {
        l = pf.nextLine();
        //   System.out.print("'" + l + "'");
        if (l.matches("\\d\\d:\\d\\d.*")) {
          if (sb == null) {
            sb = new StringBuffer();
          }
          sb.append(l + "\n");
          //  System.out.println(" ADD LINE");
        } else {
          if (sb != null) {
            blocks.add(sb);
            sb = null;
            //    System.out.println(" TO VECTOR & NEW");
          } else {
            //    System.out.println();
          }
        }
      }

      for (int xx = 0; xx < blocks.size(); xx++) {
        StringBuffer sb1 = (StringBuffer) blocks.get(xx);
        StringBuffer sb2 = bufs[xx % 5];
        sb2.append(sb1.toString());
      }
    }

    _programs = new Vector();

    for (int xx = 0; xx < bufs.length; xx++) {

      StringBuffer sb = bufs[xx];

      BufferedReader br =
        new BufferedReader(new StringReader(bufs[xx].toString()));
      int c = 0;
      Calendar cal = Calendar.getInstance();
      cal.set(Calendar.SECOND, 0);
      cal.set(Calendar.MILLISECOND, 0);

      String l = null;
      int check = 0;
      int hh = 0, mm = 0;
      do {
        try {
          c++;
          l = br.readLine();
          if (l != null) {
            cal = (Calendar) cal.clone();
            check = hh;
            hh = Integer.parseInt(l.substring(0, 2));
            mm = Integer.parseInt(l.substring(3, 5));
            if (hh < check) {
              cal.roll(Calendar.DAY_OF_YEAR, 1);
            }
            cal.set(Calendar.HOUR_OF_DAY, hh);
            cal.set(Calendar.MINUTE, mm);
            String str2 = l.substring(6);
            TvProgram prog = new TvProgram(cal, CHANNELS[xx], str2);
            _programs.add(prog);
          }
        } catch (IOException e) {
          e.printStackTrace();
        }
      } while (l != null);
    }
    Collections.sort(_programs);
    System.out.println("Programs fetched!");
  }

  public static void main(String[] args) {
    TvProgs tv = new TvProgs();
    tv.update();

    for (int xx = 0; xx < CHANNELS.length; xx++) {
      TvProgram prg = tv.getProgram(CHANNELS[xx], Calendar.getInstance());
      System.out.println(prg);
    }
  }

}

//===============================================//

/*
 * COPYRIGHT 2004 Petri Airio
 *
 * All rights reserved.
 *
 */


import java.util.Calendar;
import java.text.SimpleDateFormat;

/**
 * TvProgram
 *
 * $Revision: 1.1 $
 * @author Petri Airio
 */


public class TvProgram implements Comparable {

  //~ Instance/static variables ..............................................

  private static int _idCounter = 0;
  private static SimpleDateFormat _sdf1 = new SimpleDateFormat("HH:mm");
  private static SimpleDateFormat _sdf2 = new SimpleDateFormat("dd/MM HH:mm");
   
  private Calendar _startTime;
  private String _channel;
  private String _name;
  private int _id;

  //~ Constructors ...........................................................

  public TvProgram(Calendar startTime, String channel, String name) {
    _startTime = startTime;
    _channel = channel;
    _name = name;
    _id = _idCounter++;
  }

  //~ Methods ................................................................

  public Calendar getStartTime() {
    return _startTime;
  }

  public String getChannel() {
    return _channel;
  }

  public String getName() {
    return _name;
  }

  public int getId() {
    return _id;
  }

  public String getTimeStr() {
    int day = Calendar.getInstance().get(Calendar.DAY_OF_MONTH);
    String dayStr = null;
    if (day == getStartTime().get(Calendar.DAY_OF_MONTH)) {
      dayStr = _sdf1.format(getStartTime().getTime()) + " ";
    } else {
      dayStr = _sdf2.format(getStartTime().getTime()) + " ";
    }
    return dayStr;
  }

  public int compareTo(Object o) {
    TvProgram tp = (TvProgram) o;
    long time1 = tp.getStartTime().getTime().getTime();;
    long time2 = this.getStartTime().getTime().getTime();

    if (time1 == time2) {
      return 0;
    }

    if (time1 < time2) {
      return 1;
    } else {
      return -1;
    }
    // java 1.5
    //    return this.getStartTime().compareTo(tp.getStartTime());
  }

  public String toString() {
    return "[" + _id + "] " + _startTime.getTime() + " - " + _channel + " -> " + _name;
  }

}

//===============================================//

/*
 * COPYRIGHT 2004 Petri Airio
 *
 * All rights reserved.
 *
 */


import com.arthurdo.parser.HtmlStreamTokenizer;
import com.arthurdo.parser.HtmlTag;
import com.arthurdo.parser.HtmlException;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.io.StringReader;

import java.net.URL;
import java.net.MalformedURLException;

/**
 * Fetches pages from the web.
 *
 * HtmlStreamTokenizer library homepage:
 * http://www.do.org/products/parser/
 *
 * @author Petri Airio
 */


public class HttpPageFetcher {

//~ Instance/static variables ..............................................

  private boolean _flag = true;
  private StringBuffer _textBuffer;
  private StringBuffer _htmlBuffer;
  private String _line = null;
  private BufferedReader _lines;
  private HtmlStreamTokenizer _tok;

//~ Constructors ...........................................................

  public HttpPageFetcher(String address)
    throws MalformedURLException, IOException, HtmlException {
   
    URL url = new URL(address);
   
    BufferedReader br =
      new BufferedReader(new InputStreamReader(url.openStream()));

    _htmlBuffer = new StringBuffer();
    String l = null;
    do {
      try {
        l = br.readLine();
      } catch (IOException ex) {
        ex.printStackTrace();
      }
      if (l != null) {
        _htmlBuffer.append(l + "\n");
      }
    } while (l != null);

    _tok = new HtmlStreamTokenizer(new StringReader(_htmlBuffer.toString()));

    HtmlTag tag = new HtmlTag();
    _textBuffer = new StringBuffer();
    while (_tok.nextToken() != HtmlStreamTokenizer.TT_EOF) {
      int ttype = _tok.getTokenType();
      if (ttype == HtmlStreamTokenizer.TT_TEXT) {
        //        System.out.println("text: " + _tok.getStringValue());
        _textBuffer.append(_tok.getStringValue());
      }
    }

    HtmlStreamTokenizer.unescape(_textBuffer);
    reset();
  }

//~ Methods ................................................................

  public void reset() {
    _lines = new BufferedReader(new StringReader(_textBuffer.toString()));
    _flag = true;
    _line = getLine();   
  }

  public StringBuffer getTextBuffer() {
    return _textBuffer;
  }
  public StringBuffer getHtmlBuffer() {
    return _htmlBuffer;
  }

  private String getLine() {
    String line = null;
    try {
      line = _lines.readLine();
    } catch (IOException e) {
      _flag = false;
    }
    if (line == null) {
      _flag = false;
    }
    return line;
  }

  public String nextLine() {
    String line = _line;
    _line = getLine();
    return line;
  }

  public boolean hasMoreLines(){
    return _flag;
  }

}