Browse Source

add:youtube live页面展示v1

lvzhiqiang 7 months ago
parent
commit
931b997655

+ 37 - 0
src/main/java/top/lvzhiqiang/controller/CoinYoutubeController.java

@@ -0,0 +1,37 @@
+package top.lvzhiqiang.controller;
+
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import top.lvzhiqiang.dto.R;
+import top.lvzhiqiang.exception.ParameterException;
+import top.lvzhiqiang.service.CoinYoutubeService;
+import top.lvzhiqiang.util.StringUtils;
+
+import javax.annotation.Resource;
+
+/**
+ * youtube Controller
+ *
+ * @author lvzhiqiang
+ * 2024/9/25 10:47
+ */
+@RestController
+@RequestMapping("/coinYoutube")
+public class CoinYoutubeController {
+
+    @Resource
+    private CoinYoutubeService coinYoutubeService;
+
+    @PostMapping("/liveChapterUpdate")
+    public Object liveChapterUpdate(String id, String remark) {
+        if (StringUtils.isEmpty(id)) {
+            throw new ParameterException("id不能为空!");
+        }
+        if (StringUtils.isEmpty(remark)) {
+            remark = "--";
+        }
+
+        return R.ok().data(coinYoutubeService.liveChapterUpdate(id, remark));
+    }
+}

+ 38 - 0
src/main/java/top/lvzhiqiang/dto/CoinYoutubeYt2140LiveChapterDTO.java

@@ -0,0 +1,38 @@
+package top.lvzhiqiang.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import top.lvzhiqiang.entity.CoinYoutubeYt2140LiveChapter;
+
+import java.time.LocalDate;
+
+/**
+ * 币-油管-2140加密社群-直播表-DTO
+ *
+ * @author lvzhiqiang
+ * 2025/5/15 10:50
+ */
+@Data
+public class CoinYoutubeYt2140LiveChapterDTO extends CoinYoutubeYt2140LiveChapter {
+
+    /**
+     * 主URL
+     */
+    private String originalUrl;
+
+    /**
+     * 主标题
+     */
+    private String fullTitle;
+
+    /**
+     * 发布时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private LocalDate publishTime;
+
+    private String readableStartTime;
+    private String readableEndTime;
+    private String chapterCount;
+    private String chapterSort;
+}

+ 2 - 0
src/main/java/top/lvzhiqiang/entity/CoinApiConfig.java

@@ -89,5 +89,7 @@ public class CoinApiConfig implements Serializable {
 
 
     private List<JSONObject> categoryList;
     private List<JSONObject> categoryList;
 
 
+    private List<String>ytLivePublishTimeList;
+
     private String userType;
     private String userType;
 }
 }

+ 5 - 0
src/main/java/top/lvzhiqiang/entity/CoinYoutubeYt2140LiveChapter.java

@@ -41,6 +41,11 @@ public class CoinYoutubeYt2140LiveChapter implements Serializable {
     private Integer endTime;
     private Integer endTime;
 
 
     /**
     /**
+     * long_time
+     */
+    private Integer longTime;
+
+    /**
      * 备注
      * 备注
      */
      */
     private String remark;
     private String remark;

+ 3 - 0
src/main/java/top/lvzhiqiang/mapper/CoinApiConfigMapper.java

@@ -127,4 +127,7 @@ public interface CoinApiConfigMapper {
             " order by sort desc" +
             " order by sort desc" +
             "</script>"})
             "</script>"})
     List<JSONObject> findBookmarkCategoryList(String parentId);
     List<JSONObject> findBookmarkCategoryList(String parentId);
+
+    @Select("select distinct publish_time from coin_youtube_yt2140_live where delete_flag = 1 and status = 1 order by publish_time desc")
+    List<String> findYtLivePublishTimeList();
 }
 }

+ 30 - 0
src/main/java/top/lvzhiqiang/mapper/CoinYoutubeMapper.java

@@ -2,6 +2,8 @@ package top.lvzhiqiang.mapper;
 
 
 import org.apache.ibatis.annotations.Insert;
 import org.apache.ibatis.annotations.Insert;
 import org.apache.ibatis.annotations.Select;
 import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
+import top.lvzhiqiang.dto.CoinYoutubeYt2140LiveChapterDTO;
 import top.lvzhiqiang.entity.CoinYoutubeYt2140Live;
 import top.lvzhiqiang.entity.CoinYoutubeYt2140Live;
 import top.lvzhiqiang.entity.CoinYoutubeYt2140LiveChapter;
 import top.lvzhiqiang.entity.CoinYoutubeYt2140LiveChapter;
 
 
@@ -51,4 +53,32 @@ public interface CoinYoutubeMapper {
             "VALUES (#{id}, #{originalUrl}, #{fullTitle}, #{status}, #{failureCause}, #{publishTime}, #{duration}, #{chapterCount}, now(), now()) " +
             "VALUES (#{id}, #{originalUrl}, #{fullTitle}, #{status}, #{failureCause}, #{publishTime}, #{duration}, #{chapterCount}, now(), now()) " +
             "ON DUPLICATE KEY UPDATE full_title=values(full_title),status=values(status),failure_cause=values(failure_cause),publish_time=values(publish_time),duration=values(duration),chapter_count=values(chapter_count),modify_time=now()")
             "ON DUPLICATE KEY UPDATE full_title=values(full_title),status=values(status),failure_cause=values(failure_cause),publish_time=values(publish_time),duration=values(duration),chapter_count=values(chapter_count),modify_time=now()")
     void insertOrUpdateYt2140Live(CoinYoutubeYt2140Live coinYoutubeYt2140Live);
     void insertOrUpdateYt2140Live(CoinYoutubeYt2140Live coinYoutubeYt2140Live);
+
+    @Select({"<script>" +
+            "select a.*,b.original_url,b.full_title,b.publish_time,b.chapter_count from coin_youtube_yt2140_live_chapter a " +
+            "left join coin_youtube_yt2140_live b on a.live_id = b.id WHERE a.delete_flag = 1 and b.delete_flag=1" +
+            "<if test=\"keyword != null and keyword != ''\">" +
+            "   and a.chapter_title like concat('%',#{keyword},'%')" +
+            "</if>" +
+            "<if test=\"publishTimeField != null and publishTimeField != ''\">" +
+            "   and b.publish_time = #{publishTimeField}" +
+            "</if>" +
+            " order by " +
+            "<foreach collection='sortField' item='sf' index=\"index\" separator=\",\">" +
+            "   ${sf} ${sort}" +
+            " </foreach>" +
+            "</script>"})
+    List<CoinYoutubeYt2140LiveChapterDTO> findYoutubeLiveList(Map<String, Object> params);
+
+    @Update({"<script>" +
+            "update coin_youtube_yt2140_live_chapter " +
+            "<set>" +
+            "<if test=\"remark != null and remark != ''\">" +
+            "   remark = #{remark}," +
+            "</if>" +
+            "modify_time=now()" +
+            "</set>" +
+            "where id = #{id}" +
+            "</script>"})
+    int updateLiveChapterRemark(CoinYoutubeYt2140LiveChapter coinYoutubeYt2140LiveChapter);
 }
 }

+ 2 - 0
src/main/java/top/lvzhiqiang/service/CoinYoutubeService.java

@@ -22,4 +22,6 @@ public interface CoinYoutubeService {
     void jsoupYoutubeLive4yt2140ChapterSub(CoinYoutubeYt2140Live coinYoutubeYt2140Live);
     void jsoupYoutubeLive4yt2140ChapterSub(CoinYoutubeYt2140Live coinYoutubeYt2140Live);
 
 
     String getVideoDetails(String videoUrl) throws IOException, InterruptedException;
     String getVideoDetails(String videoUrl) throws IOException, InterruptedException;
+
+    Object liveChapterUpdate(String id, String remark);
 }
 }

+ 2 - 0
src/main/java/top/lvzhiqiang/service/impl/CoinApiConfigServiceImpl.java

@@ -87,6 +87,8 @@ public class CoinApiConfigServiceImpl implements CoinApiConfigService {
                 coinApiConfig.setExchangeCategoryList(coinApiConfigMapper.findFileCurrentHoldingCategoryList());
                 coinApiConfig.setExchangeCategoryList(coinApiConfigMapper.findFileCurrentHoldingCategoryList());
             } else if (coinApiConfig.getNameEn().equals("bookmark")) {
             } else if (coinApiConfig.getNameEn().equals("bookmark")) {
                 coinApiConfig.setCategoryList(coinApiConfigMapper.findBookmarkCategoryList(null));
                 coinApiConfig.setCategoryList(coinApiConfigMapper.findBookmarkCategoryList(null));
+            }else if (coinApiConfig.getNameEn().equals("youtubeLive")) {
+                coinApiConfig.setYtLivePublishTimeList(coinApiConfigMapper.findYtLivePublishTimeList());
             }
             }
         }
         }
 
 

+ 37 - 4
src/main/java/top/lvzhiqiang/service/impl/CoinServiceImpl.java

@@ -13,6 +13,7 @@ import me.chanjar.weixin.cp.bean.article.NewArticle;
 import me.chanjar.weixin.cp.bean.message.WxCpMessage;
 import me.chanjar.weixin.cp.bean.message.WxCpMessage;
 import me.chanjar.weixin.cp.bean.message.WxCpMessageSendResult;
 import me.chanjar.weixin.cp.bean.message.WxCpMessageSendResult;
 import me.chanjar.weixin.cp.config.impl.WxCpDefaultConfigImpl;
 import me.chanjar.weixin.cp.config.impl.WxCpDefaultConfigImpl;
+import org.apache.commons.lang3.time.DurationFormatUtils;
 import org.jsoup.Connection;
 import org.jsoup.Connection;
 import org.redisson.api.RLock;
 import org.redisson.api.RLock;
 import org.redisson.api.RedissonClient;
 import org.redisson.api.RedissonClient;
@@ -24,15 +25,13 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.StopWatch;
 import org.springframework.util.StopWatch;
 import top.lvzhiqiang.config.InitRunner;
 import top.lvzhiqiang.config.InitRunner;
 import top.lvzhiqiang.config.WorkWeixinProperties;
 import top.lvzhiqiang.config.WorkWeixinProperties;
+import top.lvzhiqiang.dto.CoinYoutubeYt2140LiveChapterDTO;
 import top.lvzhiqiang.dto.R;
 import top.lvzhiqiang.dto.R;
 import top.lvzhiqiang.entity.*;
 import top.lvzhiqiang.entity.*;
 import top.lvzhiqiang.enumeration.ResultCodeEnum;
 import top.lvzhiqiang.enumeration.ResultCodeEnum;
 import top.lvzhiqiang.exception.BusinessException;
 import top.lvzhiqiang.exception.BusinessException;
 import top.lvzhiqiang.exception.ParameterException;
 import top.lvzhiqiang.exception.ParameterException;
-import top.lvzhiqiang.mapper.CoinApiConfigMapper;
-import top.lvzhiqiang.mapper.CoinMapper;
-import top.lvzhiqiang.mapper.MusicInfoMapper;
-import top.lvzhiqiang.mapper.PictureInfoMapper;
+import top.lvzhiqiang.mapper.*;
 import top.lvzhiqiang.service.CoinService;
 import top.lvzhiqiang.service.CoinService;
 import top.lvzhiqiang.util.*;
 import top.lvzhiqiang.util.*;
 
 
@@ -116,6 +115,8 @@ public class CoinServiceImpl implements CoinService {
     private PictureInfoMapper pictureInfoMapper;
     private PictureInfoMapper pictureInfoMapper;
     @Resource
     @Resource
     private MusicInfoMapper musicInfoMapper;
     private MusicInfoMapper musicInfoMapper;
+    @Resource
+    private CoinYoutubeMapper coinYoutubeMapper;
 
 
     @Resource
     @Resource
     private RedissonClient redissonClient;
     private RedissonClient redissonClient;
@@ -1879,11 +1880,43 @@ public class CoinServiceImpl implements CoinService {
 
 
             renderMainSearch4Bookmark(bookmarkInfoList);
             renderMainSearch4Bookmark(bookmarkInfoList);
             return bookmarkInfoPageInfo;
             return bookmarkInfoPageInfo;
+        } else if (params.getString("nameEn").equals("youtubeLive")) {
+            PageHelper.startPage(params.getInteger("pageNo"), params.getInteger("pageSize"), true);
+
+            if (params.containsKey("sortField")) {
+                params.put("sortField", Arrays.asList(params.getString("sortField").split(",")));
+            }
+
+            List<CoinYoutubeYt2140LiveChapterDTO> yt2140LiveChapterList = coinYoutubeMapper.findYoutubeLiveList(params.toJavaObject(Map.class));
+
+            PageInfo<CoinYoutubeYt2140LiveChapterDTO> yt2140LiveChapterPageInfo = new PageInfo<>(yt2140LiveChapterList);
+
+            renderMainSearch4YoutubeYt2140LiveChapter(yt2140LiveChapterList);
+            return yt2140LiveChapterPageInfo;
         }
         }
 
 
         return result;
         return result;
     }
     }
 
 
+    private void renderMainSearch4YoutubeYt2140LiveChapter(List<CoinYoutubeYt2140LiveChapterDTO> yt2140LiveChapterList) {
+        for (CoinYoutubeYt2140LiveChapterDTO yt2140LiveChapter : yt2140LiveChapterList) {
+            String chapterUrl = yt2140LiveChapter.getOriginalUrl().concat("&t=").concat(String.valueOf(yt2140LiveChapter.getStartTime())).concat("s");
+            // 顺序
+            yt2140LiveChapter.setChapterSort(yt2140LiveChapter.getSort() + "/" + yt2140LiveChapter.getChapterCount());
+            // 开始时间
+            yt2140LiveChapter.setReadableStartTime("<a target=\"_blank\" href=\" " + chapterUrl + "\">" + formatTime(yt2140LiveChapter.getStartTime()) + "</a>");
+            // 结束时间
+            yt2140LiveChapter.setReadableEndTime(formatTime(yt2140LiveChapter.getEndTime() - 1));
+        }
+    }
+
+    public String formatTime(long totalSeconds) {
+        if (totalSeconds >= 3600) {
+            return DurationFormatUtils.formatDuration(totalSeconds * 1000, "H:mm:ss"); // 2:20:20
+        } else {
+            return DurationFormatUtils.formatDuration(totalSeconds * 1000, "mm:ss");  // 20:20
+        }
+    }
 
 
     private void renderMainSearch4Bookmark(List<BookmarkInfo> bookmarkInfoList) {
     private void renderMainSearch4Bookmark(List<BookmarkInfo> bookmarkInfoList) {
         for (BookmarkInfo bookmarkInfo : bookmarkInfoList) {
         for (BookmarkInfo bookmarkInfo : bookmarkInfoList) {

+ 11 - 0
src/main/java/top/lvzhiqiang/service/impl/CoinYoutubeServiceImpl.java

@@ -201,6 +201,7 @@ public class CoinYoutubeServiceImpl implements CoinYoutubeService {
                 yt2140LiveChapter.setLiveId(coinYoutubeYt2140Live.getId());
                 yt2140LiveChapter.setLiveId(coinYoutubeYt2140Live.getId());
                 yt2140LiveChapter.setStartTime(chapter.getInteger("start_time"));
                 yt2140LiveChapter.setStartTime(chapter.getInteger("start_time"));
                 yt2140LiveChapter.setEndTime(chapter.getInteger("end_time"));
                 yt2140LiveChapter.setEndTime(chapter.getInteger("end_time"));
+                yt2140LiveChapter.setLongTime(chapter.getInteger("end_time") - chapter.getInteger("start_time") - 1);
                 yt2140LiveChapter.setSort(i + 1);
                 yt2140LiveChapter.setSort(i + 1);
 
 
                 yt2140LiveChapterList.add(yt2140LiveChapter);
                 yt2140LiveChapterList.add(yt2140LiveChapter);
@@ -241,4 +242,14 @@ public class CoinYoutubeServiceImpl implements CoinYoutubeService {
 
 
         return jsonOutput.toString(); // 返回 JSON 格式的视频详情
         return jsonOutput.toString(); // 返回 JSON 格式的视频详情
     }
     }
+
+    @Override
+    public Object liveChapterUpdate(String id, String remark) {
+        CoinYoutubeYt2140LiveChapter coinYoutubeYt2140LiveChapter = new CoinYoutubeYt2140LiveChapter();
+
+        coinYoutubeYt2140LiveChapter.setId(Long.valueOf(id));
+        coinYoutubeYt2140LiveChapter.setRemark(remark);
+        int num = coinYoutubeMapper.updateLiveChapterRemark(coinYoutubeYt2140LiveChapter);
+        return num;
+    }
 }
 }

+ 35 - 5
src/main/resources/static/coin.html

@@ -33,7 +33,7 @@
         font-weight: bold;
         font-weight: bold;
     }
     }
 
 
-    #watchlistpreview, #musicpreview {
+    #watchlistpreview, #musicpreview, #youtubeLivepreview {
         display: none;
         display: none;
         position: absolute;
         position: absolute;
         z-index: 999;
         z-index: 999;
@@ -49,17 +49,17 @@
         font-size: 14px;
         font-size: 14px;
     }
     }
 
 
-    .watchlistpreview-top, .musicpreview-top {
+    .watchlistpreview-top, .musicpreview-top, .youtubeLivepreview-top {
         height: 40px;
         height: 40px;
         line-height: 40px;
         line-height: 40px;
     }
     }
 
 
-    .watchlistpreview-content, .musicpreview-content {
+    .watchlistpreview-content, .musicpreview-content, .youtubeLivepreview-content {
         overflow: auto;
         overflow: auto;
         height: calc(100% - 40px);
         height: calc(100% - 40px);
     }
     }
 
 
-    .watchlistpreview-top-close, .musicpreview-top-close {
+    .watchlistpreview-top-close, .musicpreview-top-close, .youtubeLivepreview-top-close {
         color: #ddd;
         color: #ddd;
         height: 40px;
         height: 40px;
         font-size: 28px;
         font-size: 28px;
@@ -72,7 +72,7 @@
         cursor: pointer;
         cursor: pointer;
     }*/
     }*/
 
 
-    .watchlistpreview-loading, .musicpreview-loading {
+    .watchlistpreview-loading, .musicpreview-loading, .youtubeLivepreview-loading {
         text-align: center;
         text-align: center;
         display: none;
         display: none;
         position: absolute;
         position: absolute;
@@ -462,6 +462,26 @@
             </select>
             </select>
         </div>
         </div>
 
 
+        <div id="apis-quiet-div-youtubeLive" style="display: none;">
+            <button class="apis-quiet-div-button3" slideDiv="apis-quiet-content" pageO="prev">上一页</button>
+            <button class="apis-quiet-div-button3" slideDiv="apis-quiet-content" pageO="next">下一页</button>
+            <input type="text" style="width: 100px;padding-top: 3px;" id="apis-quiet-div-youtubeLive-pageNo" value="1">
+            <input type="text" style="width: 100px;padding-top: 3px;" id="apis-quiet-div-youtubeLive-pageSize" disabled="disabled" value="20">
+            <input type="text" style="width: 100px;padding-top: 3px;" id="apis-quiet-div-youtubeLive-pages" disabled="disabled" value="999999">
+            <input type="text" style="width: 100px;padding-top: 3px;" id="apis-quiet-div-youtubeLive-keyword" placeholder="关键词">
+            <select id="apis-quiet-div-youtubeLive-publishTimeField" style="height: 24px;">
+                <option value="">直播时间</option>
+            </select>
+            <select id="apis-quiet-div-youtubeLive-sortField" style="height: 24px;">
+                <option value="b.publish_time,a.sort">发布时间</option>
+                <option value="a.long_time,a.sort">耗时</option>
+            </select>
+            <select id="apis-quiet-div-youtubeLive-sort" style="height: 24px;">
+                <option value="desc">desc</option>
+                <option value="asc">asc</option>
+            </select>
+        </div>
+
         <div id="apis-quiet-div-cmcmap" style="display: none;">
         <div id="apis-quiet-div-cmcmap" style="display: none;">
             <button class="apis-quiet-div-button3" slideDiv="apis-quiet-content" pageO="prev">上一页</button>
             <button class="apis-quiet-div-button3" slideDiv="apis-quiet-content" pageO="prev">上一页</button>
             <button class="apis-quiet-div-button3" slideDiv="apis-quiet-content" pageO="next">下一页</button>
             <button class="apis-quiet-div-button3" slideDiv="apis-quiet-content" pageO="next">下一页</button>
@@ -588,6 +608,16 @@
     <div class="musicpreview-content"></div>
     <div class="musicpreview-content"></div>
 </div>
 </div>
 
 
+<div id="youtubeLivepreview">
+    <div class="youtubeLivepreview-loading"><img src='cover/loading.gif'></div>
+    <div class="youtubeLivepreview-top">
+        <div style="float: left;" class="youtubeLivepreview-top-title">详情</div>
+        <div style="float: right;" class="youtubeLivepreview-top-submit"><img src="cover/submit.svg"></div>
+        <div style="float: right;" class="youtubeLivepreview-top-close"><img src="cover/close.svg"></div>
+    </div>
+    <div class="youtubeLivepreview-content"></div>
+</div>
+
 <div class="popup" id="draggable-popup">
 <div class="popup" id="draggable-popup">
     <button class="close-btn">&times;</button>
     <button class="close-btn">&times;</button>
     <h2></h2>
     <h2></h2>

+ 75 - 3
src/main/resources/static/js/my-coin.js

@@ -207,6 +207,12 @@ function initOther4Select() {
                             categoryStr += '<option value="' + obj2.id + '">' + obj2.categoryName + '</option>';
                             categoryStr += '<option value="' + obj2.id + '">' + obj2.categoryName + '</option>';
                         });
                         });
                         $("#apis-quiet-div-bookmark-categoryField").append(categoryStr);
                         $("#apis-quiet-div-bookmark-categoryField").append(categoryStr);
+                    } else if (obj.nameEn === 'youtubeLive') {
+                        var ytLivePublishTimeStr = '';
+                        $.each(obj.ytLivePublishTimeList, function (index2, obj2) {
+                            ytLivePublishTimeStr += '<option value="' + obj2 + '">' + obj2 + '</option>';
+                        });
+                        $("#apis-quiet-div-youtubeLive-publishTimeField").append(ytLivePublishTimeStr);
                     }
                     }
                 });
                 });
 
 
@@ -283,7 +289,7 @@ function handleSelectChange(objj) {
             $.each(returnEn, function (index, obj) {
             $.each(returnEn, function (index, obj) {
                 theadStr += '<th returnEn="' + obj + '">' + returnCn[index] + '</th>';
                 theadStr += '<th returnEn="' + obj + '">' + returnCn[index] + '</th>';
             });
             });
-            if (nameEn === 'watchlist' || nameEn === 'image' || nameEn === 'music') {
+            if (nameEn === 'watchlist' || nameEn === 'image' || nameEn === 'music' || nameEn === 'youtubeLive') {
                 theadStr += '<th>操作</th>';
                 theadStr += '<th>操作</th>';
             }
             }
 
 
@@ -518,6 +524,13 @@ function mainSearch(url, nameEn, slideDiv, typetype, needCustomFlag) {
         jsonData.sort = $("#apis-quiet-div-bookmark-sort").val();
         jsonData.sort = $("#apis-quiet-div-bookmark-sort").val();
         jsonData.categoryField = $("#apis-quiet-div-bookmark-categoryField").val();
         jsonData.categoryField = $("#apis-quiet-div-bookmark-categoryField").val();
         jsonData.subCategoryField = $("#apis-quiet-div-bookmark-subCategoryField").val();
         jsonData.subCategoryField = $("#apis-quiet-div-bookmark-subCategoryField").val();
+    } else if (nameEn === 'youtubeLive') {
+        jsonData.pageNo = $("#apis-quiet-div-youtubeLive-pageNo").val();
+        jsonData.pageSize = $("#apis-quiet-div-youtubeLive-pageSize").val();
+        jsonData.keyword = $("#apis-quiet-div-youtubeLive-keyword").val();
+        jsonData.sortField = $("#apis-quiet-div-youtubeLive-sortField").val();
+        jsonData.sort = $("#apis-quiet-div-youtubeLive-sort").val();
+        jsonData.publishTimeField = $("#apis-quiet-div-youtubeLive-publishTimeField").val();
     }
     }
 
 
     $.ajax({
     $.ajax({
@@ -534,7 +547,7 @@ function mainSearch(url, nameEn, slideDiv, typetype, needCustomFlag) {
                     return;
                     return;
                 }
                 }
 
 
-                if (nameEn === 'orderHistoryProductType' || nameEn === 'traderList' || nameEn === 'watchlist' || nameEn === 'image' || nameEn === 'cmcmap' || nameEn === 'music' || nameEn === 'currentHolding' || nameEn === 'bookmark') {
+                if (nameEn === 'orderHistoryProductType' || nameEn === 'traderList' || nameEn === 'watchlist' || nameEn === 'image' || nameEn === 'cmcmap' || nameEn === 'music' || nameEn === 'currentHolding' || nameEn === 'bookmark' || nameEn === 'youtubeLive') {
                     $("#apis-quiet-div-" + nameEn).find("input[id$=pages]").val(data.data.pages);
                     $("#apis-quiet-div-" + nameEn).find("input[id$=pages]").val(data.data.pages);
                     $('#' + slideDiv).find("span.contentSPAN").html(data.data.total);
                     $('#' + slideDiv).find("span.contentSPAN").html(data.data.total);
                     data = data.data.list;
                     data = data.data.list;
@@ -572,7 +585,9 @@ function mainSearch(url, nameEn, slideDiv, typetype, needCustomFlag) {
 
 
                         if (nameEn === 'currentHolding') {
                         if (nameEn === 'currentHolding') {
                             objContent = objContent != null ? objContent : '--';
                             objContent = objContent != null ? objContent : '--';
-                        }else if (nameEn === 'bookmark') {
+                        } else if (nameEn === 'bookmark') {
+                            objContent = objContent != null ? objContent : '--';
+                        } else if (nameEn === 'youtubeLive') {
                             objContent = objContent != null ? objContent : '--';
                             objContent = objContent != null ? objContent : '--';
                         }
                         }
 
 
@@ -596,6 +611,10 @@ function mainSearch(url, nameEn, slideDiv, typetype, needCustomFlag) {
                         str += '<button class="apis-quiet-div-music-update" operationType="update" symbolName="' + dataDetail.id + '">编辑</button>';
                         str += '<button class="apis-quiet-div-music-update" operationType="update" symbolName="' + dataDetail.id + '">编辑</button>';
                         str += '<button class="apis-quiet-div-music-delete" operationType="delete" symbolName="' + dataDetail.id + '">删除</button>';
                         str += '<button class="apis-quiet-div-music-delete" operationType="delete" symbolName="' + dataDetail.id + '">删除</button>';
                         str += '</td>';
                         str += '</td>';
+                    } else if (nameEn === 'youtubeLive') {
+                        str += '<td style="padding: 0px 10px 0px 10px;">';
+                        str += '<button class="apis-quiet-div-youtubeLive-update" operationType="update" symbolName="' + dataDetail.id + '" symbolContent="' + dataDetail.remark + '">编辑</button>';
+                        str += '</td>';
                     }
                     }
 
 
                     str += '</tr>';
                     str += '</tr>';
@@ -613,6 +632,8 @@ function mainSearch(url, nameEn, slideDiv, typetype, needCustomFlag) {
                     // $(".apis-quiet-div-music-pause").unbind("click");
                     // $(".apis-quiet-div-music-pause").unbind("click");
                     $(".apis-quiet-div-music-detail").unbind("click");
                     $(".apis-quiet-div-music-detail").unbind("click");
                     $(".apis-quiet-div-music-update").unbind("click");
                     $(".apis-quiet-div-music-update").unbind("click");
+                }else if (nameEn === 'youtubeLive') {
+                    $(".apis-quiet-div-music-update").unbind("click");
                 }
                 }
 
 
                 $('#' + slideDiv).find(".contentTD").html(str);
                 $('#' + slideDiv).find(".contentTD").html(str);
@@ -1057,6 +1078,57 @@ function initContentEvent(nameEn) {
                 }
                 }
             });
             });
         });
         });
+    } else if (nameEn === 'youtubeLive') {
+        $(".apis-quiet-div-youtubeLive-update").click(function () {
+            if ($("#youtubeLivepreview").css("display") === 'none') {
+                $("#youtubeLivepreview").css("display", "block");
+            } else if ($("#youtubeLivepreview").css("display") === 'block') {
+                $("#youtubeLivepreview").css("display", "none");
+            }
+
+            $(".youtubeLivepreview-top-close").click(function () {
+                if ($("#youtubeLivepreview").css("display") === 'none') {
+                    $("#youtubeLivepreview").css("display", "block");
+                } else if ($("#youtubeLivepreview").css("display") === 'block') {
+                    $("#youtubeLivepreview").css("display", "none");
+                }
+                $(this).unbind("click");
+                $(".youtubeLivepreview-top-submit").unbind("click");
+            });
+            $(".youtubeLivepreview-top-submit").click(function () {
+                $.ajax({
+                    url: "coinYoutube/liveChapterUpdate", //请求的url地址
+                    dataType: "json", //返回格式为json
+                    data: {"id": $(".youtubeLivepreview-content").find(".youtubeLivepreview-symbol").val(), "remark": $(".youtubeLivepreview-content").find("textarea").val()}, //参数值
+                    type: "post", //请求方式
+                    async: false, //请求是否异步,默认为异步,这也是ajax重要特性
+                    success: function (data) {
+                        //请求成功时处理
+                        if (data != null && $.trim(data) != "" && data.success) {
+                            $(".youtubeLivepreview-top-close").click();
+                            $(".apis-quiet-div-button2").click();
+                        } else {
+                            console.log("youtubeLivepreview-top-submit success error," + data);
+                        }
+                    },
+                    beforeSend: function () {
+                    },
+                    complete: function () {
+                    },
+                    error: function (data) {
+                        //请求出错处理
+                        console.log("youtubeLivepreview-top-submit error," + data);
+                    }
+                });
+            });
+
+            $(".youtubeLivepreview-top-submit").css("display", "block");
+            var symbolName = $(this).attr("symbolName");
+            var symbolContent = $(this).attr("symbolContent");
+            var update4Text = '<textarea rows="4" cols="50" style="background: antiquewhite;width: 100%;height: 100%;">' + symbolContent + '</textarea>';
+            update4Text += '<input type="hidden" class="youtubeLivepreview-symbol" value="' + symbolName + '"/>';
+            $(".youtubeLivepreview-content").html(update4Text);
+        });
     }
     }
 
 
     if (nameEn === 'orderHistoryProductType' || nameEn === 'traderList' || nameEn === 'watchlist' || nameEn === 'image' || nameEn === 'cmcmap') {
     if (nameEn === 'orderHistoryProductType' || nameEn === 'traderList' || nameEn === 'watchlist' || nameEn === 'image' || nameEn === 'cmcmap') {