'; var _rptContent = rptHeader + rptScript + rptContent + rptReport + rptTail; var agent = navigator.userAgent.toLowerCase(); if ((agent.indexOf("msie") != -1)) //IE브라우저 10이하버전 // 11버전은 else 탐 { printHtml = rptContent + rptReport; var rptWin = window.open("/common/printPop.html", "rpt", "width=" + w + ",height=" + h + ",top=" + ypos + ",left=" + xpos + ",status=yes,scrollbars=yes"); } else { var rptWin = window.open("", "rpt", "width=" + w + ",height=" + h + ",top=" + ypos + ",left=" + xpos + ",status=yes,scrollbars=yes"); rptWin.document.open(); rptWin.document.write(_rptContent); rptWin.document.close(); }}function displayMetaTag() { var metaTag = ''; var arrString = []; var listHtml = ""; if (!isEmpty(metaTag)) { arrString = metaTag.split("|"); for (var i = 0; i < arrString.length; i++) { listHtml += '
'; } $('#hashList').html(listHtml); }}// ------------------------------------------------var modArrImg = [];var modBxObj = [];var searchTemp = '';function fnModSetContentsView(tagNm, tagType, TagKey) { modArrImg.push({"TAG_ID": tagNm, "TAG_LIST": null}); switch (tagType) { case "VIDEO": { modGetVideo(tagNm, TagKey); } break; case "VOD": { modGetVod(tagNm, TagKey); } break; case "NEWSVIDEO": { modGetNewsVideo(tagNm, TagKey); } break; }};function modGetNewsVideo(tagNm, TagKey) { var tagArr = []; tagArr = TagKey.split("_"); var ncd = tagArr[0]; var mediaSeq = tagArr[1]; var url = application.rootUrlPrefix + '/api/getNewsInfo'; var param = { newsCode: ncd }; postAjax(url, param, function (result, status) { modNewsVideoDisplay(result, tagNm, mediaSeq); });};function modNewsVideoDisplay(data, tagNm, mediaSeq) { var listTag = null; var list;if (data && data.data) {list = data.data;} var thumbnailImageUrl = ""; var caption = ""; var srtUrl = ""; var vodCaption = ""; var dutyYN = ""; var vodBlockingYn = ""; var vodTypeArr = []; var vodCheck = false; if (list && list.vods && !isEmpty(list.vods)) { var lowVodUrl = ""; var highVodUrl = ""; for (var i = 0; i < list.vods.length; i++) { var temp = list.vods[i]; if (temp.mediasetSeq == mediaSeq) { vodTypeArr.push(temp.vodType); thumbnailImageUrl = temp.thumbnailImageUrl; caption = temp.caption; srtUrl = temp.subtitleUrl; vodCaption = temp.caption; dutyYN = temp.dutyYn; vodBlockingYn = temp.vodBlockingYn; if (temp.vodType == 'D') lowVodUrl = temp.vodUrl; else if (temp.vodType == 'G') highVodUrl = temp.vodUrl; else if (temp.vodType == 'K') highVodUrl = temp.vodUrl; } } vodTypeArr.sort(); if (lowVodUrl == highVodUrl || highVodUrl == "" || lowVodUrl == "") { vodCheck = true; } } listTag = modGetTagList(tagNm); listTag.TAG_LIST = { 'NEWS_CODE': list && list.newsCode ? list.newsCode : "", 'MEDIASET_SEQ': mediaSeq, 'VOD_TYPE': vodTypeArr, 'IMG_URL': thumbnailImageUrl, 'NEWS_TITLE': list && list.newsTitle ? list.newsTitle : "", 'srtUrl': srtUrl, 'dutyYn': dutyYN, 'vodBlockingYn': vodBlockingYn }; var k = $("#vod_template").clone(); k.removeAttr('id'); k.css('display', 'block'); k.find('.player-wrap .multi_player').attr('id', 'player_' + tagNm); k.find('.player-wrap .multi_player_image').attr('id', 'thumbnail_player_' + tagNm); var playerInitialValue = { newsCode: "8064696", playerId: 'player_' + tagNm, imgUrl: application.rootUrlPrefix + thumbnailImageUrl, lowVodUrl: lowVodUrl, highVodUrl: highVodUrl, caption: caption } $(".view-article #" + tagNm).html(k); var originalWidth = 912; var originalHeight = 513; $('#player_' + tagNm).css("max-height", "0"); // 동영상 관련 하단 설명 $('#player_' + tagNm).closest('.player-wrap').next('.player-caption').text(caption); var $thumbnail = $('#thumbnail_player_' + tagNm); var $img = $thumbnail.find("img"); $img.css("width", originalWidth); $img.css("height", originalHeight); var $playBtn = $thumbnail.find(".play-button"); $img.attr("src", application.rootUrlPrefix + thumbnailImageUrl); $thumbnail.show(); $playBtn.off("click").on("click", function (e) { $thumbnail.hide(); $('#player_' + tagNm).css("max-height", originalHeight); new _KbsPlayer(playerInitialValue); });};function modGetTagList(tagNm) { for (var i = 0; i < modArrImg.length; i++) { if (modArrImg[i].TAG_ID == tagNm) { listTag = modArrImg[i]; break; } } return listTag;};//비디오function modGetVideo(tagNm, TagKey) { var url = application.rootUrlPrefix + '/api/getNewsInfo'; var param = { newsCode: TagKey, }; postAjax(url, param, function (result, status) { modVideoDisplay(result, tagNm); });};function modVideoDisplay(data, tagNm) { var listTag = null; var list = data.data; var length = 0; var imgUrl = ""; if (!isEmpty(list.images)) { imgUrl = list.images[0].imgUrl; } else { imgUrl = application.vodDefaultImage; } var lowVodUrl = ""; var highVodUrl = ""; if (list && list.vods && !isEmpty(list.vods)) { for (var i = 0; i < list.vods.length; i++) { var temp = list.vods[i]; if (temp.vodType == 'D') lowVodUrl = "|N|N|N|" + temp.vodUrl; else if (temp.vodType == 'K') highVodUrl = "|N|N|N|" + temp.vodUrl; } } listTag = modGetTagList(tagNm); listTag.TAG_LIST = { 'NEWS_CODE': list && list.newsCode ? list.newsCode : "", 'LOW_VOD_URL': lowVodUrl, 'HIGH_VOD_URL': highVodUrl, 'IMG_URL': imgUrl, 'NEWS_TITLE': list && list.newsTitle ? list.newsTitle : "" }; var k = $("
동영상영역 시작
동영상영역 끝
동영상설명
"); k.find(".view").attr('id', "player_" + tagNm); k.find("img").attr('id', "img_" + tagNm); if (isEmpty(imgUrl)) { k.find("img").attr('src', application.vodDefaultImage); } else { k.find("img").attr('src', application.imagePath + imgUrl); } k.find("img").attr('alt', list.newsTitle); k.find("button").attr('onClick', "modPlayVideo( \'" + tagNm + "\' );"); k.find("em").text(list.newsTitle); $("#cont_newstext #" + tagNm).html(k); var l = $("
"); if (isEmpty(imgUrl)) { l.find("img").attr('src', application.vodDefaultImage); } else { l.find("img").attr('src', application.imagePath + imgUrl); } l.find("img").attr('alt', newsTitle); $("#mailHtmlContents #" + tagNm).html(l);};function modPlayVideo(tagNm) { var listTag = modGetTagList(tagNm); var list = listTag.TAG_LIST; var vodUrl; var vodQualityType = "" + getCookie("vod_quality_type"); if (vodQualityType == "low") { vodUrl = getKBSHlsVodUrl(list.LOW_VOD_URL); } else { vodUrl = getKBSHlsVodUrl(list.HIGH_VOD_URL); } if (isEmpty(vodUrl)) return; var image = list.IMG_URL; if (list.srtUrl != "" && list.srtUrl != 'undefined' && list.srtUrl != undefined) { var vodParam = { playlist: [{ image: image, file: vodUrl, tracks: [{file: list.srtUrl, "default": "false"}] }], skin: 'kbsvod', autostart: "true", //자동시작 height: 422, width: 750, vodPlayListInfo: [{newscode: list.NEWS_CODE}] }; } else { var vodParam = { playlist: [{ image: image, file: vodUrl }], skin: 'kbsvod', autostart: "true", //자동시작 height: 422, width: 750, vodPlayListInfo: [{newscode: list.NEWS_CODE}] }; } jwPlayerPlayNew(vodParam, 'player_' + tagNm); //동영상 재생 if (list.srtUrl != "" && list.srtUrl != 'undefined' && list.srtUrl != undefined) { setTimeout(function () { $("#player_" + tagNm + " .jw-icon-cc").show(); }, 1000); }};function modGetVod(tagNm, TagKey) { var listTag = null; var arr_key = TagKey.split("|"); var loopCnt = arr_key.length; if (loopCnt < 3) return false; var vodUrl = ""; var imgUrl = ""; var newsTitle = ""; for (var i = 0; i < loopCnt; i++) { if (i == (loopCnt - 1)) { newsTitle = arr_key[i]; } else if (i == (loopCnt - 2)) { imgUrl = arr_key[i]; } else { if (isEmpty(vodUrl)) { vodUrl = arr_key[i]; } else { vodUrl += "|" + arr_key[i]; } } } if (vodUrl.indexOf('|') == -1) { vodUrl = "|N|N|N|" + vodUrl; } else { vodUrl = "|" + vodUrl; } listTag = modGetTagList(tagNm); listTag.TAG_LIST = {'VOD_URL': vodUrl, 'IMG_URL': imgUrl, 'NEWS_TITLE': newsTitle}; var k = $("
동영상영역 시작
동영상영역 끝
동영상설명
"); k.find(".view").attr('id', "player_" + tagNm); k.find("img").attr('id', "img_" + tagNm); if (isEmpty(imgUrl)) { k.find("img").attr('src', application.vodDefaultImage); } else { k.find("img").attr('src', application.imagePath + imgUrl); } k.find("img").attr('alt', newsTitle); k.find("button").attr('onClick', "modPlayVod( \'" + tagNm + "\' );"); if (imgUrl.indexOf('/data/fckeditor/vod/') > -1) { k.find("em").text(newsTitle); } else { k.find("em").remove(); } $("#cont_newstext #" + tagNm).html(k); var l = $("
"); if (isEmpty(imgUrl)) { l.find("img").attr('src', application.vodDefaultImage); } else { l.find("img").attr('src', application.imagePath + imgUrl); } l.find("img").attr('alt', newsTitle); $("#mailHtmlContents #" + tagNm).html(l);};function modPlayVod(tagNm) { var listTag = modGetTagList(tagNm); var list = listTag.TAG_LIST; var vodUrl = getKBSHlsVodUrl(list.VOD_URL); if (isEmpty(vodUrl)) return; var image = ""; if (isEmpty(list.IMG_URL)) { image = application.vodDefaultImage; } else { image = list.IMG_URL; } var vodParam = { playlist: [{ image: image, file: vodUrl }], skin: 'kbsvod', autostart: "true", //자동시작 height: 422, width: 750 }; jwPlayerPlayNew(vodParam, 'player_' + tagNm); //동영상 재생};function modPlayNewsVideo(tagNm) { var listTag = modGetTagList(tagNm); var list = listTag.TAG_LIST; var vodUrl; if (list.dutyYN == 'Y') { popAlert('I', '저작권 관련 서비스 사용이 불가합니다.'); return; } if (list.vodBlockingYn == 'Y') { var blocking = ''; var url = application.rootUrlPrefix + '/api/getIpInfo'; var param = {}; postAjax(url, param, function (result, status) { if (!isEmpty(result.isAbroadIp)) { blocking = data.isAbroadIp; //해외 IP 확인 } }, function (result, status) { blocking = 'N'; }); if ("N" == blocking) { popAlert('I', '저작권 관련 서비스 사용이 불가합니다.'); return; } } var vodQualityType = "" + getCookie("vod_quality_type"); var lowType = list.VOD_TYPE[0]; var highType = list.VOD_TYPE[list.VOD_TYPE.length - 1]; if (vodQualityType == "low") { vodUrl = getNewsVodOneTimeUrl(list.NEWS_CODE, lowType, list.MEDIASET_SEQ); } else { vodUrl = getNewsVodOneTimeUrl(list.NEWS_CODE, highType, list.MEDIASET_SEQ); } if (isEmpty(vodUrl)) return; var image = list.IMG_URL; if (list.srtUrl != "" && list.srtUrl != 'undefined' && list.srtUrl != undefined) { var vodParam = { playlist: [{ image: image, file: vodUrl, tracks: [{file: list.srtUrl, "default": "false"}] }], skin: 'kbsvod', autostart: "true", //자동시작 height: 422, width: 750, vodPlayListInfo: [{newscode: list.NEWS_CODE}] }; } else { var vodParam = { playlist: [{ image: image, file: vodUrl }], skin: 'kbsvod', autostart: "true", //자동시작 height: 422, width: 750, vodPlayListInfo: [{newscode: list.NEWS_CODE}] }; } jwPlayerPlayNew(vodParam, 'player_' + tagNm); //동영상 재생 if (list.srtUrl != "" && list.srtUrl != 'undefined' && list.srtUrl != undefined) { setTimeout(function () { $("#player_" + tagNm + " .jw-icon-cc").show(); }, 1000); }};function getNewsVodOneTimeUrl(ncd, vodType, mediaseq) { var url = application.rootUrlPrefix + '/api/getNewsVodOneTimeUrl'; var param = { mediasetSeq: mediaseq, newsCode: ncd, vodType: vodType }; postAjax(url, param, function (result, status) { if (result.success) { streamUrl = data.data.streamUrl; } else { streamUrl = null; alert(result.message); } }, function (result, status) { streamUrl = null; popAlert('E', 'VOD Url 정보를 가지고 오는데 실패하였습니다. >> [' + error + ']'); }); return streamUrl;}function setNextNewsVod() { var url = application.rootUrlPrefix + '/api/getPreNextNews'; var param = { newsCode: newsCode, }; postAjax(url, param, function (result, status) { var prevNextNews = result.data; if (prevNextNews == null || prevNextNews.nextNews == null) { return; } var nextNews = prevNextNews.nextNews; $('#preNewsDiv').show(); $('#nextNewsDiv').show(); $('#nextNewsUrl').attr('href', '/news/view.do?ncd=' + nextNews.newsCode); $('#nextNewsImg').attr('src', nextNews.imgUrl); $('#nextNewsTitle').html(nextNews.newsTitle); });}function setKeyword() { var keyword = '이태원 참사|규명 조사|특조위 오늘|특별법 제정|발생 구역' if (keyword) { var keywordList = keyword.split('|'); for (var i = 0; i < keywordList.length; i++) { var $li = $('.hashtag-links-wrapper ul li').first().clone(); $li.find('a').html("#" + keywordList[i]).attr('href', "/news/pc/search/search.do?query=" + decodeHtmlEntities(keywordList[i])); $('.hashtag-links-wrapper ul').append($li); } $('.hashtag-links-wrapper ul li').first().remove(); }}function decodeHtmlEntities(input) { var doc = new DOMParser().parseFromString(input, "text/html"); return doc.documentElement.textContent;}function newsContentsDecorate() { function anchorProperties(iconName) { return { section_color: "#4664e6", div_color: "#f7fbff", div_background: "rgb(18 18 55 / 4%)", font_color: "#121237", icon_name: iconName, class: "badge", parentsClass: "anchor-text" }; } function reporterProperties(iconName) { return { section_color: "#db9655", div_color: "#fefcfb", div_background: "rgb(0 128 204 / 4%)", font_color: "#0080CC", icon_name: iconName, class: "badge", parentsClass: "report-text" }; } var section_map = { "[앵커]": anchorProperties("앵커"), "<앵커 멘트>": anchorProperties("앵커"), "[질문]": anchorProperties("질문"), "⊙인터뷰:": anchorProperties("인터뷰"), "[기자]": reporterProperties("기자"), "⊙기자:": reporterProperties("기자"), "[리포트]": reporterProperties("리포트"), "<리포트>": reporterProperties("리포트"), "[답변]": reporterProperties("답변") }; // split var list = [{section: "전체", contents: $("#cont_newstext").html()}]; for (var s in section_map) { list = newsContentsSplitByWord(list, s); } // decorate var decorated_html;if (list[0] && list[0].contents) {decorated_html = list[0].contents;} for (var a = 1; a < list.length; a++) { var obj = list[a]; var map = section_map[obj.section]; decorated_html += '
'; decorated_html += '
'; decorated_html += '' + map.icon_name + ''; decorated_html += '
' + obj.contents.replace(/^\s*
/, '') + '
'; decorated_html += '
'; decorated_html += '
'; } $("#cont_newstext").html(decorated_html);}function newsContentsSplitByWord(list, word) { var ret = []; for (var a = 0; a < list.length; a++) { var subList = []; if (list[a] && list[a].contents) { subList = list[a].contents.split(word); } for (var b = 0; b < subList.length; b++) { if (b == 0) { ret.push({section: list[a].section, contents: subList[b]}); continue; } ret.push({section: word, contents: subList[b]}); } } return ret;}
뉴스 12 이태원 참사 2주기
“지연된 만큼 책무 다할 것”…이태원참사 특조위 첫발
입력 2024.09.23 (12:06) 수정 2024.09.23 (21:39)
읽어주기 기능은 크롬기반의
브라우저에서만 사용하실 수 있습니다.
`; $(`#${playerId}`).find(".jw-display-controls.jw-reset").append(HTML); const $forwardButton = $(`#${playerId}`).find(".jw-icon-forward"); $forwardButton.on("click", ()=>{ self.moveForward(); }); } // 볼륨 조절 시 볼륨 값 표시 영역 세팅 this.preRenderVolumeValueDisplay = function () { const playerId = self.settings.playerId; const HTML = `
`; $(`#${playerId}`).append(HTML); } // 키보드 조작 이벤트 this.preRenderKeyboardControl = function() { document.getElementById(self.settings.playerId).addEventListener('keydown', function (e) { const playerId = self.settings.playerId; const state = jwplayer(playerId).getState(); if (e.keyCode == 37) { // ← self.moveBackward(); e.preventDefault(); } else if (e.keyCode == 39) { // → e.preventDefault(); if (state != 'complete') { self.moveForward(); } } else if (e.keyCode == 38) { // ↑ self.soundUp(); e.preventDefault(); } else if (e.keyCode == 40) { // ↓ self.soundDown(); e.preventDefault(); } else if (e.keyCode == 32) { // spaceBar self.pause(); e.preventDefault(); } else if (e.keyCode == 70) { // f self.fullscreen(); e.preventDefault(); } else if (e.keyCode == 77) { // m self.mute(); e.preventDefault(); } }); } // jwplayer에 키보드 컨트롤 안내창 삽입 this.preRenderKeyControlInfo = function () { const playerId = self.settings.playerId; const HTML = `
`; $(`#${playerId}`).after(HTML); const $playerWrap = $(`#${playerId}`).parents('.player-wrap'); const $openKeyinfoButton = $playerWrap.find('.button-keyinfo'); const $closeKeyinfoButton = $playerWrap.find('.close-keyinfo'); const $keyinfoBox = $playerWrap.find(".keyinfo-box"); $openKeyinfoButton.on("click", () => $keyinfoBox.toggle()); $closeKeyinfoButton.on("click", () => $keyinfoBox.hide()); } // 스크롤 내렸을 때 동영상 띄우기 (pip mode) this.preRenderFloatingVideo = function() { var videoElements = document.querySelectorAll('video'); videoElements.forEach( video => video.setAttribute('disablePictureInPicture', 'true') ); var onScrollHandler = function () { if ( scrollY > 900 ) { $('.player-wrap').addClass('fix'); $('.player-app').addClass('fix'); } else { $('.player-wrap').removeClass('fix'); $('.player-app').removeClass('fix'); } }; self.vodPlayer.on("play", () => { $(window).on("scroll", onScrollHandler); }); } // AutoStart 세팅 (autoStart가 아닐 때 섬네일 이미지 세팅) this.preRenderAutoStart = function() { const isAutoStart = localStorage.getItem('jwplayer-autoStart') == 'true'; if (isAutoStart) return; var $thumbnail = $("#element-image"); var $img = $thumbnail.find("img"); var $playBtn = $thumbnail.find(".play-button"); $img.attr("src", application.rootUrlPrefix + "/data/news/title_image/newsmp4/news12/2024/09/23/40_8064696.jpg"); $thumbnail.show(); $playBtn.off("click").on("click", function (e) { $thumbnail.hide(); self.vodPlayer.play(); }); } // preRenderErrorMessage (확인필요) this.preRenderErrorMessage = function() { if (this.vodPlayer.getPlaylist()[0].sources.length == 0) { var errMsg = $(".error-message"); errMsg.css("display", ""); errMsg.text(message); } } // 영상 재생 10초 뒤로 this.moveBackward = function () { this.moveSeek(-10) } // 영상 재생 10초 앞으로 this.moveForward = function () { this.moveSeek(10); } // 사운드 5포인트 크게 this.soundUp = function () { const playerId = self.settings.playerId; const volume = parseInt(self.vodPlayer.getVolume()); this.moveVolume(5); $(`#${playerId}`).find(".jw-animation.ani-volume").text(`${volume}%`); $(`#${playerId}`).find(".jw-animation.ani-volume").stop(true, true).fadeIn().delay(300).fadeOut(); } // 사운드 5포인트 작게 this.soundDown = function () { const playerId = self.settings.playerId; const volume = parseInt(self.vodPlayer.getVolume()); this.moveVolume(-5); $(`#${playerId}`).find(".jw-animation.ani-volume").text(`${volume}%`); $(`#${playerId}`).find(".jw-animation.ani-volume").stop(true, true).fadeIn().delay(300).fadeOut(); } // 재생 영상 앞으로 뒤로 이동시킴 this.moveSeek = function (sec) { var moveTo = this.vodPlayer.getPosition() + sec; if (moveTo < 0) { moveTo = 0 } else if (moveTo > this.vodPlayer.getDuration()) { moveTo = this.vodPlayer.getDuration() } this.vodPlayer.seek(moveTo) } // 사운드 볼륨을 크게 작게 함 this.moveVolume = function (percent) { var volume = this.vodPlayer.getVolume() + percent if (volume < 0) { volume = 0 } else if (volume > 100) { volume = 100 } this.vodPlayer.setVolume(volume) } // 영상 일시 정지하거나 다시 재생시킴 this.pause = function () { const state = this.vodPlayer.getState(); if (state == 'playing') { this.vodPlayer.pause() } else if (state == 'paused' || state == 'complete') { this.vodPlayer.play() } } // 영상 풀스크린으로 보이게 this.fullscreen = function () { if (this.vodPlayer.getFullscreen()) { this.vodPlayer.setFullscreen(false) } else { this.vodPlayer.setFullscreen(true) } } // 음소거 this.mute = function () { if (jwplayer().getMute()) { jwplayer().setMute(false); } else { jwplayer().setMute(true); } } // 자막 보이게 안 보이게 토글 기능 this.toggleCaption = function () { if( self.vodPlayer.getCurrentCaptions() == 0 ) { setCaptionsOn(self.vodPlayer); } else { setCaptionsOff(self.vodPlayer); } } // 영상 자동 재생 토글 toggleAutoStart this.toggleAutoStart = function () { self.settings.isAutoPlay = !self.settings.isAutoPlay; var $autoPlay = $(".jw-button-autostart"); $autoPlay.toggleClass('on'); if ($autoPlay.hasClass('on')) { localStorage.setItem('jwplayer-autoStart', 'true'); } else { localStorage.setItem('jwplayer-autoStart', 'false'); } } // 동영상 퍼가기 this.embedVideo = function () { var vod = ''; if (hiVod) { vod = hiVod; } else { vod = lowVod; } var embedVideoUrl = application.rootUrlPrefix + '/news/pc/view/embedVideo.do?vodUrl=' + vod + '&imgUrl=' + self.settings.imgUrl + '&captionYn=' + captionYn; var embedUrl = '<iframe width="100%" height="100%" src="' + embedVideoUrl + '" ' + 'title="video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; ' + 'encrypted-media; gyroscope; web-share" allowfullscreen></iframe>'; $('.video-embed-popup .embed-text').html(embedUrl); $('.video-embed-popup').addClass("on"); $('.dim').addClass("on"); $('.body').addClass("on"); $('.header-nav-wrapper').addClass("index-change"); } var defaults = { playerWidth: 912, playerHeight: 513, isShortcuts: false, isAutoPlay: false, isCaption: true, vodPlayType: "vod_play_type", mediaFile: [], }; // jwplayer 기본 설정값 // 함수 arguments와 defaults 값을 가져와 settings에 기본 설정함 this.settings = (arguments[0] && typeof arguments[0] == "object") ? extendDefaults(defaults, arguments[0]) : defaults; var lowVod = "/newsmp4/news12/2024/09/23/500k/40_8064696.mp4"; var hiVod = "/newsmp4/news12/2024/09/23/1500k/40_8064696.mp4"; var captionYn = isEmptyStr("Y", 'N'); if (lowVod && lowVod != hiVod) { var cdnYn = 'N', duty = 'N', blockingYn = 'N'; if (lowVod.indexOf('|') == 0) { var vodInfos = lowVod.split('|'); duty = vodInfos[1]; cdnYn = vodInfos[2]; blockingYn = vodInfos[3]; lowVod = vodInfos[4]; } cdnYn = 'Y';//무조건 cdn으로 실행 if (duty.indexOf('^') >= 0) { var dutyInfos = duty.split('^'); dutyYn = dutyInfos[0]; if (dutyYn == 'Y') { duty_code = dutyInfos[1]; if (duty_code) { var dutyMsg = ''; $.ajax({ url: application.rootUrlPrefix + '/news/getVodDutyCodeMsg.do', type: "POST", async: false, dataType: 'json', data: { dutyCode: duty_code }, success: function (data, status) { if (data.dutyMsg && data.dutyMsg.resultcode == 1) { dutyMsg = data.dutyMsg.duty_msg; } else { dutyMsg = '저작권 관련 서비스 사용이 불가합니다.'; } }, error: function (request, status, error) { dutyMsg = '저작권 관련 서비스 사용이 불가합니다.'; } }); message = dutyMsg; return null; } } } else { dutyYn = duty; } if (dutyYn == 'Y') { message = '저작권 관련 서비스 사용이 불가합니다.'; return null; } if ("Y" == blockingYn) { var blocking = ''; $.ajax({ url: application.rootUrlPrefix + '/api/getIpInfo', type: "POST", async: false, dataType: 'json', success: function (data, status) { if (data.isAbroadIp) { blocking = data.isAbroadIp; //해외 IP 확인 } }, error: function (request, status, error) { blocking = 'N'; } }); if ("N" == blocking) { message = '저작권 관련 서비스 사용이 불가합니다.'; return; } } // VOD URL 조회 if (!lowVod) { message = 'VOD URL 정보가 없습니다.'; return null; } if (lowVod.indexOf("/") == 0) { lowVod = lowVod.substr(1); } var lowVodUrl = ""; var hiVodUrl = ""; $.ajax({ url: application.rootUrlPrefix + '/api/getHlsNewsVodUrl', type: "POST", dataType: 'json', data: { vodUrl: lowVod }, success: function (data, status) { if (data && data.success) { lowVodUrl = data.data.streamUrl; $.ajax({ url: application.rootUrlPrefix + '/api/getHlsNewsVodUrl', type: "POST", dataType: 'json', data: { vodUrl: hiVod }, success: function (data, status) { if (data && data.success) { hiVodUrl = data.data.streamUrl; self.SD = { file: lowVodUrl, label: '표준화질' } self.HD = { file: hiVodUrl, label: '고화질' } self.init(); } else { hiVodUrl = null; if (data && data.message) { message = data.message; } else { message = 'VOD Url 정보를 가지고 오는데 실패하였습니다.'; } self.init(); } }, error: function (request, status, error) { hiVodUrl = null; message = 'VOD Url 정보를 가지고 오는데 실패하였습니다. >> [' + error + ']'; self.init(); } }); } else { lowVodUrl = null; if (data && data.message) { message = data.message; } else { message = 'VOD Url 정보를 가지고 오는데 실패하였습니다.'; } const playerId = self.settings.playerId; displayErrorMessage(playerId, message); self.init(); } }, error: function (request, status, error) { lowVodUrl = null; message = 'VOD Url 정보를 가지고 오는데 실패하였습니다. >> [' + error + ']'; self.init(); } }); } else if (lowVod) { var cdnYn = 'N', duty = 'N', blockingYn = 'N'; if (lowVod.indexOf('|') == 0) { var vodInfos = lowVod.split('|'); duty = vodInfos[1]; cdnYn = vodInfos[2]; blockingYn = vodInfos[3]; lowVod = vodInfos[4]; } cdnYn = 'Y';//무조건 cdn으로 실행 if (duty.indexOf('^') >= 0) { var dutyInfos = duty.split('^'); dutyYn = dutyInfos[0]; if (dutyYn == 'Y') { duty_code = dutyInfos[1]; if (duty_code) { var dutyMsg = ''; $.ajax({ url: application.rootUrlPrefix + '/news/getVodDutyCodeMsg.do', type: "POST", async: false, dataType: 'json', data: { dutyCode: duty_code }, success: function (data, status) { if (data.dutyMsg && data.dutyMsg.resultcode == 1) { dutyMsg = data.dutyMsg.duty_msg; } else { dutyMsg = '저작권 관련 서비스 사용이 불가합니다.'; } }, error: function (request, status, error) { dutyMsg = '저작권 관련 서비스 사용이 불가합니다.'; } }); message = dutyMsg; return null; } } } else { dutyYn = duty; } if (dutyYn == 'Y') { message = '저작권 관련 서비스 사용이 불가합니다.'; return null; } if ("Y" == blockingYn) { var blocking = ''; $.ajax({ url: application.rootUrlPrefix + '/api/getIpInfo', type: "POST", async: false, dataType: 'json', success: function (data, status) { if (data.isAbroadIp) { blocking = data.isAbroadIp; //해외 IP 확인 } }, error: function (request, status, error) { blocking = 'N'; } }); if ("N" == blocking) { message = '저작권 관련 서비스 사용이 불가합니다.'; return; } } // VOD URL 조회 if (!lowVod) { message = 'VOD URL 정보가 없습니다.'; return null; } if (lowVod.indexOf("/") == 0) { lowVod = lowVod.substr(1); } var lowVodUrl = ""; var hiVodUrl = ""; $.ajax({ url: application.rootUrlPrefix + '/api/getHlsNewsVodUrl', type: "POST", dataType: 'json', data: { vodUrl: lowVod }, success: function (data, status) { if (data && data.success) { lowVodUrl = data.data.streamUrl; self.SD = { file: lowVodUrl, label: '표준화질' } self.init(); } else { lowVodUrl = null; if (data && data.message) { message = data.message; } else { message = 'VOD Url 정보를 가지고 오는데 실패하였습니다.'; } self.init(); } }, error: function (request, status, error) { lowVodUrl = null; message = 'VOD Url 정보를 가지고 오는데 실패하였습니다. >> [' + error + ']'; self.init(); } }); }}/** * 자체영상 (기사 내 영상 여러개, #contentsTag_0, #contentsTag_1 ...) * pip mode 미지원 * fnModSetContentsView 함수에서 tagType(VIDEO, VOD, NEWSVIDEO)에 따라 분류되어 NEWSVIDEO 일 때만 실행 됨 */function _KbsPlayer() { // _KbsPlayer() 에서는 이 부분이 위에 있어야 함 var defaults = { playerWidth: 912, playerHeight: 513, isShortcuts: false, isAutoPlay: false, isCaption: true, vodPlayType: "vod_play_type", mediaFile: [], lowVodUrl: '', highVodUrl: '' }; // jwplayer 기본 설정값 // 함수 arguments와 defaults 값을 가져와 settings에 기본 설정함 this.settings = (arguments[0] && typeof arguments[0] == "object") ? extendDefaults(defaults, arguments[0]) : defaults; if (this.settings.lowVodUrl) { var _lowVodUrl = getKBSHlsVodUrl(this.settings.lowVodUrl); this.SD = { file: _lowVodUrl, label: '표준화질' } } if (this.settings.lowVodUrl != this.settings.highVodUrl) { if (this.settings.highVodUrl) { var _highVodUrl = getKBSHlsVodUrl(this.settings.highVodUrl); this.HD = { file: _highVodUrl, label: '고화질' } } } var self = this; this.init = function () { this.build(); // jwplayer 객체 생성 // jwplayer 최초 렌더링 this.vodPlayer.on("ready", function () { // vod watch log용 변수 설정 self.vodPlayer.$state = 'Z'; self.vodPlayer.$watchTime = 0; self.vodPlayer.$watchStartTime = dayjs(); self.vodPlayer.$watchEndTime = dayjs(); self.preRenderForwardButton(); // 10초 앞으로 버튼 추가 self.preRenderVolumeValueDisplay(); // 볼륨 조절 시 볼륨 값 표시 영역 세팅 self.preRenderKeyboardControl(); // 키보드 조작 이벤트 self.preRenderKeyControlInfo(); // jwplayer에 키보드 컨트롤 안내창 삽입 // 자체 영상에서 세팅 X: 스크롤 내렸을 때 동영상 띄우기 (pip mode) // 자체 영상에서 세팅 X: AutoStart self.preRenderErrorMessage(); // error message (확인필요) }); } this.build = function () { this.vodParams = self.getVodParams(); this.vodPlayer = jwplayer(self.settings.playerId); this.vodPlayer.setup(this.vodParams); // 자동재생 세팅 (_KbsPlayer()에선 자동재생 세팅 안함) // 자막 세팅 var captionYn = isEmptyStr("Y", 'N'); if (captionYn == 'Y') { let captoinClass = (localStorage.getItem("jwplayer.captionLabel") != 'Off') ? 'jw-button-caption on' : 'jw-button-caption'; this.vodPlayer.addButton('', '자막', this.toggleCaption, 'buttonCaption', captoinClass); } this.vodPlayer.on("play", function () { const playerId = self.settings.playerId; $(`#${playerId} .vod-recommed-thumb`).remove(); // 재시작 시 추천동영상 삭제 $(`#${playerId}`).removeClass("jw-state-buffer"); // play 시 buffer 클래스 삭제 $(`#${playerId}`).focus(); // 키보드 조작을 위해 focus clearInterval(jwplayer(playerId).$interval); if(!jwplayer(playerId).$isSeeking) sendVodWatchLog(playerId); jwplayer(playerId).$interval = sendVodWatchLogInterval(playerId); }); // 맨처음 또는 재시작할 때 이벤트, play 이벤트 후 발생 this.vodPlayer.on("firstFrame", function() { // 영어자막 초기설정: playbuttonClicked이 false 일 때만 실행 (play 클릭 시 최초 1회만 실행) // 영어뉴스 일 때는 자막을 항상 켜준다. if( !playbuttonClicked ) { setNewsCaptions(self.vodPlayer); } // play 버튼 클릭 시 true로 바꿔준다. playbuttonClicked = true; }) this.vodPlayer.on("pause", function () { const playerId = self.settings.playerId; clearInterval(jwplayer(playerId).$interval); sendVodWatchLog(playerId); }); this.vodPlayer.on("complete", function () { const playerId = self.settings.playerId; clearInterval(jwplayer(playerId).$interval); sendVodWatchLog(playerId); // 추천동영상 렌더링 getRecommendPlaylist('8064696', res => { displayRecommendPlaylist(res, playerId); }); }); // 재생 바 조작 시 this.vodPlayer.on("seek", function (e) { const playerId = self.settings.playerId; jwplayer(playerId).$seekPosition = e.position; // 현재 재생 위치를 기록 clearInterval(jwplayer(playerId).$interval); let seeking = jwplayer(playerId).$isSeeking; if(seeking === undefined || seeking === false){ jwplayer(playerId).$isSeeking = true; sendVodWatchLog(playerId); } if (!jwplayer(playerId).getConfig().scrubbing) { jwplayer(playerId).$isSeeking = false } // ios safari if( isSafari() ) { setTimeout(() => { if(jwplayer(playerId).getState() == 'playing') { sendVodWatchLog(playerId); } }, 100); } }); // jwplayer 파일 버퍼링일 때 this.vodPlayer.on("buffer", function () { const playerId = self.settings.playerId; $(`#${playerId}`).addClass("jw-state-buffer"); // buffer 클래스 추가 }); } // jwplayer 파라미터 가져오기 this.getVodParams = function () { const isAutoStart = false; // 자체영상에서는 무조건 false const setVolume = localStorage.getItem('jwplayer.volume') ? parseInt(localStorage.getItem('jwplayer.volume')) : 50; var result = { playlist: [{ image: self.settings.imgUrl, sources: [], }], // 자막 style captions: { state: true, color: '#FFFFFF', fontFamily: '"Dotum", "돋움", "Gulim", "굴림"', fontSize: 18, backgroundOpacity: 75, edgeStyle: "uniform" }, // 공유하기 sharing: { link: window.location.href, sites: [ { src: shareFacebook, label: "페이스북" }, { src: shareTwitter, label: "트위터" }, { src: shareKakao, label: "카카오톡" }, { src: shareKakaoStory, label: "카카오스토리" }, { src: shareNaverBlog, label: "네이버블로그" }, { src: shareNaverBand, label: "네이버밴드" }, { src: this.embedVideo, // string과 핸들러 함수로도 사용 가능 label: "동영상 퍼가기" } ] }, playbackRateControls: true, // 재생 속도 컨트롤 활성화 playbackRates: [0.5, 0.8, 1, 1.2, 1.5, 1.8, 2, 3], // 재생 속도 설정 enableShortcuts: this.settings.isShortcuts, // 키보드 단축키 비활성화 autostart: isAutoStart, mute: false, volume: setVolume, aspectratio: '16:9', // 화면 비율 설정 (height 설정 무시 -> height가 없어도 됨) width: this.settings.playerWidth, height: this.settings.playerHeight, repeat: false, // 반복 재생 horizontalVolumeSlider: true, // 사운드바 가로로 controls: true, } var captionYn = isEmptyStr("Y", 'N'); if (captionYn == 'Y') { result.playlist[0].tracks = [{ file: application.rootUrlPrefix + getCaption(), kind: "captions", label: "Korean", default: true }] } if (this.settings.highVodUrl) { result.playlist[0].sources.push(this.HD); } if (this.settings.lowVodUrl) { result.playlist[0].sources.push(this.SD); } return result } // jwplayer에 10초 앞으로 이동 버튼 삽입, 클릭 이벤트 바인딩 this.preRenderForwardButton = function () { const playerId = self.settings.playerId; const HTML = `
`; $(`#${playerId}`).find(".jw-display-controls.jw-reset").append(HTML); const $forwardButton = $(`#${playerId}`).find(".jw-icon-forward"); $forwardButton.on("click", ()=>{ self.moveForward(); }); } // 볼륨 조절 시 볼륨 값 표시 영역 세팅 this.preRenderVolumeValueDisplay = function () { const playerId = self.settings.playerId; const HTML = `
`; $(`#${playerId}`).append(HTML); } // 키보드 조작 이벤트 this.preRenderKeyboardControl = function() { document.getElementById(self.settings.playerId).addEventListener('keydown', function (e) { const playerId = self.settings.playerId; const state = jwplayer(playerId).getState(); if (e.keyCode == 37) { // ← self.moveBackward(); e.preventDefault(); } else if (e.keyCode == 39) { // → e.preventDefault(); if (state != 'complete') { self.moveForward(); } } else if (e.keyCode == 38) { // ↑ self.soundUp(); e.preventDefault(); } else if (e.keyCode == 40) { // ↓ self.soundDown(); e.preventDefault(); } else if (e.keyCode == 32) { // spaceBar self.pause(); e.preventDefault(); } else if (e.keyCode == 70) { // f self.fullscreen(); e.preventDefault(); } else if (e.keyCode == 77) { // m self.mute(); e.preventDefault(); } }); } // jwplayer에 키보드 컨트롤 안내창 삽입 this.preRenderKeyControlInfo = function () { const playerId = self.settings.playerId; const HTML = `
`; $(`#${playerId}`).after(HTML); const $playerWrap = $(`#${playerId}`).parents('.player-wrap'); const $openKeyinfoButton = $playerWrap.find('.button-keyinfo'); const $closeKeyinfoButton = $playerWrap.find('.close-keyinfo'); const $keyinfoBox = $playerWrap.find(".keyinfo-box"); $openKeyinfoButton.on("click", () => $keyinfoBox.toggle()); $closeKeyinfoButton.on("click", () => $keyinfoBox.hide()); } // preRenderErrorMessage (자체 영상에서는 세팅 X) (확인필요) this.preRenderErrorMessage = function() { if (this.vodPlayer.getPlaylist()[0].sources.length == 0) { var errMsg = $(`#${self.settings.playerId}`).find(".error-message"); errMsg.css("display", ""); errMsg.text(message); } } // 영상 재생 10초 뒤로 this.moveBackward = function () { this.moveSeek(-10) } // 영상 재생 10초 앞으로 this.moveForward = function () { this.moveSeek(10); } // 사운드 5포인트 크게 this.soundUp = function () { const playerId = self.settings.playerId; const volume = parseInt(self.vodPlayer.getVolume()); this.moveVolume(5); $(`#${playerId}`).find(".jw-animation.ani-volume").text(`${volume}%`); $(`#${playerId}`).find(".jw-animation.ani-volume").stop(true, true).fadeIn().delay(300).fadeOut(); } // 사운드 5포인트 작게 this.soundDown = function () { const playerId = self.settings.playerId; const volume = parseInt(self.vodPlayer.getVolume()); this.moveVolume(-5); $(`#${playerId}`).find(".jw-animation.ani-volume").text(`${volume}%`); $(`#${playerId}`).find(".jw-animation.ani-volume").stop(true, true).fadeIn().delay(300).fadeOut(); } // 재생 영상 앞으로 뒤로 이동시킴 this.moveSeek = function (sec) { var moveTo = this.vodPlayer.getPosition() + sec if (moveTo < 0) { moveTo = 0 } else if (moveTo > this.vodPlayer.getDuration()) { moveTo = this.vodPlayer.getDuration() } this.vodPlayer.seek(moveTo) } // 사운드 볼륨을 크게 작게 함 this.moveVolume = function (percent) { var volume = this.vodPlayer.getVolume() + percent if (volume < 0) { volume = 0 } else if (volume > 100) { volume = 100 } this.vodPlayer.setVolume(volume) } // 영상 일시 정지하거나 다시 재생시킴 this.pause = function () { const state = this.vodPlayer.getState(); if (state == 'playing') { this.vodPlayer.pause() } else if (state == 'paused' || state == 'complete') { this.vodPlayer.play() } } // 영상 풀스크린으로 보이게 this.fullscreen = function () { if (this.vodPlayer.getFullscreen()) { this.vodPlayer.setFullscreen(false) } else { this.vodPlayer.setFullscreen(true) } } // 음소거 this.mute = function () { if (jwplayer().getMute()) { jwplayer().setMute(false); } else { jwplayer().setMute(true); } } // 자막 보이게 안 보이게 토글 기능 this.toggleCaption = function () { if( self.vodPlayer.getCurrentCaptions() == 0 ) { setCaptionsOn(self.vodPlayer); } else { setCaptionsOff(self.vodPlayer); } } // 영상 자동 재생 토글 toggleAutoStart this.toggleAutoStart = function () { self.settings.isAutoPlay = !self.settings.isAutoPlay; var $autoPlay = $(".jw-button-autostart"); $autoPlay.toggleClass('on'); if ($autoPlay.hasClass('on')) { localStorage.setItem('jwplayer-autoStart', 'true'); } else { localStorage.setItem('jwplayer-autoStart', 'false'); } } // 동영상 퍼가기 (iframe) this.embedVideo = function () { var vod = ''; if (self.settings.highVodUrl) { vod = self.settings.highVodUrl; } else { vod = self.settings.lowVodUrl; } var embedVideoUrl = application.rootUrlPrefix + '/news/pc/view/embedVideo.do?vodUrl=' + vod + '&imgUrl=' + self.settings.imgUrl; var embedUrl = '<iframe width="100%" height="100%" src="' + embedVideoUrl + '" ' + 'title="video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; ' + 'encrypted-media; gyroscope; web-share" allowfullscreen></iframe>'; $('.video-embed-popup .embed-text').html(embedUrl); $('.video-embed-popup').addClass("on"); $('.dim').addClass("on"); $('.body').addClass("on"); $('.header-nav-wrapper').addClass("index-change"); } // 자체영상 에서는 바로 init(); this.init(); this.vodPlayer.play();}// _KbsPlayer 에서 사용function getKBSHlsVodUrl(vodUrl) { if (!vodUrl) { message = 'VOD URL 정보가 없습니다.' return null; } var cdnYn = 'N', duty = 'N', blockingYn = 'N'; if (vodUrl.indexOf('|') == 0) { var vodInfos = vodUrl.split('|'); duty = vodInfos[1]; cdnYn = vodInfos[2]; blockingYn = vodInfos[3]; vodUrl = vodInfos[4]; } cdnYn = 'Y';//무조건 cdn으로 실행 if (duty.indexOf('^') >= 0) { var dutyInfos = duty.split('^'); dutyYn = dutyInfos[0]; if (dutyYn == 'Y') { duty_code = dutyInfos[1]; if (duty_code) { var dutyMsg = ''; $.ajax({ url: application.rootUrlPrefix + '/news/getVodDutyCodeMsg.do', type: "POST", async: false, dataType: 'json', data: { dutyCode: duty_code }, success: function (data, status) { if (data.dutyMsg && data.dutyMsg.resultcode == 1) { dutyMsg = data.dutyMsg.duty_msg; } else { dutyMsg = '저작권 관련 서비스 사용이 불가합니다.'; } }, error: function (request, status, error) { dutyMsg = '저작권 관련 서비스 사용이 불가합니다.'; } }); message = dutyMsg; return null; } } } else { dutyYn = duty; } if (dutyYn == 'Y') { message = '저작권 관련 서비스 사용이 불가합니다.'; return null; } if ("Y" == blockingYn) { var blocking = ''; $.ajax({ url: application.rootUrlPrefix + '/api/getIpInfo', type: "POST", async: false, dataType: 'json', success: function (data, status) { if (data.isAbroadIp) { blocking = data.isAbroadIp; //해외 IP 확인 } }, error: function (request, status, error) { blocking = 'N'; } }); if ("N" == blocking) { message = '저작권 관련 서비스 사용이 불가합니다.'; return; } } // VOD URL 조회 if (!vodUrl) { message = 'VOD URL 정보가 없습니다.'; return null; } if (vodUrl.indexOf("/") == 0) { vodUrl = vodUrl.substr(1); } var hlsUrl = null; if (cdnYn == 'Y') { $.ajax({ url: application.rootUrlPrefix + '/api/getHlsNewsVodUrl', type: "POST", async: false, dataType: 'json', data: { vodUrl: vodUrl }, success: function (data, status) { if (data && data.success) { hlsUrl = data.data.streamUrl; } else { hlsUrl = null; if (data && data.message) { message = data.message; } else { message = 'VOD Url 정보를 가지고 오는데 실패하였습니다.'; } } }, error: function (request, status, error) { hlsUrl = null; message = 'VOD Url 정보를 가지고 오는데 실패하였습니다. >> [' + error + ']'; } }); } return hlsUrl;}// 페이스북 공유function shareFacebook() { var shareUrl = 'https://www.facebook.com/sharer/sharer.php?u=' + encodedCurrentUrl; openPopup(shareUrl);}// 트위터 공유function shareTwitter() { var shareUrl = "https://twitter.com/intent/tweet?url=" + encodedCurrentUrl; openPopup(shareUrl);}// 카카오공유function shareKakao() { var shareDesc = document.getElementById('facebook_desc').getAttribute('content'); var shareImg = document.getElementById('facebook_img').getAttribute('content'); var mShareUrl = currentUrl; Kakao.Link.sendDefault({ objectType: "feed" , content: { title: "KBS News" // 콘텐츠의 타이틀 , description: shareDesc // 콘텐츠 상세설명 , imageUrl: shareImg // 썸네일 이미지 , link: { webUrl: currentUrl, // 모바일 카카오톡에서 사용하는 웹 링크 URL } }, buttons: [ { title: '웹으로 이동', link: { mobileWebUrl: mShareUrl, webUrl: currentUrl }, }, ] }); //sendDefualt}// 카카오스토리 공유function shareKakaoStory() { var origin = currentUrl.match(/^(https?:\/\/[^/]+)/)[1]; var shareUrl = "https://story.kakao.com/s/share?url=" + currentUrl + "&kakao_agent=sdk%2F1.43.1%20os%2Fjavascript%20sdk_type%2Fjavascript%20lang%2Fko-KR%20device%2FWin32%20origin%2F" + origin + "&app_key=d57b7eca9db04c5ccd91e4d309ce0288"; openPopup(shareUrl);}// 네이버블로그 공유function shareNaverBlog() { var shareUrl = 'http://blog.naver.com/openapi/share?url=' + encodedCurrentUrl + '&title='; openPopup(shareUrl);}// 네이버밴드 공유function shareNaverBand() { var shareUrl = "https://band.us/plugin/share?body=" + encodedCurrentUrl + "&route=" + encodedCurrentUrl; openPopup(shareUrl);}// arguments와 defaults의 property를 가져와 속성을 합치는 함수function extendDefaults(defaults, props) { var prop; for (prop in props) { if (props.hasOwnProperty(prop)) { defaults[prop] = props[prop]; } } return defaults;}var sendVodWatchLog = function (playerId) { if (typeof playerId == 'undefined') return; try { const state = jwplayer(playerId).getState(); if (jwplayer(playerId).$state != 'B') { switch (state) { case 'playing': jwplayer(playerId).$state = 'S'; // play break; case 'paused': jwplayer(playerId).$state = 'P'; // paused break; case 'complete': jwplayer(playerId).$state = 'C'; // complete break; default: jwplayer(playerId).$state = 'Z'; // etc break; } // seek if(jwplayer(playerId).$isSeeking) { jwplayer(playerId).$state = 'M' } } // watchStartTime if( jwplayer(playerId).$state == 'S' ) { jwplayer(playerId).$watchStartTime = dayjs(); } // watchEndTime jwplayer(playerId).$watchEndTime = dayjs(); let gapTime = dayjs.duration(jwplayer(playerId).$watchEndTime.diff(jwplayer(playerId).$watchStartTime)).asMilliseconds() * 0.001; // 재생시간이 늘어나지 않는 경우 ('P || M -> *') if(jwplayer(playerId).$beforeState == 'P' || jwplayer(playerId).$beforeState == 'M') { gapTime = 0; } jwplayer(playerId).$watchTime += gapTime; // param2: 선택한 영상의 총 재생시간 // param3: 선택한 영상의 재생 위치 (M 일 때는 마지막 시청위치) // param12: 선택한 영상의 mediasetSeq var param2 = Math.floor(jwplayer(playerId).getDuration()); var param3 = (jwplayer(playerId).$state == 'M') ? Math.floor(jwplayer(playerId).$seekPosition) : Math.floor(jwplayer(playerId).getPosition()); var param12 = getParam12(playerId); var sendWatchTime = Math.floor(jwplayer(playerId).$watchTime); var sendState = jwplayer(playerId).$state; // console.log('watch', 'VOD', param2, param3, param4, '', sendWatchTime, sendState, '', '', '', '', param12, param13); window._add_rte('watch', 'VOD', param2, param3, param4, '', sendWatchTime, sendState, '', '', '', '', param12, param13); // beforeState update jwplayer(playerId).$beforeState = jwplayer(playerId).$state; } catch (e) { // 새로고침 시 플레이어가 생성되기 전 발생 console.error('sendVodWatchLog : ', e.message); }};var sendVodWatchLogInterval = function (playerId) { // param2: 선택한 영상의 총 재생시간 // param12: 선택한 영상의 mediasetSeq var param2 = Math.floor(jwplayer(playerId).getDuration()); var param12 = getParam12(playerId); // setInterval var id = setInterval(function () { // param3: 선택한 영상의 재생 위치 갱신 var param3 = Math.floor(jwplayer(playerId).getPosition()); // watchtime jwplayer(playerId).$watchStartTime = dayjs(); // $watchStartTime도 함께 갱신 해준다. jwplayer(playerId).$watchEndTime = dayjs(); // $watchEndTime도 함께 갱신 해준다. jwplayer(playerId).$watchTime += (logIntervalTime/1000); var sendWatchTime = Math.floor(jwplayer(playerId).$watchTime); var sendState = jwplayer(playerId).$state; // console.log('watch', 'VOD', param2, param3, param4, '', sendWatchTime, sendState, '', '', '', '', param12, param13); window._add_rte('watch', 'VOD', param2, param3, param4, '', sendWatchTime, sendState, '', '', '', '', param12, param13); }, logIntervalTime); return id;}// param12: 선택한 영상의 mediasetSeq (영상의 순서, 1부터 시작)function getParam12(playerId) { // mediasetSeq는 playerId에서 가져올 수 있다. // 대표영상일 경우 mediasetSeq: playerId: playerElement // 자체영상일 경우 mediasetSeq: player_contentsTag_0 ~ ... (+1 해서 1부터 사용) if ( playerId.includes('player_') ) { // 자체영상 일 경우 return param12 = playerId.split('_')[2] * 1 + 1; } return 1;}// 자막 파일 가져오기function getCaption() { var captionUrl = ""; var srtUrl = ""; var lowVod = isEmptyStr("/newsmp4/news12/2024/09/23/500k/40_8064696.mp4", "/newsmp4/news12/2024/09/23/1500k/40_8064696.mp4"); var captionYn = isEmptyStr("Y", 'N'); var arrUrl = lowVod.split('|'); srtUrl = arrUrl[arrUrl.length - 1].replace('.mp4', '.srt'); if (captionYn == "Y") { captionUrl = '/data/srt/FIXED' + srtUrl } else { captionUrl = null } captionUrl = (captionUrl == null) ? "/resource/image/mobile/player/myFilevtt.vtt" : captionUrl; return captionUrl;}// 추천동영상용 데이터 가져오기function getRecommendPlaylist(param, successCallback, errorCallback) { return $.ajax({ url: application.rootUrlPrefix + '/api/getRecommendVod?newsCode=' + param, type: "POST", dataType: 'json', data: param, success: successCallback, error: errorCallback });}// 추천동영상 DOM 렌더링function displayRecommendPlaylist (res, playerId) { var data = []; if (res.data.length == 0) { return; } if (res && res.data.length > 0) { data = res.data; } var length = 4; for (var i = 0; i < length; i++) { var $thumb = $('').clone(); var $title = $(''); var $p = $('
'); $thumb.css('background-image', 'url(' + application.rootUrlPrefix + data[i].imgUrl + ')'); $thumb.addClass('recommed-' + i); $thumb.attr('href', data[i].url); var title = (data[i].title).replace(/
/g, ''); $title.css('display', 'flex'); $p.text(title); $title.append($p); $thumb.append($title); $(`#${playerId}`).append($thumb); }}// 영어뉴스일 경우 true를 반환환다.function isEngNews() { const sourceCode = "200" return (sourceCode == "172") ? true : false;}// 영어뉴스일 경우: html에 data-news-lang="en"을 추가한다.function setEngNews() { if (!isEngNews()) return; $("html").attr("data-news-lang", "en");}// 영어뉴스 자막 초기설정function setNewsCaptions(vodPlayer) { if( isEngNews() ) setCaptionsOn(vodPlayer); setCaptionsIcon(vodPlayer);}// 자막 켜기function setCaptionsOn(vodPlayer) { vodPlayer.setCurrentCaptions(1); setCaptionsIcon(vodPlayer);}// 자막 끄기function setCaptionsOff(vodPlayer) { vodPlayer.setCurrentCaptions(0); setCaptionsIcon(vodPlayer);}// 자막 켜기/끄기 아이콘function setCaptionsIcon(vodPlayer) { const currentPlayer = $(`#${vodPlayer.id}`); if( vodPlayer.getCurrentCaptions() == '0' ) { currentPlayer.find(".jw-button-caption").removeClass('on'); } else { currentPlayer.find(".jw-button-caption").addClass('on'); }}// ios safari checkfunction isSafari() { return /^((?!chrome|android).)*safari/i.test(navigator.userAgent);}// error messagefunction displayErrorMessage(playerId, message) { $(`#${playerId}`).parents(".player-app").find(".error-message").html(message).show();}
[앵커]
이태원 특별법 통과 넉 달여 만에 '이태원 참사 진상 규명과 재발 방지를 위한 특별조사위원회'가 첫발을 뗐습니다.
오늘 첫 번째 회의를 열고, 위원장을 선출하는 등 본격적인 활동을 시작했습니다.
원동희 기자입니다.
[리포트]
이태원 참사 특별조사위원회는 오늘 오전 1차 전원위원회를 열고 송기춘 전북대 법학전문대학원 교수를 위원장으로 선출했습니다.
지난 5월 이태원 참사 특별법이 국회를 통과한 지 4개월여만, 참사가 발생한 지 거의 2년이 다 돼 이뤄진 일입니다.
송 위원장은 "참사가 발생한 후 1년 반이 지나서야 특별법이 제정되는 등 출발이 지연된 만큼 더욱 철저하게 본연의 책무를 다할 것"이라고 말했습니다.
이어 참사 원인 조사, 국가기관 조치 적절성 및 책임 여부 규명, 피해 실태와 지원 대책 점검 등을 해나가겠다고 밝혔습니다.
특조위는 오늘 제정한 '진상규명 조사신청에 관한 규칙'에 따라 다음 달 2일부터 내년 6월까지 진상규명 조사 신청서를 접수합니다.
진상규명 조사 대상자는 희생자 유가족과 참사로 신체·정신·경제적 피해를 입은 이들입니다.
또 직무가 아님에도 긴급 구조·수습에 참여한 이들, 참사 발생 구역 인근에서 사업장을 운영하거나 근로활동을 하던 이들도 조사 대상에 포함됩니다.
특조위는 오늘 특조위 사무처 설립준비단 구성안도 의결했습니다.
준비단은 3개월간 특별법 시행령 제정 등 특조위 활동을 위한 준비를 맡게 됩니다.
특조위원들은 오늘 서울 종로구에 있는 '이태원 참사 기억·소통공간 별들의집'을 방문해 희생자들을 추모하고 유가족과 만날 예정입니다.
KBS 뉴스 원동희입니다.
촬영기자:김현민/영상편집:이태희
■ 제보하기
▷ 카카오톡 : 'KBS제보' 검색, 채널 추가
▷ 전화 : 02-781-1234, 4444
▷ 이메일 : kbs1234@kbs.co.kr
▷ 유튜브, 네이버, 카카오에서도 KBS뉴스를 구독해주세요!
- “지연된 만큼 책무 다할 것”…이태원참사 특조위 첫발
-
- 입력 2024-09-23 12:06:50
- 수정2024-09-23 21:39:44
[앵커]
이태원 특별법 통과 넉 달여 만에 '이태원 참사 진상 규명과 재발 방지를 위한 특별조사위원회'가 첫발을 뗐습니다.
오늘 첫 번째 회의를 열고, 위원장을 선출하는 등 본격적인 활동을 시작했습니다.
원동희 기자입니다.
[리포트]
이태원 참사 특별조사위원회는 오늘 오전 1차 전원위원회를 열고 송기춘 전북대 법학전문대학원 교수를 위원장으로 선출했습니다.
지난 5월 이태원 참사 특별법이 국회를 통과한 지 4개월여만, 참사가 발생한 지 거의 2년이 다 돼 이뤄진 일입니다.
송 위원장은 "참사가 발생한 후 1년 반이 지나서야 특별법이 제정되는 등 출발이 지연된 만큼 더욱 철저하게 본연의 책무를 다할 것"이라고 말했습니다.
이어 참사 원인 조사, 국가기관 조치 적절성 및 책임 여부 규명, 피해 실태와 지원 대책 점검 등을 해나가겠다고 밝혔습니다.
특조위는 오늘 제정한 '진상규명 조사신청에 관한 규칙'에 따라 다음 달 2일부터 내년 6월까지 진상규명 조사 신청서를 접수합니다.
진상규명 조사 대상자는 희생자 유가족과 참사로 신체·정신·경제적 피해를 입은 이들입니다.
또 직무가 아님에도 긴급 구조·수습에 참여한 이들, 참사 발생 구역 인근에서 사업장을 운영하거나 근로활동을 하던 이들도 조사 대상에 포함됩니다.
특조위는 오늘 특조위 사무처 설립준비단 구성안도 의결했습니다.
준비단은 3개월간 특별법 시행령 제정 등 특조위 활동을 위한 준비를 맡게 됩니다.
특조위원들은 오늘 서울 종로구에 있는 '이태원 참사 기억·소통공간 별들의집'을 방문해 희생자들을 추모하고 유가족과 만날 예정입니다.
KBS 뉴스 원동희입니다.
촬영기자:김현민/영상편집:이태희
-
-
원동희 기자 eastshine@kbs.co.kr
원동희 기자의 기사 모음
-
원동희 기자
이 기사가 좋으셨다면
-
좋아요
-
응원해요
-
후속 원해요
이슈
이태원 참사 2주기
더보기
KBS는 올바른 여론 형성을 위해 자유로운 댓글 작성을 지지합니다.
다만 해당 기사는 댓글을 통해 피해자에 대한 2차 가해 우려가 제기됨에 따라 자체 논의를 거쳐 댓글창을 운영하지 않기로 결정했습니다.
여러분의 양해를 바랍니다.
헤드라인
많이 본 뉴스
-
각 플랫폼에서 최근 1시간 동안 많이 본 KBS 기사를 제공합니다.
- 1 성남시, 월곶~판교선 추가 역 신설 추진
- 2 “폭설 뚫고 한걸음에”…SUV 동호회에 쏟아진 칭찬
- 3 전주첨단벤처단지 민간 위탁 업체 선정 두고 ‘논란’
- 4 ‘이 손 안 놓을게요’…11m 다리 위 45분간 버텼다
- 5 대통령실 “감사원장 등 무분별한 탄핵 추진은 헌법 질서 유린 행위”
- 6 서울대 교수·연구자 525명 시국선언…“부끄럽고 반성한다”
-
각 플랫폼에서 최근 1시간 동안 많이 본 KBS 기사를 제공합니다.
-
각 플랫폼에서 최근 1시간 동안 많이 본 KBS 기사를 제공합니다.
요약내용
요약 내용은 네이버 및 OpenAI 社의 AI 서비스를 통해 제공하고 있습니다.
기사의 내용을 올바르게 이해하기 위해서는 본문을 함께 읽어야 합니다.
동영상 퍼가기
KBS 뉴스 사이트 동영상을 퍼가면 KBS 뉴스의 서비스
이용정책에 동의하는 것으로 간주합니다.