package nliveroid.nlr.main.parser;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import nliveroid.nlr.main.ErrorCode;
import nliveroid.nlr.main.LiveInfo;
import nliveroid.nlr.main.NLiveRoid;
import nliveroid.nlr.main.SearchTab.SearchTask;
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 ChannelParser implements ContentHandler {
private String startTag;
private ArrayList<LiveInfo> liveInfos = new ArrayList<LiveInfo>();
private StringBuilder innerText = new StringBuilder(1024);
private LiveInfo tempInfo = new LiveInfo();
private byte divCount = 0;
private byte h3Count = 0;
private SearchTask task;
private Pattern lvpt = Pattern.compile("lv[0-9]+");
private ErrorCode error;//最初のパースとサムネイル取得に必要
public ChannelParser(SearchTask task,ErrorCode error){
this.task = task;
this.error = error;
}
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(divCount == 5 && startTag.equals("div")){
tempInfo.setTitle(getInnerText(arg0,arg2));
// Log.d("NLiveRoid"," ChannelParser " + divCount + " " + tempInfo.getTitle());
divCount = 6;
}else if(divCount == 7 && startTag.equals("div")){
tempInfo.setDescription(getInnerText(arg0,arg2));
// Log.d("NLiveRoid"," ChannelParser " + divCount + " " + tempInfo.getDescription());
divCount = 8;
}else if(divCount == 9 && startTag.equals("dd")){
tempInfo.setStartTime(getInnerText(arg0,arg2));
liveInfos.add(tempInfo.clone());
tempInfo = new LiveInfo();
// Log.d("NLiveRoid"," ChannelParser " + divCount +" " + tempInfo.getStartTime());
divCount = 0;
}
}
@Override
public void startElement(String arg0, String arg1, String arg2,
Attributes attr) throws SAXException {
if(arg1.equals("h3") && attr != null && attr.getValue("class") != null && attr.getValue("class").equals("secttl")){//過去に切り替わった
Log.d("NLiveRoid"," ChannelParser CCCC h3");
h3Count++;
}
if(divCount == 0 && arg1.equals("li") && attr != null && attr.getValue("class") != null && attr.getValue("class").equals("live")){
if(h3Count == 1)tempInfo.setLiveStarted(true);//現在放送中ならtrueにしておいてSearchTabで区別する
divCount = 1;
}else if(divCount == 1 && arg1.equals("a") && attr != null && attr.getValue("href") != null){
Matcher mc = lvpt.matcher(attr.getValue("href"));
if(mc.find()){
tempInfo.setLiveID(mc.group());
}else{
error.setErrorCode(-27);
Log.d("NLiveRoid","Failed ChannelParser :00");
task.finishCallBack(null,new LinkedHashMap<String, String>());
}
// Log.d("NLiveRoid"," ChannelParser " + divCount);
divCount = 2;
}else if(divCount == 2 && arg1.equals("img") && attr != null && attr.getValue("data-src") != null){
tempInfo.setThumbnailURL(attr.getValue("data-src"));//サムネイルは全然chXXXが無いのでURLを取得
// Log.d("NLiveRoid"," ChannelParser " + divCount + " " + tempInfo.getThumbnailURL());
divCount = 3;
}else if(divCount == 3 && arg1.equals("div")){//charcterはエンドタグの間でも呼ばれるのでこうする
divCount = 4;
}else if(divCount == 4 && arg1.equals("div")){
divCount = 5;
}else if(divCount == 6 && arg1.equals("div")){
divCount = 7;
}else if(divCount == 8 && arg1.equals("div")){
divCount = 9;
}
if(divCount >= 5)startTag = arg1;
}
@Override
public void endDocument() throws SAXException {
if(NLiveRoid.isDebugMode)Log.d("NLiveRoid","CEND endDocument ---- " + startTag);
task.finishCallBack(liveInfos);
}
@Override
public void endElement(String arg0, String arg1, String arg2)throws SAXException {
}
@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
if(NLiveRoid.isDebugMode)Log.d("NLiveRoid","CEND startDocument -------------- " + startTag);
}
@Override
public void startPrefixMapping(String arg0, String arg1)
throws SAXException {
// TODO
}
}