package cn.ictgu.parse;
import cn.ictgu.dto.Article;
import cn.ictgu.dto.Video;
import cn.ictgu.parse.article.Didispace;
import cn.ictgu.parse.article.Weixin;
import cn.ictgu.parse.video.Imooc;
import cn.ictgu.parse.video.Letv;
import cn.ictgu.parse.video.Panda;
import cn.ictgu.tools.UrlUtils;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.log4j.Log4j2;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
/**
* Video
* Created by Silence on 2017/4/14.
*/
@Service
@Log4j2
public class VideoParserManager implements ParserManager{
@Autowired
private StringRedisTemplate redisTemplate;
private Map<String, Parser> parserMap;
public VideoParserManager(){
parserMap = new HashMap<>();
parserMap.put("le.com", new Letv());
parserMap.put("imooc.com", new Imooc());
parserMap.put("panda.tv", new Panda());
parserMap.put("mp.weixin.qq.com", new Weixin());
parserMap.put("blog.didispace.com", new Didispace());
}
public Parser getParser(String key){
return parserMap.get(key);
}
public Video parseVideo(String url){
String cacheValue = redisTemplate.opsForValue().get(url);
Video video;
if (StringUtils.isEmpty(cacheValue)){
log.info("Parse:" + url);
String key = UrlUtils.getTopDomain(url);
Parser videoParser = this.getParser(key);
video = (Video) videoParser.parse(url);
this.cacheVideoInfo(url, video);
}else {
log.info("Get cache info:" + url);
video = JSONObject.parseObject(cacheValue, Video.class);
}
log.debug("VIDEO: "+ JSONObject.toJSONString(video));
return video;
}
public Article parseArticle(String url) {
String key = UrlUtils.getDomain(url);
Parser articleParser = this.getParser(key);
return (Article) articleParser.parse(url);
}
@Async
private void cacheVideoInfo(String url, Video video){
if (StringUtils.isNotEmpty(video.getPlayUrl())){
log.info("Cache video:" + url);
String value = JSONObject.toJSONString(video);
redisTemplate.opsForValue().set(url, value);
redisTemplate.expire(url, 3, TimeUnit.HOURS);
}
}
}