package com.zdcf.service.Impl;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.annotation.Resource;
import org.apache.log4j.Logger;
import org.jsoup.Connection;
import org.jsoup.Connection.Response;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.zdcf.base.Constants;
import com.zdcf.dto.ZhihuDTO;
import com.zdcf.mapper.FileMapper;
import com.zdcf.mapper.MovieMapper;
import com.zdcf.model.Movie;
import com.zdcf.model.Zhihu;
import com.zdcf.service.BaseService;
import com.zdcf.service.MovieService;
import com.zdcf.tool.PageInfo;
@Service
@Transactional
public class MovieServiceImpl extends BaseService implements MovieService {
@Resource
private FileMapper fileMapper;
@Resource
private MovieMapper movieMapper;
@Resource
private RedisCacheService redisCacheService;
private static Logger logger = Logger.getLogger(MovieServiceImpl.class);
private static final String URL = "http://www.hdwan.net/page/";
@Override
public Movie getMovieById(int id) {
Movie temp = new Movie();
temp.setId(id);
Movie movie = redisCacheService.get(temp.getCacheKey(), Movie.class);
//不在缓存中,去数据库中查询
if(movie == null){
movie = movieMapper.getMovieById(id);
if(movie !=null){
movieMapper.updateMovieReviewNum(id);
movie.setReviewNum(movie.getReviewNum()+1);
super.sendMessage(movie, Constants.Cache.Type.update);
}
}
return movie;
}
@Override
public List<Movie> getPage(PageInfo page) {
Document doc=null;
try {
doc = getConnect(getPageUrl(page.getCurPageNo())).get();
} catch (IOException e) {
throw new RuntimeException(e);
}
Elements els = doc.select("#post_container > li");
if(els != null){
List<Movie> Movies = new ArrayList<>();
for(int i = 0;i<els.size();i++){
Element li = els.get(i);
Elements as = li.select(".thumbnail a");
for(Element a:as){
String href = a.attr("href");
Elements img = a.select(" > img");
String imgUrl = img.attr("src");
String title = a.attr("title");
if(!checkHave(title)){
Movie vo = getRecord(href);
vo.setName(title);
vo.setImg(imgUrl);
movieMapper.addMovie(vo);
logger.info("插入:"+vo.getName());
Movie vi = movieMapper.getMovieDetailbyName(title);
vi.setReviewNum(0);
vi.setAddTime(new Date());
vi.setUpdateTime(new Date());
super.sendMessage(vi, Constants.Cache.Type.save);
Movies.add(vo);
}
}
// if(i==2)break;
}
return Movies;
}
return null;
}
private boolean checkHave(String title) {
Integer count = movieMapper.getMoviebyName(title);
if(count != null){
System.err.println("已经存在:"+title);
return true;
}
return false;
}
private Connection getConnect(String url) {
return Jsoup.connect(url).header("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36").timeout(100000);
}
@Override
public Movie getRecord(String url) {
Movie vo = new Movie();
Document doc=null;
try {
doc = getConnect(url).get();
} catch (IOException e) {
throw new RuntimeException(e);
}
Elements els = doc.select("#post_content");
if(els != null && !els.isEmpty()){
Element content = els.get(0);
vo.setMetadata(content.html());
Elements as = content.child(0).lastElementSibling().select("a");
if(as != null && !as.isEmpty()){
String href = as.get(0).attr("href");
if(href != null && href.startsWith("http")){
try {
byte[] torrent = getTorrent(href);
//TODO 种子另外保存
// vo.setTorrent(torrent);
} catch (Exception e) {
vo.setDurl(href);
}
}else{
vo.setDurl(href);
}
}
}
return vo;
}
@Override
public byte[] getTorrent(String href) {
Response response=null;
try {
response = getConnect(href).ignoreContentType(true).execute();
} catch (IOException e) {
throw new RuntimeException(e);
}
return response.bodyAsBytes();
}
@Override
public PageInfo buildPage(int curNo) {
return new PageInfo(curNo,10);
}
public String getPageUrl(int pageNo) {
return URL+pageNo;
}
@Override
public List<Movie> nextPage() {
return null;
}
@Override
public Movie nextRecord() {
return null;
}
}