/*
* Copyright (C) 2013 Chen Hui <calmer91@gmail.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package master.flame.danmaku.danmaku.parser.android;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.graphics.Color;
import master.flame.danmaku.danmaku.model.BaseDanmaku;
import master.flame.danmaku.danmaku.model.android.Danmakus;
import master.flame.danmaku.danmaku.parser.BaseDanmakuParser;
import master.flame.danmaku.danmaku.parser.DanmakuFactory;
public class AcFunDanmakuParser extends BaseDanmakuParser {
@Override
public Danmakus parse() {
if (mDataSource != null && mDataSource instanceof JSONSource) {
JSONSource jsonSource = (JSONSource) mDataSource;
return doParse(jsonSource.data());
}
return new Danmakus();
}
/**
* @param danmakuListData 弹幕数据
* 传入的数组内包含普通弹幕,会员弹幕,锁定弹幕。
* @return 转换后的Danmakus
*/
private Danmakus doParse(JSONArray danmakuListData) {
Danmakus danmakus = new Danmakus();
if (danmakuListData == null || danmakuListData.length() == 0) {
return danmakus;
}
for (int i = 0; i < danmakuListData.length(); i++) {
try {
JSONArray danmakuArray = danmakuListData.getJSONArray(i);
if (danmakuArray != null) {
danmakus = _parse(danmakuArray, danmakus);
}
} catch (JSONException e) {
}
}
return danmakus;
}
private Danmakus _parse(JSONArray jsonArray, Danmakus danmakus) {
if (danmakus == null) {
danmakus = new Danmakus();
}
if (jsonArray == null || jsonArray.length() == 0) {
return danmakus;
}
for (int i = 0; i < jsonArray.length(); i++) {
try {
JSONObject obj = jsonArray.getJSONObject(i);
String c = obj.getString("c");
String[] values = c.split(",");
if (values.length > 0) {
int type = Integer.parseInt(values[2]); // 弹幕类型
if (type == 7)
// FIXME : hard code
// TODO : parse advance danmaku json
continue;
long time = (long) (Float.parseFloat(values[0]) * 1000); // 出现时间
int color = Integer.parseInt(values[1]) | 0xFF000000; // 颜色
float textSize = Float.parseFloat(values[3]); // 字体大小
BaseDanmaku item = DanmakuFactory.createDanmaku(type, mDisp);
if (item != null) {
item.time = time;
item.textSize = textSize * (mDispDensity - 0.6f);
item.textColor = color;
item.textShadowColor = color <= Color.BLACK ? Color.WHITE : Color.BLACK;
DanmakuFactory.fillText(item, obj.optString("m", "...."));
item.index = i;
item.setTimer(mTimer);
danmakus.addItem(item);
}
}
} catch (JSONException e) {
} catch (NumberFormatException e) {
}
}
return danmakus;
}
}