src/main/java/com/yeshi/buwan/aspect/ParamsCheckAspect.java
@@ -1,6 +1,6 @@ package com.yeshi.buwan.aspect; import com.beust.jcommander.internal.Lists; import com.google.common.collect.Lists; import com.google.gson.Gson; import com.yeshi.buwan.exception.ParamsException; import org.aspectj.lang.JoinPoint; src/main/java/com/yeshi/buwan/dao/juhe/internetsearch/InternetSearchVideoDao.java
New file @@ -0,0 +1,58 @@ package com.yeshi.buwan.dao.juhe.youku; import com.yeshi.buwan.domain.video.InternetSearchVideo; import com.yeshi.buwan.dao.base.MongodbBaseDao; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Update; import org.springframework.stereotype.Repository; import java.util.Date; @Repository public class InternetSearchVideoDao extends MongodbBaseDao<InternetSearchVideo>{ public void updateSelective(InternetSearchVideo bean) { Query query = new Query(); Update update=new Update(); query.addCriteria(Criteria.where("id").is(bean.getId())); if(bean.getName() != null) { update.set("name", bean.getName()); } if(bean.getNameStr() != null) { update.set("nameStr", bean.getNameStr()); } if(bean.getVpicture() != null) { update.set("vpicture", bean.getVpicture()); } if(bean.getHpicture() != null) { update.set("hpicture", bean.getHpicture()); } if(bean.getArea() != null) { update.set("area", bean.getArea()); } if(bean.getTag() != null) { update.set("tag", bean.getTag()); } if(bean.getVideoCount() != null) { update.set("videoCount", bean.getVideoCount()); } if(bean.getYear() != null) { update.set("year", bean.getYear()); } if(bean.getRootType() != null) { update.set("rootType", bean.getRootType()); } if(bean.getActors() != null) { update.set("actors", bean.getActors()); } if(bean.getDirector() != null) { update.set("director", bean.getDirector()); } if(bean.getResourceIds() != null) { update.set("resourceIds", bean.getResourceIds()); } update.set("updateTime", new Date()); update(query, update); } } src/main/java/com/yeshi/buwan/dao/juhe/tencent/TencentCoverInfoDao.java
New file @@ -0,0 +1,94 @@ package com.yeshi.buwan.dao.juhe.tencent; import com.yeshi.buwan.tencent.entity.TencentCoverInfo; import com.yeshi.buwan.dao.base.MongodbBaseDao; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Update; import org.springframework.stereotype.Repository; import java.util.Date; @Repository public class TencentCoverInfoDao extends MongodbBaseDao<TencentCoverInfo>{ public void updateSelective(TencentCoverInfo bean) { Query query = new Query(); Update update=new Update(); query.addCriteria(Criteria.where("id").is(bean.getId())); if(bean.getDouban_score() != null) { update.set("douban_score", bean.getDouban_score()); } if(bean.getPay_status() != null) { update.set("pay_status", bean.getPay_status()); } if(bean.getYear() != null) { update.set("year", bean.getYear()); } if(bean.getEpisode_updated() != null) { update.set("episode_updated", bean.getEpisode_updated()); } if(bean.getEpisode_all() != null) { update.set("episode_all", bean.getEpisode_all()); } if(bean.getCurrent_num() != null) { update.set("current_num", bean.getCurrent_num()); } if(bean.getPublish_date() != null) { update.set("publish_date", bean.getPublish_date()); } if(bean.getTitle() != null) { update.set("title", bean.getTitle()); } if(bean.getDescription() != null) { update.set("description", bean.getDescription()); } if(bean.getCover_id() != null) { update.set("cover_id", bean.getCover_id()); } if(bean.getType_name() != null) { update.set("type_name", bean.getType_name()); } if(bean.getArea_name() != null) { update.set("area_name", bean.getArea_name()); } if(bean.getHorizontal_pic_url() != null) { update.set("horizontal_pic_url", bean.getHorizontal_pic_url()); } if(bean.getVertical_pic_url() != null) { update.set("vertical_pic_url", bean.getVertical_pic_url()); } if(bean.getSecond_title() != null) { update.set("second_title", bean.getSecond_title()); } if(bean.getLangue() != null) { update.set("langue", bean.getLangue()); } if(bean.getMain_genre() != null) { update.set("main_genre", bean.getMain_genre()); } if(bean.getScore() != null) { update.set("score", bean.getScore()); } if(bean.getDirector() != null) { update.set("director", bean.getDirector()); } if(bean.getLeading_actor() != null) { update.set("leading_actor", bean.getLeading_actor()); } if(bean.getVip_ids() != null) { update.set("vip_ids", bean.getVip_ids()); } if(bean.getSubtype() != null) { update.set("subtype", bean.getSubtype()); } if(bean.getSub_genre() != null) { update.set("sub_genre", bean.getSub_genre()); } if(bean.getCreateTime() != null) { update.set("createTime", bean.getCreateTime()); } update.set("updateTime", new Date()); update(query, update); } } src/main/java/com/yeshi/buwan/domain/video/InternetSearchVideo.java
New file @@ -0,0 +1,204 @@ package com.yeshi.buwan.domain.video; import com.yeshi.buwan.util.StringUtil; import org.apache.solr.client.solrj.beans.Field; import org.hibernate.validator.constraints.NotEmpty; import org.springframework.data.annotation.Id; import org.springframework.data.annotation.Transient; import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.solr.core.mapping.Indexed; import java.util.Date; /** * 全网搜实体 */ @Document(collection = "internetSearchVideo") public class InternetSearchVideo { @NotEmpty(message = "id不能为空") @Id @Field private String id; @NotEmpty(message = "名称不能为空") @Field private String name; @Field private String nameStr; @NotEmpty(message = "竖图不能为空") @Field private String vpicture; @NotEmpty(message = "横图不能为空") @Field private String hpicture; @Field private String area; @Field private String tag; @Field private Integer videoCount; @Field private String year; @Indexed @Field private Integer rootType; @Field private String actors;//演员 @Field private String director;//导演 @Indexed @Field private String resourceIds; @Transient @Field private Date solrTime; @Field private Date updateTime; private Date createTime; private String desc; public Date getSolrTime() { return solrTime; } public void setSolrTime(Date solrTime) { this.solrTime = solrTime; } public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } public static String createId(String name, int year, String rootType) { return StringUtil.Md5(name + "#" + year + "#" + rootType); } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getNameStr() { return nameStr; } public void setNameStr(String nameStr) { this.nameStr = nameStr; } public String getVpicture() { return vpicture; } public void setVpicture(String vpicture) { this.vpicture = vpicture; } public String getHpicture() { return hpicture; } public void setHpicture(String hpicture) { this.hpicture = hpicture; } public String getArea() { return area; } public void setArea(String area) { this.area = area; } public String getTag() { return tag; } public void setTag(String tag) { this.tag = tag; } public Integer getVideoCount() { return videoCount; } public void setVideoCount(Integer videoCount) { this.videoCount = videoCount; } public String getYear() { return year; } public void setYear(String year) { this.year = year; } public Integer getRootType() { return rootType; } public void setRootType(Integer rootType) { this.rootType = rootType; } public String getActors() { return actors; } public void setActors(String actors) { this.actors = actors; } public String getDirector() { return director; } public void setDirector(String director) { this.director = director; } public String getResourceIds() { return resourceIds; } public void setResourceIds(String resourceIds) { this.resourceIds = resourceIds; } public Date getUpdateTime() { return updateTime; } public void setUpdateTime(Date updateTime) { this.updateTime = updateTime; } public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; } } src/main/java/com/yeshi/buwan/dto/mq/InternetSearchVideoMQMsg.java
New file @@ -0,0 +1,31 @@ package com.yeshi.buwan.dto.mq; public class InternetSearchVideoMQMsg { private String handler; private String id; private Integer resourceId; public String getHandler() { return handler; } public void setHandler(String handler) { this.handler = handler; } public String getId() { return id; } public void setId(String id) { this.id = id; } public Integer getResourceId() { return resourceId; } public void setResourceId(Integer resourceId) { this.resourceId = resourceId; } } src/main/java/com/yeshi/buwan/service/imp/juhe/InternetSearchVideoServiceImpl.java
New file @@ -0,0 +1,78 @@ package com.yeshi.buwan.service.imp.juhe; import com.yeshi.buwan.dao.juhe.youku.InternetSearchVideoDao; import com.yeshi.buwan.domain.video.InternetSearchVideo; import com.yeshi.buwan.exception.ParamsException; import com.yeshi.buwan.service.inter.juhe.InternetSearchVideoService; import org.springframework.data.mongodb.core.query.Query; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import org.yeshi.utils.StringUtil; import javax.annotation.Resource; import javax.validation.Valid; import java.util.*; @Service public class InternetSearchVideoServiceImpl implements InternetSearchVideoService { @Resource private InternetSearchVideoDao internetSearchVideoDao; @Validated @Override public void save(@Valid InternetSearchVideo video) throws ParamsException, Exception { InternetSearchVideo oldVideo = internetSearchVideoDao.get(video.getId()); Set<Integer> resourceIds = listResourceId(video); resourceIds.add(Integer.parseInt(video.getResourceIds())); Integer[] rids = new Integer[resourceIds.size()]; resourceIds.toArray(rids); video.setResourceIds(StringUtil.concat(rids, ",")); if (oldVideo == null) { video.setCreateTime(new Date()); internetSearchVideoDao.save(video); } else { internetSearchVideoDao.updateSelective(video); } } private Set<Integer> listResourceId(InternetSearchVideo video) { if (video == null) { return new HashSet<>(); } List<String> list = Arrays.asList(video.getResourceIds().split(",")); Set<Integer> sets = new HashSet<>(); for (String st : list) { sets.add(Integer.parseInt(st)); } return sets; } @Override public Set<Integer> listResourceId(String id) { InternetSearchVideo oldVideo = internetSearchVideoDao.get(id); return listResourceId(oldVideo); } @Override public long countAll() { return internetSearchVideoDao.count(new Query()); } @Override public List<InternetSearchVideo> listAll(int page, int pageSize) { Query query = new Query(); query.skip((page - 1) * pageSize); query.limit(pageSize); return internetSearchVideoDao.findList(query); } @Override public InternetSearchVideo selectByPrimaryKey(String id) { return internetSearchVideoDao.get(id); } } src/main/java/com/yeshi/buwan/service/imp/juhe/TencentVideoServiceImpl.java
New file @@ -0,0 +1,53 @@ package com.yeshi.buwan.service.imp.juhe; import com.yeshi.buwan.dao.juhe.tencent.TencentCoverInfoDao; import com.yeshi.buwan.service.inter.juhe.TencentVideoService; import com.yeshi.buwan.tencent.entity.TencentCoverInfo; import com.yeshi.buwan.youku.entity.YouKuShowDetail; import com.yeshi.buwan.youku.entity.YouKuVideo; import org.springframework.data.domain.Sort; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.Date; import java.util.List; @Service public class TencentVideoServiceImpl implements TencentVideoService { @Resource private TencentCoverInfoDao tencentCoverInfoDao; @Override public void save(TencentCoverInfo detail) { if (detail.getUpdateTime() == null) detail.setUpdateTime(new Date()); tencentCoverInfoDao.save(detail); } @Override public TencentCoverInfo getConverDetail(String id) { TencentCoverInfo detail = tencentCoverInfoDao.get(id); return detail; } @Override public long count(String type) { Query query = new Query(); if (type != null) query.addCriteria(Criteria.where("type").is(type)); return tencentCoverInfoDao.count(query); } @Override public List<TencentCoverInfo> list(String type, int page, int pageSize) { Query query = new Query(); if (type != null) query.addCriteria(Criteria.where("type").is(type)); query.limit(pageSize); query.skip((page - 1) * pageSize); return tencentCoverInfoDao.findList(query); } } src/main/java/com/yeshi/buwan/service/imp/juhe/YouKuServiceImpl.java
@@ -5,10 +5,14 @@ import com.yeshi.buwan.service.inter.juhe.YouKuService; import com.yeshi.buwan.youku.entity.YouKuShowDetail; import com.yeshi.buwan.youku.entity.YouKuVideo; import org.springframework.data.domain.Sort; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.Date; import java.util.List; @Service public class YouKuServiceImpl implements YouKuService { @@ -31,4 +35,36 @@ youKuVideoDao.save(video); } } @Override public YouKuShowDetail getShowDetail(String showId) { YouKuShowDetail detail = youKuShowDetailDao.get(showId); Query query = new Query(); if (detail != null) { query.addCriteria(Criteria.where("showId").is(showId)); } query.with(new Sort(new Sort.Order(Sort.Direction.ASC, "show_videoseq"))); List<YouKuVideo> videoList = youKuVideoDao.findList(query); detail.setVideoList(videoList); return detail; } @Override public long count(String category) { Query query = new Query(); if (category != null) query.addCriteria(Criteria.where("category").is(category)); return youKuShowDetailDao.count(query); } @Override public List<YouKuShowDetail> list(String category, int page, int pageSize) { Query query = new Query(); if (category != null) query.addCriteria(Criteria.where("category").is(category)); query.limit(pageSize); query.skip((page - 1) * pageSize); return youKuShowDetailDao.findList(query); } } src/main/java/com/yeshi/buwan/service/inter/juhe/InternetSearchVideoService.java
New file @@ -0,0 +1,23 @@ package com.yeshi.buwan.service.inter.juhe; import com.yeshi.buwan.domain.video.InternetSearchVideo; import com.yeshi.buwan.exception.ParamsException; import javax.validation.Valid; import java.util.List; import java.util.Set; public interface InternetSearchVideoService { public void save(@Valid InternetSearchVideo video) throws ParamsException, Exception; public Set<Integer> listResourceId(String id); public long countAll(); public List<InternetSearchVideo> listAll(int page, int pageSize); public InternetSearchVideo selectByPrimaryKey(String id); } src/main/java/com/yeshi/buwan/service/inter/juhe/TencentVideoService.java
New file @@ -0,0 +1,23 @@ package com.yeshi.buwan.service.inter.juhe; import com.yeshi.buwan.tencent.entity.TencentCoverInfo; import com.yeshi.buwan.youku.entity.YouKuShowDetail; import java.util.List; public interface TencentVideoService { /** * 保存 * * @param detail */ public void save(TencentCoverInfo detail); public TencentCoverInfo getConverDetail(String id); public long count(String type); public List<TencentCoverInfo> list(String type, int page, int pageSize); } src/main/java/com/yeshi/buwan/service/inter/juhe/YouKuService.java
@@ -2,12 +2,21 @@ import com.yeshi.buwan.youku.entity.YouKuShowDetail; import java.util.List; public interface YouKuService { /** * 保存 * * @param detail */ public void save(YouKuShowDetail detail); public YouKuShowDetail getShowDetail(String showId); public long count(String category); public List<YouKuShowDetail> list(String category, int page, int pageSize); } src/main/java/com/yeshi/buwan/service/manager/SolrInternetSearchVideoDataManager.java
New file @@ -0,0 +1,182 @@ package com.yeshi.buwan.service.manager; import com.yeshi.buwan.domain.video.InternetSearchVideo; import com.yeshi.buwan.dto.search.SolrResultDTO; import com.yeshi.buwan.dto.search.SolrVideoSearchFilter; import com.yeshi.buwan.service.inter.juhe.InternetSearchVideoService; import com.yeshi.buwan.util.StringUtil; import org.apache.solr.client.solrj.response.UpdateResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.data.domain.Sort; import org.springframework.data.solr.core.SolrTemplate; import org.springframework.data.solr.core.query.Criteria; import org.springframework.data.solr.core.query.Query; import org.springframework.data.solr.core.query.SimpleFilterQuery; import org.springframework.data.solr.core.query.SimpleQuery; import org.springframework.data.solr.core.query.result.ScoredPage; import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * 搜索引擎-全网搜数据管理 */ @Component public class SolrInternetSearchVideoDataManager { private final String CORE_NAME = "buwan_internet_search"; private final Logger logger = LoggerFactory.getLogger(SolrInternetSearchVideoDataManager.class); @Resource private SolrTemplate solrTemplate; @Resource private InternetSearchVideoService internetSearchVideoService; public void saveOrUpdate(InternetSearchVideo videoInfo) { if (videoInfo == null) return; videoInfo.setSolrTime(new Date()); UpdateResponse updateResponse = solrTemplate.saveBean(CORE_NAME, videoInfo); if (updateResponse.getStatus() == 0) { solrTemplate.commit(CORE_NAME); } else { solrTemplate.rollback(CORE_NAME); } } public void saveOrUpdate(List<InternetSearchVideo> videoInfoList) { for (InternetSearchVideo video : videoInfoList) { video.setSolrTime(new Date()); } UpdateResponse updateResponse = solrTemplate.saveBeans(CORE_NAME, videoInfoList); if (updateResponse.getStatus() == 0) { solrTemplate.commit(CORE_NAME); } else { solrTemplate.rollback(CORE_NAME); } } /** * 删除所有 */ // public void clear() { // Query query = new SimpleQuery("name:*"); // UpdateResponse updateResponse = solrTemplate.delete(query); // if (updateResponse.getStatus() == 0) { // solrTemplate.commit(); // } else { // solrTemplate.rollback(); // } // } public void deleteById(String id) { UpdateResponse updateResponse = solrTemplate.deleteById(CORE_NAME, id); if (updateResponse.getStatus() == 0) { solrTemplate.commit(CORE_NAME); } else { solrTemplate.rollback(CORE_NAME); } } public InternetSearchVideo findOne(String id) { InternetSearchVideo solrVideo = solrTemplate.getById(CORE_NAME, id, InternetSearchVideo.class); return solrVideo; } public SolrResultDTO find(SolrVideoSearchFilter filter, int page, int pageSize) { if (filter.getKey() == null) { filter.setKey(""); } logger.info(filter.getKey() + "#" + page); Query query = null; if (!StringUtil.isNullOrEmpty(filter.getKey())) { //solr精准检索需要带引号 query = new SimpleQuery(new Criteria("nameStr").startsWith(filter.getKey()).or("mainactor").expression("\"" + filter.getKey() + "\"")); } else if (!StringUtil.isNullOrEmpty(filter.getActor())) { query = new SimpleQuery(new Criteria("actors").expression("\"" + filter.getActor() + "\"")); } else if (!StringUtil.isNullOrEmpty(filter.getDirector())) { query = new SimpleQuery(new Criteria("director").expression("\"" + filter.getDirector() + "\"")); } else { query = new SimpleQuery("*:*"); } if (filter.getVideoType() != null) { query.addFilterQuery(new SimpleFilterQuery(Criteria.where("rootType").is(filter.getVideoType()))); } if (filter.getResourceIds() != null && filter.getResourceIds().length > 0) { query.addFilterQuery(new SimpleFilterQuery(Criteria.where("resourceIds").contains(filter.getResourceIds()))); } if (filter.getArea() != null) { query.addFilterQuery(new SimpleFilterQuery(Criteria.where("area").contains(filter.getArea()))); } /** 设置分页开始记录数(第一页) 默认0 */ query.setOffset((page - 1) * pageSize); /** 设置每页显示记录数,默认10 */ query.setRows(pageSize); if (!StringUtil.isNullOrEmpty(filter.getSortKey())) { query.addSort(new Sort(Sort.Direction.DESC, filter.getSortKey())); } ScoredPage<InternetSearchVideo> result = solrTemplate.queryForPage(CORE_NAME, query, InternetSearchVideo.class); System.out.println("总记录数:" + result.getTotalElements()); List<InternetSearchVideo> list = result.getContent(); return new SolrResultDTO(list, (int) result.getTotalElements()); } public List<String> getSuggestKeyList(String key) { Query query = new SimpleQuery(new Criteria("nameStr").startsWith(key)); /** 设置分页开始记录数(第一页) 默认0 */ query.setOffset(0); /** 设置每页显示记录数,默认10 */ query.setRows(10); ScoredPage<InternetSearchVideo> result = solrTemplate.queryForPage(CORE_NAME, query, InternetSearchVideo.class); System.out.println("总记录数:" + result.getTotalElements()); List<InternetSearchVideo> list = result.getContent(); List<String> keyList = new ArrayList<>(); for (InternetSearchVideo sv : list) if (!keyList.contains(sv.getName())) keyList.add(sv.getName()); return keyList; } /** * 同步所有专辑 */ public void syncAllAlbum() { long count = internetSearchVideoService.countAll(); int pageSize = 100; int pageCount = (int) (count % pageSize == 0 ? count / pageSize : count / pageSize + 1); for (int i = 0; i < pageCount; i++) { try { List<InternetSearchVideo> videoList = internetSearchVideoService.listAll(i + 1, pageSize); saveOrUpdate(videoList); } catch (Exception e) { logger.error("专辑搜索引擎数据同步失败", e); } } } public void syncAlbum(String videoId) { InternetSearchVideo video = internetSearchVideoService.selectByPrimaryKey(videoId); if (video == null) return; saveOrUpdate(video); } } src/main/java/com/yeshi/buwan/tencent/TencentVideoUtil.java
@@ -147,8 +147,8 @@ img = img.startsWith("http") ? img : "http:" + img; try { TencentCoverInfo coverInfo = getCoverInfo(href); coverInfo.setVertical_pic_url(img); System.out.println(coverInfo); } catch (Exception e) { e.printStackTrace(); } src/main/java/com/yeshi/buwan/tencent/entity/TencentCoverInfo.java
@@ -1,7 +1,12 @@ package com.yeshi.buwan.tencent.entity; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; import java.util.Date; import java.util.List; @Document(collection = "tencentCoverInfo") public class TencentCoverInfo { @@ -33,9 +38,10 @@ * sub_genre : ["剧情"] */ @Id private String id; private String douban_score; private int pay_status; private Integer pay_status; private String year; private String episode_updated; private String episode_all; @@ -57,6 +63,24 @@ private List<VipIdsBean> vip_ids; private List<String> subtype; private List<String> sub_genre; private Date createTime; private Date updateTime; public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; } public Date getUpdateTime() { return updateTime; } public void setUpdateTime(Date updateTime) { this.updateTime = updateTime; } public String getId() { return id; @@ -74,11 +98,11 @@ this.douban_score = douban_score; } public int getPay_status() { public Integer getPay_status() { return pay_status; } public void setPay_status(int pay_status) { public void setPay_status(Integer pay_status) { this.pay_status = pay_status; } src/main/java/com/yeshi/buwan/tencent/entity/TencentSearchVideoMap.java
New file @@ -0,0 +1,41 @@ package com.yeshi.buwan.tencent.entity; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.index.Indexed; import org.springframework.data.mongodb.core.mapping.Document; import java.util.Date; @Document(collection = "tencentSearchVideoMap") public class TencentSearchVideoMap { @Id private String videoId; @Indexed private String coverId; private Date createTime; public String getVideoId() { return videoId; } public void setVideoId(String videoId) { this.videoId = videoId; } public String getCoverId() { return coverId; } public void setCoverId(String coverId) { this.coverId = coverId; } public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; } } src/main/java/com/yeshi/buwan/util/SpringContext.java
@@ -3,6 +3,7 @@ import com.yeshi.buwan.domain.ResourceVideo; import com.yeshi.buwan.domain.VideoInfo; import com.yeshi.buwan.domain.VideoResource; import com.yeshi.buwan.domain.video.InternetSearchVideo; import com.yeshi.buwan.dto.mq.*; import com.yeshi.buwan.funtv.entity.FunTVAlbum2; import com.yeshi.buwan.iqiyi.entity.IqiyiAlbum2; @@ -13,8 +14,12 @@ import com.yeshi.buwan.service.inter.juhe.FunTV2Service; import com.yeshi.buwan.service.inter.juhe.Iqiyi2Service; import com.yeshi.buwan.service.inter.juhe.PPTVService; import com.yeshi.buwan.service.inter.juhe.YouKuService; import com.yeshi.buwan.service.manager.SolrAlbumVideoDataManager; import com.yeshi.buwan.service.manager.SolrInternetSearchVideoDataManager; import com.yeshi.buwan.util.factory.InternetSearchVideoFactory; import com.yeshi.buwan.util.mq.CMQManager; import com.yeshi.buwan.youku.entity.YouKuShowDetail; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.ApplicationListener; @@ -118,6 +123,55 @@ } @Resource private YouKuService youKuService; @Resource private SolrInternetSearchVideoDataManager solrInternetSearchVideoDataManager; private void doInternetSearchVideoUpdateJob() { for (int i = 0; i < 1; i++) { new JobThreadExecutorServiceImpl().run(new Runnable() { @Override public void run() { List<InternetSearchVideoMQMsg> solrMsgList = CMQManager.getInstance().consumeInternetSearchVideoUpdateMsg(16); if (solrMsgList != null) for (InternetSearchVideoMQMsg solrVideo : solrMsgList) { try { switch (solrVideo.getResourceId()) { //优酷 case 20: YouKuShowDetail detail = youKuService.getShowDetail(solrVideo.getId()); if (detail == null) {//被删除 solrInternetSearchVideoDataManager.deleteById(detail.getId()); } else {//更新 InternetSearchVideo video = InternetSearchVideoFactory.create(detail); solrInternetSearchVideoDataManager.saveOrUpdate(video); } break; //腾讯 case 17: break; } CMQManager.getInstance().deleteSolrMsg(solrVideo.getHandler()); } catch (Exception e) { logger.error("更新全网搜搜索引擎出错", e); } } } }); } } private void doAddIqiyi2Video() { new JobThreadExecutorServiceImpl().run(new Runnable() { @Override src/main/java/com/yeshi/buwan/util/factory/InternetSearchVideoFactory.java
New file @@ -0,0 +1,89 @@ package com.yeshi.buwan.util.factory; import com.yeshi.buwan.domain.video.InternetSearchVideo; import com.yeshi.buwan.tencent.entity.TencentCoverInfo; import com.yeshi.buwan.util.TimeUtil; import com.yeshi.buwan.util.video.VideoConstant; import com.yeshi.buwan.youku.entity.YouKuShowDetail; import org.yeshi.utils.StringUtil; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Date; import java.util.List; public class InternetSearchVideoFactory { public static InternetSearchVideo create(YouKuShowDetail detail) { InternetSearchVideo video = new InternetSearchVideo(); List<String> actors = new ArrayList<>(); for (YouKuShowDetail.AttrBean.PerformerBean bean : detail.getAttr().getPerformer()) { actors.add(bean.getName()); } video.setActors(StringUtil.concat(actors, ",")); video.setArea(detail.getArea()); List<String> directors = new ArrayList<>(); for (YouKuShowDetail.AttrBean.DirectorBean bean : detail.getAttr().getDirector()) { directors.add(bean.getName()); } video.setDirector(StringUtil.concat(directors, ",")); video.setHpicture(detail.getThumbnail_large()); video.setVpicture(detail.getPoster_large()); video.setName(detail.getName()); video.setNameStr(detail.getName()); video.setResourceIds(20 + ""); if (detail.getCategory().equalsIgnoreCase("电影")) { video.setRootType(VideoConstant.VIDEO_CATEGORY_DIANYING); } else if (detail.getCategory().equalsIgnoreCase("电视剧")) { video.setRootType(VideoConstant.VIDEO_CATEGORY_DIANSHIJU); } else if (detail.getCategory().equalsIgnoreCase("动漫")) { video.setRootType(VideoConstant.VIDEO_CATEGORY_DONGMAN); } else if (detail.getCategory().equalsIgnoreCase("综艺")) { video.setRootType(VideoConstant.VIDEO_CATEGORY_ZONGYI); } if (detail.getCategory().equalsIgnoreCase("电影")) { video.setTag("评分:" + new BigDecimal(detail.getScore()).setScale(1).toString()); } else video.setTag(detail.getEpisode_updated()); video.setUpdateTime(new Date()); video.setVideoCount(Integer.parseInt(detail.getEpisode_updated())); video.setYear(detail.getReleased().split("-")[0]); video.setId(InternetSearchVideo.createId(video.getName(), video.getRootType(), video.getYear())); return video; } public static InternetSearchVideo create(TencentCoverInfo info) { InternetSearchVideo video = new InternetSearchVideo(); video.setActors(StringUtil.concat(info.getLeading_actor(), ",")); video.setArea(info.getArea_name()); video.setDirector(StringUtil.concat(info.getDirector(), ",")); video.setHpicture(info.getHorizontal_pic_url()); video.setVpicture(info.getVertical_pic_url()); video.setName(info.getTitle()); video.setNameStr(info.getTitle()); video.setResourceIds(17 + ""); if (info.getType_name().equalsIgnoreCase("电影")) { video.setRootType(VideoConstant.VIDEO_CATEGORY_DIANYING); } else if (info.getType_name().equalsIgnoreCase("电视剧")) { video.setRootType(VideoConstant.VIDEO_CATEGORY_DIANSHIJU); } else if (info.getType_name().equalsIgnoreCase("动漫")) { video.setRootType(VideoConstant.VIDEO_CATEGORY_DONGMAN); } else if (info.getType_name().equalsIgnoreCase("综艺")) { video.setRootType(VideoConstant.VIDEO_CATEGORY_ZONGYI); } if (info.getType_name().equalsIgnoreCase("电影")) { video.setTag("评分:" + info.getScore().getScore()); } else video.setTag(info.getEpisode_updated()); video.setUpdateTime(new Date()); video.setVideoCount(info.getVip_ids().size()); video.setYear(info.getYear()); video.setId(InternetSearchVideo.createId(video.getName(), video.getRootType(), video.getYear())); return video; } } src/main/java/com/yeshi/buwan/util/factory/SolrVideoFactory.java
@@ -1,10 +1,9 @@ package com.yeshi.buwan.util.factory; import com.yeshi.buwan.domain.CategoryVideo; import com.yeshi.buwan.domain.VideoType; import com.yeshi.buwan.domain.solr.SolrAlbumVideo; import com.yeshi.buwan.domain.VideoInfo; import com.yeshi.buwan.domain.VideoResource; import com.yeshi.buwan.domain.VideoType; import com.yeshi.buwan.domain.solr.SolrAlbumVideo; import com.yeshi.buwan.domain.solr.SolrCommonVideo; import org.yeshi.utils.StringUtil; src/main/java/com/yeshi/buwan/util/mq/CMQManager.java
@@ -29,6 +29,9 @@ //更新视频附加信息 public static String QUEUENAME_UPDATE_VIDEO_EXTRAINFO = "buwan-video-video-update-extrainfo"; //全网搜 public static String QUEUENAME_UPDATE_INTERNET_SEARCH = "buwan-video-update-internet-search"; private static String TOPIC_VIDEO_EXTRAINFO = "buwan_topic_video_extrainfo_change"; @@ -42,6 +45,7 @@ cmqUtil.createQueue(QUEUENAME_VIDEO_UPDATE_PPTV, 1024 * 1024); cmqUtil.createQueue(QUEUENAME_VIDEO_RESOURCE_DELETE, 1024 * 1024); cmqUtil.createQueue(QUEUENAME_UPDATE_VIDEO_EXTRAINFO, 1024 * 1024); cmqUtil.createQueue(QUEUENAME_UPDATE_INTERNET_SEARCH, 1024 * 1024); //创建主题 cmqUtil.createTopic(TOPIC_VIDEO_EXTRAINFO); @@ -231,4 +235,32 @@ } /** * 全网搜 * * @param msg */ public void addInternetSearchVideoUpdateMsg(InternetSearchVideoMQMsg msg) { cmqUtil.sendMsg(QUEUENAME_VIDEO_RESOURCE_DELETE, new Gson().toJson(msg)); } public List<InternetSearchVideoMQMsg> consumeInternetSearchVideoUpdateMsg(int count) { Gson gson = new Gson(); List<InternetSearchVideoMQMsg> list = new ArrayList<>(); List<Message> msgList = cmqUtil.recieveMsg(count, QUEUENAME_UPDATE_INTERNET_SEARCH); if (msgList != null) for (Message msg : msgList) { InternetSearchVideoMQMsg mm = gson.fromJson(msg.msgBody, InternetSearchVideoMQMsg.class); mm.setHandler(msg.receiptHandle); list.add(mm); } return list; } public void deleteInternetSearchVideoUpdateMsg(String handler) { cmqUtil.deleteMsg(QUEUENAME_UPDATE_INTERNET_SEARCH, handler); } } src/main/java/com/yeshi/buwan/youku/YouKuApiUtil.java
@@ -71,7 +71,7 @@ public static ListResultDTO getShowListByCategory(String category, int page, int pageSize) { try { String url = String.format("https://openapi.youku.com/v2/shows/by_category.json?client_id=%s&category=%s&page=%s&count=" + pageSize, APP_ID, URLEncoder.encode(category, "UTF-8"), page); String url = String.format("https://openapi.youku.com/v2/shows/by_category.json?client_id=%s&paid=1&category=%s&page=%s&count=" + pageSize, APP_ID, URLEncoder.encode(category, "UTF-8"), page); String result = HttpUtil.get(url); net.sf.json.JSONObject resultJson = net.sf.json.JSONObject.fromObject(result); int total = resultJson.optInt("total"); @@ -84,7 +84,6 @@ } return null; } public static ListResultDTO getVideoList(String showId, int page, int pageSize) { src/main/java/com/yeshi/buwan/youku/entity/YouKuSearchVideoMap.java
New file @@ -0,0 +1,41 @@ package com.yeshi.buwan.youku.entity; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.index.Indexed; import org.springframework.data.mongodb.core.mapping.Document; import java.util.Date; @Document(collection = "youKuSearchVideoMap") public class YouKuSearchVideoMap { @Id private String videoId; @Indexed private String showId; private Date createTime; public String getVideoId() { return videoId; } public void setVideoId(String videoId) { this.videoId = videoId; } public String getShowId() { return showId; } public void setShowId(String showId) { this.showId = showId; } public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; } } src/main/java/com/yeshi/buwan/youku/entity/YouKuVideo.java
@@ -50,8 +50,17 @@ private String state; private String category; private Integer is_panorama; private Integer show_videoseq; private Date updateTime; public Integer getShow_videoseq() { return show_videoseq; } public void setShow_videoseq(Integer show_videoseq) { this.show_videoseq = show_videoseq; } public Date getUpdateTime() { return updateTime; @@ -60,7 +69,6 @@ public void setUpdateTime(Date updateTime) { this.updateTime = updateTime; } public String getShowId() { src/test/java/com/hxh/spring/test/GeneralTest.java
@@ -6,8 +6,10 @@ import com.yeshi.buwan.domain.recommend.HomeRecommendSpecial; import com.yeshi.buwan.domain.recommend.SuperHomeRecommendSpecial; import com.yeshi.buwan.domain.system.SystemConfig; import com.yeshi.buwan.domain.video.InternetSearchVideo; import com.yeshi.buwan.domain.video.VideoResourceVersionMap; import com.yeshi.buwan.service.inter.video.VideoResourceVersionMapService; import com.yeshi.buwan.tencent.entity.TencentCoverInfo; import com.yeshi.buwan.youku.entity.YouKuShowDetail; import com.yeshi.buwan.youku.entity.YouKuVideo; import org.yeshi.utils.generater.SpringComponentGenerater; @@ -19,7 +21,7 @@ @org.junit.Test public void createDao() { try { SpringComponentGenerater.createMongoDao(new MongoDBDaoData.Builder().setBaseDaoClass(MongodbBaseDao.class).setDaoPackageName("com.yeshi.buwan.dao.juhe.youku").setEntityClass(YouKuVideo.class).create(), "D:\\workspace\\BuWan\\src\\main\\java\\com\\yeshi\\buwan\\dao\\juhe\\youku\\"); SpringComponentGenerater.createMongoDao(new MongoDBDaoData.Builder().setBaseDaoClass(MongodbBaseDao.class).setDaoPackageName("com.yeshi.buwan.dao.juhe.tencent").setEntityClass(TencentCoverInfo.class).create(), "D:\\workspace\\buwan\\buwan-server\\src\\main\\java\\com\\yeshi\\buwan\\dao\\juhe\\tencent\\"); } catch (Exception e) { e.printStackTrace(); }