package nliveroid.nlr.main.parser;
import java.util.ArrayList;
import java.util.regex.Pattern;
import nliveroid.nlr.main.NLiveRoid;
import nliveroid.nlr.main.TimeShiftDialog.TimeShiftTask;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import android.util.Log;
public class TimeShiftParser implements ContentHandler {
private String startTag;
private Attributes nowAttr;
private StringBuilder innerText = new StringBuilder(1024);
private ArrayList<String[]> infos = new ArrayList<String[]>();
private String[] info = new String[3];
private byte propertyCount = 0;
private byte parseCount = 0;
private TimeShiftTask task;
private boolean parseEnd = false;
public TimeShiftParser(TimeShiftTask timeShiftTask){
this.task = timeShiftTask;
}
private String getInnerText(char[] arg0,int arg2){
innerText = innerText.delete(0,arg0.length);
innerText.append(arg0, 0, arg2);
return innerText.toString();
}
@Override
public void characters(char[] arg0, int arg1, int arg2) throws SAXException {
if(propertyCount == 1 &&startTag.equals("b")){//一般の時はここが来ないので、h3ttlでひっかける
info[1] = getInnerText(arg0,arg2).replaceAll(" |件", "");//最初の1つは api-key,あと何件ご利用に,ulckがこの順番でくる
if(NLiveRoid.isDebugMode)Log.d("NLiveRoid","Count 1: " + info[1] );
propertyCount = 2;
}else if(parseCount == 2){
getInnerText(arg0,arg2);
}
}
@Override
public void startElement(String arg0, String arg1, String arg2,
Attributes attr) throws SAXException {
// Log.d("NLiveRoid","sTag " + arg1);
// for(int i = 0; attr != null && i < attr.getLength(); i++){
// Log.d("NLiveRoid", "att " + attr.getLocalName(i) + " " + attr.getValue(i));
// }
if(parseCount == 2||propertyCount == 1){
startTag=arg1;
nowAttr = attr;
}else if(propertyCount == 0 && arg1.equals("span") && attr != null && attr.getValue("api-key") != null){
if(NLiveRoid.isDebugMode)Log.d("NLiveRoid"," Count 0(api):" + attr.getValue("api-key"));
propertyCount = 1;
startTag = "";
info[0] = attr.getValue("api-key");
info[1] = "?";//一般はここが入ってこないので入れておく
}else if(propertyCount == 2 && arg1.equals("input") && attr != null && attr.getValue("name") != null && attr.getValue("name").equals("confirm")){
info[2] = attr.getValue("value");//ulck
if(NLiveRoid.isDebugMode)Log.d("NLiveRoid"," Count 2:" + info[2]);
infos.add(info.clone());
info = new String[3];
propertyCount = -1;
}else if(parseCount == 0 && arg1.equals("div") && attr != null && attr.getValue("class") != null ){
if(attr.getValue("class").equals("column")){
if(NLiveRoid.isDebugMode)Log.d("NLiveRoid"," Count 0:");//新たな放送開始
parseCount = 1;//ここで2にして↓のifでLVとタイトルが入ってるはず
}else if(!parseEnd && attr.getValue("id") != null && attr.getValue("id").equals("Favorite_list")){//パース終わり
parseEnd = true;
Log.d("NLiveRoid"," Favorite_list:");
task.finishCallBack(infos);
}
}else if(parseCount == 1 && arg1.equals("a")){
if(NLiveRoid.isDebugMode)Log.d("NLiveRoid"," Count 1:");
info[0] = attr.getValue("href").replaceAll("http://live.nicovideo.jp/gate/", "");
info[1] = attr.getValue("title").replaceAll("\n|\t", "");
startTag = "";
parseCount = 2;//ここでchar取得するモードにして次のspanの終わりタグの時にステータスが入る
}
}
@Override
public void endElement(String arg0, String arg1, String arg2)throws SAXException {
// Log.d("NLiveRoid","eTag" + arg2);
if(propertyCount == 1 && arg1.equals("h3"))propertyCount = 2;//一般は件数が表示されない
if(parseCount == 2 && arg1.equals("span")){//終わりタグがspanなら中のテキストでステータスを全て判断
info[2] = innerText.toString().replaceAll("\n|\t| | ", "");;
if(NLiveRoid.isDebugMode)Log.d("NLiveRoid"," Count 2:" + info[2]);
infos.add(info.clone());
info = new String[3];
parseCount = 0;
}
}
@Override
public void endDocument() throws SAXException {
if(!parseEnd){
if(NLiveRoid.isDebugMode)Log.d("NLiveRoid","ParseFailed TS..");
task.finishCallBack(null);
}
}
@Override
public void endPrefixMapping(String arg0) throws SAXException {}
@Override
public void ignorableWhitespace(char[] arg0, int arg1, int arg2)
throws SAXException {
// TODO
}
@Override
public void processingInstruction(String arg0, String arg1)
throws SAXException {
// TODO
}
@Override
public void setDocumentLocator(Locator arg0) {
// TODO
}
@Override
public void skippedEntity(String arg0) throws SAXException {
// TODO
}
@Override
public void startDocument() throws SAXException {
// TODO
}
@Override
public void startPrefixMapping(String arg0, String arg1)
throws SAXException {
// TODO
}
}