韩迷TV相关bug修改,电视直播完善(后台+前端API)
| | |
| | | for (Object obj : args) { |
| | | if (obj instanceof AcceptData) { |
| | | acceptData = (AcceptData) obj; |
| | | if (acceptData != null) { |
| | | if ("ios".equalsIgnoreCase(acceptData.getPlatform())) { |
| | | acceptData.setChannel("appstore"); |
| | | } |
| | | //注入detailSystem |
| | | DetailSystem detailSystem = systemService.getDetailSystemByPackage(acceptData.getPackageName()); |
| | | acceptData.setDetailSystem(detailSystem); |
| | | } |
| | | |
| | | } else if (obj instanceof PrintWriter) { |
| | | out = (PrintWriter) obj; |
| | | } |
| | |
| | | |
| | | //如果是Android新版本则调用新的签名方法 |
| | | //布丸3.8.7之后调用新的签名方法 |
| | | if (acceptData != null && "android".equalsIgnoreCase(acceptData.getPlatform()) && acceptData.getVersion() >= 105) { |
| | | if (acceptData != null && "android" .equalsIgnoreCase(acceptData.getPlatform()) && acceptData.getVersion() >= 105) { |
| | | Map<String, String[]> params = request.getParameterMap(); |
| | | //签名 |
| | | List<String> list = new ArrayList<>(); |
| | | for (Iterator<String> its = params.keySet().iterator(); its.hasNext(); ) { |
| | | String key = its.next(); |
| | | if ("sign".equalsIgnoreCase(key)) |
| | | if ("sign" .equalsIgnoreCase(key)) |
| | | continue; |
| | | list.add(key + "=" + params.get(key)[0]); |
| | | } |
| | |
| | | } |
| | | } |
| | | |
| | | |
| | | if (acceptData != null) { |
| | | if ("ios" .equalsIgnoreCase(acceptData.getPlatform())) { |
| | | acceptData.setChannel("appstore"); |
| | | } |
| | | if (acceptData.getPackageName().equalsIgnoreCase("com.doudou.ysvideo.lite")) |
| | | acceptData.setPackageName("com.doudou.ysvideo"); |
| | | //注入detailSystem |
| | | DetailSystem detailSystem = systemService.getDetailSystemByPackage(acceptData.getPackageName()); |
| | | acceptData.setDetailSystem(detailSystem); |
| | | acceptData.setChildPackage(acceptData.getPackage()); |
| | | |
| | | |
| | | detailSystem = systemService.getDetailSystemByPackage(acceptData.getChildPackage()); |
| | | |
| | | } |
| | | |
| | | |
| | | return joinPoint.proceed(args); |
| | | } |
| | | |
| | |
| | | out.print(JsonUtil.loadFalseAdmin("id不存在")); |
| | | return; |
| | | } |
| | | old.setAlbumQuery(searchSpecial.getAlbumQuery()); |
| | | old.setInternetQuery(searchSpecial.getInternetQuery()); |
| | | old.setShortQuery(searchSpecial.getShortQuery()); |
| | | old.setContainerList(searchSpecial.getContainerList()); |
| | | if (searchSpecial.getColumn() != null) |
| | | old.setColumn(searchSpecial.getColumn()); |
| | | if (searchSpecial.getKey() != null) { |
New file |
| | |
| | | package com.yeshi.buwan.controller.admin.api; |
| | | |
| | | import com.google.gson.*; |
| | | import com.yeshi.buwan.domain.VideoInfo; |
| | | import com.yeshi.buwan.domain.live.SuperTVLiveCategory; |
| | | import com.yeshi.buwan.domain.live.TVLiveCategory; |
| | | import com.yeshi.buwan.domain.special.Special; |
| | | import com.yeshi.buwan.domain.special.SpecialVideo; |
| | | import com.yeshi.buwan.domain.special.SuperSpecial; |
| | | import com.yeshi.buwan.domain.system.DetailSystem; |
| | | import com.yeshi.buwan.domain.system.SystemInfo; |
| | | import com.yeshi.buwan.domain.web.DetailSystemSelect; |
| | | import com.yeshi.buwan.domain.web.SpecialAdmin; |
| | | import com.yeshi.buwan.exception.live.TVLiveCategoryException; |
| | | import com.yeshi.buwan.service.imp.SpecialService; |
| | | import com.yeshi.buwan.service.imp.SystemService; |
| | | import com.yeshi.buwan.service.inter.live.TVLiveCategoryService; |
| | | import com.yeshi.buwan.util.*; |
| | | import com.yeshi.buwan.web.tag.PageEntity; |
| | | import net.sf.json.JSONArray; |
| | | import net.sf.json.JSONObject; |
| | | import org.springframework.stereotype.Controller; |
| | | import org.springframework.web.bind.annotation.RequestMapping; |
| | | import org.springframework.web.bind.annotation.RequestMethod; |
| | | |
| | | import javax.annotation.Resource; |
| | | import javax.servlet.http.HttpSession; |
| | | import java.io.PrintWriter; |
| | | import java.lang.reflect.Type; |
| | | import java.util.*; |
| | | |
| | | @Controller |
| | | @RequestMapping("admin/new/api/tvlive/category") |
| | | public class TVLiveCategoryAdminController { |
| | | |
| | | @Resource |
| | | private TVLiveCategoryService tvLiveCategoryService; |
| | | |
| | | @Resource |
| | | private SystemService systemService; |
| | | |
| | | private Gson gson = new GsonBuilder().registerTypeAdapter(Date.class, new JsonSerializer<Date>() { |
| | | |
| | | @Override |
| | | public JsonElement serialize(Date src, Type typeOfSrc, JsonSerializationContext context) { |
| | | return src==null? new JsonPrimitive(""): new JsonPrimitive(TimeUtil.getGernalTime(src.getTime(),"yyyy.MM.dd HH:mm")); |
| | | } |
| | | }).create(); |
| | | |
| | | @RequestMapping(value = "/getCategoryList", method = RequestMethod.POST) |
| | | public void getCategoryList(HttpSession session, String detailSystemId, String key, int page, PrintWriter out) { |
| | | SystemInfo systemInfo = SystemUtil.getAdminSelectedSystem(session); |
| | | detailSystemId = StringUtil.isNullOrEmpty(detailSystemId) ? null : detailSystemId; |
| | | List<TVLiveCategory> list = tvLiveCategoryService.list(detailSystemId, systemInfo.getId(), key, page, Constant.pageCount); |
| | | List<DetailSystem> detailSystemList = systemService.getDetailSystemList(systemInfo.getId()); |
| | | List<TVLiveCategoryAdmin> resultList = new ArrayList<>(); |
| | | if (list != null) |
| | | for (TVLiveCategory category : list) { |
| | | Set<String> selectedDetailSystemSet = new HashSet<>(); |
| | | List<SuperTVLiveCategory> superList = tvLiveCategoryService.listSuper(category.getId()); |
| | | for (SuperTVLiveCategory cy : superList) { |
| | | selectedDetailSystemSet.add(cy.getDetailSystemId()); |
| | | } |
| | | List<DetailSystemSelect> selectList = new ArrayList<>(); |
| | | for (DetailSystem detailSystem : detailSystemList) { |
| | | detailSystem.setSystem(null); |
| | | detailSystem.setInfo(null); |
| | | DetailSystemSelect select = new DetailSystemSelect(); |
| | | select.setDetailSystem(detailSystem); |
| | | select.setSelected(selectedDetailSystemSet.contains(detailSystem.getId())); |
| | | selectList.add(select); |
| | | } |
| | | resultList.add(new TVLiveCategoryAdmin(category, selectList)); |
| | | } |
| | | |
| | | long count = tvLiveCategoryService.count(detailSystemId, systemInfo.getId(), key); |
| | | JSONObject data = new JSONObject(); |
| | | data.put("pageEntity", new PageEntity(page, Constant.pageCount, (int) count)); |
| | | data.put("data", gson.toJson(resultList)); |
| | | out.print(JsonUtil.loadTrueAdmin(data.toString())); |
| | | } |
| | | |
| | | @RequestMapping(value = "/addCategory", method = RequestMethod.POST) |
| | | public void addCategory(TVLiveCategory category, String detailsystemids, HttpSession session, PrintWriter out) { |
| | | |
| | | if (StringUtil.isNullOrEmpty(category.getName())) { |
| | | out.print(JsonUtil.loadFalseAdmin("数据不完整")); |
| | | return; |
| | | } |
| | | |
| | | category.setSystemId(SystemUtil.getAdminSelectedSystem(session).getId()); |
| | | |
| | | List<String> detailSystemList = new ArrayList<>(); |
| | | if (!StringUtil.isNullOrEmpty(detailsystemids)) { |
| | | String[] sps = detailsystemids.split(","); |
| | | for (String sp : sps) { |
| | | detailSystemList.add(sp); |
| | | } |
| | | } |
| | | |
| | | try { |
| | | tvLiveCategoryService.addCategory(category, detailSystemList); |
| | | out.print(JsonUtil.loadTrueAdmin("")); |
| | | } catch (TVLiveCategoryException e) { |
| | | out.print(JsonUtil.loadFalseAdmin(e.getMsg())); |
| | | } |
| | | } |
| | | |
| | | |
| | | @RequestMapping(value = "/updateCategory", method = RequestMethod.POST) |
| | | public void updateCategory(TVLiveCategory category, PrintWriter out) { |
| | | |
| | | if (StringUtil.isNullOrEmpty(category.getName())) { |
| | | out.print(JsonUtil.loadFalseAdmin("数据不完整")); |
| | | return; |
| | | } |
| | | tvLiveCategoryService.updateCategory(category); |
| | | out.print(JsonUtil.loadTrueAdmin("")); |
| | | } |
| | | |
| | | |
| | | @RequestMapping(value = "/getCategory", method = RequestMethod.POST) |
| | | public void getCategory(String id, PrintWriter out) { |
| | | TVLiveCategory category = tvLiveCategoryService.selectCategoryBuPrimaryKey(id); |
| | | out.print(JsonUtil.loadTrueAdmin(new Gson().toJson(category))); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 删除分类 |
| | | * |
| | | * @param ids |
| | | * @param out |
| | | */ |
| | | @RequestMapping(value = "/deleteCategory", method = RequestMethod.POST) |
| | | public void deleteCategory(String ids, PrintWriter out) { |
| | | if (StringUtil.isNullOrEmpty(ids)) { |
| | | out.print(JsonUtil.loadFalseAdmin("ids不能为空")); |
| | | return; |
| | | } |
| | | tvLiveCategoryService.deleteCateogry(Arrays.asList(ids.split(","))); |
| | | out.print(JsonUtil.loadTrueAdmin("")); |
| | | } |
| | | |
| | | |
| | | @RequestMapping(value = "/deleteSuperCategory", method = RequestMethod.POST) |
| | | public void deleteSuperCategory(String cid, String detailSystemId, PrintWriter out) { |
| | | if (StringUtil.isNullOrEmpty(cid) || StringUtil.isNullOrEmpty(detailSystemId)) { |
| | | out.print(JsonUtil.loadFalseAdmin("信息不完整")); |
| | | return; |
| | | } |
| | | tvLiveCategoryService.deleteSuperCategory(cid, detailSystemId); |
| | | out.print(JsonUtil.loadTrueAdmin("")); |
| | | } |
| | | |
| | | |
| | | @RequestMapping(value = "/addSuperCategory", method = RequestMethod.POST) |
| | | public void addSuperCategory(String cid, String detailSystemId, Integer weight, String icon, PrintWriter out) { |
| | | |
| | | SuperTVLiveCategory superTVLiveCategory = new SuperTVLiveCategory(); |
| | | superTVLiveCategory.setCid(cid); |
| | | superTVLiveCategory.setDetailSystemId(detailSystemId); |
| | | superTVLiveCategory.setWeight(weight); |
| | | superTVLiveCategory.setIcon(icon); |
| | | tvLiveCategoryService.addSuperCategory(superTVLiveCategory); |
| | | out.print(JsonUtil.loadTrueAdmin("")); |
| | | } |
| | | |
| | | |
| | | class TVLiveCategoryAdmin { |
| | | private TVLiveCategory category; |
| | | private List<DetailSystemSelect> detailSystemSelectList; |
| | | |
| | | public TVLiveCategoryAdmin(TVLiveCategory category, List<DetailSystemSelect> detailSystemSelectList) { |
| | | this.category = category; |
| | | this.detailSystemSelectList = detailSystemSelectList; |
| | | } |
| | | |
| | | public TVLiveCategory getCategory() { |
| | | return category; |
| | | } |
| | | |
| | | public void setCategory(TVLiveCategory category) { |
| | | this.category = category; |
| | | } |
| | | |
| | | public List<DetailSystemSelect> getDetailSystemSelectList() { |
| | | return detailSystemSelectList; |
| | | } |
| | | |
| | | public void setDetailSystemSelectList(List<DetailSystemSelect> detailSystemSelectList) { |
| | | this.detailSystemSelectList = detailSystemSelectList; |
| | | } |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.yeshi.buwan.controller.admin.api; |
| | | |
| | | import com.google.gson.*; |
| | | import com.yeshi.buwan.domain.live.SuperTVLiveCategory; |
| | | import com.yeshi.buwan.domain.live.TVLiveCategory; |
| | | import com.yeshi.buwan.domain.live.TVLiveCategoryChannelMap; |
| | | import com.yeshi.buwan.domain.live.TVLiveChannel; |
| | | import com.yeshi.buwan.domain.web.DetailSystemSelect; |
| | | import com.yeshi.buwan.exception.live.TVLiveCategoryException; |
| | | import com.yeshi.buwan.service.imp.SystemService; |
| | | import com.yeshi.buwan.service.inter.live.TVLiveCategoryChannelService; |
| | | import com.yeshi.buwan.service.inter.live.TVLiveChannelService; |
| | | import com.yeshi.buwan.util.*; |
| | | import com.yeshi.buwan.web.tag.PageEntity; |
| | | import net.sf.json.JSONObject; |
| | | import org.springframework.stereotype.Controller; |
| | | import org.springframework.web.bind.annotation.RequestMapping; |
| | | import org.springframework.web.bind.annotation.RequestMethod; |
| | | |
| | | import javax.annotation.Resource; |
| | | import javax.servlet.http.HttpSession; |
| | | import java.io.PrintWriter; |
| | | import java.lang.reflect.Type; |
| | | import java.util.ArrayList; |
| | | import java.util.Arrays; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | |
| | | @Controller |
| | | @RequestMapping("admin/new/api/tvlive/channel") |
| | | public class TVLiveChannelAdminController { |
| | | |
| | | @Resource |
| | | private TVLiveChannelService tvLiveChannelService; |
| | | |
| | | @Resource |
| | | private TVLiveCategoryChannelService tvLiveCategoryChannelService; |
| | | |
| | | @Resource |
| | | private SystemService systemService; |
| | | |
| | | private Gson gson = new GsonBuilder().registerTypeAdapter(Date.class, new JsonSerializer<Date>() { |
| | | |
| | | @Override |
| | | public JsonElement serialize(Date src, Type typeOfSrc, JsonSerializationContext context) { |
| | | return src == null ? new JsonPrimitive("") : new JsonPrimitive(TimeUtil.getGernalTime(src.getTime(), "yyyy.MM.dd HH:mm")); |
| | | } |
| | | }).create(); |
| | | |
| | | @RequestMapping(value = "/getChannelList", method = RequestMethod.POST) |
| | | public void getChannelList(HttpSession session, String categoryId, String key, Integer state, int page, PrintWriter out) { |
| | | |
| | | List<TVLiveChannel> channelList; |
| | | long count; |
| | | if (StringUtil.isNullOrEmpty(categoryId)) { |
| | | channelList = tvLiveChannelService.list(key, state, page, Constant.pageCount); |
| | | count = tvLiveChannelService.count(key, state); |
| | | } else { |
| | | channelList = tvLiveCategoryChannelService.listChannelByCid(categoryId, key, page, Constant.pageCount); |
| | | count = tvLiveCategoryChannelService.countChannelByCid(categoryId, key); |
| | | } |
| | | JSONObject data = new JSONObject(); |
| | | data.put("pageEntity", new PageEntity(page, Constant.pageCount, (int) count)); |
| | | data.put("data", gson.toJson(channelList)); |
| | | out.print(JsonUtil.loadTrueAdmin(data.toString())); |
| | | } |
| | | |
| | | |
| | | @RequestMapping(value = "/addCategoryChannel", method = RequestMethod.POST) |
| | | public void addCategoryChannel(String categoryId, String channelIds, Integer weight, HttpSession session, PrintWriter out) { |
| | | |
| | | if (StringUtil.isNullOrEmpty(categoryId) || StringUtil.isNullOrEmpty(channelIds)) { |
| | | out.print(JsonUtil.loadFalseAdmin("数据不完整")); |
| | | return; |
| | | } |
| | | |
| | | String[] channelIdArray = channelIds.split(","); |
| | | for (String channelId : channelIdArray) { |
| | | TVLiveCategoryChannelMap map = new TVLiveCategoryChannelMap(); |
| | | map.setWeight(weight); |
| | | map.setCategoryId(categoryId); |
| | | map.setChannelId(channelId); |
| | | tvLiveCategoryChannelService.addMap(map); |
| | | } |
| | | |
| | | out.print(JsonUtil.loadTrueAdmin("")); |
| | | } |
| | | |
| | | @RequestMapping(value = "/deleteCategoryChannel", method = RequestMethod.POST) |
| | | public void deleteCategoryChannel(String categoryId, String channelIds, HttpSession session, PrintWriter out) { |
| | | |
| | | if (StringUtil.isNullOrEmpty(categoryId) || StringUtil.isNullOrEmpty(channelIds)) { |
| | | out.print(JsonUtil.loadFalseAdmin("数据不完整")); |
| | | return; |
| | | } |
| | | |
| | | String[] channelIdArray = channelIds.split(","); |
| | | for (String channelId : channelIdArray) { |
| | | TVLiveCategoryChannelMap map = tvLiveCategoryChannelService.selectByCategoryIdAndChannelId(categoryId, channelId); |
| | | if (map != null) |
| | | tvLiveCategoryChannelService.deleteByPrimaryKey(map.getId()); |
| | | } |
| | | out.print(JsonUtil.loadTrueAdmin("")); |
| | | } |
| | | |
| | | |
| | | @RequestMapping(value = "/updateCategoryChannelWeight", method = RequestMethod.POST) |
| | | public void updateCategoryChannelWeight(String categoryId, String channelId, Integer weight, HttpSession session, PrintWriter out) { |
| | | TVLiveCategoryChannelMap oldMap = tvLiveCategoryChannelService.selectByCategoryIdAndChannelId(categoryId, channelId); |
| | | if (oldMap == null) { |
| | | out.print(JsonUtil.loadFalseAdmin("分类的频道不存在")); |
| | | return; |
| | | } |
| | | |
| | | TVLiveCategoryChannelMap map = new TVLiveCategoryChannelMap(); |
| | | map.setId(oldMap.getId()); |
| | | map.setWeight(weight); |
| | | tvLiveCategoryChannelService.update(map); |
| | | out.print(JsonUtil.loadTrueAdmin("")); |
| | | } |
| | | |
| | | |
| | | // @RequestMapping(value = "/addCategory", method = RequestMethod.POST) |
| | | // public void addCategory(TVLiveCategory category, String detailsystemids, HttpSession session, PrintWriter out) { |
| | | // |
| | | // if (StringUtil.isNullOrEmpty(category.getName())) { |
| | | // out.print(JsonUtil.loadFalseAdmin("数据不完整")); |
| | | // return; |
| | | // } |
| | | // |
| | | // category.setSystemId(SystemUtil.getAdminSelectedSystem(session).getId()); |
| | | // |
| | | // List<String> detailSystemList = new ArrayList<>(); |
| | | // if (!StringUtil.isNullOrEmpty(detailsystemids)) { |
| | | // String[] sps = detailsystemids.split(","); |
| | | // for (String sp : sps) { |
| | | // detailSystemList.add(sp); |
| | | // } |
| | | // } |
| | | // |
| | | // try { |
| | | // tvLiveCategoryService.addCategory(category, detailSystemList); |
| | | // out.print(JsonUtil.loadTrueAdmin("")); |
| | | // } catch (TVLiveCategoryException e) { |
| | | // out.print(JsonUtil.loadFalseAdmin(e.getMsg())); |
| | | // } |
| | | // } |
| | | // |
| | | // |
| | | // @RequestMapping(value = "/updateCategory", method = RequestMethod.POST) |
| | | // public void updateCategory(TVLiveCategory category, PrintWriter out) { |
| | | // |
| | | // if (StringUtil.isNullOrEmpty(category.getName())) { |
| | | // out.print(JsonUtil.loadFalseAdmin("数据不完整")); |
| | | // return; |
| | | // } |
| | | // tvLiveCategoryService.updateCategory(category); |
| | | // out.print(JsonUtil.loadTrueAdmin("")); |
| | | // } |
| | | // |
| | | // |
| | | // @RequestMapping(value = "/getCategory", method = RequestMethod.POST) |
| | | // public void getCategory(String id, PrintWriter out) { |
| | | // TVLiveCategory category = tvLiveCategoryService.selectCategoryBuPrimaryKey(id); |
| | | // out.print(JsonUtil.loadTrueAdmin(new Gson().toJson(category))); |
| | | // } |
| | | // |
| | | // |
| | | // /** |
| | | // * 删除分类 |
| | | // * |
| | | // * @param ids |
| | | // * @param out |
| | | // */ |
| | | // @RequestMapping(value = "/deleteCategory", method = RequestMethod.POST) |
| | | // public void deleteCategory(String ids, PrintWriter out) { |
| | | // if (StringUtil.isNullOrEmpty(ids)) { |
| | | // out.print(JsonUtil.loadFalseAdmin("ids不能为空")); |
| | | // return; |
| | | // } |
| | | // tvLiveCategoryService.deleteCateogry(Arrays.asList(ids.split(","))); |
| | | // out.print(JsonUtil.loadTrueAdmin("")); |
| | | // } |
| | | // |
| | | // |
| | | // @RequestMapping(value = "/deleteSuperCategory", method = RequestMethod.POST) |
| | | // public void deleteSuperCategory(String cid, String detailSystemId, PrintWriter out) { |
| | | // if (StringUtil.isNullOrEmpty(cid) || StringUtil.isNullOrEmpty(detailSystemId)) { |
| | | // out.print(JsonUtil.loadFalseAdmin("信息不完整")); |
| | | // return; |
| | | // } |
| | | // tvLiveCategoryService.deleteSuperCategory(cid, detailSystemId); |
| | | // out.print(JsonUtil.loadTrueAdmin("")); |
| | | // } |
| | | // |
| | | // |
| | | // @RequestMapping(value = "/addSuperCategory", method = RequestMethod.POST) |
| | | // public void addSuperCategory(String cid, String detailSystemId, Integer weight, String icon, PrintWriter out) { |
| | | // |
| | | // SuperTVLiveCategory superTVLiveCategory = new SuperTVLiveCategory(); |
| | | // superTVLiveCategory.setCid(cid); |
| | | // superTVLiveCategory.setDetailSystemId(detailSystemId); |
| | | // superTVLiveCategory.setWeight(weight); |
| | | // superTVLiveCategory.setIcon(icon); |
| | | // tvLiveCategoryService.addSuperCategory(superTVLiveCategory); |
| | | // out.print(JsonUtil.loadTrueAdmin("")); |
| | | // } |
| | | |
| | | |
| | | } |
New file |
| | |
| | | package com.yeshi.buwan.controller.api; |
| | | |
| | | import com.google.gson.*; |
| | | import com.yeshi.buwan.domain.live.*; |
| | | import com.yeshi.buwan.domain.user.LoginUser; |
| | | import com.yeshi.buwan.domain.vip.*; |
| | | import com.yeshi.buwan.dto.order.PPTVVideoPrice; |
| | | import com.yeshi.buwan.dto.order.PayWayInfoDTO; |
| | | import com.yeshi.buwan.exception.PPTVException; |
| | | import com.yeshi.buwan.exception.goldcorn.GoldCornException; |
| | | import com.yeshi.buwan.exception.order.OrderException; |
| | | import com.yeshi.buwan.exception.order.PayException; |
| | | import com.yeshi.buwan.exception.vip.VIPException; |
| | | import com.yeshi.buwan.exception.vip.VideoBuyRecordException; |
| | | import com.yeshi.buwan.live.migu.MiGuLiveListInfo; |
| | | import com.yeshi.buwan.live.migu.MiguLiveApiUtil; |
| | | import com.yeshi.buwan.service.inter.LoginUserService; |
| | | import com.yeshi.buwan.service.inter.juhe.PPTVService; |
| | | import com.yeshi.buwan.service.inter.live.*; |
| | | import com.yeshi.buwan.service.inter.order.OrderService; |
| | | import com.yeshi.buwan.service.inter.system.SystemConfigService; |
| | | import com.yeshi.buwan.service.inter.vip.VIPPriceService; |
| | | import com.yeshi.buwan.service.inter.vip.VIPService; |
| | | import com.yeshi.buwan.util.*; |
| | | import com.yeshi.buwan.videos.pptv.entity.PPTVSeries; |
| | | import com.yeshi.buwan.videos.pptv.entity.VideoPPTVMap; |
| | | import com.yeshi.buwan.vo.AcceptData; |
| | | import com.yeshi.buwan.vo.client.user.UserInfoVO; |
| | | import com.yeshi.buwan.vo.order.OrderInfoVO; |
| | | import com.yeshi.buwan.vo.tvlive.TVLiveChannelVO; |
| | | import net.sf.json.JSONObject; |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | | import org.springframework.stereotype.Controller; |
| | | import org.springframework.web.bind.annotation.RequestMapping; |
| | | import org.springframework.web.bind.annotation.ResponseBody; |
| | | import org.yeshi.utils.annotation.RequestSerializableByKey; |
| | | |
| | | import javax.annotation.Resource; |
| | | import javax.servlet.http.HttpServletRequest; |
| | | import java.lang.reflect.Type; |
| | | import java.math.BigDecimal; |
| | | import java.math.RoundingMode; |
| | | import java.util.ArrayList; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * 电视直播 |
| | | */ |
| | | @Controller |
| | | @RequestMapping("api/v2/tvlive") |
| | | public class TVLiveController { |
| | | |
| | | Logger logger = LoggerFactory.getLogger(TVLiveController.class); |
| | | |
| | | |
| | | @Resource |
| | | private TVLiveCategoryService tvLiveCategoryService; |
| | | |
| | | @Resource |
| | | private TVLiveCategoryChannelService tvLiveCategoryChannelService; |
| | | |
| | | @Resource |
| | | private TVLiveChannelResourceService tvLiveChannelResourceService; |
| | | |
| | | @Resource |
| | | private MiGuLiveService miGuLiveService; |
| | | |
| | | |
| | | @RequestMapping("getCategory") |
| | | @ResponseBody |
| | | public String getCategory(AcceptData acceptData) { |
| | | Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create(); |
| | | List<SuperTVLiveCategory> superList = tvLiveCategoryService.listSuper(acceptData.getDetailSystem().getId(), 1, 20); |
| | | List<String> channelIds = new ArrayList<>(); |
| | | for (SuperTVLiveCategory category : superList) { |
| | | channelIds.add(category.getCid()); |
| | | } |
| | | List<TVLiveCategory> categoryList = tvLiveCategoryService.listByIds(channelIds); |
| | | JSONObject data = new JSONObject(); |
| | | data.put("count", categoryList.size()); |
| | | data.put("data", gson.toJson(categoryList)); |
| | | return JsonUtilV2.loadTrueJson(data.toString()); |
| | | } |
| | | |
| | | |
| | | @RequestMapping("getChannelList") |
| | | @ResponseBody |
| | | public String getChannelList(AcceptData acceptData, String cid, int page) { |
| | | |
| | | if (StringUtil.isNullOrEmpty(cid)) { |
| | | return JsonUtilV2.loadFalseJson("cid为空"); |
| | | } |
| | | |
| | | List<TVLiveChannel> channelList = tvLiveCategoryChannelService.listChannelByCid(cid, null, page, Constant.pageCount); |
| | | long count = tvLiveCategoryChannelService.countChannelByCid(cid, null); |
| | | |
| | | List<TVLiveChannelVO> voList = new ArrayList<>(); |
| | | for (TVLiveChannel channel : channelList) { |
| | | voList.add(TVLiveChannelVO.create(channel)); |
| | | } |
| | | JSONObject root = new JSONObject(); |
| | | root.put("list", new Gson().toJson(voList)); |
| | | root.put("count", count); |
| | | return JsonUtilV2.loadTrueJson(root.toString()); |
| | | } |
| | | |
| | | @RequestMapping("getPlayUrl") |
| | | @ResponseBody |
| | | public String getPlayUrl(AcceptData acceptData, String id) { |
| | | |
| | | if (StringUtil.isNullOrEmpty(id)) { |
| | | return JsonUtilV2.loadFalseJson("id为空"); |
| | | } |
| | | |
| | | //获取播放链接 |
| | | |
| | | List<TVLiveChannelResourceMap> mapList = tvLiveChannelResourceService.listByChannelId(id); |
| | | if (mapList == null || mapList.size() == 0) { |
| | | return JsonUtilV2.loadFalseJson("暂无播放源"); |
| | | } |
| | | |
| | | TVLiveChannelResourceMap map = mapList.get(0); |
| | | String playUrl = null; |
| | | if (map.getResource() == TVLiveResource.migu) { |
| | | MiGuLiveListInfo info = miGuLiveService.selectByPrimaryKey(map.getRid()); |
| | | playUrl = MiguLiveApiUtil.getPlayUrl(info.getPID()); |
| | | } else if (map.getResource() == TVLiveResource.other) { |
| | | |
| | | } |
| | | JSONObject root = new JSONObject(); |
| | | root.put("playUrl", playUrl); |
| | | return JsonUtilV2.loadTrueJson(root.toString()); |
| | | } |
| | | |
| | | |
| | | } |
| | |
| | | adConfig = null; |
| | | adNew.put("other", gson.toJson(adConfig)); |
| | | |
| | | //广告ID |
| | | if (!StringUtil.isNullOrEmpty(map.get("gdt_app_id"))) { |
| | | adNew.put("gdtAppId", map.get("gdt_app_id")); |
| | | } |
| | | |
| | | if (!StringUtil.isNullOrEmpty(map.get("csj_app_id"))) { |
| | | adNew.put("csjAppId", map.get("csj_app_id")); |
| | | } |
| | | |
| | | data.put("ad", ad); |
| | | data.put("adNew", adNew); |
| | |
| | | List<HomeType> list = new ArrayList<>(); |
| | | for (HomeType ht : list1) |
| | | list.add(ht); |
| | | if ("309".equals(vtid)) { |
| | | if (!"ios".equalsIgnoreCase(acceptData.getPlatform())) { |
| | | if ("309" .equals(vtid)) { |
| | | if (!"ios" .equalsIgnoreCase(acceptData.getPlatform())) { |
| | | Map<String, String> confMap = configService.getConfigAsMap(detailSystem, acceptData.getVersion()); |
| | | String mm = confMap.get("meinv_mm_count"); |
| | | int count = Integer.parseInt(mm); |
| | |
| | | } |
| | | } |
| | | |
| | | if ("huawei".equalsIgnoreCase(channel)) { |
| | | if ("huawei" .equalsIgnoreCase(channel)) { |
| | | for (int i = 0; i < list.size(); i++) { |
| | | if (list.get(i).getName().equalsIgnoreCase("美女")) { |
| | | list.remove(i); |
| | |
| | | if (adP < homeTypeList.size() && adP > -1) { |
| | | HomeType homeType = new HomeType(); |
| | | homeType.setAd(ad); |
| | | if ("1".equalsIgnoreCase(page)) { |
| | | if ("1" .equalsIgnoreCase(page)) { |
| | | homeTypeList.add(adP, homeType); |
| | | } |
| | | count++; |
| | |
| | | if (StringUtil.isNullOrEmpty(resourceId)) { |
| | | resourceId = internetSearchVideo.getResourceIds().split(",")[0]; |
| | | } |
| | | |
| | | List<Long> resourceList = videoResouceUtil.getAvailableResourceIds(acceptData.getDetailSystem(), acceptData.getVersion(), acceptData.getChannel()); |
| | | |
| | | if (resourceList != null) { |
| | | if (!resourceList.contains(Long.parseLong(resourceId))) { |
| | | out.print(JsonUtil.loadFalseAdmin("")); |
| | | return; |
| | | } |
| | | } |
| | | |
| | | |
| | | VideoInfo info = null; |
| | | if (Integer.parseInt(resourceId) == YouKuUtil.RESOURCE_ID) { |
| | | try { |
| | |
| | | data.put("playUrl", playUrl); |
| | | data.put("name", videoName); |
| | | data.put("pptv", true); |
| | | data.put("vip", "1".equalsIgnoreCase(series.getFree())); |
| | | data.put("vip", "1" .equalsIgnoreCase(series.getFree())); |
| | | data.put("sessionId", sessionId); |
| | | out.print(JsonUtil.loadTrueJson(data.toString())); |
| | | LoggerUtil.getUserActiveLogger().info(UserActiveLogFactory.createVideoDetail(new BaseLog(acceptData, loginUid), videoId, series.getName(), from)); |
| | |
| | | public void isPraise(AcceptData acceptData, HttpServletRequest request, PrintWriter out) { |
| | | DetailSystem detailSystem = systemService.getDetailSystemByPackage(acceptData.getPackageName()); |
| | | DetailSystemConfig config = configService.getConfigByKey("banner_praise", detailSystem, acceptData.getVersion()); |
| | | if ("是".equals(config.getValue())) { |
| | | if ("是" .equals(config.getValue())) { |
| | | out.print(JsonUtil.loadTrueJson("1")); |
| | | } else { |
| | | out.print(JsonUtil.loadTrueJson("0")); |
| | |
| | | import java.io.PrintWriter; |
| | | import java.util.ArrayList; |
| | | import java.util.Collections; |
| | | import java.util.Comparator; |
| | | import java.util.List; |
| | | |
| | | @Controller |
| | |
| | | |
| | | int pageSize = Constant.pageCount; |
| | | boolean hasNextPage = false; |
| | | if (searchSpecial.getAlbumQuery() != null) { |
| | | SolrResultDTO solrResultDTO = solrAlbumVideoDataManager.find(searchSpecial.getAlbumQuery(), pageIndex, pageSize); |
| | | |
| | | //获取搜索条件 |
| | | SearchSpecial.QueryConditions conditions = null; |
| | | |
| | | if (searchSpecial.getContainerList() != null) { |
| | | //按version排序 |
| | | Comparator<SearchSpecial.QueryConditionsContainer> cm = (o1, o2) -> o1.getMinVersion() - o2.getMinVersion(); |
| | | Collections.sort(searchSpecial.getContainerList(), cm); |
| | | |
| | | |
| | | for (SearchSpecial.QueryConditionsContainer container : searchSpecial.getContainerList()) { |
| | | if (acceptData.getDetailSystem().getId().equalsIgnoreCase(container.getDetailSystemId())) { |
| | | if (acceptData.getVersion() >= container.getMinVersion()) { |
| | | if (acceptData.getChannel().equalsIgnoreCase(container.getChannel())) { |
| | | conditions = container.getQueryConditions(); |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | if (conditions == null) { |
| | | for (SearchSpecial.QueryConditionsContainer container : searchSpecial.getContainerList()) { |
| | | if (acceptData.getDetailSystem().getId().equalsIgnoreCase(container.getDetailSystemId())) { |
| | | if (acceptData.getVersion() >= container.getMinVersion()) { |
| | | conditions = container.getQueryConditions(); |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | if (conditions.getAlbumQuery() != null) { |
| | | SolrResultDTO solrResultDTO = solrAlbumVideoDataManager.find(conditions.getAlbumQuery(), pageIndex, pageSize); |
| | | if (solrResultDTO != null) { |
| | | List<SolrAlbumVideo> list = solrResultDTO.getVideoList(); |
| | | if (list != null) { |
| | |
| | | } |
| | | } |
| | | |
| | | if (searchSpecial.getInternetQuery() != null) { |
| | | SolrResultDTO solrResultDTO = solrInternetSearchVideoDataManager.find(searchSpecial.getInternetQuery(), pageIndex, pageSize); |
| | | if (conditions.getInternetQuery() != null) { |
| | | SolrResultDTO solrResultDTO = solrInternetSearchVideoDataManager.find(conditions.getInternetQuery(), pageIndex, pageSize); |
| | | if (solrResultDTO != null) { |
| | | List<InternetSearchVideo> list = solrResultDTO.getVideoList(); |
| | | if (list != null) { |
| | |
| | | } |
| | | } |
| | | |
| | | if (searchSpecial.getShortQuery() != null) { |
| | | SolrResultDTO solrResultDTO = solrShortVideoDataManager.find(searchSpecial.getShortQuery(), pageIndex, pageSize); |
| | | if (conditions.getShortQuery() != null) { |
| | | SolrResultDTO solrResultDTO = solrShortVideoDataManager.find(conditions.getShortQuery(), pageIndex, pageSize); |
| | | if (solrResultDTO != null) { |
| | | List<SolrShortVideo> list = solrResultDTO.getVideoList(); |
| | | if (list != null) { |
| | |
| | | item.put("name", StringUtil.isNullOrEmpty(map.getShowName()) ? map.getSpecial().getName() : map.getShowName()); |
| | | item.put("id", map.getSpecialId()); |
| | | item.put("icon", map.getIcon()); |
| | | array.add(item); |
| | | String name = item.optString("name"); |
| | | //魅族和小米不添加 |
| | | if (("xiaomi" .equalsIgnoreCase(acceptData.getChannel()) || "meizu" .equalsIgnoreCase(acceptData.getChannel())) && "hanju-video-types" .equalsIgnoreCase(pid)) { |
| | | if (name.contains("电视剧") || name.contains("电影") || name.contains("综艺") || name.contains("少儿")) { |
| | | array.add(item); |
| | | } |
| | | } else { |
| | | array.add(item); |
| | | } |
| | | } |
| | | JSONObject data = new JSONObject(); |
| | | data.put("list", array); |
New file |
| | |
| | | package com.yeshi.buwan.dao.juhe.hanmi; |
| | | |
| | | import com.yeshi.buwan.dao.base.MongodbBaseDao; |
| | | import com.yeshi.buwan.videos.hanmi.entity.HanmiShow; |
| | | import org.springframework.data.mongodb.core.query.Criteria; |
| | | import org.springframework.data.mongodb.core.query.Query; |
| | | import org.springframework.stereotype.Repository; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | |
| | | @Repository |
| | | public class HanmiShowDao extends MongodbBaseDao<HanmiShow> { |
| | | |
| | | /** |
| | | * 根据ID查询 |
| | | * |
| | | * @param ids |
| | | * @return |
| | | */ |
| | | public List<HanmiShow> listByIds(List<String> ids) { |
| | | Query query = new Query(); |
| | | List<Criteria> whereList = new ArrayList<>(); |
| | | for (String id : ids) |
| | | whereList.add(Criteria.where("id").is(id)); |
| | | Criteria[] wheres = new Criteria[whereList.size()]; |
| | | whereList.toArray(wheres); |
| | | query.addCriteria(new Criteria().orOperator(wheres)); |
| | | return findList(query); |
| | | } |
| | | |
| | | public List<HanmiShow> listAll(int start, int count) { |
| | | Query query = new Query(); |
| | | query.skip(start); |
| | | query.limit(count); |
| | | return findList(query); |
| | | } |
| | | |
| | | |
| | | } |
New file |
| | |
| | | package com.yeshi.buwan.dao.juhe.hanmi; |
| | | |
| | | import com.yeshi.buwan.dao.base.MongodbBaseDao; |
| | | import com.yeshi.buwan.videos.hanmi.entity.HanmiShow; |
| | | import com.yeshi.buwan.videos.hanmi.entity.HanmiShowEpisode; |
| | | 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.Repository; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | |
| | | @Repository |
| | | public class HanmiShowEpisodeDao extends MongodbBaseDao<HanmiShowEpisode> { |
| | | |
| | | |
| | | public List<HanmiShowEpisode> listByShowId(String showId, int start, int count) { |
| | | Query query = new Query(); |
| | | query.addCriteria(Criteria.where("showId").is(showId)); |
| | | query.with(new Sort(new Sort.Order(Sort.Direction.ASC, "orderBy"))); |
| | | return findList(query); |
| | | } |
| | | |
| | | |
| | | |
| | | public HanmiShowEpisode getLatestEpisode(String showId) { |
| | | Query query = new Query(); |
| | | query.addCriteria(Criteria.where("showId").is(showId)); |
| | | query.with(new Sort(new Sort.Order(Sort.Direction.DESC, "orderBy"))); |
| | | query.limit(1); |
| | | return findOne(query); |
| | | } |
| | | |
| | | public long countByShowId(String showId) { |
| | | Query query = new Query(); |
| | | query.addCriteria(Criteria.where("showId").is(showId)); |
| | | return count(query); |
| | | } |
| | | |
| | | |
| | | } |
New file |
| | |
| | | package com.yeshi.buwan.dao.juhe.hanmi; |
| | | |
| | | import com.yeshi.buwan.dao.base.MongodbBaseDao; |
| | | import com.yeshi.buwan.videos.hanmi.entity.VideoHanmiMap; |
| | | import org.springframework.data.mongodb.core.query.Criteria; |
| | | import org.springframework.data.mongodb.core.query.Query; |
| | | import org.springframework.stereotype.Repository; |
| | | |
| | | @Repository |
| | | public class VideoHanmiMapDao extends MongodbBaseDao<VideoHanmiMap> { |
| | | |
| | | |
| | | public VideoHanmiMap selectByVideoId(String videoId) { |
| | | Query query = new Query(); |
| | | query.addCriteria(Criteria.where("_id").is(videoId)); |
| | | return findOne(query); |
| | | } |
| | | |
| | | public VideoHanmiMap selectByShowId(String showId) { |
| | | Query query = new Query(); |
| | | query.addCriteria(Criteria.where("showId").is(showId)); |
| | | return findOne(query); |
| | | } |
| | | |
| | | |
| | | } |
| | |
| | | if (daoQuery.name != null) { |
| | | andList.add(Criteria.where("name").regex(daoQuery.name)); |
| | | } |
| | | Criteria[] ands = new Criteria[andList.size()]; |
| | | andList.toArray(ands); |
| | | query.addCriteria(new Criteria().andOperator(ands)); |
| | | if(andList.size()>0) { |
| | | Criteria[] ands = new Criteria[andList.size()]; |
| | | andList.toArray(ands); |
| | | query.addCriteria(new Criteria().andOperator(ands)); |
| | | } |
| | | return query; |
| | | } |
| | | |
| | |
| | | |
| | | public long count(DaoQuery daoQuery) { |
| | | |
| | | return count(daoQuery); |
| | | return count(getQuery(daoQuery)); |
| | | } |
| | | |
| | | |
| | |
| | | |
| | | public static class DaoQuery extends BaseQuery { |
| | | public String name; |
| | | public String systemId; |
| | | public List<Sort.Order> sortList; |
| | | } |
| | | } |
| | |
| | | if (bean.getSystemId() != null) { |
| | | update.set("systemId", bean.getSystemId()); |
| | | } |
| | | if (bean.getAlbumQuery() != null) { |
| | | update.set("albumQuery", bean.getAlbumQuery()); |
| | | |
| | | if (bean.getContainerList() != null) { |
| | | update.set("containerList", bean.getContainerList()); |
| | | } |
| | | if (bean.getInternetQuery() != null) { |
| | | update.set("internetQuery", bean.getInternetQuery()); |
| | | } |
| | | if (bean.getShortQuery() != null) { |
| | | update.set("shortQuery", bean.getShortQuery()); |
| | | } |
| | | |
| | | if (bean.getCreateTime() != null) { |
| | | update.set("createTime", bean.getCreateTime()); |
| | | } |
| | | |
| | | update.set("updateTime", new Date()); |
| | | update(query, update); |
| | | } |
| | |
| | | @Indexed |
| | | private String detailSystemId; |
| | | private Integer weight; |
| | | //分类图标 |
| | | private String icon; |
| | | private Date createTime; |
| | | private Date updateTime; |
| | | |
| | |
| | | public void setUpdateTime(Date updateTime) { |
| | | this.updateTime = updateTime; |
| | | } |
| | | |
| | | public String getIcon() { |
| | | return icon; |
| | | } |
| | | |
| | | public void setIcon(String icon) { |
| | | this.icon = icon; |
| | | } |
| | | } |
| | |
| | | package com.yeshi.buwan.domain.live; |
| | | |
| | | import com.google.gson.annotations.Expose; |
| | | import org.springframework.data.annotation.Id; |
| | | import org.springframework.data.mongodb.core.mapping.Document; |
| | | |
| | |
| | | @Document(collection = "tvLiveCategory") |
| | | public class TVLiveCategory { |
| | | |
| | | @Expose |
| | | @Id |
| | | private String id; |
| | | @Expose |
| | | private String name; |
| | | @Expose |
| | | private String icon; |
| | | private Integer weight; |
| | | private String systemId; |
| | | private Date createTime; |
| | | private Date updateTime; |
| | | |
| | |
| | | public void setUpdateTime(Date updateTime) { |
| | | this.updateTime = updateTime; |
| | | } |
| | | |
| | | public String getSystemId() { |
| | | return systemId; |
| | | } |
| | | |
| | | public void setSystemId(String systemId) { |
| | | this.systemId = systemId; |
| | | } |
| | | } |
| | |
| | | package com.yeshi.buwan.domain.live; |
| | | |
| | | import com.google.gson.annotations.Expose; |
| | | import org.springframework.data.annotation.Id; |
| | | import org.springframework.data.mongodb.core.mapping.Document; |
| | | |
| | |
| | | //隐藏 |
| | | public final static int STATE_HIDDEN = 0; |
| | | |
| | | @Expose |
| | | @Id |
| | | private String id; |
| | | @Expose |
| | | private String name; |
| | | private String hPicture; |
| | | private String vPicture; |
| | |
| | | import org.springframework.data.mongodb.core.mapping.Document; |
| | | |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * 搜索专题 |
| | |
| | | @Indexed |
| | | private String key; |
| | | private String systemId; |
| | | //专辑查询 |
| | | private SolrVideoSearchFilter albumQuery; |
| | | //全网搜查询 |
| | | private SolrVideoSearchFilter internetQuery; |
| | | //短视频 |
| | | private SolrShortVideoSearchFilter shortQuery; |
| | | |
| | | //查询条件的版本分布与系统分布 |
| | | private List<QueryConditionsContainer> containerList; |
| | | |
| | | //备注 |
| | | private String remarks; |
| | |
| | | this.systemId = systemId; |
| | | } |
| | | |
| | | public SolrVideoSearchFilter getAlbumQuery() { |
| | | return albumQuery; |
| | | } |
| | | |
| | | public void setAlbumQuery(SolrVideoSearchFilter albumQuery) { |
| | | this.albumQuery = albumQuery; |
| | | } |
| | | |
| | | public SolrVideoSearchFilter getInternetQuery() { |
| | | return internetQuery; |
| | | } |
| | | |
| | | public void setInternetQuery(SolrVideoSearchFilter internetQuery) { |
| | | this.internetQuery = internetQuery; |
| | | } |
| | | |
| | | public Date getCreateTime() { |
| | | return createTime; |
| | | } |
| | |
| | | |
| | | public void setUpdateTime(Date updateTime) { |
| | | this.updateTime = updateTime; |
| | | } |
| | | |
| | | |
| | | public SolrShortVideoSearchFilter getShortQuery() { |
| | | return shortQuery; |
| | | } |
| | | |
| | | public void setShortQuery(SolrShortVideoSearchFilter shortQuery) { |
| | | this.shortQuery = shortQuery; |
| | | } |
| | | |
| | | public String getName() { |
| | |
| | | public void setColumn(Integer column) { |
| | | this.column = column; |
| | | } |
| | | |
| | | public List<QueryConditionsContainer> getContainerList() { |
| | | return containerList; |
| | | } |
| | | |
| | | public void setContainerList(List<QueryConditionsContainer> containerList) { |
| | | this.containerList = containerList; |
| | | } |
| | | |
| | | /** |
| | | * 搜索专题查询的条件 |
| | | */ |
| | | public static class QueryConditions { |
| | | //专辑查询 |
| | | private SolrVideoSearchFilter albumQuery; |
| | | //全网搜查询 |
| | | private SolrVideoSearchFilter internetQuery; |
| | | //短视频 |
| | | private SolrShortVideoSearchFilter shortQuery; |
| | | |
| | | |
| | | public QueryConditions(SolrVideoSearchFilter albumQuery, SolrVideoSearchFilter internetQuery, SolrShortVideoSearchFilter shortQuery) { |
| | | this.albumQuery = albumQuery; |
| | | this.internetQuery = internetQuery; |
| | | this.shortQuery = shortQuery; |
| | | } |
| | | |
| | | public SolrVideoSearchFilter getAlbumQuery() { |
| | | return albumQuery; |
| | | } |
| | | |
| | | public void setAlbumQuery(SolrVideoSearchFilter albumQuery) { |
| | | this.albumQuery = albumQuery; |
| | | } |
| | | |
| | | public SolrVideoSearchFilter getInternetQuery() { |
| | | return internetQuery; |
| | | } |
| | | |
| | | public void setInternetQuery(SolrVideoSearchFilter internetQuery) { |
| | | this.internetQuery = internetQuery; |
| | | } |
| | | |
| | | public SolrShortVideoSearchFilter getShortQuery() { |
| | | return shortQuery; |
| | | } |
| | | |
| | | public void setShortQuery(SolrShortVideoSearchFilter shortQuery) { |
| | | this.shortQuery = shortQuery; |
| | | } |
| | | } |
| | | |
| | | public static class QueryConditionsContainer { |
| | | private QueryConditions queryConditions; |
| | | private String detailSystemId; |
| | | private String channel; |
| | | private int minVersion; |
| | | |
| | | public QueryConditionsContainer(QueryConditions queryConditions, String detailSystemId, String channel, int minVersion) { |
| | | this.queryConditions = queryConditions; |
| | | this.detailSystemId = detailSystemId; |
| | | this.channel = channel; |
| | | this.minVersion = minVersion; |
| | | } |
| | | |
| | | public QueryConditionsContainer() { |
| | | |
| | | } |
| | | |
| | | public QueryConditions getQueryConditions() { |
| | | return queryConditions; |
| | | } |
| | | |
| | | public void setQueryConditions(QueryConditions queryConditions) { |
| | | this.queryConditions = queryConditions; |
| | | } |
| | | |
| | | public String getDetailSystemId() { |
| | | return detailSystemId; |
| | | } |
| | | |
| | | public void setDetailSystemId(String detailSystemId) { |
| | | this.detailSystemId = detailSystemId; |
| | | } |
| | | |
| | | public int getMinVersion() { |
| | | return minVersion; |
| | | } |
| | | |
| | | public void setMinVersion(int minVersion) { |
| | | this.minVersion = minVersion; |
| | | } |
| | | |
| | | public String getChannel() { |
| | | return channel; |
| | | } |
| | | |
| | | public void setChannel(String channel) { |
| | | this.channel = channel; |
| | | } |
| | | } |
| | | } |
| | |
| | | this.msg = msg; |
| | | } |
| | | |
| | | @Override |
| | | public String getMsg() { |
| | | return msg; |
| | | } |
| | | |
| | | @Override |
| | | public int getCode() { |
| | | return code; |
| | | } |
| | | } |
| | |
| | | private static String LIVE_CATE = "[{\"name\":\"热门\",\"vomsID\":\"e7716fea6aa1483c80cfc10b7795fcb8\"},{\"name\":\"央视\",\"vomsID\":\"a5f78af9d160418eb679a6dd0429c920\"},{\"name\":\"卫视\",\"vomsID\":\"0847b3f6c08a4ca28f85ba5701268424\"},{\"name\":\"地方\",\"vomsID\":\"855e9adc91b04ea18ef3f2dbd43f495b\"},{\"name\":\"追剧\",\"vomsID\":\"dd5311d848b54c56acba186ff1107236\"},{\"name\":\"影视\",\"vomsID\":\"10b0d04cb23d4ac5945c4bc77c7ac44e\"},{\"name\":\"体育\",\"vomsID\":\"7538163cdac044398cb292ecf75db4e0\"},{\"name\":\"新闻\",\"vomsID\":\"c584f67ad63f4bc983c31de3a9be977c\"},{\"name\":\"教育\",\"vomsID\":\"af72267483d94275995a4498b2799ecd\"},{\"name\":\"熊猫\",\"vomsID\":\"e76e56e88fff4c11b0168f55e826445d\"},{\"name\":\"娱乐\",\"vomsID\":\"192a12edfef04b5eb616b878f031f32f\"},{\"name\":\"少儿\",\"vomsID\":\"fc2f5b8fd7db43ff88c4243e731ecede\"},{\"name\":\"纪实\",\"vomsID\":\"e1165138bdaa44b9a3138d74af6c6673\"},{\"name\":\"印象天下\",\"vomsID\":\"72504196e156468b873a39734f0af7db\"},{\"name\":\"特色\",\"vomsID\":\"f24ab89d1ad94b66b623945ae0c1350e\"},{\"name\":\"购物\",\"vomsID\":\"5938b5e060964fae9fe22ca20fbd5d6a\"}]"; |
| | | |
| | | |
| | | /** |
| | | * 获取播放链接 |
| | | * |
| | | * @param pid |
| | | * @return |
| | | */ |
| | | public static String getPlayUrl(String pid) { |
| | | return "https://m.miguvideo.com/mgs/msite/prd/detail.html?cid=" + pid; |
| | | } |
| | | |
| | | |
| | | public static List<MiGuLiveListInfo> getLiveList(String vomsID) { |
New file |
| | |
| | | package com.yeshi.buwan.service.imp.juhe; |
| | | |
| | | import com.yeshi.buwan.dao.VideoInfoDao; |
| | | import com.yeshi.buwan.dao.juhe.hanmi.HanmiShowDao; |
| | | import com.yeshi.buwan.dao.juhe.hanmi.HanmiShowEpisodeDao; |
| | | import com.yeshi.buwan.dao.juhe.hanmi.VideoHanmiMapDao; |
| | | import com.yeshi.buwan.dao.video.AlbumVideoMapDao; |
| | | import com.yeshi.buwan.domain.AdminInfo; |
| | | import com.yeshi.buwan.domain.VideoDetailInfo; |
| | | import com.yeshi.buwan.domain.VideoInfo; |
| | | import com.yeshi.buwan.domain.VideoResource; |
| | | import com.yeshi.buwan.domain.entity.PlayUrl; |
| | | import com.yeshi.buwan.domain.video.AlbumVideoMap; |
| | | import com.yeshi.buwan.service.imp.CategoryVideoService; |
| | | import com.yeshi.buwan.service.imp.ResourceVideoService; |
| | | import com.yeshi.buwan.service.imp.VideoInfoService; |
| | | import com.yeshi.buwan.service.imp.VideoResourceService; |
| | | import com.yeshi.buwan.service.inter.juhe.HanmiService; |
| | | import com.yeshi.buwan.util.StringUtil; |
| | | import com.yeshi.buwan.util.TimeUtil; |
| | | import com.yeshi.buwan.util.mq.CMQManager; |
| | | import com.yeshi.buwan.videos.hanmi.HanmiUtil; |
| | | import com.yeshi.buwan.videos.hanmi.entity.HanmiShow; |
| | | import com.yeshi.buwan.videos.hanmi.entity.HanmiShowEpisode; |
| | | import com.yeshi.buwan.videos.hanmi.entity.VideoHanmiMap; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.io.Serializable; |
| | | import java.util.ArrayList; |
| | | import java.util.Calendar; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | |
| | | @Service |
| | | public class HanmiServiceImpl implements HanmiService { |
| | | @Resource |
| | | private HanmiShowDao hanmiShowDao; |
| | | |
| | | @Resource |
| | | private HanmiShowEpisodeDao hanmiShowEpisodeDao; |
| | | |
| | | @Resource |
| | | private VideoHanmiMapDao videoHanmiMapDao; |
| | | |
| | | @Resource |
| | | private VideoInfoService videoInfoService; |
| | | |
| | | @Resource |
| | | private VideoInfoDao videoInfoDao; |
| | | |
| | | @Resource |
| | | private ResourceVideoService resourceVideoService; |
| | | |
| | | @Resource |
| | | private CategoryVideoService categoryVideoService; |
| | | |
| | | @Resource |
| | | private VideoResourceService videoResourceService; |
| | | |
| | | @Resource |
| | | private AlbumVideoMapDao albumVideoMapDao; |
| | | |
| | | public List<VideoDetailInfo> getVideoDetailList(String videoId, int page, int pageSize) { |
| | | //查询专辑 |
| | | VideoHanmiMap videoHanmiMap = videoHanmiMapDao.selectByVideoId(videoId); |
| | | if (videoHanmiMap == null) |
| | | return null; |
| | | List<HanmiShowEpisode> list = hanmiShowEpisodeDao.listByShowId(videoHanmiMap.getShowId(), (page - 1) * pageSize, pageSize); |
| | | List<VideoDetailInfo> detailInfoList = new ArrayList<>(); |
| | | if (list != null) |
| | | for (HanmiShowEpisode a : list) |
| | | detailInfoList.add(HanmiUtil.convertEpisodeToVideoDetail(a)); |
| | | return detailInfoList; |
| | | } |
| | | |
| | | // 获取最新一集的详情 |
| | | public VideoDetailInfo getLatestVideoDetail(String videoId) { |
| | | VideoHanmiMap videoHanmiMap = videoHanmiMapDao.selectByVideoId(videoId); |
| | | if (videoHanmiMap == null) |
| | | return null; |
| | | HanmiShowEpisode episode = hanmiShowEpisodeDao.getLatestEpisode(videoHanmiMap.getShowId()); |
| | | if (episode != null) |
| | | return HanmiUtil.convertEpisodeToVideoDetail(episode); |
| | | return null; |
| | | } |
| | | |
| | | @Override |
| | | public void saveShow(HanmiShow show) { |
| | | if (show.getCreateTime() == null) { |
| | | show.setCreateTime(new Date()); |
| | | } |
| | | show.setUpdateTime(new Date()); |
| | | hanmiShowDao.save(show); |
| | | if (show.getEpisodeList() != null) { |
| | | for (HanmiShowEpisode episode : show.getEpisodeList()) { |
| | | if (episode.getShowId() == null) { |
| | | episode.setShowId(show.getId()); |
| | | } |
| | | if (episode.getCreateTime() == null) { |
| | | episode.setCreateTime(new Date()); |
| | | } |
| | | if (episode.getId() == null) { |
| | | episode.setId(HanmiShowEpisode.createId(show.getId(), episode.getTag())); |
| | | } |
| | | // if (hanmiShowEpisodeDao.get(episode.getId()) != null) |
| | | // continue; |
| | | hanmiShowEpisodeDao.save(episode); |
| | | } |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public void addToVideoInfo(HanmiShow show) { |
| | | |
| | | if (StringUtil.isNullOrEmpty(show.getTitle())) { |
| | | return; |
| | | } |
| | | |
| | | VideoInfo newVideoInfo = convertShowToVideoInfo(show); |
| | | VideoHanmiMap map = videoHanmiMapDao.selectByShowId(show.getId()); |
| | | if (map != null) {//渠道视频已经存在 |
| | | VideoInfo videoInfo = videoInfoService.getVideoInfo(map.getVideoId() + ""); |
| | | if (videoInfo == null) |
| | | return; |
| | | newVideoInfo.setId(videoInfo.getId()); |
| | | if (!newVideoInfo.getTag().equalsIgnoreCase(videoInfo.getTag()) || newVideoInfo.getVideocount() != videoInfo.getVideocount()) { |
| | | newVideoInfo.setCreatetime(videoInfo.getCreatetime()); |
| | | //更新信息tag信息 |
| | | videoInfo.setLatestHpicture(newVideoInfo.getLatestHpicture()); |
| | | videoInfo.setLatestVpicture(newVideoInfo.getLatestVpicture()); |
| | | videoInfo.setVideocount(newVideoInfo.getVideocount()); |
| | | videoInfo.setTag(newVideoInfo.getTag()); |
| | | videoInfo.setPicture(newVideoInfo.getPicture()); |
| | | videoInfo.setHpicture(newVideoInfo.getHpicture()); |
| | | videoInfo.setVpicture(newVideoInfo.getVpicture()); |
| | | videoInfo.setShow(newVideoInfo.getShow()); |
| | | videoInfo.setVideoType(newVideoInfo.getVideoType()); |
| | | videoInfo.setUpdatetime(newVideoInfo.getUpdatetime()); |
| | | videoInfoDao.update(videoInfo); |
| | | } |
| | | } else {//视频不存在 |
| | | //判断2个视频实体是否为同一视频 |
| | | VideoInfo oldVideo = videoInfoService.getExistSameVideoWithTime(newVideoInfo); |
| | | if (oldVideo == null) { |
| | | //添加视频 |
| | | Serializable id = videoInfoDao.save(newVideoInfo); |
| | | newVideoInfo.setId(id + ""); |
| | | } else {//为同一视频 |
| | | //更新tag |
| | | newVideoInfo.setId(oldVideo.getId()); |
| | | oldVideo.setLatestHpicture(newVideoInfo.getLatestHpicture()); |
| | | oldVideo.setLatestVpicture(newVideoInfo.getLatestVpicture()); |
| | | oldVideo.setVideocount(newVideoInfo.getVideocount()); |
| | | oldVideo.setTag(newVideoInfo.getTag()); |
| | | oldVideo.setPicture(newVideoInfo.getPicture()); |
| | | oldVideo.setHpicture(newVideoInfo.getHpicture()); |
| | | oldVideo.setVpicture(newVideoInfo.getVpicture()); |
| | | oldVideo.setShow(newVideoInfo.getShow()); |
| | | oldVideo.setVideoType(newVideoInfo.getVideoType()); |
| | | oldVideo.setUpdatetime(newVideoInfo.getUpdatetime()); |
| | | videoInfoDao.update(oldVideo); |
| | | } |
| | | |
| | | //加入专辑视频映射 |
| | | AlbumVideoMap vmap = new AlbumVideoMap(); |
| | | vmap.setId(newVideoInfo.getId()); |
| | | vmap.setCreateTime(new Date()); |
| | | vmap.setVideoId(newVideoInfo.getId()); |
| | | vmap.setRootVideoType(newVideoInfo.getVideoType().getId()); |
| | | vmap.setVideoCount(newVideoInfo.getVideocount()); |
| | | albumVideoMapDao.save(vmap); |
| | | |
| | | |
| | | //加入映射 |
| | | VideoHanmiMap vi = new VideoHanmiMap(); |
| | | vi.setShowId(show.getId()); |
| | | vi.setVideoId(newVideoInfo.getId()); |
| | | videoHanmiMapDao.save(vi); |
| | | } |
| | | |
| | | //添加视频来源映射 |
| | | resourceVideoService.addVideoResource(newVideoInfo.getId(), HanmiUtil.RESOURCE_ID + ""); |
| | | //添加视频分类映射 |
| | | categoryVideoService.addCategoryVideo(newVideoInfo.getId(), newVideoInfo.getVideoType().getId()); |
| | | |
| | | //加入专辑搜索引擎 |
| | | CMQManager.getInstance().addSolrMsg(newVideoInfo.getId()); |
| | | } |
| | | |
| | | @Override |
| | | public PlayUrl getPlayUrl(String detailSystemId, int resourceId, String id, String videoId) { |
| | | HanmiShowEpisode album = hanmiShowEpisodeDao.get(id); |
| | | VideoResource vr = videoResourceService.getResource(resourceId + ""); |
| | | int t = HanmiUtil.getPlayType(album); |
| | | PlayUrl pu = new PlayUrl(); |
| | | pu.setParams(""); |
| | | pu.setPlayType(t); |
| | | pu.setResource(vr); |
| | | if (t == HanmiUtil.PLAY_NONE) { |
| | | pu.setUrl(""); |
| | | } else if (t == HanmiUtil.PLAY_HTML || t == HanmiUtil.PLAY_SDK) { |
| | | pu.setUrl(album.getPlayUrl()); |
| | | } |
| | | return pu; |
| | | } |
| | | |
| | | @Override |
| | | public int getShowType(String videoid) { |
| | | VideoHanmiMap map = videoHanmiMapDao.selectByVideoId(videoid); |
| | | if (map != null) { |
| | | HanmiShow show = hanmiShowDao.get(map.getShowId()); |
| | | if (show != null) { |
| | | if ("韩剧".equalsIgnoreCase(show.getType())) { |
| | | return 2; |
| | | } |
| | | } |
| | | } |
| | | return 1; |
| | | } |
| | | |
| | | @Override |
| | | public VideoInfo convertShowToVideoInfo(HanmiShow show) { |
| | | Calendar ca = Calendar.getInstance(); |
| | | ca.setTimeInMillis(TimeUtil.convertGernalTime(show.getRelaseDate(), "yyyy-MM-dd")); |
| | | int day = ca.get(Calendar.DAY_OF_MONTH); |
| | | int month = ca.get(Calendar.MONTH) + 1; |
| | | int year = ca.get(Calendar.YEAR); |
| | | |
| | | VideoInfo video = new VideoInfo(); |
| | | video.setArea(show.getArea()); |
| | | video.setBaseurl(show.getUrl()); |
| | | video.setCanSave(false); |
| | | video.setCommentCount(0); |
| | | video.setCreatetime(System.currentTimeMillis()); |
| | | video.setDay(day + ""); |
| | | video.setYear(year + ""); |
| | | video.setMonth(month + ""); |
| | | video.setDirector(show.getDirector()); |
| | | video.setFinish("1"); |
| | | video.setIntroduction(show.getDesc()); |
| | | video.setMainActor(show.getActors()); |
| | | video.setName(show.getTitle()); |
| | | video.setNowNumber(show.getEpisodeList().size() + ""); |
| | | |
| | | video.setOrderby("0" + ""); |
| | | video.setPicture(show.getPicture()); |
| | | video.setVpicture(show.getPicture()); |
| | | |
| | | video.setScore(show.getScore()); |
| | | video.setShare("0"); |
| | | video.setShow("1"); |
| | | |
| | | video.setThirdType("1"); |
| | | video.setTotalNumber("0"); |
| | | |
| | | video.setWatchCount(0 + ""); |
| | | |
| | | video.setAdmin(new AdminInfo("1")); |
| | | video.setContentType(1); |
| | | video.setCommentCount(0); |
| | | |
| | | String tag = show.getTag(); |
| | | video.setTag(tag); |
| | | |
| | | |
| | | long videoCount = show.getEpisodeList().size(); |
| | | if (videoCount == 0L) |
| | | videoCount = 1; |
| | | |
| | | video.setVideocount((int) videoCount); |
| | | |
| | | video.setUpdatetime(System.currentTimeMillis() + ""); |
| | | |
| | | video.setVideoType(HanmiUtil.getVideoType(show)); |
| | | return video; |
| | | } |
| | | |
| | | @Override |
| | | public HanmiShow selectShowById(String id) { |
| | | return hanmiShowDao.get(id); |
| | | } |
| | | |
| | | @Override |
| | | public long countById(String id) { |
| | | return hanmiShowEpisodeDao.countByShowId(id); |
| | | } |
| | | |
| | | @Override |
| | | public void deleteByShowId(String id) { |
| | | hanmiShowDao.delete(id); |
| | | long count = hanmiShowEpisodeDao.countByShowId(id); |
| | | int page = (int) count / 100 + 1; |
| | | for (int i = 0; i < page; i++) { |
| | | List<HanmiShowEpisode> episodes = hanmiShowEpisodeDao.listByShowId(id, i * 100, 100); |
| | | for (HanmiShowEpisode episode : episodes) { |
| | | hanmiShowEpisodeDao.delete(episode.getId()); |
| | | } |
| | | } |
| | | |
| | | |
| | | VideoHanmiMap bean = videoHanmiMapDao.selectByShowId(id); |
| | | if (bean != null) { |
| | | videoHanmiMapDao.delete(bean.getVideoId()); |
| | | //删除资源 |
| | | resourceVideoService.delete(bean.getVideoId() + "", HanmiUtil.RESOURCE_ID + ""); |
| | | resourceVideoService.delete(bean.getVideoId() + "", HanmiUtil.RESOURCE_ID + ""); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public List<HanmiShow> listByIds(List<String> idsList) { |
| | | return hanmiShowDao.listByIds(idsList); |
| | | } |
| | | |
| | | @Override |
| | | public HanmiShow getShowDetail(String id) { |
| | | HanmiShow show = hanmiShowDao.get(id); |
| | | if (show != null) { |
| | | show.setEpisodeList(hanmiShowEpisodeDao.listByShowId(id, 0, 1000)); |
| | | } |
| | | |
| | | return show; |
| | | } |
| | | } |
| | |
| | | @Override |
| | | public List<TVLiveChannel> listChannelByCid(String cid, String nameKey, int page, int pageSize) { |
| | | //查询Map |
| | | List<TVLiveCategoryChannelMap> mapList = tvLiveCategoryChannelMapDao.listByCid(cid, page, pageSize); |
| | | List<TVLiveCategoryChannelMap> mapList = tvLiveCategoryChannelMapDao.listByCid(cid, (page-1)*pageSize, pageSize); |
| | | if (mapList == null || mapList.size() == 0) |
| | | return null; |
| | | List<String> cids = new ArrayList<>(); |
| | |
| | | return tvLiveCategoryChannelMapDao.findList(query); |
| | | } |
| | | |
| | | @Override |
| | | public TVLiveCategoryChannelMap selectByCategoryIdAndChannelId(String categoryId, String channelId) { |
| | | Query query = new Query(); |
| | | query.addCriteria(Criteria.where("channelId").is(channelId).and("categoryId").is(categoryId)); |
| | | return tvLiveCategoryChannelMapDao.findOne(query); |
| | | } |
| | | |
| | | |
| | | } |
| | |
| | | import com.yeshi.buwan.service.inter.live.TVLiveCategoryService; |
| | | import com.yeshi.buwan.util.StringUtil; |
| | | 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; |
| | |
| | | } |
| | | |
| | | @Override |
| | | public List<TVLiveCategory> list(String detailSystemId, String nameKey, int page, int pageSize) { |
| | | public List<TVLiveCategory> list(String detailSystemId, String systemId, String nameKey, int page, int pageSize) { |
| | | if (detailSystemId != null) { |
| | | List<SuperTVLiveCategory> superTVLiveCategoryList = superTVLiveCategoryDao.listByDetailSystemId(detailSystemId, page, pageSize); |
| | | List<SuperTVLiveCategory> superTVLiveCategoryList = superTVLiveCategoryDao.listByDetailSystemId(detailSystemId, (page - 1) * pageSize, pageSize); |
| | | if (superTVLiveCategoryList == null || superTVLiveCategoryList.size() == 0) |
| | | return null; |
| | | List<String> cids = new ArrayList<>(); |
| | |
| | | return resultList; |
| | | } else { |
| | | TVLiveCategoryDao.DaoQuery daoQuery = new TVLiveCategoryDao.DaoQuery(); |
| | | daoQuery.systemId = systemId; |
| | | daoQuery.start = (page - 1) * pageSize; |
| | | daoQuery.count = pageSize; |
| | | daoQuery.name = nameKey; |
| | |
| | | } |
| | | |
| | | @Override |
| | | public long count(String detailSystemId, String nameKey) { |
| | | public long count(String detailSystemId, String systemId, String nameKey) { |
| | | if (detailSystemId != null) { |
| | | return superTVLiveCategoryDao.countByDetailSystemId(detailSystemId); |
| | | } else { |
| | | TVLiveCategoryDao.DaoQuery daoQuery = new TVLiveCategoryDao.DaoQuery(); |
| | | daoQuery.name = nameKey; |
| | | daoQuery.systemId = systemId; |
| | | return tvLiveCategoryDao.count(daoQuery); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public List<TVLiveCategory> listByIds(List<String> idList) { |
| | | Criteria[] ors = new Criteria[idList.size()]; |
| | | for (int i = 0; i < idList.size(); i++) { |
| | | ors[i] = Criteria.where("_id").is(idList.get(i)); |
| | | } |
| | | Query query = new Query(); |
| | | query.addCriteria(new Criteria().orOperator(ors)); |
| | | return tvLiveCategoryDao.findList(query); |
| | | } |
| | | |
| | | @Override |
| | | public List<SuperTVLiveCategory> listSuper(String detailSystemId, int page, int pageSize) { |
| | | |
| | | return superTVLiveCategoryDao.listByDetailSystemId(detailSystemId, (page - 1) * pageSize, pageSize); |
| | | |
| | | } |
| | | |
| | | @Override |
| | |
| | | if (sc != null) |
| | | deleteSuperCategory(sc.getId()); |
| | | } |
| | | |
| | | @Override |
| | | public List<SuperTVLiveCategory> listSuper(String cid) { |
| | | return superTVLiveCategoryDao.listByCid(cid); |
| | | } |
| | | |
| | | @Override |
| | | public TVLiveCategory selectCategoryBuPrimaryKey(String id) { |
| | | return tvLiveCategoryDao.get(id); |
| | | } |
| | | |
| | | |
| | | } |
| | |
| | | daoQuery.name = name; |
| | | return tvLiveChannelDao.count(daoQuery); |
| | | } |
| | | |
| | | } |
| | |
| | | } |
| | | |
| | | |
| | | private List<HomeVideo> betchInternetVideos(List<HomeVideo> homeVideoList) { |
| | | for (HomeVideo hv : homeVideoList) { |
| | | private List<HomeVideo> betchInternetVideos(List<HomeVideo> homeVideoList, List<Long> resourceIds) { |
| | | for (int i = 0; i < homeVideoList.size(); i++) { |
| | | HomeVideo hv = homeVideoList.get(i); |
| | | if (hv == null || hv.getVideo() != null || StringUtil.isNullOrEmpty(hv.getVideoId())) { |
| | | continue; |
| | | } |
| | |
| | | } |
| | | InternetSearchVideo internetSearchVideo = internetSearchVideoService.selectByPrimaryKeyCache(hv.getVideoId()); |
| | | if (internetSearchVideo != null) { |
| | | hv.setVideo(VideoInfoFactory.create(internetSearchVideo)); |
| | | String[] rids = internetSearchVideo.getResourceIds().split(","); |
| | | List<Long> ridList = new ArrayList<>(); |
| | | for (String rid : rids) { |
| | | ridList.add(Long.parseLong(rid)); |
| | | } |
| | | ridList.retainAll(resourceIds); |
| | | if (ridList.size() > 0) |
| | | hv.setVideo(VideoInfoFactory.create(internetSearchVideo)); |
| | | else { |
| | | homeVideoList.remove(i); |
| | | i--; |
| | | } |
| | | } |
| | | |
| | | } |
| | | |
| | | return homeVideoList; |
| | | } |
| | | |
| | | private List<HomeVideo> betchShortVideos(List<HomeVideo> homeVideoList) { |
| | | for (HomeVideo hv : homeVideoList) { |
| | | private List<HomeVideo> betchShortVideos(List<HomeVideo> homeVideoList, List<Long> resourceIds) { |
| | | for (int i = 0; i < homeVideoList.size(); i++) { |
| | | HomeVideo hv = homeVideoList.get(i); |
| | | if (hv == null || hv.getVideo() != null || StringUtil.isNullOrEmpty(hv.getVideoId())) { |
| | | continue; |
| | | } |
| | |
| | | |
| | | SolrShortVideo shortVideo = solrShortVideoDataManager.findOne(hv.getVideoId()); |
| | | if (shortVideo != null) { |
| | | hv.setVideo(VideoInfoFactory.create(shortVideo)); |
| | | Long rid = Long.parseLong(shortVideo.getResourceId() + ""); |
| | | if (resourceIds.contains(rid)) { |
| | | hv.setVideo(VideoInfoFactory.create(shortVideo)); |
| | | } else { |
| | | homeVideoList.remove(i); |
| | | i--; |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | }); |
| | | |
| | | List<VideoInfo> videoInfoList = new ArrayList<>(); |
| | | homeVideos = betchInternetVideos(homeVideos); |
| | | homeVideos = betchShortVideos(homeVideos); |
| | | homeVideos = betchInternetVideos(homeVideos, resourceIds); |
| | | homeVideos = betchShortVideos(homeVideos, resourceIds); |
| | | for (int i = 0; i < homeVideos.size(); i++) { |
| | | if (homeVideos.get(i).getVideo() == null) { |
| | | homeVideos.remove(i); |
| | |
| | | } |
| | | } |
| | | videoInfoExtraService.batchExtra(videoInfoList, resourceIds); |
| | | return betchInternetVideos(homeVideos); |
| | | return betchInternetVideos(homeVideos, resourceIds); |
| | | } |
| | | |
| | | @Override |
| | |
| | | throw new Exception("参数不完整"); |
| | | } |
| | | |
| | | if (special.getAlbumQuery() == null && special.getInternetQuery() == null && special.getShortQuery() == null) { |
| | | if (special.getContainerList() == null || special.getContainerList().size() == 0) { |
| | | throw new Exception("搜索条件不能都为空"); |
| | | } |
| | | |
New file |
| | |
| | | package com.yeshi.buwan.service.inter.juhe; |
| | | |
| | | import com.yeshi.buwan.domain.VideoDetailInfo; |
| | | import com.yeshi.buwan.domain.VideoInfo; |
| | | import com.yeshi.buwan.domain.entity.PlayUrl; |
| | | import com.yeshi.buwan.exception.video.IqiyiVideoSolrException; |
| | | import com.yeshi.buwan.videos.hanmi.entity.HanmiShow; |
| | | import com.yeshi.buwan.videos.iqiyi.entity.IqiyiAlbum2; |
| | | |
| | | import java.util.List; |
| | | |
| | | public interface HanmiService { |
| | | |
| | | /** |
| | | * 获取视频详情 |
| | | * |
| | | * @param videoId |
| | | * @return |
| | | */ |
| | | public List<VideoDetailInfo> getVideoDetailList(String videoId, int page, int pageSize); |
| | | |
| | | /** |
| | | * 获取最新一集的详情 |
| | | * |
| | | * @param videoId |
| | | * @return |
| | | */ |
| | | public VideoDetailInfo getLatestVideoDetail(String videoId); |
| | | |
| | | |
| | | /** |
| | | * 保存专辑 |
| | | * |
| | | * @param show |
| | | */ |
| | | public void saveShow(HanmiShow show); |
| | | |
| | | |
| | | /** |
| | | * 将专辑添加到视频 |
| | | * |
| | | * @param show |
| | | */ |
| | | public void addToVideoInfo(HanmiShow show); |
| | | |
| | | |
| | | public PlayUrl getPlayUrl(String detailSystemId, int resourceId, String id, String videoId); |
| | | |
| | | |
| | | public int getShowType(String videoid); |
| | | |
| | | public VideoInfo convertShowToVideoInfo(HanmiShow show); |
| | | |
| | | |
| | | public HanmiShow selectShowById(String id); |
| | | |
| | | public long countById(String id); |
| | | |
| | | /** |
| | | * 根据专辑ID删除 |
| | | * |
| | | * @param id |
| | | */ |
| | | public void deleteByShowId(String id); |
| | | |
| | | |
| | | /** |
| | | * 根据ID查询 |
| | | * |
| | | * @param idsList |
| | | * @return |
| | | */ |
| | | public List<HanmiShow> listByIds(List<String> idsList); |
| | | |
| | | /** |
| | | * 韩迷show详情 |
| | | * |
| | | * @param id |
| | | * @return |
| | | */ |
| | | public HanmiShow getShowDetail(String id); |
| | | |
| | | } |
| | |
| | | |
| | | public List<TVLiveCategoryChannelMap> listByChannelId(String channelId); |
| | | |
| | | public TVLiveCategoryChannelMap selectByCategoryIdAndChannelId(String categoryId, String channelId); |
| | | |
| | | } |
| | |
| | | * 列表查询 |
| | | * |
| | | * @param detailSystemId |
| | | * @param systemId |
| | | * @param nameKey |
| | | * @param page |
| | | * @param pageSize |
| | | * @return |
| | | */ |
| | | public List<TVLiveCategory> list(String detailSystemId, String nameKey, int page, int pageSize); |
| | | public List<TVLiveCategory> list(String detailSystemId, String systemId, String nameKey, int page, int pageSize); |
| | | |
| | | public long count(String detailSystemId, String nameKey); |
| | | |
| | | public long count(String detailSystemId, String systemId, String nameKey); |
| | | |
| | | |
| | | public List<TVLiveCategory> listByIds(List<String> idList); |
| | | |
| | | |
| | | public List<SuperTVLiveCategory> listSuper(String detailSystemId, int page, int pageSize); |
| | | |
| | | |
| | | //系统分类映射 |
| | |
| | | |
| | | public void deleteSuperCategory(String categoryId, String detailSystemId); |
| | | |
| | | |
| | | public List<SuperTVLiveCategory> listSuper(String cid); |
| | | |
| | | public TVLiveCategory selectCategoryBuPrimaryKey(String id); |
| | | |
| | | } |
| | |
| | | import com.yeshi.buwan.domain.solr.SolrShortVideo; |
| | | import com.yeshi.buwan.dto.search.SolrResultDTO; |
| | | import com.yeshi.buwan.dto.search.SolrShortVideoSearchFilter; |
| | | import com.yeshi.buwan.iqiyi.util.IqiyiUtil; |
| | | import com.yeshi.buwan.util.StringUtil; |
| | | import com.yeshi.buwan.util.video.VideoUtil; |
| | | import com.yeshi.buwan.videos.iqiyi.util.IqiyiUtil2; |
| | | import org.apache.solr.client.solrj.response.UpdateResponse; |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | |
| | | return null; |
| | | PlayUrl pu = new PlayUrl(); |
| | | pu.setParams(""); |
| | | pu.setPlayType(IqiyiUtil.PLAY_HTML); |
| | | pu.setPlayType(IqiyiUtil2.PLAY_HTML); |
| | | pu.setResource(videoResource); |
| | | pu.setUrl(solrShortVideo.getPlayUrl()); |
| | | return pu; |
| | |
| | | import com.yeshi.buwan.domain.entity.PlayUrl; |
| | | import com.yeshi.buwan.videos.funtv.FunTVUtil; |
| | | import com.yeshi.buwan.videos.funtv.FunTVUtil2; |
| | | import com.yeshi.buwan.videos.hanmi.HanmiUtil; |
| | | import com.yeshi.buwan.videos.iqiyi.util.IqiyiUtil; |
| | | import com.yeshi.buwan.videos.iqiyi.util.IqiyiUtil2; |
| | | import com.yeshi.buwan.videos.mogotv.MogoTVUtil; |
| | |
| | | |
| | | @Resource |
| | | private BilibiliVideoService bilibiliVideoService; |
| | | |
| | | @Resource |
| | | private HanmiService hanmiService; |
| | | |
| | | @Resource |
| | | private BilibiliUtil bilibiliUtil; |
| | |
| | | return tencentVideoService.getVideoDetailList(videoid, page, pageSize); |
| | | case BilibiliUtil.RESOURCE_ID: |
| | | return bilibiliVideoService.getVideoDetailList(videoid, page, pageSize); |
| | | case HanmiUtil.RESOURCE_ID: |
| | | return hanmiService.getVideoDetailList(videoid, page, pageSize); |
| | | default: |
| | | return null; |
| | | } |
| | |
| | | return soHuService.getLatestVideoDetail(videoid); |
| | | case MogoTVUtil.RESOURCE_ID: |
| | | return soHuService.getLatestVideoDetail(videoid); |
| | | case HanmiUtil.RESOURCE_ID: |
| | | return hanmiService.getLatestVideoDetail(videoid); |
| | | default: |
| | | return null; |
| | | } |
| | |
| | | return soHuUtil.getShowType(videoid); |
| | | case YouKuUtil.RESOURCE_ID: |
| | | return soHuUtil.getShowType(videoid); |
| | | case HanmiUtil.RESOURCE_ID: |
| | | return hanmiService.getShowType(videoid); |
| | | default: |
| | | return 1; |
| | | } |
| | |
| | | return tencentVideoUtil.getPlayUrl(detailSystemId, id, type, resourceid, videoid); |
| | | case BilibiliUtil.RESOURCE_ID: |
| | | return bilibiliUtil.getPlayUrl(detailSystemId, id, type, resourceid, videoid); |
| | | case HanmiUtil.RESOURCE_ID: |
| | | return hanmiService.getPlayUrl(detailSystemId, resourceid, id, videoid); |
| | | default: |
| | | return null; |
| | | } |
| | |
| | | package com.yeshi.buwan.videos.hanmi; |
| | | |
| | | import com.yeshi.buwan.util.StringUtil; |
| | | import com.yeshi.buwan.videos.hanmi.entity.HanmiShow; |
| | | import com.yeshi.buwan.videos.hanmi.entity.HanmiShowEpisode; |
| | | import org.jsoup.Connection; |
| | | import org.jsoup.Jsoup; |
| | | import org.jsoup.nodes.Document; |
| | | import org.jsoup.nodes.Element; |
| | | import org.jsoup.select.Elements; |
| | | |
| | | import java.io.IOException; |
| | | import java.util.ArrayList; |
| | | import java.util.HashMap; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.*; |
| | | |
| | | public class HanmiApiUtil { |
| | | |
| | |
| | | return parseShowDetail(show); |
| | | } |
| | | |
| | | private static Map<String, String> getHeaders() { |
| | | Map<String, String> headers = new HashMap<>(); |
| | | headers.put("sec-fetch-dest", "document"); |
| | | headers.put("sec-fetch-mode", "navigate"); |
| | | headers.put("sec-fetch-site", "same-origin"); |
| | | headers.put("sec-fetch-user", "?1"); |
| | | headers.put("upgrade-insecure-requests", "1"); |
| | | return headers; |
| | | } |
| | | |
| | | private static Document getDoc(String link, Map<String, String> headres) throws IOException { |
| | | Connection connection = Jsoup.connect(link).timeout(60000); |
| | | if (headres != null) |
| | | for (Iterator<String> its = headres.keySet().iterator(); its.hasNext(); ) { |
| | | String key = its.next(); |
| | | connection = connection.header(key, headres.get(key)); |
| | | } |
| | | Document doc = connection |
| | | .userAgent("Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E304 Safari/602.1").get(); |
| | | return doc; |
| | | } |
| | | |
| | | public static HanmiShow parseShowDetail(HanmiShow show) throws Exception { |
| | | if (show.getUrl() == null || !show.getUrl().startsWith("https://www.hmtv.me/show/")) { |
| | | throw new Exception("链接不合法"); |
| | | } |
| | | Document doc = Jsoup.connect(show.getUrl()).timeout(60000).referrer("https://www.hmtv.me/hanju").userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36").get(); |
| | | Document doc = getDoc(show.getUrl(), getHeaders()); |
| | | |
| | | Element root = doc.getElementsByClass("video-content").get(0); |
| | | Element titleItem = root.getElementsByClass("article-title").get(0); |
| | | |
| | | //标题 |
| | | String title = titleItem.getElementsByClass("item-title").get(0).ownText(); |
| | | String title = null; |
| | | try { |
| | | title = titleItem.getElementsByClass("item-title").get(0).ownText(); |
| | | } catch (IndexOutOfBoundsException e) { |
| | | } |
| | | |
| | | String year = titleItem.getElementsByClass("item-year").get(0).ownText(); |
| | | |
| | | String year = null; |
| | | try { |
| | | year = titleItem.getElementsByClass("item-year").get(0).ownText(); |
| | | } catch (IndexOutOfBoundsException e) { |
| | | } |
| | | |
| | | //节目信息 |
| | | Element videoBox = root.getElementsByClass("video_box").get(0); |
| | |
| | | Element eposide = root.getElementsByClass("video_list_li").get(0); |
| | | Elements eposides = eposide.getElementsByTag("a"); |
| | | List<HanmiShowEpisode> episodeList = new ArrayList<>(); |
| | | for (int i = 0; i < eposides.size(); i++) { |
| | | String href = eposides.get(i).attr("href"); |
| | | String tag = eposides.get(i).ownText(); |
| | | |
| | | |
| | | //电影 |
| | | if (show.getType() != null && show.getType().contains("影")) { |
| | | int index = 0; |
| | | // for (int i = 0; i < eposides.size(); i++) { |
| | | // String tag = eposides.get(i).ownText(); |
| | | // if (tag.contains("HD")) { |
| | | // index = i; |
| | | // break; |
| | | // } |
| | | // } |
| | | String href = eposides.get(index).attr("href"); |
| | | HanmiShowEpisode ep = new HanmiShowEpisode(); |
| | | ep.setOrderBy(i + 1); |
| | | ep.setOrderBy(0); |
| | | ep.setPlayUrl("https://www.hmtv.me" + href); |
| | | ep.setTag(tag); |
| | | ep.setTag(show.getTitle() != null ? show.getTitle() : title); |
| | | episodeList.add(ep); |
| | | } else { |
| | | for (int i = 0; i < eposides.size(); i++) { |
| | | String href = eposides.get(i).attr("href"); |
| | | String tag = eposides.get(i).ownText(); |
| | | HanmiShowEpisode ep = new HanmiShowEpisode(); |
| | | ep.setOrderBy(i + 1); |
| | | ep.setPlayUrl("https://www.hmtv.me" + href); |
| | | ep.setTag(tag); |
| | | episodeList.add(ep); |
| | | } |
| | | } |
| | | |
| | | //简介 |
| | |
| | | |
| | | if (show.getTitle() == null) |
| | | show.setTitle(title.split(" ")[0]); |
| | | show.setYear(year.replace("(", "").replace(")", "")); |
| | | |
| | | show.setPicture(picture); |
| | | if (infos.get("主演") != null) |
| | | show.setActors(infos.get("主演").replace("/", ",")); |
| | | show.setActors(infos.get("主演"). |
| | | |
| | | replace("/", ",")); |
| | | if (infos.get("导演") != null) |
| | | show.setDirector(infos.get("导演")); |
| | | if (infos.get("类型") != null) |
| | |
| | | if (infos.get("国家/地区") != null) |
| | | show.setArea(infos.get("国家/地区")); |
| | | if (infos.get("首播") != null) |
| | | show.setRelaseDate(infos.get("首播").substring(0, infos.get("首播").indexOf("(") > -1 ? infos.get("首播").indexOf("(") : infos.get("首播").length())); |
| | | show.setRelaseDate(infos.get("首播"). |
| | | |
| | | show.setId(show.getUrl().replace("https://www.hmtv.me/show/", "").trim()); |
| | | substring(0, infos.get("首播"). |
| | | |
| | | indexOf("(") > -1 ? infos.get("首播"). |
| | | |
| | | indexOf("(") : infos.get("首播"). |
| | | |
| | | length())); |
| | | if (infos.get("上映日期") != null) |
| | | show.setRelaseDate(infos.get("上映日期"). |
| | | |
| | | substring(0, infos.get("上映日期"). |
| | | |
| | | indexOf("(") > -1 ? infos.get("上映日期"). |
| | | |
| | | indexOf("(") : infos.get("上映日期"). |
| | | |
| | | length())); |
| | | |
| | | |
| | | if (year == null && show.getRelaseDate() != null) { |
| | | year = show.getRelaseDate().split("-")[0]; |
| | | } |
| | | |
| | | show.setYear(year.replace("(", ""). |
| | | replace(")", "")); |
| | | |
| | | show.setId(show.getUrl(). |
| | | |
| | | replace("https://www.hmtv.me/show/", ""). |
| | | |
| | | trim()); |
| | | show.setEpisodeList(episodeList); |
| | | show.setUrl(show.getUrl()); |
| | | show.setDesc(desc.trim()); |
| | |
| | | |
| | | |
| | | public static List<HanmiShow> parseList(String listUrl) throws IOException { |
| | | Map<String, String> headers = new HashMap<>(); |
| | | headers.put("sec-fetch-dest", "document"); |
| | | headers.put("sec-fetch-mode", "navigate"); |
| | | headers.put("sec-fetch-site", "same-origin"); |
| | | headers.put("sec-fetch-user", "?1"); |
| | | headers.put("upgrade-insecure-requests", "1"); |
| | | |
| | | |
| | | List<HanmiShow> list = new ArrayList<>(); |
| | | Document doc = Jsoup.connect(listUrl).timeout(60000).referrer("https://www.hmtv.me/hanju").userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36").get(); |
| | | Document doc = getDoc(listUrl, headers); |
| | | String type = doc.getElementsByClass("list-content").get(0).getElementsByClass("title").get(0).getElementsByTag("strong").text(); |
| | | |
| | | Element root = doc.getElementsByClass("m-movies").get(0); |
| | | Elements items = root.getElementsByClass("u-movie"); |
| | | for (int i = 0; i < items.size(); i++) { |
| | |
| | | show.setScore(score); |
| | | } |
| | | show.setTitle(item.getElementsByTag("h2").get(0).getElementsByTag("a").get(0).ownText()); |
| | | show.setType(type); |
| | | show.setId(show.getUrl(). |
| | | replace("https://www.hmtv.me/show/", ""). |
| | | trim()); |
| | | list.add(show); |
| | | } |
| | | |
| | | return list; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 根据链接获取剧集 |
| | | * |
| | | * @param playUrl |
| | | * @return |
| | | */ |
| | | public static List<HanmiShowEpisode> getShowEpisodesFromPlayUrl(String playUrl) throws IOException { |
| | | List<HanmiShowEpisode> episodeList = new ArrayList<>(); |
| | | Document doc = getDoc(playUrl, null); |
| | | Element els = doc.getElementById("playnav"); |
| | | Elements items = els.getElementsByTag("li"); |
| | | int playIndex = -1; |
| | | for (int i = 0; i < items.size(); i++) { |
| | | String name = items.get(i).text(); |
| | | if (name.contains("HM")) { |
| | | playIndex = i; |
| | | break; |
| | | } |
| | | } |
| | | if (playIndex < 0) |
| | | return null; |
| | | Element tab = doc.getElementById("playcontainer").getElementsByClass("tab").get(playIndex); |
| | | Elements es = tab.getElementsByTag("a"); |
| | | |
| | | for (int i = 0; i < es.size(); i++) { |
| | | HanmiShowEpisode episode = new HanmiShowEpisode(); |
| | | String href = "https://www.hmtv.me" + es.get(i).attr("href"); |
| | | String name = es.get(i).text(); |
| | | episode.setTag(name); |
| | | episode.setPlayUrl(href); |
| | | episode.setOrderBy(i + 1); |
| | | episodeList.add(episode); |
| | | } |
| | | return episodeList; |
| | | } |
| | | |
| | | |
| | | public static List<HanmiShow> parseDetailList(List<HanmiShow> showList) throws Exception { |
| | | List<HanmiShow> list = new ArrayList<>(); |
| | |
| | | } |
| | | |
| | | public static void main(String[] args) throws Exception { |
| | | parseDetailList(parseList("https://www.hmtv.me/hanju")); |
| | | List<HanmiShowEpisode> list = getShowEpisodesFromPlayUrl("https://www.hmtv.me/vplay/MTExNS0xLTA=.html"); |
| | | System.out.println(list); |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.yeshi.buwan.videos.hanmi; |
| | | |
| | | import com.yeshi.buwan.domain.AdminInfo; |
| | | import com.yeshi.buwan.domain.VideoDetailInfo; |
| | | import com.yeshi.buwan.domain.VideoType; |
| | | import com.yeshi.buwan.service.inter.juhe.HanmiService; |
| | | import com.yeshi.buwan.util.video.VideoConstant; |
| | | import com.yeshi.buwan.videos.hanmi.entity.HanmiShow; |
| | | import com.yeshi.buwan.videos.hanmi.entity.HanmiShowEpisode; |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.util.List; |
| | | |
| | | @Component |
| | | public class HanmiUtil { |
| | | |
| | | private final Logger logger = LoggerFactory.getLogger("HanmiUtil"); |
| | | |
| | | public final static int PLAY_NONE = 0;// 不能播放 |
| | | public final static int PLAY_HTML = 1;// 跳转移动端网页播放 |
| | | public final static int PLAY_SDK = 2;// 嵌套网页播放 |
| | | |
| | | public final static int RESOURCE_ID = 28; |
| | | public final static String RESOURCE_NAME = "韩迷TV"; |
| | | @Resource |
| | | private HanmiService hanmiService; |
| | | |
| | | private void saveShow(List<HanmiShow> list) { |
| | | if (list == null) |
| | | return; |
| | | for (HanmiShow show : list) |
| | | hanmiService.saveShow(show); |
| | | } |
| | | |
| | | |
| | | public static VideoType getVideoType(HanmiShow show) { |
| | | |
| | | switch (show.getType()) { |
| | | case "韩剧": |
| | | return new VideoType(VideoConstant.VIDEO_CATEGORY_DIANSHIJU); |
| | | case "韩综": |
| | | case "综艺": |
| | | return new VideoType(VideoConstant.VIDEO_CATEGORY_ZONGYI); |
| | | case "韩影": |
| | | case "电影": |
| | | return new VideoType(VideoConstant.VIDEO_CATEGORY_DIANYING); |
| | | } |
| | | |
| | | return null; |
| | | } |
| | | |
| | | |
| | | public static VideoDetailInfo convertEpisodeToVideoDetail(HanmiShowEpisode episode) { |
| | | VideoDetailInfo vi = new VideoDetailInfo(); |
| | | vi.setAdmin(new AdminInfo("1")); |
| | | vi.setId(null); |
| | | vi.setIntroduction(""); |
| | | vi.setExtraId(episode.getId()); |
| | | vi.setName(episode.getTag()); |
| | | vi.setTag(episode.getTag()); |
| | | vi.setType("album"); |
| | | return vi; |
| | | } |
| | | |
| | | |
| | | public static int getPlayType(HanmiShowEpisode album) { |
| | | int type = PLAY_SDK; |
| | | return type; |
| | | } |
| | | |
| | | |
| | | } |
| | |
| | | package com.yeshi.buwan.videos.hanmi.entity; |
| | | |
| | | import com.yeshi.buwan.util.StringUtil; |
| | | import org.springframework.data.annotation.Id; |
| | | import org.springframework.data.mongodb.core.mapping.Document; |
| | | |
| | |
| | | |
| | | |
| | | public static String createId(String showId, String tag) { |
| | | return showId + "#" + tag; |
| | | return StringUtil.Md5(showId + "#" + tag); |
| | | } |
| | | |
| | | |
New file |
| | |
| | | package com.yeshi.buwan.videos.hanmi.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 = "videoHanmiMap") |
| | | public class VideoHanmiMap { |
| | | public VideoHanmiMap() { |
| | | } |
| | | |
| | | @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; |
| | | } |
| | | } |
| | |
| | | private String Package; |
| | | private String uid; |
| | | private String utdId; |
| | | private String childPackage; |
| | | //注入detailSystem |
| | | private DetailSystem detailSystem; |
| | | //注入childDetailSystem |
| | | private DetailSystem childDetailSystem; |
| | | |
| | | |
| | | public String getUtdId() { |
| | | return utdId; |
| | |
| | | this.utdId = utdId; |
| | | } |
| | | |
| | | //注入detailSystem |
| | | private DetailSystem detailSystem; |
| | | |
| | | |
| | | |
| | | public DetailSystem getDetailSystem() { |
| | |
| | | public void setPackage(String aPackage) { |
| | | Package = aPackage; |
| | | } |
| | | |
| | | public String getChildPackage() { |
| | | return childPackage; |
| | | } |
| | | |
| | | public void setChildPackage(String childPackage) { |
| | | this.childPackage = childPackage; |
| | | } |
| | | |
| | | public DetailSystem getChildDetailSystem() { |
| | | return childDetailSystem; |
| | | } |
| | | |
| | | public void setChildDetailSystem(DetailSystem childDetailSystem) { |
| | | this.childDetailSystem = childDetailSystem; |
| | | } |
| | | } |
New file |
| | |
| | | package com.yeshi.buwan.vo.tvlive; |
| | | |
| | | import com.yeshi.buwan.domain.live.TVLiveChannel; |
| | | import com.yeshi.buwan.util.StringUtil; |
| | | |
| | | public class TVLiveChannelVO { |
| | | |
| | | private String id; |
| | | private String name; |
| | | private String picture; |
| | | private String nowProgram; |
| | | private String nextProgram; |
| | | |
| | | public static TVLiveChannelVO create(TVLiveChannel tvLiveChannel) { |
| | | TVLiveChannelVO vo = new TVLiveChannelVO(); |
| | | vo.setId(tvLiveChannel.getId()); |
| | | vo.setName(tvLiveChannel.getName()); |
| | | vo.setPicture(tvLiveChannel.gethPicture()); |
| | | |
| | | if (!StringUtil.isNullOrEmpty(tvLiveChannel.getNowProgram()) && !StringUtil.isNullOrEmpty(tvLiveChannel.getNowProgramTime())) { |
| | | vo.setNowProgram(tvLiveChannel.getNowProgramTime() + " " + tvLiveChannel.getNowProgram()); |
| | | } else { |
| | | vo.setNowProgram("暂无节目信息"); |
| | | } |
| | | |
| | | |
| | | if (!StringUtil.isNullOrEmpty(tvLiveChannel.getNextProgram()) && !StringUtil.isNullOrEmpty(tvLiveChannel.getNextProgramTime())) { |
| | | vo.setNowProgram(tvLiveChannel.getNextProgramTime() + " " + tvLiveChannel.getNextProgram()); |
| | | } else { |
| | | vo.setNowProgram("暂无节目信息"); |
| | | } |
| | | return vo; |
| | | } |
| | | |
| | | |
| | | 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 getPicture() { |
| | | return picture; |
| | | } |
| | | |
| | | public void setPicture(String picture) { |
| | | this.picture = picture; |
| | | } |
| | | |
| | | public String getNowProgram() { |
| | | return nowProgram; |
| | | } |
| | | |
| | | public void setNowProgram(String nowProgram) { |
| | | this.nowProgram = nowProgram; |
| | | } |
| | | |
| | | public String getNextProgram() { |
| | | return nextProgram; |
| | | } |
| | | |
| | | public void setNextProgram(String nextProgram) { |
| | | this.nextProgram = nextProgram; |
| | | } |
| | | } |
| | |
| | | <dubbo:parameter key="qos.port" value="33333"></dubbo:parameter> |
| | | </dubbo:application> |
| | | |
| | | <dubbo:registry address="zookeeper://172.16.16.46:2181"/> |
| | | <!--<dubbo:registry address="zookeeper://172.16.16.46:2181"/>--> |
| | | |
| | | <!--<dubbo:registry address="zookeeper://193.112.35.168:2182"/>--> |
| | | <dubbo:registry address="zookeeper://193.112.35.168:2182"/> |
| | | |
| | | <dubbo:annotation package="com"/> |
| | | |
| | |
| | | <option value="22">爱奇艺2</option> |
| | | <option value="21">Acfun</option> |
| | | <option value="25">PPTV</option> |
| | | <option value="28">韩迷TV</option> |
| | | </select> |
| | | |
| | | |
| | |
| | | <?xml version="1.0" encoding="UTF-8"?> |
| | | <nav> |
| | | <topNav url="shuju.html" name="数据"> |
| | | <!--二级菜单下面的东西 --> |
| | | <secondNav url="shuju.html" name="数据汇总"> |
| | | <!-- 网页链接 --> |
| | | <url></url> |
| | | </secondNav> |
| | | <secondNav url="shuju_play.html" name="播放数据"> |
| | | <!-- 网页链接 --> |
| | | </secondNav> |
| | | <secondNav url="shuju_register.html" name="注册数据"> |
| | | <!-- 网页链接 --> |
| | | </secondNav> |
| | | <secondNav url="shuju_comment.html" name="评论数据"> |
| | | <!-- 网页链接 --> |
| | | </secondNav> |
| | | <secondNav url="shuju_search.html" name="搜索数据"> |
| | | <!-- 网页链接 --> |
| | | </secondNav> |
| | | <secondNav url="shuju_attention.html" name="关注数据"> |
| | | <!-- 网页链接 --> |
| | | </secondNav> |
| | | <secondNav url="shuju_collect.html" name="收藏数据"> |
| | | <!-- 网页链接 --> |
| | | </secondNav> |
| | | </topNav> |
| | | <topNav url="tuijian-lanmuneirong.html" name="推荐"> |
| | | <!--二级菜单下面的东西 --> |
| | | <topNav url="shuju.html" name="数据"> |
| | | <!--二级菜单下面的东西 --> |
| | | <secondNav url="shuju.html" name="数据汇总"> |
| | | <!-- 网页链接 --> |
| | | <url></url> |
| | | </secondNav> |
| | | <secondNav url="shuju_play.html" name="播放数据"> |
| | | <!-- 网页链接 --> |
| | | </secondNav> |
| | | <secondNav url="shuju_register.html" name="注册数据"> |
| | | <!-- 网页链接 --> |
| | | </secondNav> |
| | | <secondNav url="shuju_comment.html" name="评论数据"> |
| | | <!-- 网页链接 --> |
| | | </secondNav> |
| | | <secondNav url="shuju_search.html" name="搜索数据"> |
| | | <!-- 网页链接 --> |
| | | </secondNav> |
| | | <secondNav url="shuju_attention.html" name="关注数据"> |
| | | <!-- 网页链接 --> |
| | | </secondNav> |
| | | <secondNav url="shuju_collect.html" name="收藏数据"> |
| | | <!-- 网页链接 --> |
| | | </secondNav> |
| | | </topNav> |
| | | <topNav url="tuijian-lanmuneirong.html" name="推荐"> |
| | | <!--二级菜单下面的东西 --> |
| | | |
| | | <secondNav url="tuijian-home-labels.html" name="顶部标签"> |
| | | <!-- 网页链接 --> |
| | | <url>add-tuijian-home-labels.html</url> |
| | | <url>edit-tuijian-home-labels.html</url> |
| | | <url>tuijian-home-labels.html</url> |
| | | </secondNav> |
| | | <secondNav url="tuijian-home-labels.html" name="顶部标签"> |
| | | <!-- 网页链接 --> |
| | | <url>add-tuijian-home-labels.html</url> |
| | | <url>edit-tuijian-home-labels.html</url> |
| | | <url>tuijian-home-labels.html</url> |
| | | </secondNav> |
| | | |
| | | <secondNav url="tuijian-lanmuneirong.html" name="栏目内容"> |
| | | <!-- 网页链接 --> |
| | | <url>add-lmneirong.html</url> |
| | | <url>edit-lmneirong.html</url> |
| | | <url>tuijian-lanmuneirong.html</url> |
| | | <url>tuijian-lanmuneirong-videos.html</url> |
| | | <secondNav url="tuijian-lanmuneirong.html" name="栏目内容"> |
| | | <!-- 网页链接 --> |
| | | <url>add-lmneirong.html</url> |
| | | <url>edit-lmneirong.html</url> |
| | | <url>tuijian-lanmuneirong.html</url> |
| | | <url>tuijian-lanmuneirong-videos.html</url> |
| | | |
| | | </secondNav> |
| | | <secondNav url="tuijian-banner.html" name="推荐Banner"> |
| | | <!-- 网页链接 --> |
| | | <url>add-banner.html</url> |
| | | <url>edit-banner.html</url> |
| | | </secondNav> |
| | | <secondNav url="tuijian-sousuopb.html" name="搜索屏蔽"> |
| | | <!-- 网页链接 --> |
| | | </secondNav> |
| | | <secondNav url="HotSearch.html" name="热门搜索"> |
| | | <!-- 网页链接 --> |
| | | <url>add-hotSearch.html</url> |
| | | </secondNav> |
| | | </topNav> |
| | | <topNav url="fenqu.html" name="分区"> |
| | | <!--二级菜单下面的东西 --> |
| | | <secondNav url="fenqu.html" name="分区视频"> |
| | | <!-- 网页链接 --> |
| | | <url>add-fqmovie.html</url> |
| | | </secondNav> |
| | | <secondNav url="fenqu-banner.html" name="分区banner"> |
| | | <!-- 网页链接 --> |
| | | <url>add-fenqubanner.html</url> |
| | | <url>edit-recommend-banner.html</url> |
| | | </secondNav> |
| | | <secondNav url="topManage.html" name="榜首管理"> |
| | | <url>edit-top.html</url> |
| | | </secondNav> |
| | | <secondNav url="shiping-fenlei.html" name="视频分类"> |
| | | <url>shiping-fenlei.html</url> |
| | | <url>add-shipingfenlei.html</url> |
| | | <url>edit-shipingfenlei.html</url> |
| | | <url>areaList.html</url> |
| | | <url>edit-area.html</url> |
| | | </secondNav> |
| | | <secondNav url="banquanshiping.html" name="版权视频"> |
| | | <!-- 网页链接 --> |
| | | <url></url> |
| | | </secondNav> |
| | | </secondNav> |
| | | <secondNav url="tuijian-banner.html" name="推荐Banner"> |
| | | <!-- 网页链接 --> |
| | | <url>add-banner.html</url> |
| | | <url>edit-banner.html</url> |
| | | </secondNav> |
| | | <secondNav url="tuijian-sousuopb.html" name="搜索屏蔽"> |
| | | <!-- 网页链接 --> |
| | | </secondNav> |
| | | <secondNav url="HotSearch.html" name="热门搜索"> |
| | | <!-- 网页链接 --> |
| | | <url>add-hotSearch.html</url> |
| | | </secondNav> |
| | | </topNav> |
| | | <topNav url="fenqu.html" name="分区"> |
| | | <!--二级菜单下面的东西 --> |
| | | <secondNav url="fenqu.html" name="分区视频"> |
| | | <!-- 网页链接 --> |
| | | <url>add-fqmovie.html</url> |
| | | </secondNav> |
| | | <secondNav url="fenqu-banner.html" name="分区banner"> |
| | | <!-- 网页链接 --> |
| | | <url>add-fenqubanner.html</url> |
| | | <url>edit-recommend-banner.html</url> |
| | | </secondNav> |
| | | <secondNav url="topManage.html" name="榜首管理"> |
| | | <url>edit-top.html</url> |
| | | </secondNav> |
| | | <secondNav url="shiping-fenlei.html" name="视频分类"> |
| | | <url>shiping-fenlei.html</url> |
| | | <url>add-shipingfenlei.html</url> |
| | | <url>edit-shipingfenlei.html</url> |
| | | <url>areaList.html</url> |
| | | <url>edit-area.html</url> |
| | | </secondNav> |
| | | <secondNav url="banquanshiping.html" name="版权视频"> |
| | | <!-- 网页链接 --> |
| | | <url></url> |
| | | </secondNav> |
| | | |
| | | <secondNav url="fenqu-search-special-position.html" name="搜索专题位置"> |
| | | <!-- 网页链接 --> |
| | | <url></url> |
| | | </secondNav> |
| | | <secondNav url="fenqu-search-special-position.html" name="搜索专题位置"> |
| | | <!-- 网页链接 --> |
| | | <url></url> |
| | | </secondNav> |
| | | |
| | | <secondNav url="fenqu-search-special.html" name="搜索专题"> |
| | | <!-- 网页链接 --> |
| | | <url></url> |
| | | </secondNav> |
| | | <secondNav url="fenqu-search-special.html" name="搜索专题"> |
| | | <!-- 网页链接 --> |
| | | <url></url> |
| | | </secondNav> |
| | | |
| | | </topNav> |
| | | </topNav> |
| | | |
| | | <topNav url="vip-user-list.html" name="用户"> |
| | | <!--二级菜单下面的东西 --> |
| | | <secondNav url="vip-user-list.html" name="会员列表"> |
| | | <!-- 网页链接 --> |
| | | <url>add-zhuanti.html</url> |
| | | </secondNav> |
| | | <secondNav url="vip-order-list.html" name="会员订单"> |
| | | <!-- 网页链接 --> |
| | | <url>add-star.html</url> |
| | | </secondNav> |
| | | </topNav> |
| | | <topNav url="vip-user-list.html" name="用户"> |
| | | <!--二级菜单下面的东西 --> |
| | | <secondNav url="vip-user-list.html" name="会员列表"> |
| | | <!-- 网页链接 --> |
| | | <url>add-zhuanti.html</url> |
| | | </secondNav> |
| | | <secondNav url="vip-order-list.html" name="会员订单"> |
| | | <!-- 网页链接 --> |
| | | <url>add-star.html</url> |
| | | </secondNav> |
| | | </topNav> |
| | | |
| | | |
| | | <topNav url="faxian.html" name="发现"> |
| | | <!--二级菜单下面的东西 --> |
| | | <secondNav url="faxian.html" name="专题合辑"> |
| | | <!-- 网页链接 --> |
| | | <url>add-zhuanti.html</url> |
| | | </secondNav> |
| | | <secondNav url="faxian-star.html" name="明星合辑"> |
| | | <!-- 网页链接 --> |
| | | <url>add-star.html</url> |
| | | </secondNav> |
| | | <secondNav url="faxian-shop.html" name="发现商品"> |
| | | <!-- 网页链接 --> |
| | | </secondNav> |
| | | <topNav url="faxian.html" name="发现"> |
| | | <!--二级菜单下面的东西 --> |
| | | <secondNav url="faxian.html" name="专题合辑"> |
| | | <!-- 网页链接 --> |
| | | <url>add-zhuanti.html</url> |
| | | </secondNav> |
| | | <secondNav url="faxian-star.html" name="明星合辑"> |
| | | <!-- 网页链接 --> |
| | | <url>add-star.html</url> |
| | | </secondNav> |
| | | <secondNav url="faxian-shop.html" name="发现商品"> |
| | | <!-- 网页链接 --> |
| | | </secondNav> |
| | | |
| | | <secondNav url="comment-list.html" name="评论管理"> |
| | | <!-- 网页链接 --> |
| | | </secondNav> |
| | | </topNav> |
| | | <topNav url="shezhi.html" name="设置"> |
| | | <!--二级菜单下面的东西 --> |
| | | <secondNav url="shezhi.html" name="TOP通知栏"> |
| | | <!-- 网页链接 --> |
| | | <url>add-toptongzhi.html</url> |
| | | <url>edit-toptongzhi.html</url> |
| | | </secondNav> |
| | | <secondNav url="send-message.html" name="消息推送"> |
| | | <url></url> |
| | | </secondNav> |
| | | <secondNav url="share.html" name="分享内容"> |
| | | <!-- 网页链接 --> |
| | | <url>add-share.html</url> |
| | | </secondNav> |
| | | <secondNav url="production.html" name="产品信息"> |
| | | <!-- 网页链接 --> |
| | | <url></url> |
| | | </secondNav> |
| | | <secondNav url="systemlist.html" name="系统列表"> |
| | | <!-- 网页链接 --> |
| | | <url>add-system.html</url> |
| | | </secondNav> |
| | | <secondNav url="systemcanshu.html" name="系统参数"> |
| | | <!-- 网页链接 --> |
| | | <url></url> |
| | | </secondNav> |
| | | <secondNav url="comment-list.html" name="评论管理"> |
| | | <!-- 网页链接 --> |
| | | </secondNav> |
| | | </topNav> |
| | | |
| | | <secondNav url="iqiyi-update.html" name="爱奇艺专辑更新"> |
| | | <!-- 网页链接 --> |
| | | <url></url> |
| | | </secondNav> |
| | | <topNav url="tvlive_category_list.html" name="电视直播"> |
| | | <!--二级菜单下面的东西 --> |
| | | <secondNav url="tvlive_category_list.html" name="直播分类"> |
| | | <!-- 网页链接 --> |
| | | <url>tvlive_category_add.html</url> |
| | | <url>tvlive_category_update.html</url> |
| | | <url>tvlive_category_channel_list.html</url> |
| | | </secondNav> |
| | | <secondNav url="tvlive_channel_list.html" name="频道列表"> |
| | | <!-- 网页链接 --> |
| | | <url>tvlive_channel_add.html</url> |
| | | </secondNav> |
| | | </topNav> |
| | | |
| | | <secondNav url="add-bilibili-video.html" name="B站视频更新"> |
| | | <!-- 网页链接 --> |
| | | <url></url> |
| | | </secondNav> |
| | | <topNav url="shezhi.html" name="设置"> |
| | | <!--二级菜单下面的东西 --> |
| | | <secondNav url="shezhi.html" name="TOP通知栏"> |
| | | <!-- 网页链接 --> |
| | | <url>add-toptongzhi.html</url> |
| | | <url>edit-toptongzhi.html</url> |
| | | </secondNav> |
| | | <secondNav url="send-message.html" name="消息推送"> |
| | | <url></url> |
| | | </secondNav> |
| | | <secondNav url="share.html" name="分享内容"> |
| | | <!-- 网页链接 --> |
| | | <url>add-share.html</url> |
| | | </secondNav> |
| | | <secondNav url="production.html" name="产品信息"> |
| | | <!-- 网页链接 --> |
| | | <url></url> |
| | | </secondNav> |
| | | <secondNav url="systemlist.html" name="系统列表"> |
| | | <!-- 网页链接 --> |
| | | <url>add-system.html</url> |
| | | </secondNav> |
| | | <secondNav url="systemcanshu.html" name="系统参数"> |
| | | <!-- 网页链接 --> |
| | | <url></url> |
| | | </secondNav> |
| | | |
| | | <secondNav url="ad-update.html" name="广告设置"> |
| | | <!-- 网页链接 --> |
| | | <url></url> |
| | | </secondNav> |
| | | <secondNav url="iqiyi-update.html" name="爱奇艺专辑更新"> |
| | | <!-- 网页链接 --> |
| | | <url></url> |
| | | </secondNav> |
| | | |
| | | <secondNav url="add-bilibili-video.html" name="B站视频更新"> |
| | | <!-- 网页链接 --> |
| | | <url></url> |
| | | </secondNav> |
| | | |
| | | <secondNav url="ad-update.html" name="广告设置"> |
| | | <!-- 网页链接 --> |
| | | <url></url> |
| | | </secondNav> |
| | | |
| | | |
| | | <secondNav url="cache-update.html" name="清除缓存"> |
| | | <!-- 网页链接 --> |
| | | <url></url> |
| | | </secondNav> |
| | | <secondNav url="cache-update.html" name="清除缓存"> |
| | | <!-- 网页链接 --> |
| | | <url></url> |
| | | </secondNav> |
| | | |
| | | </topNav> |
| | | </topNav> |
| | | </nav> |
New file |
| | |
| | | <html lang="zh-cn"> |
| | | |
| | | <head> |
| | | <meta charset="utf-8"> |
| | | <meta http-equiv="X-UA-Compatible" content="IE=edge"> |
| | | <meta name="viewport" content="width=device-width, initial-scale=1"> |
| | | <meta name="referrer" content="never"> |
| | | <title>添加顶部标签</title> |
| | | <link href="css/bootstrap.min.css" rel="stylesheet"> |
| | | <link href="css/maincontent.css" rel="stylesheet"> |
| | | <link href="css/tablestyle.css" rel="stylesheet"> |
| | | <style> |
| | | .form-group { |
| | | margin-bottom: 30px; |
| | | } |
| | | |
| | | .checkbox input[type=checkbox] { |
| | | top: 6px; |
| | | } |
| | | </style> |
| | | </head> |
| | | |
| | | <body> |
| | | <nav class="navbar navbar-default navbar-fixed-top"> |
| | | </nav> |
| | | <div id="mainbody"> |
| | | <div id="sidebar"> |
| | | <dl> |
| | | </dl> |
| | | </div> |
| | | <div id="neirong"> |
| | | <div class="erjidh"> |
| | | <ol class="breadcrumb"> |
| | | <li> |
| | | <a href="tvlive_category_list.html">电视直播分类</a> |
| | | </li> |
| | | <li class="active">添加分类</li> |
| | | </ol> |
| | | </div> |
| | | <form class="form-horizontal" role="form"> |
| | | |
| | | |
| | | |
| | | <div class="form-group"> |
| | | <label for="input1" class="changdu1 control-label">名称</label> |
| | | <div class="col-sm-7"> |
| | | <input type="text" class="form-control" id="name" placeholder="必须填写"> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="form-group"> |
| | | <label for="input2" class="changdu1 control-label">权重</label> |
| | | <div class="col-sm-7"> |
| | | <input type="text" class="form-control" id="weight" placeholder="必须填写"> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="form-group"> |
| | | <label for="input1" class="changdu1 control-label">图标链接</label> |
| | | <div class="col-sm-7"> |
| | | <input type="text" class="form-control" id="icon" placeholder="可不填"> |
| | | </div> |
| | | </div> |
| | | |
| | | |
| | | <div class="form-group"> |
| | | <label for="input7" class="changdu1 control-label">媒体</label> |
| | | <div class="col-sm-7 detailsystem"> |
| | | |
| | | </div> |
| | | </div> |
| | | <div class="button0"> |
| | | <div class="button"> |
| | | <button type="button" class="btn btn-primary save">保存</button> |
| | | </div> |
| | | <div class="button"> |
| | | <input type="reset" class="btn btn-default" value="重置"/> |
| | | </div> |
| | | </div> |
| | | </form> |
| | | |
| | | </div> |
| | | </div> |
| | | |
| | | <script src="//cdn.bootcss.com/jquery/1.10.1/jquery.min.js"></script> |
| | | <script src="js/bootstrap.min.js"></script> |
| | | <script src="js/nav.js"></script> |
| | | <script src="js/common.js"></script> |
| | | <script src="layer/layer.js"></script> |
| | | <script> |
| | | $(function () { |
| | | |
| | | $.post('api/videoType/getAllVideoType', function (data) { |
| | | if (data.code == 0) { |
| | | var list = data.list; |
| | | for (var i = 0; i < list.length; i++) { |
| | | var vt = list[i]; |
| | | var vid = vt.id; |
| | | $("#classtype").append("<option key='" + vid + "'>" + vt.name + "</option>") |
| | | } |
| | | } |
| | | |
| | | }, 'json') |
| | | |
| | | $.post('api/common/detailsystemlist', function (data) { |
| | | if (data.code == 0) { |
| | | var dsStr = ""; |
| | | data.data.forEach(function (ds) { |
| | | dsStr += "<div class='checkbox '><label>"; |
| | | dsStr += "<input type='checkbox' value=" + ds.id + ">"; |
| | | dsStr += " " + ds.name; |
| | | dsStr += "</label></div>"; |
| | | }); |
| | | $(".detailsystem").html(dsStr); |
| | | } |
| | | }, 'json'); |
| | | |
| | | $(".save").click(function () { |
| | | |
| | | var $detailsystems = $(".detailsystem input[type=checkbox]"); |
| | | var dess = ""; |
| | | for (var i = 0; i < $detailsystems.length; i++) { |
| | | if ($detailsystems.eq(i).is(":checked")) { |
| | | dess += $detailsystems.eq(i).val() + ","; |
| | | } |
| | | } |
| | | if (dess.length > 0) |
| | | dess = dess.substr(0, dess.length - 1); |
| | | |
| | | var index = layer.load(0, { |
| | | 'shade': false |
| | | }); |
| | | $.post('api/tvlive/category/addCategory', { |
| | | 'name': $("#name").val(), |
| | | 'weight': $("#weight").val(), |
| | | 'icon': $("#icon").val(), |
| | | 'detailsystemids': dess, |
| | | }, function (data) { |
| | | layer.close(index); |
| | | if (data.code == 0) { |
| | | layer.msg("添加成功"); |
| | | } else { |
| | | layer.msg(data.msg); |
| | | } |
| | | |
| | | doResponse(data, function () { |
| | | |
| | | }); |
| | | }, 'json'); |
| | | |
| | | }); |
| | | |
| | | }); |
| | | </script> |
| | | </body> |
| | | |
| | | </html> |
New file |
| | |
| | | <html lang="zh-cn"> |
| | | |
| | | <head> |
| | | <meta charset="utf-8"> |
| | | <meta http-equiv="X-UA-Compatible" content="IE=edge"> |
| | | <meta name="viewport" content="width=device-width, initial-scale=1"> |
| | | <meta name="referrer" content="never"> |
| | | <title>电视直播-频道列表</title> |
| | | <link href="css/bootstrap.min.css" rel="stylesheet"> |
| | | <link href="css/maincontent.css" rel="stylesheet"> |
| | | <style> |
| | | .search { |
| | | display: inline; |
| | | width: auto; |
| | | } |
| | | |
| | | .h-picture { |
| | | |
| | | width: 120px; |
| | | } |
| | | |
| | | .v-picture { |
| | | height: 120px; |
| | | } |
| | | |
| | | .form-group { |
| | | margin-bottom: 20px; |
| | | } |
| | | |
| | | .bianhao { |
| | | margin: 0; |
| | | } |
| | | </style> |
| | | |
| | | </head> |
| | | |
| | | <body> |
| | | <nav class="navbar navbar-default navbar-fixed-top"> |
| | | |
| | | </nav> |
| | | <div id="mainbody"> |
| | | <div id="sidebar"> |
| | | |
| | | </div> |
| | | <div id="neirong"> |
| | | <div class="erjidh search-div" style="padding: 10px;"> |
| | | |
| | | <div class="form-group search" role="search"> |
| | | <input type="text" class="form-control search" id="kw" style="width: 200px;" placeholder="搜索"> |
| | | </div> |
| | | <button type="button" class="btn btn-default search-button">搜索</button> |
| | | |
| | | |
| | | </div> |
| | | <div class="bottom"> |
| | | <div class="qx"> |
| | | <div class="checkbox"> |
| | | <label> |
| | | <input type="checkbox" class="check-all" value="#"> |
| | | 全选</label> |
| | | </div> |
| | | </div> |
| | | <button class="btn btn-warning pl-del" type="button">批量删除</button> |
| | | <div class="page"> |
| | | <ul class="pagination"> |
| | | <li class="disabled pre"> |
| | | <a href="#">«</a> |
| | | </li> |
| | | <li class="active"> |
| | | <a href="#">1</a> |
| | | </li> |
| | | <li> |
| | | <a href="#">2</a> |
| | | </li> |
| | | <li> |
| | | <a href="#" class="next">»</a> |
| | | </li> |
| | | </ul> |
| | | <div class="form-group"> |
| | | <div class="tzan"> |
| | | <button type="button" class="btn btn-primary">跳转</button> |
| | | </div> |
| | | <div class="tz"> |
| | | <input class="form-control" type="text" placeholder="页数"> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | </div> |
| | | <div class="zhuti"> |
| | | <div class="zhutisousuo"> |
| | | <table class="table"> |
| | | <thead> |
| | | <th width="5%">选择</th> |
| | | <th width="10%">编号</th> |
| | | <th width="9%">频道名称</th> |
| | | <th width="9%">封面横图</th> |
| | | <th width="9%">封面竖图</th> |
| | | <th width="9%">当前节目信息</th> |
| | | <th width="9%">下个节目信息</th> |
| | | <th width="8%">状态</th> |
| | | <th width="12%">创建时间</th> |
| | | <th width="12%">更新时间</th> |
| | | <th width="5%">删除</th> |
| | | <th width="5%">编辑</th> |
| | | </thead> |
| | | |
| | | <tbody> |
| | | <tr v-for="(item,index) in list"> |
| | | <td> |
| | | <div class="xuanze"> |
| | | <label> |
| | | <input type="checkbox" class="check-item" v-bind:keys="item.id" |
| | | value="#"> |
| | | </label> |
| | | </div> |
| | | </td> |
| | | <td> |
| | | <div class="bianhao">{{item.id}}</div> |
| | | </td> |
| | | <td> |
| | | <div class="bianhao name"> |
| | | <a href="#">{{item.name}}</a> |
| | | </div> |
| | | </td> |
| | | |
| | | <td> |
| | | <img class="h-picture" v-bind:src="item.hPicture" v-if="item.hPicture"> |
| | | </td> |
| | | |
| | | <td> |
| | | <img class="v-picture" v-bind:src="item.vPicture" v-if="item.vPicture"> |
| | | </td> |
| | | |
| | | |
| | | <td> |
| | | <div class="bianhao"> |
| | | {{item.nowProgramTime}} |
| | | <br> |
| | | {{item.nowProgram}} |
| | | </div> |
| | | </td> |
| | | |
| | | <td> |
| | | <div class="bianhao"> |
| | | {{item.nextProgramTime}} |
| | | <br> |
| | | {{item.nextProgram}} |
| | | </div> |
| | | </td> |
| | | |
| | | <td>{{item.state==1?'显示':'隐藏'}}</td> |
| | | <td class="">{{item.createTime}}</td> |
| | | <td class="">{{item.updateTime}}</td> |
| | | |
| | | <td> |
| | | <div class="anniu"><img src="image/dustbin.png" class="delete" |
| | | v-on:click="deleteCategoryChannel(item.id,index)"> |
| | | </div> |
| | | </td> |
| | | <td> |
| | | <div class="anniu"> |
| | | <a v-bind:keys="item.id" href="javascript:void(0)" class="edit" |
| | | v-on:click="changeWeight(item.id)"><img |
| | | src="image/bianji.png"></a> |
| | | </div> |
| | | </td> |
| | | </tr> |
| | | </tbody> |
| | | |
| | | </table> |
| | | </div> |
| | | </div> |
| | | <div class="bottom"> |
| | | <div class="qx"> |
| | | <div class="checkbox"> |
| | | <label> |
| | | <input type="checkbox" class="check-all" value="#"> |
| | | 全选</label> |
| | | </div> |
| | | </div> |
| | | <button class="btn btn-warning pl-del" type="button">批量删除</button> |
| | | <div class="page"> |
| | | <ul class="pagination"> |
| | | <li class="disabled pre"> |
| | | <a href="#">«</a> |
| | | </li> |
| | | <li class="active"> |
| | | <a href="#">1</a> |
| | | </li> |
| | | <li> |
| | | <a href="#">2</a> |
| | | </li> |
| | | <li> |
| | | <a href="#" class="next">»</a> |
| | | </li> |
| | | </ul> |
| | | <div class="form-group"> |
| | | <div class="tzan"> |
| | | <button type="button" class="btn btn-primary">跳转</button> |
| | | </div> |
| | | <div class="tz"> |
| | | <input class="form-control" type="text" placeholder="页数"> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | </div> |
| | | </div> |
| | | |
| | | |
| | | <script src="//cdn.bootcss.com/jquery/1.10.1/jquery.min.js"></script> |
| | | <script src="js/bootstrap.min.js"></script> |
| | | <script src="js/page.js"></script> |
| | | <script src="js/nav.js"></script> |
| | | <script src="js/common.js"></script> |
| | | <script src="js/vue.min.js"></script> |
| | | <script src="layer/layer.js"></script> |
| | | <script> |
| | | $(function () { |
| | | |
| | | function getQueryString(name) { |
| | | var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i"); |
| | | var r = window.location.search.substr(1).match(reg); |
| | | if (r != null) return unescape(r[2]); |
| | | return null; |
| | | }; |
| | | |
| | | const categoryId = getQueryString("id"); |
| | | |
| | | var app = new Vue({ |
| | | el: "#neirong", |
| | | data: { |
| | | list: [], |
| | | }, |
| | | methods: { |
| | | channelList: function (page) { |
| | | |
| | | if (!categoryId) { |
| | | return; |
| | | } |
| | | |
| | | var index = layer.load(1, { |
| | | shade: false |
| | | }) |
| | | |
| | | var data = { |
| | | "page": page, |
| | | "key": $("#kw").val(), |
| | | "categoryId": categoryId |
| | | }; |
| | | |
| | | $.post('api/tvlive/channel/getChannelList', data, function (data) { |
| | | layer.close(index); |
| | | if (data.code != 0) |
| | | return; |
| | | app.list = data.data.data; |
| | | |
| | | fillPage(data.data.pageEntity, function (pageIndex) { |
| | | app.channelList(pageIndex); |
| | | }); |
| | | }, 'json'); |
| | | }, |
| | | changeWeight: function (id) { |
| | | layer.prompt({title: '修改权重', formType: 1}, function (text, index) { |
| | | layer.close(index); |
| | | $.post('api/tvlive/channel/updateCategoryChannelWeight', { |
| | | channelId: id, |
| | | categoryId: categoryId, |
| | | weight: text |
| | | }, function (data) { |
| | | if (data.code != 0) { |
| | | layer.msg(data.msg); |
| | | } else { |
| | | layer.msg("修改成功"); |
| | | } |
| | | }, 'json'); |
| | | |
| | | }); |
| | | }, |
| | | deleteCategoryChannel: function (id, index) { |
| | | var indexDialog = layer.confirm('是否删除该条目?', { |
| | | btn: ['是', '否'] //按钮 |
| | | }, function () { |
| | | $.post('api/tvlive/channel/deleteCategoryChannel', { |
| | | categoryId: categoryId, |
| | | channelIds: id |
| | | }, function (data) { |
| | | layer.close(indexDialog); |
| | | if (data.code == 0) { |
| | | if (index > -1) { |
| | | app.list.splice(index, 1); |
| | | } else { |
| | | var ids = id.split(","); |
| | | console.log(ids); |
| | | for (var i = 0; i < ids.length; i++) { |
| | | for (var j = 0; j < app.list.length; j++) { |
| | | console.log(app.list[j].special.id + ":" + ids[i]) |
| | | if (app.list[j].special.id == ids[i]) { |
| | | app.list.splice(j, 1); |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | layer.msg("删除成功"); |
| | | } else { |
| | | layer.msg(data.msg); |
| | | } |
| | | }, 'json'); |
| | | }, function () { |
| | | |
| | | }); |
| | | }, |
| | | } |
| | | }); |
| | | |
| | | $(".search-div .search-button").click(function () { |
| | | app.channelList(1); |
| | | }); |
| | | |
| | | app.channelList(1); |
| | | |
| | | function getCheckedItems() { |
| | | var ids = ""; |
| | | for (var i = 0; i < $(".check-item").length; i++) { |
| | | if ($(".check-item").eq(i).is(':checked')) { |
| | | ids += $(".check-item").eq(i).attr("keys") + ","; |
| | | } |
| | | } |
| | | if (ids.length > 0) |
| | | ids = ids.substr(0, ids.length - 1); |
| | | return ids; |
| | | } |
| | | |
| | | $(".check-all").change(function () { |
| | | if (this.checked) { |
| | | $(".check-item").each(function () { |
| | | this.checked = true; |
| | | }) |
| | | } |
| | | else { |
| | | $(".check-item").each(function () { |
| | | this.checked = false; |
| | | }) |
| | | } |
| | | }); |
| | | |
| | | $(".pl-del").click(function () { |
| | | var ids = getCheckedItems(); |
| | | if (ids.length < 1) { |
| | | layer.msg("请选择栏目"); |
| | | return; |
| | | } |
| | | app.deleteCategoryChannel(ids, -1); |
| | | }); |
| | | |
| | | |
| | | }); |
| | | </script> |
| | | |
| | | </body> |
| | | |
| | | </html> |
New file |
| | |
| | | <html lang="zh-cn"> |
| | | |
| | | <head> |
| | | <meta charset="utf-8"> |
| | | <meta http-equiv="X-UA-Compatible" content="IE=edge"> |
| | | <meta name="viewport" content="width=device-width, initial-scale=1"> |
| | | <meta name="referrer" content="never"> |
| | | <title>电视直播-分类列表</title> |
| | | <link href="css/bootstrap.min.css" rel="stylesheet"> |
| | | <link href="css/maincontent.css" rel="stylesheet"> |
| | | <style> |
| | | .search { |
| | | display: inline; |
| | | width: auto; |
| | | } |
| | | </style> |
| | | |
| | | </head> |
| | | |
| | | <body> |
| | | <nav class="navbar navbar-default navbar-fixed-top"> |
| | | |
| | | </nav> |
| | | <div id="mainbody"> |
| | | <div id="sidebar"> |
| | | |
| | | </div> |
| | | <div id="neirong"> |
| | | <div class="erjidh search-div" style="padding: 10px;"> |
| | | |
| | | <select name="select" class="form-control search select-detailsystem"> |
| | | |
| | | </select> |
| | | |
| | | <div class="form-group search" role="search"> |
| | | <input type="text" class="form-control search" id="kw" style="width: 200px;" placeholder="搜索"> |
| | | </div> |
| | | <button type="button" class="btn btn-default search-button">搜索</button> |
| | | |
| | | <div class="tianjia" class="search"> |
| | | <a href="tvlive_category_add.html" class="btn btn-primary" role="button">添加分类 +</a> |
| | | </div> |
| | | |
| | | </div> |
| | | <div class="zhuti"> |
| | | <div class="zhutisousuo"> |
| | | <table class="table"> |
| | | <thead> |
| | | <th width="5%">选择</th> |
| | | <th width="10%">编号</th> |
| | | <th width="9%">分类名称</th> |
| | | <th width="20%">APP名称</th> |
| | | <th width="8%">图标</th> |
| | | <th width="10%">权重</th> |
| | | <th width="12%">创建时间</th> |
| | | <th width="12%">更新时间</th> |
| | | <th width="5%">删除</th> |
| | | <th width="5%">编辑</th> |
| | | </thead> |
| | | |
| | | <tbody> |
| | | <tr v-for="(item,index) in list"> |
| | | <td> |
| | | <div class="xuanze"> |
| | | <label> |
| | | <input type="checkbox" class="check-item" v-bind:keys="item.category.id" |
| | | value="#"> |
| | | </label> |
| | | </div> |
| | | </td> |
| | | <td> |
| | | <div class="bianhao">{{item.category.id}}</div> |
| | | </td> |
| | | <td> |
| | | <div class="bianhao name"> |
| | | <a v-bind:href="'tvlive_category_channel_list.html?id='+item.category.id">{{item.category.name}}</a> |
| | | </div> |
| | | </td> |
| | | |
| | | <td class="apps"> |
| | | <div class="appname" v-for="ds in item.detailSystemSelectList"> |
| | | <div class="checkbox"> |
| | | <label> |
| | | <input type="checkbox" value="#" v-bind:checked="ds.selected" |
| | | v-on:click="changeSuper(item.category.id,ds.detailSystem.id,$event)"> |
| | | {{ds.detailSystem.appName}}</label> |
| | | </div> |
| | | </div> |
| | | </td> |
| | | <td style="text-align:center;line-height:105px;"><img v-bind:src="item.category.icon" |
| | | v-if="item.category.icon"></td> |
| | | <td style="text-align:center;line-height:105px;">{{item.category.weight}}</td> |
| | | <td style="text-align:center;line-height:105px;" class="">{{item.category.createTime}}</td> |
| | | <td style="text-align:center;line-height:105px;" class="">{{item.category.updateTime}}</td> |
| | | <td> |
| | | <div class="anniu"><img src="image/dustbin.png" class="delete" |
| | | v-on:click="deleteCategory(item.category.id,index)"> |
| | | </div> |
| | | </td> |
| | | <td> |
| | | <div class="anniu"> |
| | | <a v-bind:keys="item.category.id" href="javascript:void(0)" class="edit" |
| | | v-on:click="edit(item.category.id)"><img |
| | | src="image/bianji.png"></a> |
| | | </div> |
| | | </td> |
| | | </tr> |
| | | </tbody> |
| | | |
| | | </table> |
| | | </div> |
| | | </div> |
| | | <div class="bottom"> |
| | | <div class="qx"> |
| | | <div class="checkbox"> |
| | | <label> |
| | | <input type="checkbox" class="check-all" value="#"> |
| | | 全选</label> |
| | | </div> |
| | | </div> |
| | | <button class="btn btn-warning pl-del" type="button">批量删除</button> |
| | | <div class="page"> |
| | | <ul class="pagination"> |
| | | <li class="disabled pre"> |
| | | <a href="#">«</a> |
| | | </li> |
| | | <li class="active"> |
| | | <a href="#">1</a> |
| | | </li> |
| | | <li> |
| | | <a href="#">2</a> |
| | | </li> |
| | | <li> |
| | | <a href="#" class="next">»</a> |
| | | </li> |
| | | </ul> |
| | | <div class="form-group"> |
| | | <div class="tzan"> |
| | | <button type="button" class="btn btn-primary">跳转</button> |
| | | </div> |
| | | <div class="tz"> |
| | | <input class="form-control" type="text" placeholder="页数"> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | </div> |
| | | </div> |
| | | <script src="//cdn.bootcss.com/jquery/1.10.1/jquery.min.js"></script> |
| | | <script src="js/bootstrap.min.js"></script> |
| | | <script src="js/page.js"></script> |
| | | <script src="js/nav.js"></script> |
| | | <script src="js/common.js"></script> |
| | | <script src="js/vue.min.js"></script> |
| | | <script src="layer/layer.js"></script> |
| | | <script> |
| | | $(function () { |
| | | |
| | | var app = new Vue({ |
| | | el: "#neirong", |
| | | data: { |
| | | list: [], |
| | | }, |
| | | methods: { |
| | | categoryList: function (page) { |
| | | var index = layer.load(1, { |
| | | shade: false |
| | | }) |
| | | |
| | | var data = { |
| | | "page": page, |
| | | "key": $("#kw").val() |
| | | }; |
| | | var detailSystemId = $(".search-div .select-detailsystem").val(); |
| | | if (detailSystemId&&detailSystemId!='0') { |
| | | data.detailSystemId = detailSystemId; |
| | | } |
| | | |
| | | |
| | | $.post('api/tvlive/category/getCategoryList', data, function (data) { |
| | | layer.close(index); |
| | | if (data.code != 0) |
| | | return; |
| | | app.list = data.data.data; |
| | | |
| | | fillPage(data.data.pageEntity, function (pageIndex) { |
| | | app.categoryList(pageIndex); |
| | | }); |
| | | }, 'json'); |
| | | }, |
| | | changeSuper: function (id, detailSystemId, e) { |
| | | if ($(e.target).is(":checked")) { |
| | | $.post('api/tvlive/category/addSuperCategory', { |
| | | "cid": id, |
| | | "detailSystemId": detailSystemId |
| | | }, function (data) { |
| | | if (data.code != 0) { |
| | | layer.msg(data.msg); |
| | | } else { |
| | | layer.msg("操作成功"); |
| | | } |
| | | }, 'json'); |
| | | } else { |
| | | $.post('api/tvlive/category/deleteSuperCategory', { |
| | | "cid": id, |
| | | "detailSystemId": detailSystemId |
| | | }, function (data) { |
| | | if (data.code != 0) { |
| | | layer.msg(data.msg); |
| | | } else { |
| | | layer.msg("操作成功"); |
| | | } |
| | | }, 'json'); |
| | | } |
| | | }, |
| | | deleteCategory: function (id, index) { |
| | | var indexDialog = layer.confirm('是否删除该条目?', { |
| | | btn: ['是', '否'] //按钮 |
| | | }, function () { |
| | | $.post('api/tvlive/category/deleteCategory', { |
| | | 'ids': id |
| | | }, function (data) { |
| | | layer.close(indexDialog); |
| | | if (data.code == 0) { |
| | | if (index > -1) { |
| | | app.list.splice(index, 1); |
| | | } else { |
| | | var ids = id.split(","); |
| | | console.log(ids); |
| | | for (var i = 0; i < ids.length; i++) { |
| | | for (var j = 0; j < app.list.length; j++) { |
| | | console.log(app.list[j].category.id + ":" + ids[i]) |
| | | if (app.list[j].category.id == ids[i]) { |
| | | app.list.splice(j, 1); |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | layer.msg("删除成功"); |
| | | } else { |
| | | layer.msg(data.msg); |
| | | } |
| | | }, 'json'); |
| | | }, function () { |
| | | |
| | | }); |
| | | }, |
| | | edit: function (id) { |
| | | window.location.href = "tvlive_category_update.html?id=" + id; |
| | | } |
| | | } |
| | | |
| | | |
| | | }); |
| | | |
| | | $(".search-div .search-button").click(function () { |
| | | app.categoryList(1); |
| | | }); |
| | | |
| | | app.categoryList(1); |
| | | |
| | | function getCheckedItems() { |
| | | var ids = ""; |
| | | for (var i = 0; i < $(".check-item").length; i++) { |
| | | if ($(".check-item").eq(i).is(':checked')) { |
| | | ids += $(".check-item").eq(i).attr("keys") + ","; |
| | | } |
| | | } |
| | | if (ids.length > 0) |
| | | ids = ids.substr(0, ids.length - 1); |
| | | return ids; |
| | | } |
| | | |
| | | $(".pl-del").click(function () { |
| | | var ids = getCheckedItems(); |
| | | if (ids.length < 1) { |
| | | layer.msg("请选择栏目"); |
| | | return; |
| | | } |
| | | |
| | | app.deleteCategory(ids, -1); |
| | | |
| | | }); |
| | | |
| | | }); |
| | | </script> |
| | | |
| | | </body> |
| | | |
| | | </html> |
New file |
| | |
| | | <html lang="zh-cn"> |
| | | |
| | | <head> |
| | | <meta charset="utf-8"> |
| | | <meta http-equiv="X-UA-Compatible" content="IE=edge"> |
| | | <meta name="viewport" content="width=device-width, initial-scale=1"> |
| | | <meta name="referrer" content="never"> |
| | | <title>添加推荐Banner</title> |
| | | <link href="css/bootstrap.min.css" rel="stylesheet"> |
| | | <link href="css/maincontent.css" rel="stylesheet"> |
| | | <link href="css/tablestyle.css" rel="stylesheet"> |
| | | <style> |
| | | .form-group { |
| | | margin-bottom: 30px; |
| | | } |
| | | |
| | | .checkbox input[type=checkbox] { |
| | | top: 6px; |
| | | } |
| | | |
| | | #container-video { |
| | | display: block; |
| | | } |
| | | |
| | | #container-web { |
| | | display: none; |
| | | } |
| | | |
| | | #container-special { |
| | | display: none; |
| | | } |
| | | |
| | | #dialog-chooselink { |
| | | padding: 20px; |
| | | } |
| | | |
| | | #dialog-chooselink select { |
| | | width: 100px; |
| | | } |
| | | |
| | | #dialog-chooselink label { |
| | | display: inline; |
| | | } |
| | | |
| | | #dialog-chooselink input[type=text] { |
| | | display: inline; |
| | | width: 500px; |
| | | } |
| | | |
| | | #dialog-chooselink ul { |
| | | display: block; |
| | | list-style: none; |
| | | } |
| | | |
| | | #dialog-chooselink ul li { |
| | | display: inline; |
| | | list-style: none; |
| | | width: 33%; |
| | | float: left; |
| | | } |
| | | |
| | | #dialog-chooselink input[type=radio] { |
| | | width: 20px; |
| | | height: 20px; |
| | | } |
| | | |
| | | #dialog-chooselink .search-result { |
| | | height: 630px; |
| | | overflow-y: scroll; |
| | | } |
| | | </style> |
| | | </head> |
| | | |
| | | <body> |
| | | <nav class="navbar navbar-default navbar-fixed-top"> |
| | | </nav> |
| | | <div id="mainbody"> |
| | | <div id="sidebar"> |
| | | <dl> |
| | | </dl> |
| | | </div> |
| | | <div id="neirong"> |
| | | <div class="erjidh"> |
| | | <ol class="breadcrumb"> |
| | | <li> |
| | | <a href="tvlive_category_list.html">分类列表</a> |
| | | </li> |
| | | <li class="active">修改内容</li> |
| | | </ol> |
| | | </div> |
| | | <form class="form-horizontal"> |
| | | <div class="form-group"> |
| | | <label for="input1" class="changdu1 control-label">分类名称</label> |
| | | <div class="col-sm-7"> |
| | | <input type="text" class="form-control" id="name" readonly> |
| | | </div> |
| | | </div> |
| | | |
| | | |
| | | <div class="form-group"> |
| | | <label for="input2" class="changdu1 control-label">权重</label> |
| | | <div class="col-sm-7"> |
| | | <input type="text" class="form-control" id="weight" placeholder="必须填写"> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="form-group"> |
| | | <label for="input1" class="changdu1 control-label">图标</label> |
| | | <div class="col-sm-7"> |
| | | <input type="text" class="form-control" id="icon"> |
| | | </div> |
| | | </div> |
| | | |
| | | |
| | | <div class="button0"> |
| | | <div class="button"> |
| | | <button type="button" class="btn btn-primary save">保存</button> |
| | | </div> |
| | | <div class="button"> |
| | | <input type="reset" class="btn btn-default" value="重置"/> |
| | | </div> |
| | | </div> |
| | | </form> |
| | | </div> |
| | | </div> |
| | | |
| | | <script src="//cdn.bootcss.com/jquery/1.10.1/jquery.min.js"></script> |
| | | <script src="js/bootstrap.min.js"></script> |
| | | <script src="js/nav.js"></script> |
| | | <script src="js/common.js"></script> |
| | | <script src="layer/layer.js"></script> |
| | | <script> |
| | | function getQueryString(name) { |
| | | var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i"); |
| | | var r = window.location.search.substr(1).match(reg); |
| | | if (r != null) return unescape(r[2]); |
| | | return null; |
| | | } |
| | | |
| | | var id = getQueryString("id"); |
| | | $(function () { |
| | | |
| | | var inx = layer.load(0, { |
| | | "shade": false |
| | | }); |
| | | $.post('api/tvlive/category/getCategory', { |
| | | 'id': id |
| | | }, function (data) { |
| | | layer.close(inx); |
| | | if (data.code == 0) { |
| | | $("#icon").val(data.data.icon); |
| | | $("#weight").val(data.data.weight); |
| | | $("#name").val(data.data.name); |
| | | } |
| | | |
| | | doResponse(data, function () { |
| | | |
| | | }); |
| | | }, 'json'); |
| | | |
| | | }); |
| | | </script> |
| | | |
| | | <script> |
| | | var index; |
| | | $(function () { |
| | | |
| | | $(".save").click(function () { |
| | | var index = layer.load(0, { |
| | | 'shade': false |
| | | }); |
| | | $.post('/BuWan/admin/new/api/tvlive/category/updateCategory', { |
| | | 'id': id, |
| | | 'icon': $("#icon").val(), |
| | | 'weight': $("#weight").val(), |
| | | 'name': $("#name").val(), |
| | | }, function (data) { |
| | | layer.close(index); |
| | | layer.msg(data.msg); |
| | | if (data.code == 0) { |
| | | layer.msg("修改成功"); |
| | | } else { |
| | | layer.msg(data.msg); |
| | | } |
| | | |
| | | doResponse(data, function () { |
| | | |
| | | }); |
| | | }, 'json'); |
| | | |
| | | }); |
| | | |
| | | }); |
| | | </script> |
| | | </body> |
| | | |
| | | </html> |
New file |
| | |
| | | <html lang="zh-cn"> |
| | | |
| | | <head> |
| | | <meta charset="utf-8"> |
| | | <meta http-equiv="X-UA-Compatible" content="IE=edge"> |
| | | <meta name="viewport" content="width=device-width, initial-scale=1"> |
| | | <meta name="referrer" content="never"> |
| | | <title>电视直播-频道列表</title> |
| | | <link href="css/bootstrap.min.css" rel="stylesheet"> |
| | | <link href="css/maincontent.css" rel="stylesheet"> |
| | | <style> |
| | | .search { |
| | | display: inline; |
| | | width: auto; |
| | | } |
| | | |
| | | .h-picture { |
| | | |
| | | width: 120px; |
| | | } |
| | | |
| | | .v-picture { |
| | | height: 120px; |
| | | } |
| | | |
| | | .form-group { |
| | | margin-bottom: 20px; |
| | | } |
| | | |
| | | .bianhao { |
| | | margin: 0; |
| | | } |
| | | </style> |
| | | |
| | | </head> |
| | | |
| | | <body> |
| | | <nav class="navbar navbar-default navbar-fixed-top"> |
| | | |
| | | </nav> |
| | | <div id="mainbody"> |
| | | <div id="sidebar"> |
| | | |
| | | </div> |
| | | <div id="neirong"> |
| | | <div class="erjidh search-div" style="padding: 10px;"> |
| | | |
| | | <select name="select" class="form-control search select-state"> |
| | | |
| | | <option value="-1">全部</option> |
| | | <option value="1">显示</option> |
| | | <option value="0">隐藏</option> |
| | | |
| | | </select> |
| | | |
| | | <div class="form-group search" role="search"> |
| | | <input type="text" class="form-control search" id="kw" style="width: 200px;" placeholder="搜索"> |
| | | </div> |
| | | <button type="button" class="btn btn-default search-button">搜索</button> |
| | | |
| | | <div class="tianjia" class="search"> |
| | | <a href="add-tuijian-home-labels.html" class="btn btn-primary" role="button">添加标签 +</a> |
| | | </div> |
| | | |
| | | </div> |
| | | <div class="bottom"> |
| | | <div class="qx"> |
| | | <div class="checkbox"> |
| | | <label> |
| | | <input type="checkbox" class="check-all" value="#"> |
| | | 全选</label> |
| | | </div> |
| | | </div> |
| | | <button class="btn btn-primary pl-add-to-category" type="button">添加到分类</button> |
| | | <button class="btn btn-warning pl-del" type="button">批量删除</button> |
| | | <div class="page"> |
| | | <ul class="pagination"> |
| | | <li class="disabled pre"> |
| | | <a href="#">«</a> |
| | | </li> |
| | | <li class="active"> |
| | | <a href="#">1</a> |
| | | </li> |
| | | <li> |
| | | <a href="#">2</a> |
| | | </li> |
| | | <li> |
| | | <a href="#" class="next">»</a> |
| | | </li> |
| | | </ul> |
| | | <div class="form-group"> |
| | | <div class="tzan"> |
| | | <button type="button" class="btn btn-primary">跳转</button> |
| | | </div> |
| | | <div class="tz"> |
| | | <input class="form-control" type="text" placeholder="页数"> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | </div> |
| | | <div class="zhuti"> |
| | | <div class="zhutisousuo"> |
| | | <table class="table"> |
| | | <thead> |
| | | <th width="5%">选择</th> |
| | | <th width="10%">编号</th> |
| | | <th width="9%">频道名称</th> |
| | | <th width="9%">封面横图</th> |
| | | <th width="9%">封面竖图</th> |
| | | <th width="9%">当前节目信息</th> |
| | | <th width="9%">下个节目信息</th> |
| | | <th width="8%">状态</th> |
| | | <th width="12%">创建时间</th> |
| | | <th width="12%">更新时间</th> |
| | | <th width="12%">操作</th> |
| | | <th width="5%">删除</th> |
| | | <th width="5%">编辑</th> |
| | | </thead> |
| | | |
| | | <tbody> |
| | | <tr v-for="(item,index) in list"> |
| | | <td> |
| | | <div class="xuanze"> |
| | | <label> |
| | | <input type="checkbox" class="check-item" v-bind:keys="item.id" |
| | | value="#"> |
| | | </label> |
| | | </div> |
| | | </td> |
| | | <td> |
| | | <div class="bianhao">{{item.id}}</div> |
| | | </td> |
| | | <td> |
| | | <div class="bianhao name"> |
| | | <a href="#">{{item.name}}</a> |
| | | </div> |
| | | </td> |
| | | |
| | | <td> |
| | | <img class="h-picture" v-bind:src="item.hPicture" v-if="item.hPicture"> |
| | | </td> |
| | | |
| | | <td> |
| | | <img class="v-picture" v-bind:src="item.vPicture" v-if="item.vPicture"> |
| | | </td> |
| | | |
| | | |
| | | <td> |
| | | <div class="bianhao"> |
| | | {{item.nowProgramTime}} |
| | | <br> |
| | | {{item.nowProgram}} |
| | | </div> |
| | | </td> |
| | | |
| | | <td> |
| | | <div class="bianhao"> |
| | | {{item.nextProgramTime}} |
| | | <br> |
| | | {{item.nextProgram}} |
| | | </div> |
| | | </td> |
| | | |
| | | <td>{{item.state==1?'显示':'隐藏'}}</td> |
| | | <td class="">{{item.createTime}}</td> |
| | | <td class="">{{item.updateTime}}</td> |
| | | |
| | | <td class=""> |
| | | |
| | | <div class="btn btn-primary" v-on:click="showCategorySelect(item.id)">添加到分类</div> |
| | | |
| | | </td> |
| | | <td> |
| | | <div class="anniu"><img src="image/dustbin.png" class="delete" |
| | | v-on:click="deleteSpecial(item.id,index)"> |
| | | </div> |
| | | </td> |
| | | <td> |
| | | <div class="anniu"> |
| | | <a v-bind:keys="item.id" href="javascript:void(0)" class="edit" |
| | | v-on:click="edit(item.id)"><img |
| | | src="image/bianji.png"></a> |
| | | </div> |
| | | </td> |
| | | </tr> |
| | | </tbody> |
| | | |
| | | </table> |
| | | </div> |
| | | </div> |
| | | <div class="bottom"> |
| | | <div class="qx"> |
| | | <div class="checkbox"> |
| | | <label> |
| | | <input type="checkbox" class="check-all" value="#"> |
| | | 全选</label> |
| | | </div> |
| | | </div> |
| | | <button class="btn btn-primary pl-add-to-category" type="button">添加到分类</button> |
| | | <button class="btn btn-warning pl-del" type="button">批量删除</button> |
| | | <div class="page"> |
| | | <ul class="pagination"> |
| | | <li class="disabled pre"> |
| | | <a href="#">«</a> |
| | | </li> |
| | | <li class="active"> |
| | | <a href="#">1</a> |
| | | </li> |
| | | <li> |
| | | <a href="#">2</a> |
| | | </li> |
| | | <li> |
| | | <a href="#" class="next">»</a> |
| | | </li> |
| | | </ul> |
| | | <div class="form-group"> |
| | | <div class="tzan"> |
| | | <button type="button" class="btn btn-primary">跳转</button> |
| | | </div> |
| | | <div class="tz"> |
| | | <input class="form-control" type="text" placeholder="页数"> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | </div> |
| | | </div> |
| | | |
| | | |
| | | <!-- 分类选择 --> |
| | | <div class="modal fade" id="categoryDialog" tabindex="-1" role="dialog" aria-hidden="true" style="width: "> |
| | | <input type="hidden" class="channelids"/> |
| | | <div class="modal-dialog"> |
| | | <div class="modal-content" style="width: 500px;margin: 0 auto"> |
| | | <div class="modal-header"> |
| | | <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> |
| | | <h4 class="modal-title" id="myModalLabel">分类选择</h4> |
| | | </div> |
| | | <div class="modal-body "> |
| | | <div class="form-horizontal"> |
| | | <div class="form-group"> |
| | | <label for="input1" class="changdu1 control-label col-sm-2">分类</label> |
| | | <div class="col-sm-10"> |
| | | <select class="form-control category"> |
| | | <option>分类1</option> |
| | | </select> |
| | | </div> |
| | | |
| | | </div> |
| | | <div class="form-group"> |
| | | <label for="input1" class="changdu1 control-label col-sm-2">权重</label> |
| | | <div class="col-sm-10"> |
| | | <input type="text" class="form-control weight" placeholder="可不填写"> |
| | | </div> |
| | | |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="modal-footer"> |
| | | <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button> |
| | | <button type="button" class="btn btn-primary">确定</button> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | |
| | | <script src="//cdn.bootcss.com/jquery/1.10.1/jquery.min.js"></script> |
| | | <script src="js/bootstrap.min.js"></script> |
| | | <script src="js/page.js"></script> |
| | | <script src="js/nav.js"></script> |
| | | <script src="js/common.js"></script> |
| | | <script src="js/vue.min.js"></script> |
| | | <script src="layer/layer.js"></script> |
| | | <script> |
| | | $(function () { |
| | | |
| | | var app = new Vue({ |
| | | el: "#neirong", |
| | | data: { |
| | | list: [], |
| | | }, |
| | | methods: { |
| | | specialList: function (page) { |
| | | var index = layer.load(1, { |
| | | shade: false |
| | | }) |
| | | |
| | | var data = { |
| | | "page": page, |
| | | "key": $("#kw").val() |
| | | }; |
| | | if (parseInt($(".search-div .select-state").val()) > 0) { |
| | | data.state = $(".search-div .select-state").val(); |
| | | } |
| | | |
| | | $.post('api/tvlive/channel/getChannelList', data, function (data) { |
| | | layer.close(index); |
| | | if (data.code != 0) |
| | | return; |
| | | app.list = data.data.data; |
| | | |
| | | fillPage(data.data.pageEntity, function (pageIndex) { |
| | | app.specialList(pageIndex); |
| | | }); |
| | | }, 'json'); |
| | | }, |
| | | changeSuper: function (id, detailSystemId, e) { |
| | | if ($(e.target).is(":checked")) { |
| | | $.post('api/homerecommend/addSuperSpecial', { |
| | | "id": id, |
| | | "detailSystemId": detailSystemId |
| | | }, function (data) { |
| | | if (data.code != 0) { |
| | | layer.msg(data.msg); |
| | | } else { |
| | | layer.msg("操作成功"); |
| | | } |
| | | }, 'json'); |
| | | } else { |
| | | $.post('api/homerecommend/deleteSuperSpecial', { |
| | | "id": id, |
| | | "detailSystemId": detailSystemId |
| | | }, function (data) { |
| | | if (data.code != 0) { |
| | | layer.msg(data.msg); |
| | | } else { |
| | | layer.msg("操作成功"); |
| | | } |
| | | }, 'json'); |
| | | } |
| | | }, |
| | | deleteSpecial: function (id, index) { |
| | | var indexDialog = layer.confirm('是否删除该条目?', { |
| | | btn: ['是', '否'] //按钮 |
| | | }, function () { |
| | | $.post('api/homerecommend/deleteSpcial', { |
| | | 'ids': id |
| | | }, function (data) { |
| | | layer.close(indexDialog); |
| | | if (data.code == 0) { |
| | | if (index > -1) { |
| | | app.list.splice(index, 1); |
| | | } else { |
| | | var ids = id.split(","); |
| | | console.log(ids); |
| | | for (var i = 0; i < ids.length; i++) { |
| | | for (var j = 0; j < app.list.length; j++) { |
| | | console.log(app.list[j].special.id + ":" + ids[i]) |
| | | if (app.list[j].special.id == ids[i]) { |
| | | app.list.splice(j, 1); |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | layer.msg("删除成功"); |
| | | } else { |
| | | layer.msg(data.msg); |
| | | } |
| | | }, 'json'); |
| | | }, function () { |
| | | |
| | | }); |
| | | }, |
| | | edit: function (id) { |
| | | window.location.href = "edit-tuijian-home-labels.html?id=" + id; |
| | | }, |
| | | showCategorySelect: function (ids) { |
| | | $("#categoryDialog .btn-primary").unbind(); |
| | | $("#categoryDialog .channelids").val(ids); |
| | | $("#categoryDialog .btn-primary").bind("click", function () { |
| | | var data = { |
| | | channelIds: ids, |
| | | categoryId: $("#categoryDialog select").val() |
| | | }; |
| | | if ($("#categoryDialog .weight").val()) { |
| | | data.weight = $("#categoryDialog .weight").val(); |
| | | } |
| | | |
| | | $.post('api/tvlive/channel/addCategoryChannel', data, function (data) { |
| | | if (data.code == 0) { |
| | | layer.msg("添加成功") |
| | | } else { |
| | | layer.msg(data.msg); |
| | | } |
| | | }, 'json'); |
| | | }) |
| | | $("#categoryDialog").modal("show"); |
| | | }, |
| | | |
| | | getCategorys: function () { |
| | | $.post('api/tvlive/category/getCategoryList', {page: 1}, function (data) { |
| | | if (data.code != 0) |
| | | return; |
| | | data = data.data.data; |
| | | $("#categoryDialog .category").empty(); |
| | | for (var i = 0; i < data.length; i++) { |
| | | $("#categoryDialog .category").append("<option value='" + data[i].category.id + "'>" + data[i].category.name + "</option>"); |
| | | } |
| | | }, 'json'); |
| | | |
| | | } |
| | | } |
| | | |
| | | |
| | | }); |
| | | |
| | | $(".search-div .search-button").click(function () { |
| | | app.specialList(1); |
| | | }); |
| | | |
| | | app.specialList(1); |
| | | app.getCategorys(); |
| | | |
| | | function getCheckedItems() { |
| | | var ids = ""; |
| | | for (var i = 0; i < $(".check-item").length; i++) { |
| | | if ($(".check-item").eq(i).is(':checked')) { |
| | | ids += $(".check-item").eq(i).attr("keys") + ","; |
| | | } |
| | | } |
| | | if (ids.length > 0) |
| | | ids = ids.substr(0, ids.length - 1); |
| | | return ids; |
| | | } |
| | | |
| | | $(".check-all").change(function () { |
| | | if (this.checked) { |
| | | $(".check-item").each(function () { |
| | | this.checked = true; |
| | | }) |
| | | } |
| | | else { |
| | | $(".check-item").each(function () { |
| | | this.checked = false; |
| | | }) |
| | | } |
| | | }); |
| | | |
| | | $(".pl-del").click(function () { |
| | | var ids = getCheckedItems(); |
| | | if (ids.length < 1) { |
| | | layer.msg("请选择栏目"); |
| | | return; |
| | | } |
| | | |
| | | app.deleteSpecial(ids, -1); |
| | | |
| | | }); |
| | | |
| | | |
| | | $(".pl-add-to-category").click(function () { |
| | | var ids = getCheckedItems(); |
| | | if (ids.length < 1) { |
| | | layer.msg("请选择栏目"); |
| | | return; |
| | | } |
| | | app.showCategorySelect(ids); |
| | | }); |
| | | |
| | | |
| | | }); |
| | | </script> |
| | | |
| | | </body> |
| | | |
| | | </html> |
| | |
| | | public class DES { |
| | | @org.junit.Test |
| | | public void test1() { |
| | | String st = "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"; |
| | | String st = "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"; |
| | | System.out.println(DESUtil.decode(st)); |
| | | } |
| | | |
New file |
| | |
| | | package com.hxh.spring.test.video; |
| | | |
| | | |
| | | import com.yeshi.buwan.dao.juhe.hanmi.HanmiShowDao; |
| | | import com.yeshi.buwan.dao.juhe.hanmi.HanmiShowEpisodeDao; |
| | | import com.yeshi.buwan.service.inter.juhe.HanmiService; |
| | | import com.yeshi.buwan.videos.hanmi.HanmiApiUtil; |
| | | import com.yeshi.buwan.videos.hanmi.entity.HanmiShow; |
| | | import com.yeshi.buwan.videos.hanmi.entity.HanmiShowEpisode; |
| | | import org.junit.Test; |
| | | import org.junit.runner.RunWith; |
| | | import org.springframework.test.context.ContextConfiguration; |
| | | import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; |
| | | import org.springframework.test.context.web.WebAppConfiguration; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.io.IOException; |
| | | import java.util.Collections; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | |
| | | @RunWith(SpringJUnit4ClassRunner.class) //使用junit4进行测试 |
| | | @ContextConfiguration(locations = {"classpath:spring.xml"}) |
| | | @WebAppConfiguration |
| | | public class HanmiTest { |
| | | |
| | | @Resource |
| | | private HanmiService hanmiService; |
| | | |
| | | @Resource |
| | | private HanmiShowEpisodeDao hanmiShowEpisodeDao; |
| | | |
| | | @Resource |
| | | private HanmiShowDao hanmiShowDao; |
| | | |
| | | @Test |
| | | public void addHanJu() throws Exception { |
| | | for (int i = 1; i < 5; i++) { |
| | | List<HanmiShow> showList = HanmiApiUtil.parseDetailList(HanmiApiUtil.parseList("https://www.hmtv.me/dianying/page/" + i)); |
| | | for (HanmiShow show : showList) { |
| | | hanmiService.saveShow(show); |
| | | // hanmiService.deleteByShowId(show.getId()); |
| | | } |
| | | } |
| | | } |
| | | |
| | | @Test |
| | | public void addToVideo() throws IOException { |
| | | |
| | | for (int i = 2; i < 5; i++) { |
| | | List<HanmiShow> showList = HanmiApiUtil.parseList("https://www.hmtv.me/hanju/page/" + i); |
| | | Collections.reverse(showList); |
| | | for (HanmiShow show : showList) { |
| | | show.setId(show.getUrl().replace("https://www.hmtv.me/show/", "").trim()); |
| | | show = hanmiService.getShowDetail(show.getId()); |
| | | if (show != null) |
| | | hanmiService.addToVideoInfo(show); |
| | | } |
| | | } |
| | | } |
| | | |
| | | @Test |
| | | public void test() { |
| | | List<HanmiShow> list = hanmiShowDao.listAll(0, 100); |
| | | for (HanmiShow show : list) { |
| | | List<HanmiShowEpisode> epList = hanmiShowEpisodeDao.listByShowId(show.getId(), 0, 1); |
| | | if (epList != null && epList.size() > 0) { |
| | | try { |
| | | List<HanmiShowEpisode> episodeList = HanmiApiUtil.getShowEpisodesFromPlayUrl(epList.get(0).getPlayUrl()); |
| | | if (episodeList != null) |
| | | for (HanmiShowEpisode episode : episodeList) { |
| | | episode.setShowId(show.getId()); |
| | | episode.setId(HanmiShowEpisode.createId(episode.getShowId(), episode.getTag())); |
| | | episode.setCreateTime(new Date()); |
| | | hanmiShowEpisodeDao.save(episode); |
| | | } |
| | | } catch (IOException e) { |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | } |
| | |
| | | package com.hxh.spring.test.video; |
| | | |
| | | |
| | | import com.yeshi.buwan.dao.search.SearchSpecialDao; |
| | | import com.yeshi.buwan.domain.solr.SolrShortVideo; |
| | | import com.yeshi.buwan.domain.special.SearchSpecial; |
| | | import com.yeshi.buwan.domain.special.SearchSpecialPosition; |
| | |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.util.Arrays; |
| | | import java.util.List; |
| | | |
| | | // |
| | | @RunWith(SpringJUnit4ClassRunner.class) //使用junit4进行测试 |
| | |
| | | |
| | | @Resource |
| | | private SearchSpecialPositionMapService searchSpecialPositionMapService; |
| | | |
| | | @Resource |
| | | private SearchSpecialDao searchSpecialDao; |
| | | |
| | | |
| | | @Test |
| | |
| | | filter.setArea("韩国"); |
| | | filter.setContentType(1); |
| | | filter.setVideoType(150); |
| | | searchSpecial.setAlbumQuery(filter); |
| | | searchSpecial.setInternetQuery(filter); |
| | | filter.setResourceIds(Arrays.asList(new String[]{"25","28"})); |
| | | searchSpecial.setContainerList(Arrays.asList(new SearchSpecial.QueryConditionsContainer[]{new SearchSpecial.QueryConditionsContainer(new SearchSpecial.QueryConditions(filter, filter, null), "48", null, 1)})); |
| | | searchSpecial.setColumn(2); |
| | | searchSpecial.setSystemId(systemId + ""); |
| | | searchSpecialService.save(searchSpecial); |
| | |
| | | filter.setArea("韩国"); |
| | | filter.setContentType(1); |
| | | filter.setVideoType(151); |
| | | searchSpecial.setAlbumQuery(filter); |
| | | searchSpecial.setInternetQuery(filter); |
| | | searchSpecial.setContainerList(Arrays.asList(new SearchSpecial.QueryConditionsContainer[]{new SearchSpecial.QueryConditionsContainer(new SearchSpecial.QueryConditions(filter, filter, null), "48", null, 1)})); |
| | | searchSpecial.setColumn(3); |
| | | searchSpecial.setSystemId(systemId + ""); |
| | | searchSpecialService.save(searchSpecial); |
| | |
| | | filter.setArea("韩国"); |
| | | filter.setContentType(1); |
| | | filter.setVideoType(152); |
| | | searchSpecial.setAlbumQuery(filter); |
| | | searchSpecial.setInternetQuery(filter); |
| | | searchSpecial.setContainerList(Arrays.asList(new SearchSpecial.QueryConditionsContainer[]{new SearchSpecial.QueryConditionsContainer(new SearchSpecial.QueryConditions(filter, filter, null), "48", null, 1)})); |
| | | searchSpecial.setColumn(3); |
| | | searchSpecial.setSystemId(systemId + ""); |
| | | searchSpecialService.save(searchSpecial); |
| | |
| | | filter.setArea("日本"); |
| | | // filter.setContentType(1); |
| | | filter.setVideoType(153); |
| | | searchSpecial.setAlbumQuery(filter); |
| | | searchSpecial.setInternetQuery(filter); |
| | | searchSpecial.setContainerList(Arrays.asList(new SearchSpecial.QueryConditionsContainer[]{new SearchSpecial.QueryConditionsContainer(new SearchSpecial.QueryConditions(filter, filter, null), "48", null, 1)})); |
| | | searchSpecial.setColumn(2); |
| | | searchSpecial.setSystemId(systemId + ""); |
| | | searchSpecialService.save(searchSpecial); |
| | |
| | | sfilter.setAreas(Arrays.asList(new String[]{"韩国", "日韩"})); |
| | | sfilter.setRootVideoType(155); |
| | | // sfilter.setTag(); |
| | | searchSpecial.setShortQuery(sfilter); |
| | | searchSpecial.setContainerList(Arrays.asList(new SearchSpecial.QueryConditionsContainer[]{new SearchSpecial.QueryConditionsContainer(new SearchSpecial.QueryConditions(null, null, sfilter), "48", null, 1)})); |
| | | searchSpecial.setColumn(2); |
| | | searchSpecial.setSystemId(systemId + ""); |
| | | searchSpecialService.save(searchSpecial); |
| | |
| | | sfilter.setAreas(Arrays.asList(new String[]{"韩国", "日韩"})); |
| | | sfilter.setRootVideoType(155); |
| | | sfilter.setTag("八卦"); |
| | | searchSpecial.setShortQuery(sfilter); |
| | | searchSpecial.setContainerList(Arrays.asList(new SearchSpecial.QueryConditionsContainer[]{new SearchSpecial.QueryConditionsContainer(new SearchSpecial.QueryConditions(null, null, sfilter), "48", null, 1)})); |
| | | searchSpecial.setColumn(2); |
| | | searchSpecial.setSystemId(systemId + ""); |
| | | searchSpecialService.save(searchSpecial); |
| | |
| | | sfilter.setAreas(Arrays.asList(new String[]{"韩国", "日韩"})); |
| | | sfilter.setRootVideoType(155); |
| | | sfilter.setTag("新闻"); |
| | | searchSpecial.setShortQuery(sfilter); |
| | | searchSpecial.setContainerList(Arrays.asList(new SearchSpecial.QueryConditionsContainer[]{new SearchSpecial.QueryConditionsContainer(new SearchSpecial.QueryConditions(null, null, sfilter), "48", null, 1)})); |
| | | searchSpecial.setColumn(2); |
| | | searchSpecial.setSystemId(systemId + ""); |
| | | searchSpecialService.save(searchSpecial); |
| | |
| | | sfilter.setAreas(Arrays.asList(new String[]{"韩国", "日韩"})); |
| | | sfilter.setRootVideoType(155); |
| | | sfilter.setTag("明星"); |
| | | searchSpecial.setShortQuery(sfilter); |
| | | searchSpecial.setContainerList(Arrays.asList(new SearchSpecial.QueryConditionsContainer[]{new SearchSpecial.QueryConditionsContainer(new SearchSpecial.QueryConditions(null, null, sfilter), "48", null, 1)})); |
| | | searchSpecial.setColumn(2); |
| | | searchSpecial.setSystemId(systemId + ""); |
| | | searchSpecialService.save(searchSpecial); |
| | |
| | | sfilter.setAreas(Arrays.asList(new String[]{"韩国", "日韩"})); |
| | | sfilter.setRootVideoType(155); |
| | | sfilter.setTag("热点"); |
| | | searchSpecial.setShortQuery(sfilter); |
| | | searchSpecial.setContainerList(Arrays.asList(new SearchSpecial.QueryConditionsContainer[]{new SearchSpecial.QueryConditionsContainer(new SearchSpecial.QueryConditions(null, null, sfilter), "48", null, 1)})); |
| | | searchSpecial.setColumn(2); |
| | | searchSpecial.setSystemId(systemId + ""); |
| | | searchSpecialService.save(searchSpecial); |
| | |
| | | sfilter.setAreas(Arrays.asList(new String[]{"韩国", "日韩"})); |
| | | sfilter.setRootVideoType(155); |
| | | sfilter.setTag("音乐"); |
| | | searchSpecial.setShortQuery(sfilter); |
| | | searchSpecial.setContainerList(Arrays.asList(new SearchSpecial.QueryConditionsContainer[]{new SearchSpecial.QueryConditionsContainer(new SearchSpecial.QueryConditions(null, null, sfilter), "48", null, 1)})); |
| | | searchSpecial.setColumn(2); |
| | | searchSpecial.setSystemId(systemId + ""); |
| | | searchSpecialService.save(searchSpecial); |
| | |
| | | filter.setRootVideoType(155); |
| | | filter.setSortKey("third_update_time"); |
| | | |
| | | searchSpecial.setAlbumQuery(null); |
| | | searchSpecial.setInternetQuery(null); |
| | | searchSpecial.setShortQuery(filter); |
| | | searchSpecial.setContainerList(Arrays.asList(new SearchSpecial.QueryConditionsContainer[]{new SearchSpecial.QueryConditionsContainer(new SearchSpecial.QueryConditions(null, null, filter), "48", null, 1)})); |
| | | searchSpecial.setColumn(1); |
| | | searchSpecial.setSystemId(2 + ""); |
| | | searchSpecialService.save(searchSpecial); |
| | |
| | | searchSpecialPositionMapService.add(map); |
| | | } |
| | | |
| | | @Test |
| | | public void repaireSpecial() { |
| | | SearchSpecial special = searchSpecialDao.get("3#hanju-shaoer"); |
| | | SolrVideoSearchFilter filter = new SolrVideoSearchFilter(); |
| | | filter.setArea("日本"); |
| | | filter.setContentType(1); |
| | | filter.setVideoType(153); |
| | | filter.setResourceIds(Arrays.asList(new String[]{"25","28"})); |
| | | special.getContainerList().add(new SearchSpecial.QueryConditionsContainer(new SearchSpecial.QueryConditions(filter, null, null), "48", "meizu", 1)); |
| | | |
| | | special.setContainerList(special.getContainerList()); |
| | | searchSpecialDao.save(special); |
| | | } |
| | | |
| | | } |
| | |
| | | @Test |
| | | public void addHJAndroid() { |
| | | String[] resourceIds = null; |
| | | resourceIds = new String[]{"13", "20", "17", "19", "21", "22", "24","26", "27", "25"}; |
| | | resourceIds = new String[]{"13", "20", "17", "19", "21", "22", "24","26", "27", "25","28"}; |
| | | for (String rid : resourceIds) { |
| | | try { |
| | | videoResourceVersionMapService.add(new VideoResourceVersionMap("48", 1, rid, null)); |
| | | videoResourceVersionMapService.add(new VideoResourceVersionMap("48", 1, rid, "meizu")); |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | } |
| | | |
| | | @Test |
| | | public void addHJMZ() { |
| | | String[] resourceIds = null; |
| | | resourceIds = new String[]{ "25","28"}; |
| | | for (String rid : resourceIds) { |
| | | try { |
| | | videoResourceVersionMapService.add(new VideoResourceVersionMap("48", 1, rid, "meizu")); |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } |