diff --git a/app/common/model/Article.php b/app/common/model/Article.php index 6bdf4ad..58df97c 100644 --- a/app/common/model/Article.php +++ b/app/common/model/Article.php @@ -37,6 +37,12 @@ class Article extends Model return $this->hasMany(Comment::class); } + //文章关联收藏 + public function collection() + { + return $this->hasMany(Collection::class); + } + //文章关联用户 public function user() { diff --git a/app/common/model/Collection.php b/app/common/model/Collection.php index 3d41516..fb060ef 100644 --- a/app/common/model/Collection.php +++ b/app/common/model/Collection.php @@ -19,7 +19,7 @@ class Collection extends Model //收藏关联文章 public function article() { - return $this->belongsTo('Article','article_id','id'); + return $this->belongsTo(Article::class); } } \ No newline at end of file diff --git a/app/index/controller/User.php b/app/index/controller/User.php index e4b8dd9..b425568 100644 --- a/app/index/controller/User.php +++ b/app/index/controller/User.php @@ -25,47 +25,85 @@ class User extends BaseController //用户中心 public function index() { - $user['user_id'] = Session::get('user_id'); - $username = session::get('user_name'); - return view(); } + + + //发帖list + public function artList() + { + $article = Article::withCount('comments')->where('user_id',$this->uid)->order('update_time','desc')->paginate(10); + //var_dump($article); + $count = $article->total(); + $res = []; + if($count){ + $res['code'] = 0; + $res['count'] = $count; + foreach($article as $v){ + $res['data'][] = ['id'=>$v['id'], + 'title' => $v['title'], + 'url' => (string) url('article/detail',['id'=>$v['id']]), + 'status' => $v['status'] ? '正常':'待审核', + 'ctime' => $v['create_time'], + 'datas' => $v['pv'].'阅/'.$v['comments_count'].'答' + ]; + } + + } else { + return json(['code'=>-1,'msg'=>'无数据']); + } + return json($res); + } + + //收藏list + public function collList(){ + //收藏的帖子 + $collect = Collection::with(['article'=>function($query){ + $query->withCount('comments')->where('status',1); + }])->where('user_id',$this->uid)->order('create_time','desc')->paginate(10); + $count =$collect->total(); + $res = []; + if($count){ + $res['code'] = 0; + $res['count'] = $count ; + foreach($collect as $v){ + + $res['data'][] = [ + 'id' =>$v['id'], + 'title' => isset($v->article->title) ? '已失效' : $v->article->title, + 'url' => (string) url('article/detail',['id'=>$v['article_id']]), + 'auther' => $v->article->user->name, + 'ctime'=> $v['create_time'], + 'comment' =>$v->article->comments_count, + ]; + } + + } else { + return json(['code'=>-1,'msg'=>'无数据']); + } + return json($res); + } + + + //文章管理 public function post() { - //发表的帖子 - $user['user_id'] = session::get('user_id'); - $username = session::get('user_name'); - - $article = Article::withCount('comments')->where('user_id',$user['user_id'])->order('update_time','desc')->paginate([ - 'list_rows'=>10, - 'page', - 'path' => 'post', - 'fragment' => 'index', - 'var_page' => 'page', - ]); - $page = $article->render(); - View::assign(['article'=>$article,'page'=>$page]); - - - //收藏的帖子 - $collect = Collection::with('article')->where('user_id',$user['user_id'])->order('create_time','desc')->paginate(10); - - $count =$collect->total(); - View::assign(['collect'=>$collect,'count'=>$count]); - return View::fetch(); } //取消文章收藏 public function colltDel() { - $collt = Collection::where('article_id',input('id'))->where('user_id',session::get('user_id'))->find(); - $result = $collt->delete(); - if($result){ - $this->success('取消成功'); - } else { - $this->error('取消失败了'); + if(Request::isAjax()){ + $collt = Collection::where('user_id',$this->uid)->find(input('id')); + $result = $collt->delete(); + if($result){ + $res = ['code'=>0,'msg'=>'取消成功']; + } else { + $res = ['code'=>0,'msg'=>'取消失败']; + } + return json($res); } } @@ -154,7 +192,7 @@ class User extends BaseController //用户回答 $reys = Db::name('comment')->alias('c')->join('article a','c.article_id = a.id')->field('a.id,a.title,c.content,c.create_time,c.delete_time')->where(['a.delete_time'=>0,'c.delete_time'=>0])->where('c.user_id',$id)->order(['c.create_time'=>'desc'])->cache(3600)->select(); - View::assign(['u'=>$u,'arts'=>$arts,'reys'=>$reys]); + View::assign(['u'=>$u,'arts'=>$arts,'reys'=>$reys,'jspage'=>'']); return View::fetch(); } diff --git a/app/index/lang/zh-cn.php b/app/index/lang/zh-cn.php index 6e6c146..3d8a486 100644 --- a/app/index/lang/zh-cn.php +++ b/app/index/lang/zh-cn.php @@ -56,10 +56,10 @@ return [ 'finished' => '已结', 'end' => '已结', 'no finished' => '未结', - 'hot' => '加精', - 'top' => '置顶', - 'cancel hoting' => '取消加精', - 'cancel topping' => '取消置顶', + 'hot' => '精', + 'top' => '顶', + 'cancel hoting' => '取加精', + 'cancel topping' => '取置顶', 'go sign' => '去签到', 'more post' => '更多帖子', 'friendly link' => '友情链接', diff --git a/public/static/res/mods/index.js b/public/static/res/mods/index.js index 319e220..15826dc 100644 --- a/public/static/res/mods/index.js +++ b/public/static/res/mods/index.js @@ -926,11 +926,7 @@ layui.define(['layer', 'laytpl', 'form', 'element', 'upload', 'util'], function( fly.layEditor({ elem: '.fly-editor' }); - //加载播放器 - layui.use('plyr', function(plyr){ - plyr.setup(); - }); - + //手机设备的简单适配 var treeMobile = $('.site-tree-mobile') ,shadeMobile = $('.site-mobile-shade') diff --git a/public/static/res/mods/plyr.js b/public/static/res/mods/plyr.js index c566e07..bd67556 100644 --- a/public/static/res/mods/plyr.js +++ b/public/static/res/mods/plyr.js @@ -1,4 +1,1657 @@ -layui.define(['laypage', 'fly', 'element'], function(exports) {!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=t(e,document):"function"==typeof define&&define.amd?define([],function(){return t(e,document)}):e.plyr=t(e,document)}("undefined"!=typeof window?window:this,function(e,t){"use strict";function n(){var e,n,r,a=navigator.userAgent,s=navigator.appName,o=""+parseFloat(navigator.appVersion),i=parseInt(navigator.appVersion,10),l=!1,u=!1,c=!1,d=!1;return navigator.appVersion.indexOf("Windows NT")!==-1&&navigator.appVersion.indexOf("rv:11")!==-1?(l=!0,s="IE",o="11"):(n=a.indexOf("MSIE"))!==-1?(l=!0,s="IE",o=a.substring(n+5)):(n=a.indexOf("Chrome"))!==-1?(c=!0,s="Chrome",o=a.substring(n+7)):(n=a.indexOf("Safari"))!==-1?(d=!0,s="Safari",o=a.substring(n+7),(n=a.indexOf("Version"))!==-1&&(o=a.substring(n+8))):(n=a.indexOf("Firefox"))!==-1?(u=!0,s="Firefox",o=a.substring(n+8)):(e=a.lastIndexOf(" ")+1)<(n=a.lastIndexOf("/"))&&(s=a.substring(e,n),o=a.substring(n+1),s.toLowerCase()===s.toUpperCase()&&(s=navigator.appName)),(r=o.indexOf(";"))!==-1&&(o=o.substring(0,r)),(r=o.indexOf(" "))!==-1&&(o=o.substring(0,r)),i=parseInt(""+o,10),isNaN(i)&&(o=""+parseFloat(navigator.appVersion),i=parseInt(navigator.appVersion,10)),{name:s,version:i,isIE:l,isFirefox:u,isChrome:c,isSafari:d,isIos:/(iPad|iPhone|iPod)/g.test(navigator.platform),isIphone:/(iPhone|iPod)/g.test(navigator.userAgent),isTouch:"ontouchstart"in t.documentElement}}function r(e,t){var n=e.media;if("video"===e.type)switch(t){case"video/webm":return!(!n.canPlayType||!n.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/no/,""));case"video/mp4":return!(!n.canPlayType||!n.canPlayType('video/mp4; codecs="avc1.42E01E, mp4a.40.2"').replace(/no/,""));case"video/ogg":return!(!n.canPlayType||!n.canPlayType('video/ogg; codecs="theora"').replace(/no/,""))}else if("audio"===e.type)switch(t){case"audio/mpeg":return!(!n.canPlayType||!n.canPlayType("audio/mpeg;").replace(/no/,""));case"audio/ogg":return!(!n.canPlayType||!n.canPlayType('audio/ogg; codecs="vorbis"').replace(/no/,""));case"audio/wav":return!(!n.canPlayType||!n.canPlayType('audio/wav; codecs="1"').replace(/no/,""))}return!1}function a(e){if(!t.querySelectorAll('script[src="'+e+'"]').length){var n=t.createElement("script");n.src=e;var r=t.getElementsByTagName("script")[0];r.parentNode.insertBefore(n,r)}}function s(e,t){return Array.prototype.indexOf&&e.indexOf(t)!==-1}function o(e,t,n){return e.replace(new RegExp(t.replace(/([.*+?\^=!:${}()|\[\]\/\\])/g,"\\$1"),"g"),n)}function i(e,t){e.length||(e=[e]);for(var n=e.length-1;n>=0;n--){var r=n>0?t.cloneNode(!0):t,a=e[n],s=a.parentNode,o=a.nextSibling;return r.appendChild(a),o?s.insertBefore(r,o):s.appendChild(r),r}}function l(e){e&&e.parentNode.removeChild(e)}function u(e,t){e.insertBefore(t,e.firstChild)}function c(e,t){for(var n in t)e.setAttribute(n,O.boolean(t[n])&&t[n]?"":t[n])}function d(e,n,r){var a=t.createElement(e);c(a,r),u(n,a)}function p(e){return e.replace(".","")}function m(e,t,n){if(e)if(e.classList)e.classList[n?"add":"remove"](t);else{var r=(" "+e.className+" ").replace(/\s+/g," ").replace(" "+t+" ","");e.className=r+(n?" "+t:"")}}function f(e,t){return!!e&&(e.classList?e.classList.contains(t):new RegExp("(\\s|^)"+t+"(\\s|$)").test(e.className))}function y(e,n){var r=Element.prototype,a=r.matches||r.webkitMatchesSelector||r.mozMatchesSelector||r.msMatchesSelector||function(e){return[].indexOf.call(t.querySelectorAll(e),this)!==-1};return a.call(e,n)}function b(e,t,n,r,a){g(e,t,function(t){n&&n.apply(e,[t]),r.apply(e,[t])},a)}function v(e,t,n,r,a){var s=t.split(" ");if(O.boolean(a)||(a=!1),e instanceof NodeList)for(var o=0;o','',''+E.i18n.play+"",""),e.push('
'),s(E.controls,"restart")&&e.push('"),s(E.controls,"rewind")&&e.push('"),s(E.controls,"play")&&e.push('",'"),s(E.controls,"fast-forward")&&e.push('"),s(E.controls,"progress")&&(e.push('','','','','',"0% "+E.i18n.buffered,""),E.tooltips.seek&&e.push('00:00'),e.push("")),s(E.controls,"current-time")&&e.push('',''+E.i18n.currentTime+"",'00:00',""),s(E.controls,"duration")&&e.push('',''+E.i18n.duration+"",'00:00',""),s(E.controls,"mute")&&e.push('"),s(E.controls,"volume")&&e.push('','",'','',""),s(E.controls,"captions")&&e.push('"),s(E.controls,"fullscreen")&&e.push('"),e.push("
"),e.join("")}function q(){if(Ue.supported.full&&("audio"!==Ue.type||E.fullscreen.allowAudio)&&E.fullscreen.enabled){var e=N.supportsFullScreen;e||E.fullscreen.fallback&&!X()?(Je((e?"Native":"Fallback")+" fullscreen enabled"),m(Ue.container,E.classes.fullscreen.enabled,!0)):Je("Fullscreen not supported and fallback disabled"),Ue.buttons&&Ue.buttons.fullscreen&&k(Ue.buttons.fullscreen,!1),$()}}function D(){if("video"===Ue.type){U(E.selectors.captions)||Ue.videoContainer.insertAdjacentHTML("afterbegin",'
'),Ue.usingTextTracks=!1,Ue.media.textTracks&&(Ue.usingTextTracks=!0);for(var e,t="",n=Ue.media.childNodes,r=0;r=10||Ue.browser.isFirefox&&Ue.browser.version>=31)&&(Je("Detected browser with known TextTrack issues - using manual fallback"),Ue.usingTextTracks=!1),Ue.usingTextTracks){Je("TextTracks supported");for(var o=0;o ");for(var r=0;rUe.captions.length-1){Ue.subcount=Ue.captions.length-1;break}Ue.media.currentTime.toFixed(1)>=n(Ue.captions[Ue.subcount][0])&&Ue.media.currentTime.toFixed(1)<=r(Ue.captions[Ue.subcount][0])?(Ue.currentCaption=Ue.captions[Ue.subcount][1],H(Ue.currentCaption)):H()}}function Y(){if(Ue.buttons.captions){m(Ue.container,E.classes.captions.enabled,!0);var e=Ue.storage.captionsEnabled;O.boolean(e)||(e=E.captions.defaultActive),e&&(m(Ue.container,E.classes.captions.active,!0),k(Ue.buttons.captions,!0))}}function B(e){return Ue.container.querySelectorAll(e)}function U(e){return B(e)[0]}function X(){try{return e.self!==e.top}catch(e){return!0}}function $(){function e(e){9===e.which&&Ue.isFullscreen&&(e.target!==r||e.shiftKey?e.target===n&&e.shiftKey&&(e.preventDefault(),r.focus()):(e.preventDefault(),n.focus()))}var t=B("input:not([disabled]), button:not([disabled])"),n=t[0],r=t[t.length-1];g(Ue.container,"keydown",e)}function J(e,t){if(O.string(t))d(e,Ue.media,{src:t});else if(t.constructor===Array)for(var n=t.length-1;n>=0;n--)d(e,Ue.media,t[n])}function z(){if(E.loadSprite){var e=V();e.absolute?(Je("AJAX loading absolute SVG sprite"+(Ue.browser.isIE?" (due to IE)":"")),C(e.url,"sprite-plyr")):Je("Sprite will be used as external resource directly")}var n=E.html;Je("Injecting custom controls"),n||(n=R()),n=o(n,"{seektime}",E.seekTime),n=o(n,"{id}",Math.floor(1e4*Math.random()));var r;if(O.string(E.selectors.controls.container)&&(r=t.querySelector(E.selectors.controls.container)),O.htmlElement(r)||(r=Ue.container),r.insertAdjacentHTML("beforeend",n),E.tooltips.controls)for(var a=B([E.selectors.controls.wrapper," ",E.selectors.labels," .",E.classes.hidden].join("")),s=a.length-1;s>=0;s--){var i=a[s];m(i,E.classes.hidden,!1),m(i,E.classes.tooltip,!0)}}function G(){try{return Ue.controls=U(E.selectors.controls.wrapper),Ue.buttons={},Ue.buttons.seek=U(E.selectors.buttons.seek),Ue.buttons.play=B(E.selectors.buttons.play),Ue.buttons.pause=U(E.selectors.buttons.pause),Ue.buttons.restart=U(E.selectors.buttons.restart),Ue.buttons.rewind=U(E.selectors.buttons.rewind),Ue.buttons.forward=U(E.selectors.buttons.forward),Ue.buttons.fullscreen=U(E.selectors.buttons.fullscreen),Ue.buttons.mute=U(E.selectors.buttons.mute),Ue.buttons.captions=U(E.selectors.buttons.captions),Ue.progress={},Ue.progress.container=U(E.selectors.progress.container),Ue.progress.buffer={},Ue.progress.buffer.bar=U(E.selectors.progress.buffer),Ue.progress.buffer.text=Ue.progress.buffer.bar&&Ue.progress.buffer.bar.getElementsByTagName("span")[0],Ue.progress.played=U(E.selectors.progress.played),Ue.progress.tooltip=Ue.progress.container&&Ue.progress.container.querySelector("."+E.classes.tooltip),Ue.volume={},Ue.volume.input=U(E.selectors.volume.input),Ue.volume.display=U(E.selectors.volume.display),Ue.duration=U(E.selectors.duration),Ue.currentTime=U(E.selectors.currentTime),Ue.seekTime=B(E.selectors.seekTime),!0}catch(e){return ze("It looks like there is a problem with your controls HTML"),Q(!0),!1}}function K(){m(Ue.container,E.selectors.container.replace(".",""),Ue.supported.full)}function Q(e){e&&s(E.types.html5,Ue.type)?Ue.media.setAttribute("controls",""):Ue.media.removeAttribute("controls")}function Z(e){var t=E.i18n.play;if(O.string(E.title)&&E.title.length&&(t+=", "+E.title,Ue.container.setAttribute("aria-label",E.title)),Ue.supported.full&&Ue.buttons.play)for(var n=Ue.buttons.play.length-1;n>=0;n--)Ue.buttons.play[n].setAttribute("aria-label",t);O.htmlElement(e)&&e.setAttribute("title",E.i18n.frameTitle.replace("{title}",E.title))}function ee(){var t=null;Ue.storage={},L.supported&&E.storage.enabled&&(e.localStorage.removeItem("plyr-volume"),t=e.localStorage.getItem(E.storage.key),t&&(/^\d+(\.\d+)?$/.test(t)?te({volume:parseFloat(t)}):Ue.storage=JSON.parse(t)))}function te(t){L.supported&&E.storage.enabled&&(x(Ue.storage,t),e.localStorage.setItem(E.storage.key,JSON.stringify(Ue.storage)))}function ne(){if(!Ue.media)return void ze("No media element found!");if(Ue.supported.full&&(m(Ue.container,E.classes.type.replace("{0}",Ue.type),!0),s(E.types.embed,Ue.type)&&m(Ue.container,E.classes.type.replace("{0}","video"),!0),m(Ue.container,E.classes.stopped,E.autoplay),m(Ue.ontainer,E.classes.isIos,Ue.browser.isIos),m(Ue.container,E.classes.isTouch,Ue.browser.isTouch),"video"===Ue.type)){var e=t.createElement("div");e.setAttribute("class",E.classes.videoWrapper),i(Ue.media,e),Ue.videoContainer=e}s(E.types.embed,Ue.type)&&re()}function re(){var n,r=t.createElement("div"),s=Ue.type+"-"+Math.floor(1e4*Math.random());switch(Ue.type){case"youtube":n=T(Ue.embedId);break;case"vimeo":n=S(Ue.embedId);break;default:n=Ue.embedId}for(var o=B('[id^="'+Ue.type+'-"]'),i=o.length-1;i>=0;i--)l(o[i]);if(m(Ue.media,E.classes.videoWrapper,!0),m(Ue.media,E.classes.embedWrapper,!0),"youtube"===Ue.type)Ue.media.appendChild(r),r.setAttribute("id",s),O.object(e.YT)?se(n,r):(a(E.urls.youtube.api),e.onYouTubeReadyCallbacks=e.onYouTubeReadyCallbacks||[],e.onYouTubeReadyCallbacks.push(function(){se(n,r)}),e.onYouTubeIframeAPIReady=function(){e.onYouTubeReadyCallbacks.forEach(function(e){e()})});else if("vimeo"===Ue.type)if(Ue.supported.full?Ue.media.appendChild(r):r=Ue.media,r.setAttribute("id",s),O.object(e.Vimeo))oe(n,r);else{a(E.urls.vimeo.api);var u=e.setInterval(function(){O.object(e.Vimeo)&&(e.clearInterval(u),oe(n,r))},50)}else if("soundcloud"===Ue.type){var d=t.createElement("iframe");d.loaded=!1,g(d,"load",function(){d.loaded=!0}),c(d,{src:"https://w.soundcloud.com/player/?url=https://api.soundcloud.com/tracks/"+n,id:s}),r.appendChild(d),Ue.media.appendChild(r),e.SC||a(E.urls.soundcloud.api);var p=e.setInterval(function(){e.SC&&d.loaded&&(e.clearInterval(p),ie.call(d))},50)}}function ae(){Ue.supported.full&&(We(),Ye()),Z(U("iframe"))}function se(t,n){Ue.embed=new e.YT.Player(n.id,{videoId:t,playerVars:{autoplay:E.autoplay?1:0,controls:Ue.supported.full?0:1,rel:0,showinfo:0,iv_load_policy:3,cc_load_policy:E.captions.defaultActive?1:0,cc_lang_pref:"en",wmode:"transparent",modestbranding:1,disablekb:1,origin:"*"},events:{onError:function(e){A(Ue.container,"error",!0,{code:e.data,embed:e.target})},onReady:function(t){var n=t.target;Ue.media.play=function(){n.playVideo(),Ue.media.paused=!1},Ue.media.pause=function(){n.pauseVideo(),Ue.media.paused=!0},Ue.media.stop=function(){n.stopVideo(),Ue.media.paused=!0},Ue.media.duration=n.getDuration(),Ue.media.paused=!0,Ue.media.currentTime=0,Ue.media.muted=n.isMuted(),E.title=n.getVideoData().title,Ue.supported.full&&Ue.media.querySelector("iframe").setAttribute("tabindex","-1"),ae(),A(Ue.media,"timeupdate"),A(Ue.media,"durationchange"),e.clearInterval(Xe.buffering),Xe.buffering=e.setInterval(function(){Ue.media.buffered=n.getVideoLoadedFraction(),(null===Ue.media.lastBuffered||Ue.media.lastBufferedr&&(t=r),Ne(t);try{Ue.media.currentTime=t.toFixed(4)}catch(e){}if(s(E.types.embed,Ue.type)){switch(Ue.type){case"youtube":Ue.embed.seekTo(t);break;case"vimeo":Ue.embed.setCurrentTime(t.toFixed(0));break;case"soundcloud":Ue.embed.seekTo(1e3*t)}n&&ue(),A(Ue.media,"timeupdate"),Ue.media.seeking=!0,A(Ue.media,"seeking")}Je("Seeking to "+Ue.media.currentTime+" seconds"),W(t)}function fe(){var e=parseInt(E.duration),t=0;return null===Ue.media.duration||isNaN(Ue.media.duration)||(t=Ue.media.duration),isNaN(e)?t:e}function ye(){m(Ue.container,E.classes.playing,!Ue.media.paused),m(Ue.container,E.classes.stopped,Ue.media.paused),Me(Ue.media.paused)}function be(){P={x:e.pageXOffset||0,y:e.pageYOffset||0}}function ve(){e.scrollTo(P.x,P.y)}function ge(e){var n=N.supportsFullScreen;if(n){if(!e||e.type!==N.fullScreenEventName)return N.isFullScreen(Ue.container)?N.cancelFullScreen():(be(),N.requestFullScreen(Ue.container)),void(Ue.isFullscreen=N.isFullScreen(Ue.container));Ue.isFullscreen=N.isFullScreen(Ue.container)}else Ue.isFullscreen=!Ue.isFullscreen,t.body.style.overflow=Ue.isFullscreen?"hidden":"";m(Ue.container,E.classes.fullscreen.active,Ue.isFullscreen),$(Ue.isFullscreen),Ue.buttons&&Ue.buttons.fullscreen&&k(Ue.buttons.fullscreen,Ue.isFullscreen),A(Ue.container,Ue.isFullscreen?"enterfullscreen":"exitfullscreen",!0),!Ue.isFullscreen&&n&&ve()}function he(e){if(O.boolean(e)||(e=!Ue.media.muted),k(Ue.buttons.mute,e),Ue.media.muted=e,0===Ue.media.volume&&ke(E.volume),s(E.types.embed,Ue.type)){switch(Ue.type){case"youtube":Ue.embed[Ue.media.muted?"mute":"unMute"]();break;case"vimeo":case"soundcloud":Ue.embed.setVolume(Ue.media.muted?0:parseFloat(E.volume/E.volumeMax))}A(Ue.media,"volumechange")}}function ke(e){var t=E.volumeMax,n=E.volumeMin;if(O.undefined(e)&&(e=Ue.storage.volume),(null===e||isNaN(e))&&(e=E.volume),e>t&&(e=t),e0&&he()}function we(e){var t=Ue.media.muted?0:Ue.media.volume*E.volumeMax;O.number(e)||(e=E.volumeStep),ke(t+e)}function xe(e){var t=Ue.media.muted?0:Ue.media.volume*E.volumeMax;O.number(e)||(e=E.volumeStep),ke(t-e)}function Te(){var e=Ue.media.muted?0:Ue.media.volume*E.volumeMax;Ue.supported.full&&(Ue.volume.input&&(Ue.volume.input.value=e),Ue.volume.display&&(Ue.volume.display.value=e)),te({volume:e}),m(Ue.container,E.classes.muted,0===e),Ue.supported.full&&Ue.buttons.mute&&k(Ue.buttons.mute,0===e)}function Se(e){Ue.supported.full&&Ue.buttons.captions&&(O.boolean(e)||(e=Ue.container.className.indexOf(E.classes.captions.active)===-1),Ue.captionsEnabled=e,k(Ue.buttons.captions,Ue.captionsEnabled),m(Ue.container,E.classes.captions.active,Ue.captionsEnabled),A(Ue.container,Ue.captionsEnabled?"captionsenabled":"captionsdisabled",!0),te({captionsEnabled:Ue.captionsEnabled}))}function _e(e){var t="waiting"===e.type;clearTimeout(Xe.loading),Xe.loading=setTimeout(function(){m(Ue.container,E.classes.loading,t),Me(t)},t?250:0)}function Ee(e){if(Ue.supported.full){var t=Ue.progress.played,n=0,r=fe();if(e)switch(e.type){case"timeupdate":case"seeking":if(Ue.controls.pressed)return;n=w(Ue.media.currentTime,r),"timeupdate"===e.type&&Ue.buttons.seek&&(Ue.buttons.seek.value=n);break;case"playing":case"progress":t=Ue.progress.buffer,n=function(){var e=Ue.media.buffered;return e&&e.length?w(e.end(0),r):O.number(e)?100*e:0}()}Ce(t,n)}}function Ce(e,t){if(Ue.supported.full){if(O.undefined(t)&&(t=0),O.undefined(e)){if(!Ue.progress||!Ue.progress.buffer)return;e=Ue.progress.buffer}O.htmlElement(e)?e.value=t:e&&(e.bar&&(e.bar.value=t),e.text&&(e.text.innerHTML=t))}}function Fe(e,t){if(t){isNaN(e)&&(e=0),Ue.secs=parseInt(e%60),Ue.mins=parseInt(e/60%60),Ue.hours=parseInt(e/60/60%60);var n=parseInt(fe()/60/60%60)>0;Ue.secs=("0"+Ue.secs).slice(-2),Ue.mins=("0"+Ue.mins).slice(-2),t.innerHTML=(n?Ue.hours+":":"")+Ue.mins+":"+Ue.secs}}function Ae(){if(Ue.supported.full){var e=fe()||0;!Ue.duration&&E.displayDuration&&Ue.media.paused&&Fe(e,Ue.currentTime),Ue.duration&&Fe(e,Ue.duration),Pe()}}function Ie(e){Fe(Ue.media.currentTime,Ue.currentTime),e&&"timeupdate"===e.type&&Ue.media.seeking||Ee(e)}function Ne(e){O.number(e)||(e=0);var t=fe(),n=w(e,t);Ue.progress&&Ue.progress.played&&(Ue.progress.played.value=n),Ue.buttons&&Ue.buttons.seek&&(Ue.buttons.seek.value=n)}function Pe(e){var t=fe();if(E.tooltips.seek&&Ue.progress.container&&0!==t){var n=Ue.progress.container.getBoundingClientRect(),r=0,a=E.classes.tooltip+"--visible";if(e)r=100/n.width*(e.pageX-n.left);else{if(!f(Ue.progress.tooltip,a))return;r=Ue.progress.tooltip.style.left.replace("%","")}r<0?r=0:r>100&&(r=100),Fe(t/100*r,Ue.progress.tooltip),Ue.progress.tooltip.style.left=r+"%",e&&s(["mouseenter","mouseleave"],e.type)&&m(Ue.progress.tooltip,a,"mouseenter"===e.type)}}function Me(t){if(E.hideControls&&"audio"!==Ue.type){var n=0,r=!1,a=t,o=f(Ue.container,E.classes.loading);if(O.boolean(t)||(t&&t.type?(r="enterfullscreen"===t.type,a=s(["mousemove","touchstart","mouseenter","focus"],t.type),s(["mousemove","touchmove"],t.type)&&(n=2e3),"focus"===t.type&&(n=3e3)):a=f(Ue.container,E.classes.hideControls)),e.clearTimeout(Xe.hover),a||Ue.media.paused||o){if(m(Ue.container,E.classes.hideControls,!1),Ue.media.paused||o)return;Ue.browser.isTouch&&(n=3e3)}a&&Ue.media.paused||(Xe.hover=e.setTimeout(function(){(!Ue.controls.pressed&&!Ue.controls.hover||r)&&m(Ue.container,E.classes.hideControls,!0)},n))}}function Oe(e){if(!O.undefined(e))return void Le(e);var t;switch(Ue.type){case"youtube":t=Ue.embed.getVideoUrl();break;case"vimeo":Ue.embed.getVideoUrl.then(function(e){t=e});break;case"soundcloud":Ue.embed.getCurrentSound(function(e){t=e.permalink_url});break;default:t=Ue.media.currentSrc}return t||""}function Le(e){function n(){if(Ue.embed=null,l(Ue.media),"video"===Ue.type&&Ue.videoContainer&&l(Ue.videoContainer),Ue.container&&Ue.container.removeAttribute("class"),"type"in e&&(Ue.type=e.type,"video"===Ue.type)){var n=e.sources[0];"type"in n&&s(E.types.embed,n.type)&&(Ue.type=n.type)}switch(Ue.supported=F(Ue.type),Ue.type){case"video":Ue.media=t.createElement("video");break;case"audio":Ue.media=t.createElement("audio");break;case"youtube":case"vimeo":case"soundcloud":Ue.media=t.createElement("div"),Ue.embedId=e.sources[0].src}u(Ue.container,Ue.media),O.boolean(e.autoplay)&&(E.autoplay=e.autoplay),s(E.types.html5,Ue.type)&&(E.crossorigin&&Ue.media.setAttribute("crossorigin",""),E.autoplay&&Ue.media.setAttribute("autoplay",""),"poster"in e&&Ue.media.setAttribute("poster",e.poster),E.loop&&Ue.media.setAttribute("loop","")),m(Ue.container,E.classes.fullscreen.active,Ue.isFullscreen),m(Ue.container,E.classes.captions.active,Ue.captionsEnabled),K(),s(E.types.html5,Ue.type)&&J("source",e.sources),ne(),s(E.types.html5,Ue.type)&&("tracks"in e&&J("track",e.tracks),Ue.media.load()),(s(E.types.html5,Ue.type)||s(E.types.embed,Ue.type)&&!Ue.supported.full)&&(We(),Ye()),E.title=e.title,Z()}return O.object(e)&&"sources"in e&&e.sources.length?(m(Ue.container,E.classes.ready,!1),ue(),Ne(),Ce(),qe(),void De(n,!1)):void ze("Invalid source format")}function je(e){"video"===Ue.type&&Ue.media.setAttribute("poster",e)}function Ve(){function n(){var e=ce(),t=Ue.buttons[e?"play":"pause"],n=Ue.buttons[e?"pause":"play"];if(n=n&&n.length>1?n[n.length-1]:n[0]){var r=f(t,E.classes.tabFocus);setTimeout(function(){n.focus(),r&&(m(t,E.classes.tabFocus,!1),m(n,E.classes.tabFocus,!0))},100)}}function r(){var e=t.activeElement;return e=e&&e!==t.body?t.querySelector(":focus"):null}function a(e){return e.keyCode?e.keyCode:e.which}function o(e){for(var t in Ue.buttons){var n=Ue.buttons[t];if(O.nodeList(n))for(var r=0;r0)&&(t?xe(n):we(n)),(e.deltaY>0||e.deltaX<0)&&(t?we(n):xe(n))})}function Re(){if(g(Ue.media,"timeupdate seeking",Ie),g(Ue.media,"timeupdate",W),g(Ue.media,"durationchange loadedmetadata",Ae),g(Ue.media,"ended",function(){"video"===Ue.type&&E.showPosterOnEnd&&("video"===Ue.type&&H(),me(),Ue.media.load())}),g(Ue.media,"progress playing",Ee),g(Ue.media,"volumechange",Te),g(Ue.media,"play pause ended",ye),g(Ue.media,"waiting canplay seeked",_e),E.clickToPlay&&"audio"!==Ue.type){var e=U("."+E.classes.videoWrapper);if(!e)return;e.style.cursor="pointer",g(e,"click",function(){E.hideControls&&Ue.browser.isTouch&&!Ue.media.paused||(Ue.media.paused?le():Ue.media.ended?(me(),le()):ue())})}E.disableContextMenu&&g(Ue.media,"contextmenu",function(e){e.preventDefault()}),g(Ue.media,E.events.concat(["keyup","keydown"]).join(" "),function(e){A(Ue.container,e.type,!0)})}function qe(){if(s(E.types.html5,Ue.type)){for(var e=Ue.media.querySelectorAll("source"),t=0;t=10&&(c=!0);break;case"soundcloud":u=!0,c=!a&&!o;break;default:u=i&&l,c=u&&!a}return{basic:u,full:c}}function A(e,n){function r(e,t){f(t,M.classes.hook)||a.push({target:e,media:t})}var a=[],s=[],o=[M.selectors.html5,M.selectors.embed].join(",");if(O.string(e)?e=t.querySelectorAll(e):O.htmlElement(e)?e=[e]:O.nodeList(e)||O.array(e)||O.string(e)||(O.undefined(n)&&O.object(e)&&(n=e),e=t.querySelectorAll(o)),O.nodeList(e)&&(e=Array.prototype.slice.call(e)),!F().basic||!e.length)return!1;for(var i=0;i= 0; n--) { + var r = n > 0 ? t.cloneNode(!0) : t, + a = e[n], + s = a.parentNode, + o = a.nextSibling; + return r.appendChild(a), + o ? s.insertBefore(r, o) : s.appendChild(r), + r + } + } + function l(e) { + e && e.parentNode.removeChild(e) + } + function u(e, t) { + e.insertBefore(t, e.firstChild) + } + function c(e, t) { + for (var n in t) e.setAttribute(n, O.boolean(t[n]) && t[n] ? "": t[n]) + } + function d(e, n, r) { + var a = t.createElement(e); + c(a, r), + u(n, a) + } + function p(e) { + return e.replace(".", "") + } + function m(e, t, n) { + if (e) if (e.classList) e.classList[n ? "add": "remove"](t); + else { + var r = (" " + e.className + " ").replace(/\s+/g, " ").replace(" " + t + " ", ""); + e.className = r + (n ? " " + t: "") + } + } + function f(e, t) { + return !! e && (e.classList ? e.classList.contains(t) : new RegExp("(\\s|^)" + t + "(\\s|$)").test(e.className)) + } + function y(e, n) { + var r = Element.prototype, + a = r.matches || r.webkitMatchesSelector || r.mozMatchesSelector || r.msMatchesSelector || + function(e) { + return [].indexOf.call(t.querySelectorAll(e), this) !== -1 + }; + return a.call(e, n) + } + function b(e, t, n, r, a) { + g(e, t, + function(t) { + n && n.apply(e, [t]), + r.apply(e, [t]) + }, + a) + } + function v(e, t, n, r, a) { + var s = t.split(" "); + if (O.boolean(a) || (a = !1), e instanceof NodeList) for (var o = 0; o < e.length; o++) e[o] instanceof Node && v(e[o], arguments[1], arguments[2], arguments[3]); + else for (var i = 0; i < s.length; i++) e[r ? "addEventListener": "removeEventListener"](s[i], n, a) + } + function g(e, t, n, r) { + e && v(e, t, n, !0, r) + } + function h(e, t, n, r) { + if (e && t) { + O.boolean(n) || (n = !1); + var a = new CustomEvent(t, { + bubbles: n, + detail: r + }); + e.dispatchEvent(a) + } + } + function k(e, t) { + if (e) return t = O.boolean(t) ? t: !e.getAttribute("aria-pressed"), + e.setAttribute("aria-pressed", t), + t + } + function w(e, t) { + return 0 === e || 0 === t || isNaN(e) || isNaN(t) ? 0 : (e / t * 100).toFixed(2) + } + function x() { + var e = arguments; + if (e.length) { + if (1 === e.length) return e[0]; + for (var t = Array.prototype.shift.call(e), n = e.length, r = 0; r < n; r++) { + var a = e[r]; + for (var s in a) a[s] && a[s].constructor && a[s].constructor === Object ? (t[s] = t[s] || {}, + x(t[s], a[s])) : t[s] = a[s] + } + return t + } + } + function T(e) { + var t = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*).*/; + return e.match(t) ? RegExp.$2: e + } + function S(e) { + var t = /^.*(vimeo.com\/|video\/)(\d+).*/; + return e.match(t) ? RegExp.$2: e + } + function _() { + var e = { + supportsFullScreen: !1, + isFullScreen: function() { + return ! 1 + }, + requestFullScreen: function() {}, + cancelFullScreen: function() {}, + fullScreenEventName: "", + element: null, + prefix: "" + }, + n = "webkit o moz ms khtml".split(" "); + if (O.undefined(t.cancelFullScreen)) for (var r = 0, + a = n.length; r < a; r++) { + if (e.prefix = n[r], !O.undefined(t[e.prefix + "CancelFullScreen"])) { + e.supportsFullScreen = !0; + break + } + if (!O.undefined(t.msExitFullscreen) && t.msFullscreenEnabled) { + e.prefix = "ms", + e.supportsFullScreen = !0; + break + } + } else e.supportsFullScreen = !0; + return e.supportsFullScreen && (e.fullScreenEventName = "ms" === e.prefix ? "MSFullscreenChange": e.prefix + "fullscreenchange", e.isFullScreen = function(e) { + switch (O.undefined(e) && (e = t.body), this.prefix) { + case "": + return t.fullscreenElement === e; + case "moz": + return t.mozFullScreenElement === e; + default: + return t[this.prefix + "FullscreenElement"] === e + } + }, + e.requestFullScreen = function(e) { + return O.undefined(e) && (e = t.body), + "" === this.prefix ? e.requestFullScreen() : e[this.prefix + ("ms" === this.prefix ? "RequestFullscreen": "RequestFullScreen")]() + }, + e.cancelFullScreen = function() { + return "" === this.prefix ? t.cancelFullScreen() : t[this.prefix + ("ms" === this.prefix ? "ExitFullscreen": "CancelFullScreen")]() + }, + e.element = function() { + return "" === this.prefix ? t.fullscreenElement: t[this.prefix + "FullscreenElement"] + }), + e + } + function E(v, E) { + function A(e, t, n, r) { + h(e, t, n, x({}, + r, { + plyr: Be + })) + } + function j(t, n) { + E.debug && e.console && (n = Array.prototype.slice.call(n), O.string(E.logPrefix) && E.logPrefix.length && n.unshift(E.logPrefix), console[t].apply(console, n)) + } + function V() { + return { + url: E.iconUrl, + absolute: 0 === E.iconUrl.indexOf("http") || Ue.browser.isIE + } + } + function R() { + var e = [], + t = V(), + n = (t.absolute ? "": t.url) + "#" + E.iconPrefix; + return s(E.controls, "play-large") && e.push('"), + e.push('
'), + s(E.controls, "restart") && e.push('"), + s(E.controls, "rewind") && e.push('"), + s(E.controls, "play") && e.push('", '"), + s(E.controls, "fast-forward") && e.push('"), + s(E.controls, "progress") && (e.push('', '', '', '', '', "0% " + E.i18n.buffered, ""), E.tooltips.seek && e.push('00:00'), e.push("")), + s(E.controls, "current-time") && e.push('', '' + E.i18n.currentTime + "", '00:00', ""), + s(E.controls, "duration") && e.push('', '' + E.i18n.duration + "", '00:00', ""), + s(E.controls, "mute") && e.push('"), + s(E.controls, "volume") && e.push('', '", '', '', ""), + s(E.controls, "captions") && e.push('"), + s(E.controls, "fullscreen") && e.push('"), + e.push("
"), + e.join("") + } + function q() { + if (Ue.supported.full && ("audio" !== Ue.type || E.fullscreen.allowAudio) && E.fullscreen.enabled) { + var e = N.supportsFullScreen; + e || E.fullscreen.fallback && !X() ? (Je((e ? "Native": "Fallback") + " fullscreen enabled"), m(Ue.container, E.classes.fullscreen.enabled, !0)) : Je("Fullscreen not supported and fallback disabled"), + Ue.buttons && Ue.buttons.fullscreen && k(Ue.buttons.fullscreen, !1), + $() + } + } + function D() { + if ("video" === Ue.type) { + U(E.selectors.captions) || Ue.videoContainer.insertAdjacentHTML("afterbegin", '
'), + Ue.usingTextTracks = !1, + Ue.media.textTracks && (Ue.usingTextTracks = !0); + for (var e, t = "", + n = Ue.media.childNodes, + r = 0; r < n.length; r++)"track" === n[r].nodeName.toLowerCase() && (e = n[r].kind, "captions" !== e && "subtitles" !== e || (t = n[r].getAttribute("src"))); + if (Ue.captionExists = !0, "" === t ? (Ue.captionExists = !1, Je("No caption track found")) : Je("Caption track found; URI: " + t), Ue.captionExists) { + for (var a = Ue.media.textTracks, + s = 0; s < a.length; s++) a[s].mode = "hidden"; + if (Y(Ue), (Ue.browser.isIE && Ue.browser.version >= 10 || Ue.browser.isFirefox && Ue.browser.version >= 31) && (Je("Detected browser with known TextTrack issues - using manual fallback"), Ue.usingTextTracks = !1), Ue.usingTextTracks) { + Je("TextTracks supported"); + for (var o = 0; o < a.length; o++) { + var i = a[o]; + "captions" !== i.kind && "subtitles" !== i.kind || g(i, "cuechange", + function() { + this.activeCues[0] && "text" in this.activeCues[0] ? H(this.activeCues[0].getCueAsHTML()) : H() + }) + } + } else if (Je("TextTracks not supported so rendering captions manually"), Ue.currentCaption = "", Ue.captions = [], "" !== t) { + var l = new XMLHttpRequest; + l.onreadystatechange = function() { + if (4 === l.readyState) if (200 === l.status) { + var e, t = [], + n = l.responseText, + r = "\r\n"; + n.indexOf(r + r) === -1 && (r = n.indexOf("\r\r") !== -1 ? "\r": "\n"), + t = n.split(r + r); + for (var a = 0; a < t.length; a++) { + e = t[a], + Ue.captions[a] = []; + var s = e.split(r), + o = 0; + s[o].indexOf(":") === -1 && (o = 1), + Ue.captions[a] = [s[o], s[o + 1]] + } + Ue.captions.shift(), + Je("Successfully loaded the caption file via AJAX") + } else ze(E.logPrefix + "There was a problem loading the caption file via AJAX") + }, + l.open("get", t, !0), + l.send() + } + } else m(Ue.container, E.classes.captions.enabled) + } + } + function H(e) { + var n = U(E.selectors.captions), + r = t.createElement("span"); + n.innerHTML = "", + O.undefined(e) && (e = ""), + O.string(e) ? r.innerHTML = e.trim() : r.appendChild(e), + n.appendChild(r); + n.offsetHeight + } + function W(e) { + function t(e, t) { + var n = []; + n = e.split(" --> "); + for (var r = 0; r < n.length; r++) n[r] = n[r].replace(/(\d+:\d+:\d+\.\d+).*/, "$1"); + return a(n[t]) + } + function n(e) { + return t(e, 0) + } + function r(e) { + return t(e, 1) + } + function a(e) { + if (null === e || void 0 === e) return 0; + var t, n = [], + r = []; + return n = e.split(","), + r = n[0].split(":"), + t = Math.floor(60 * r[0] * 60) + Math.floor(60 * r[1]) + Math.floor(r[2]) + } + if (!Ue.usingTextTracks && "video" === Ue.type && Ue.supported.full && (Ue.subcount = 0, e = O.number(e) ? e: Ue.media.currentTime, Ue.captions[Ue.subcount])) { + for (; r(Ue.captions[Ue.subcount][0]) < e.toFixed(1);) if (Ue.subcount++, Ue.subcount > Ue.captions.length - 1) { + Ue.subcount = Ue.captions.length - 1; + break + } + Ue.media.currentTime.toFixed(1) >= n(Ue.captions[Ue.subcount][0]) && Ue.media.currentTime.toFixed(1) <= r(Ue.captions[Ue.subcount][0]) ? (Ue.currentCaption = Ue.captions[Ue.subcount][1], H(Ue.currentCaption)) : H() + } + } + function Y() { + if (Ue.buttons.captions) { + m(Ue.container, E.classes.captions.enabled, !0); + var e = Ue.storage.captionsEnabled; + O.boolean(e) || (e = E.captions.defaultActive), + e && (m(Ue.container, E.classes.captions.active, !0), k(Ue.buttons.captions, !0)) + } + } + function B(e) { + return Ue.container.querySelectorAll(e) + } + function U(e) { + return B(e)[0] + } + function X() { + try { + return e.self !== e.top + } catch(e) { + return ! 0 + } + } + function $() { + function e(e) { + 9 === e.which && Ue.isFullscreen && (e.target !== r || e.shiftKey ? e.target === n && e.shiftKey && (e.preventDefault(), r.focus()) : (e.preventDefault(), n.focus())) + } + var t = B("input:not([disabled]), button:not([disabled])"), + n = t[0], + r = t[t.length - 1]; + g(Ue.container, "keydown", e) + } + function J(e, t) { + if (O.string(t)) d(e, Ue.media, { + src: t + }); + else if (t.constructor === Array) for (var n = t.length - 1; n >= 0; n--) d(e, Ue.media, t[n]) + } + function z() { + if (E.loadSprite) { + var e = V(); + e.absolute ? (Je("AJAX loading absolute SVG sprite" + (Ue.browser.isIE ? " (due to IE)": "")), C(e.url, "sprite-plyr")) : Je("Sprite will be used as external resource directly") + } + var n = E.html; + Je("Injecting custom controls"), + n || (n = R()), + n = o(n, "{seektime}", E.seekTime), + n = o(n, "{id}", Math.floor(1e4 * Math.random())); + var r; + if (O.string(E.selectors.controls.container) && (r = t.querySelector(E.selectors.controls.container)), O.htmlElement(r) || (r = Ue.container), r.insertAdjacentHTML("beforeend", n), E.tooltips.controls) for (var a = B([E.selectors.controls.wrapper, " ", E.selectors.labels, " .", E.classes.hidden].join("")), s = a.length - 1; s >= 0; s--) { + var i = a[s]; + m(i, E.classes.hidden, !1), + m(i, E.classes.tooltip, !0) + } + } + function G() { + try { + return Ue.controls = U(E.selectors.controls.wrapper), + Ue.buttons = {}, + Ue.buttons.seek = U(E.selectors.buttons.seek), + Ue.buttons.play = B(E.selectors.buttons.play), + Ue.buttons.pause = U(E.selectors.buttons.pause), + Ue.buttons.restart = U(E.selectors.buttons.restart), + Ue.buttons.rewind = U(E.selectors.buttons.rewind), + Ue.buttons.forward = U(E.selectors.buttons.forward), + Ue.buttons.fullscreen = U(E.selectors.buttons.fullscreen), + Ue.buttons.mute = U(E.selectors.buttons.mute), + Ue.buttons.captions = U(E.selectors.buttons.captions), + Ue.progress = {}, + Ue.progress.container = U(E.selectors.progress.container), + Ue.progress.buffer = {}, + Ue.progress.buffer.bar = U(E.selectors.progress.buffer), + Ue.progress.buffer.text = Ue.progress.buffer.bar && Ue.progress.buffer.bar.getElementsByTagName("span")[0], + Ue.progress.played = U(E.selectors.progress.played), + Ue.progress.tooltip = Ue.progress.container && Ue.progress.container.querySelector("." + E.classes.tooltip), + Ue.volume = {}, + Ue.volume.input = U(E.selectors.volume.input), + Ue.volume.display = U(E.selectors.volume.display), + Ue.duration = U(E.selectors.duration), + Ue.currentTime = U(E.selectors.currentTime), + Ue.seekTime = B(E.selectors.seekTime), + !0 + } catch(e) { + return ze("It looks like there is a problem with your controls HTML"), + Q(!0), + !1 + } + } + function K() { + m(Ue.container, E.selectors.container.replace(".", ""), Ue.supported.full) + } + function Q(e) { + e && s(E.types.html5, Ue.type) ? Ue.media.setAttribute("controls", "") : Ue.media.removeAttribute("controls") + } + function Z(e) { + var t = E.i18n.play; + if (O.string(E.title) && E.title.length && (t += ", " + E.title, Ue.container.setAttribute("aria-label", E.title)), Ue.supported.full && Ue.buttons.play) for (var n = Ue.buttons.play.length - 1; n >= 0; n--) Ue.buttons.play[n].setAttribute("aria-label", t); + O.htmlElement(e) && e.setAttribute("title", E.i18n.frameTitle.replace("{title}", E.title)) + } + function ee() { + var t = null; + Ue.storage = {}, + L.supported && E.storage.enabled && (e.localStorage.removeItem("plyr-volume"), t = e.localStorage.getItem(E.storage.key), t && (/^\d+(\.\d+)?$/.test(t) ? te({ + volume: parseFloat(t) + }) : Ue.storage = JSON.parse(t))) + } + function te(t) { + L.supported && E.storage.enabled && (x(Ue.storage, t), e.localStorage.setItem(E.storage.key, JSON.stringify(Ue.storage))) + } + function ne() { + if (!Ue.media) return void ze("No media element found!"); + if (Ue.supported.full && (m(Ue.container, E.classes.type.replace("{0}", Ue.type), !0), s(E.types.embed, Ue.type) && m(Ue.container, E.classes.type.replace("{0}", "video"), !0), m(Ue.container, E.classes.stopped, E.autoplay), m(Ue.ontainer, E.classes.isIos, Ue.browser.isIos), m(Ue.container, E.classes.isTouch, Ue.browser.isTouch), "video" === Ue.type)) { + var e = t.createElement("div"); + e.setAttribute("class", E.classes.videoWrapper), + i(Ue.media, e), + Ue.videoContainer = e + } + s(E.types.embed, Ue.type) && re() + } + function re() { + var n, r = t.createElement("div"), + s = Ue.type + "-" + Math.floor(1e4 * Math.random()); + switch (Ue.type) { + case "youtube": + n = T(Ue.embedId); + break; + case "vimeo": + n = S(Ue.embedId); + break; + default: + n = Ue.embedId + } + for (var o = B('[id^="' + Ue.type + '-"]'), i = o.length - 1; i >= 0; i--) l(o[i]); + if (m(Ue.media, E.classes.videoWrapper, !0), m(Ue.media, E.classes.embedWrapper, !0), "youtube" === Ue.type) Ue.media.appendChild(r), + r.setAttribute("id", s), + O.object(e.YT) ? se(n, r) : (a(E.urls.youtube.api), e.onYouTubeReadyCallbacks = e.onYouTubeReadyCallbacks || [], e.onYouTubeReadyCallbacks.push(function() { + se(n, r) + }), e.onYouTubeIframeAPIReady = function() { + e.onYouTubeReadyCallbacks.forEach(function(e) { + e() + }) + }); + else if ("vimeo" === Ue.type) if (Ue.supported.full ? Ue.media.appendChild(r) : r = Ue.media, r.setAttribute("id", s), O.object(e.Vimeo)) oe(n, r); + else { + a(E.urls.vimeo.api); + var u = e.setInterval(function() { + O.object(e.Vimeo) && (e.clearInterval(u), oe(n, r)) + }, + 50) + } else if ("soundcloud" === Ue.type) { + var d = t.createElement("iframe"); + d.loaded = !1, + g(d, "load", + function() { + d.loaded = !0 + }), + c(d, { + src: "https://w.soundcloud.com/player/?url=https://api.soundcloud.com/tracks/" + n, + id: s + }), + r.appendChild(d), + Ue.media.appendChild(r), + e.SC || a(E.urls.soundcloud.api); + var p = e.setInterval(function() { + e.SC && d.loaded && (e.clearInterval(p), ie.call(d)) + }, + 50) + } + } + function ae() { + Ue.supported.full && (We(), Ye()), + Z(U("iframe")) + } + function se(t, n) { + Ue.embed = new e.YT.Player(n.id, { + videoId: t, + playerVars: { + autoplay: E.autoplay ? 1 : 0, + controls: Ue.supported.full ? 0 : 1, + rel: 0, + showinfo: 0, + iv_load_policy: 3, + cc_load_policy: E.captions.defaultActive ? 1 : 0, + cc_lang_pref: "en", + wmode: "transparent", + modestbranding: 1, + disablekb: 1, + origin: "*" + }, + events: { + onError: function(e) { + A(Ue.container, "error", !0, { + code: e.data, + embed: e.target + }) + }, + onReady: function(t) { + var n = t.target; + Ue.media.play = function() { + n.playVideo(), + Ue.media.paused = !1 + }, + Ue.media.pause = function() { + n.pauseVideo(), + Ue.media.paused = !0 + }, + Ue.media.stop = function() { + n.stopVideo(), + Ue.media.paused = !0 + }, + Ue.media.duration = n.getDuration(), + Ue.media.paused = !0, + Ue.media.currentTime = 0, + Ue.media.muted = n.isMuted(), + E.title = n.getVideoData().title, + Ue.supported.full && Ue.media.querySelector("iframe").setAttribute("tabindex", "-1"), + ae(), + A(Ue.media, "timeupdate"), + A(Ue.media, "durationchange"), + e.clearInterval(Xe.buffering), + Xe.buffering = e.setInterval(function() { + Ue.media.buffered = n.getVideoLoadedFraction(), + (null === Ue.media.lastBuffered || Ue.media.lastBuffered < Ue.media.buffered) && A(Ue.media, "progress"), + Ue.media.lastBuffered = Ue.media.buffered, + 1 === Ue.media.buffered && (e.clearInterval(Xe.buffering), A(Ue.media, "canplaythrough")) + }, + 200) + }, + onStateChange: function(t) { + var n = t.target; + switch (e.clearInterval(Xe.playing), t.data) { + case 0: + Ue.media.paused = !0, + A(Ue.media, "ended"); + break; + case 1: + Ue.media.paused = !1, + Ue.media.seeking && A(Ue.media, "seeked"), + Ue.media.seeking = !1, + A(Ue.media, "play"), + A(Ue.media, "playing"), + Xe.playing = e.setInterval(function() { + Ue.media.currentTime = n.getCurrentTime(), + A(Ue.media, "timeupdate") + }, + 100), + Ue.media.duration !== n.getDuration() && (Ue.media.duration = n.getDuration(), A(Ue.media, "durationchange")); + break; + case 2: + Ue.media.paused = !0, + A(Ue.media, "pause") + } + A(Ue.container, "statechange", !1, { + code: t.data + }) + } + } + }) + } + function oe(t, n) { + Ue.embed = new e.Vimeo.Player(n, { + id: parseInt(t), + loop: E.loop, + autoplay: E.autoplay, + byline: !1, + portrait: !1, + title: !1 + }), + Ue.media.play = function() { + Ue.embed.play(), + Ue.media.paused = !1 + }, + Ue.media.pause = function() { + Ue.embed.pause(), + Ue.media.paused = !0 + }, + Ue.media.stop = function() { + Ue.embed.stop(), + Ue.media.paused = !0 + }, + Ue.media.paused = !0, + Ue.media.currentTime = 0, + ae(), + Ue.embed.getCurrentTime().then(function(e) { + Ue.media.currentTime = e, + A(Ue.media, "timeupdate") + }), + Ue.embed.getDuration().then(function(e) { + Ue.media.duration = e, + A(Ue.media, "durationchange") + }), + Ue.embed.on("loaded", + function() { + O.htmlElement(Ue.embed.element) && Ue.supported.full && Ue.embed.element.setAttribute("tabindex", "-1") + }), + Ue.embed.on("play", + function() { + Ue.media.paused = !1, + A(Ue.media, "play"), + A(Ue.media, "playing") + }), + Ue.embed.on("pause", + function() { + Ue.media.paused = !0, + A(Ue.media, "pause") + }), + Ue.embed.on("timeupdate", + function(e) { + Ue.media.seeking = !1, + Ue.media.currentTime = e.seconds, + A(Ue.media, "timeupdate") + }), + Ue.embed.on("progress", + function(e) { + Ue.media.buffered = e.percent, + A(Ue.media, "progress"), + 1 === parseInt(e.percent) && A(Ue.media, "canplaythrough") + }), + Ue.embed.on("seeked", + function() { + Ue.media.seeking = !1, + A(Ue.media, "seeked"), + A(Ue.media, "play") + }), + Ue.embed.on("ended", + function() { + Ue.media.paused = !0, + A(Ue.media, "ended") + }) + } + function ie() { + Ue.embed = e.SC.Widget(this), + Ue.embed.bind(e.SC.Widget.Events.READY, + function() { + Ue.media.play = function() { + Ue.embed.play(), + Ue.media.paused = !1 + }, + Ue.media.pause = function() { + Ue.embed.pause(), + Ue.media.paused = !0 + }, + Ue.media.stop = function() { + Ue.embed.seekTo(0), + Ue.embed.pause(), + Ue.media.paused = !0 + }, + Ue.media.paused = !0, + Ue.media.currentTime = 0, + Ue.embed.getDuration(function(e) { + Ue.media.duration = e / 1e3, + ae() + }), + Ue.embed.getPosition(function(e) { + Ue.media.currentTime = e, + A(Ue.media, "timeupdate") + }), + Ue.embed.bind(e.SC.Widget.Events.PLAY, + function() { + Ue.media.paused = !1, + A(Ue.media, "play"), + A(Ue.media, "playing") + }), + Ue.embed.bind(e.SC.Widget.Events.PAUSE, + function() { + Ue.media.paused = !0, + A(Ue.media, "pause") + }), + Ue.embed.bind(e.SC.Widget.Events.PLAY_PROGRESS, + function(e) { + Ue.media.seeking = !1, + Ue.media.currentTime = e.currentPosition / 1e3, + A(Ue.media, "timeupdate") + }), + Ue.embed.bind(e.SC.Widget.Events.LOAD_PROGRESS, + function(e) { + Ue.media.buffered = e.loadProgress, + A(Ue.media, "progress"), + 1 === parseInt(e.loadProgress) && A(Ue.media, "canplaythrough") + }), + Ue.embed.bind(e.SC.Widget.Events.FINISH, + function() { + Ue.media.paused = !0, + A(Ue.media, "ended") + }) + }) + } + function le() { + "play" in Ue.media && Ue.media.play() + } + function ue() { + "pause" in Ue.media && Ue.media.pause() + } + function ce(e) { + return O.boolean(e) || (e = Ue.media.paused), + e ? le() : ue(), + e + } + function de(e) { + O.number(e) || (e = E.seekTime), + me(Ue.media.currentTime - e) + } + function pe(e) { + O.number(e) || (e = E.seekTime), + me(Ue.media.currentTime + e) + } + function me(e) { + var t = 0, + n = Ue.media.paused, + r = fe(); + O.number(e) ? t = e: O.object(e) && s(["input", "change"], e.type) && (t = e.target.value / e.target.max * r), + t < 0 ? t = 0 : t > r && (t = r), + Ne(t); + try { + Ue.media.currentTime = t.toFixed(4) + } catch(e) {} + if (s(E.types.embed, Ue.type)) { + switch (Ue.type) { + case "youtube": + Ue.embed.seekTo(t); + break; + case "vimeo": + Ue.embed.setCurrentTime(t.toFixed(0)); + break; + case "soundcloud": + Ue.embed.seekTo(1e3 * t) + } + n && ue(), + A(Ue.media, "timeupdate"), + Ue.media.seeking = !0, + A(Ue.media, "seeking") + } + Je("Seeking to " + Ue.media.currentTime + " seconds"), + W(t) + } + function fe() { + var e = parseInt(E.duration), + t = 0; + return null === Ue.media.duration || isNaN(Ue.media.duration) || (t = Ue.media.duration), + isNaN(e) ? t: e + } + function ye() { + m(Ue.container, E.classes.playing, !Ue.media.paused), + m(Ue.container, E.classes.stopped, Ue.media.paused), + Me(Ue.media.paused) + } + function be() { + P = { + x: e.pageXOffset || 0, + y: e.pageYOffset || 0 + } + } + function ve() { + e.scrollTo(P.x, P.y) + } + function ge(e) { + var n = N.supportsFullScreen; + if (n) { + if (!e || e.type !== N.fullScreenEventName) return N.isFullScreen(Ue.container) ? N.cancelFullScreen() : (be(), N.requestFullScreen(Ue.container)), + void(Ue.isFullscreen = N.isFullScreen(Ue.container)); + Ue.isFullscreen = N.isFullScreen(Ue.container) + } else Ue.isFullscreen = !Ue.isFullscreen, + t.body.style.overflow = Ue.isFullscreen ? "hidden": ""; + m(Ue.container, E.classes.fullscreen.active, Ue.isFullscreen), + $(Ue.isFullscreen), + Ue.buttons && Ue.buttons.fullscreen && k(Ue.buttons.fullscreen, Ue.isFullscreen), + A(Ue.container, Ue.isFullscreen ? "enterfullscreen": "exitfullscreen", !0), + !Ue.isFullscreen && n && ve() + } + function he(e) { + if (O.boolean(e) || (e = !Ue.media.muted), k(Ue.buttons.mute, e), Ue.media.muted = e, 0 === Ue.media.volume && ke(E.volume), s(E.types.embed, Ue.type)) { + switch (Ue.type) { + case "youtube": + Ue.embed[Ue.media.muted ? "mute": "unMute"](); + break; + case "vimeo": + case "soundcloud": + Ue.embed.setVolume(Ue.media.muted ? 0 : parseFloat(E.volume / E.volumeMax)) + } + A(Ue.media, "volumechange") + } + } + function ke(e) { + var t = E.volumeMax, + n = E.volumeMin; + if (O.undefined(e) && (e = Ue.storage.volume), (null === e || isNaN(e)) && (e = E.volume), e > t && (e = t), e < n && (e = n), Ue.media.volume = parseFloat(e / t), Ue.volume.display && (Ue.volume.display.value = e), s(E.types.embed, Ue.type)) { + switch (Ue.type) { + case "youtube": + Ue.embed.setVolume(100 * Ue.media.volume); + break; + case "vimeo": + case "soundcloud": + Ue.embed.setVolume(Ue.media.volume) + } + A(Ue.media, "volumechange") + } + 0 === e ? Ue.media.muted = !0 : Ue.media.muted && e > 0 && he() + } + function we(e) { + var t = Ue.media.muted ? 0 : Ue.media.volume * E.volumeMax; + O.number(e) || (e = E.volumeStep), + ke(t + e) + } + function xe(e) { + var t = Ue.media.muted ? 0 : Ue.media.volume * E.volumeMax; + O.number(e) || (e = E.volumeStep), + ke(t - e) + } + function Te() { + var e = Ue.media.muted ? 0 : Ue.media.volume * E.volumeMax; + Ue.supported.full && (Ue.volume.input && (Ue.volume.input.value = e), Ue.volume.display && (Ue.volume.display.value = e)), + te({ + volume: e + }), + m(Ue.container, E.classes.muted, 0 === e), + Ue.supported.full && Ue.buttons.mute && k(Ue.buttons.mute, 0 === e) + } + function Se(e) { + Ue.supported.full && Ue.buttons.captions && (O.boolean(e) || (e = Ue.container.className.indexOf(E.classes.captions.active) === -1), Ue.captionsEnabled = e, k(Ue.buttons.captions, Ue.captionsEnabled), m(Ue.container, E.classes.captions.active, Ue.captionsEnabled), A(Ue.container, Ue.captionsEnabled ? "captionsenabled": "captionsdisabled", !0), te({ + captionsEnabled: Ue.captionsEnabled + })) + } + function _e(e) { + var t = "waiting" === e.type; + clearTimeout(Xe.loading), + Xe.loading = setTimeout(function() { + m(Ue.container, E.classes.loading, t), + Me(t) + }, + t ? 250 : 0) + } + function Ee(e) { + if (Ue.supported.full) { + var t = Ue.progress.played, + n = 0, + r = fe(); + if (e) switch (e.type) { + case "timeupdate": + case "seeking": + if (Ue.controls.pressed) return; + n = w(Ue.media.currentTime, r), + "timeupdate" === e.type && Ue.buttons.seek && (Ue.buttons.seek.value = n); + break; + case "playing": + case "progress": + t = Ue.progress.buffer, + n = function() { + var e = Ue.media.buffered; + return e && e.length ? w(e.end(0), r) : O.number(e) ? 100 * e: 0 + } () + } + Ce(t, n) + } + } + function Ce(e, t) { + if (Ue.supported.full) { + if (O.undefined(t) && (t = 0), O.undefined(e)) { + if (!Ue.progress || !Ue.progress.buffer) return; + e = Ue.progress.buffer + } + O.htmlElement(e) ? e.value = t: e && (e.bar && (e.bar.value = t), e.text && (e.text.innerHTML = t)) + } + } + function Fe(e, t) { + if (t) { + isNaN(e) && (e = 0), + Ue.secs = parseInt(e % 60), + Ue.mins = parseInt(e / 60 % 60), + Ue.hours = parseInt(e / 60 / 60 % 60); + var n = parseInt(fe() / 60 / 60 % 60) > 0; + Ue.secs = ("0" + Ue.secs).slice( - 2), + Ue.mins = ("0" + Ue.mins).slice( - 2), + t.innerHTML = (n ? Ue.hours + ":": "") + Ue.mins + ":" + Ue.secs + } + } + function Ae() { + if (Ue.supported.full) { + var e = fe() || 0; ! Ue.duration && E.displayDuration && Ue.media.paused && Fe(e, Ue.currentTime), + Ue.duration && Fe(e, Ue.duration), + Pe() + } + } + function Ie(e) { + Fe(Ue.media.currentTime, Ue.currentTime), + e && "timeupdate" === e.type && Ue.media.seeking || Ee(e) + } + function Ne(e) { + O.number(e) || (e = 0); + var t = fe(), + n = w(e, t); + Ue.progress && Ue.progress.played && (Ue.progress.played.value = n), + Ue.buttons && Ue.buttons.seek && (Ue.buttons.seek.value = n) + } + function Pe(e) { + var t = fe(); + if (E.tooltips.seek && Ue.progress.container && 0 !== t) { + var n = Ue.progress.container.getBoundingClientRect(), + r = 0, + a = E.classes.tooltip + "--visible"; + if (e) r = 100 / n.width * (e.pageX - n.left); + else { + if (!f(Ue.progress.tooltip, a)) return; + r = Ue.progress.tooltip.style.left.replace("%", "") + } + r < 0 ? r = 0 : r > 100 && (r = 100), + Fe(t / 100 * r, Ue.progress.tooltip), + Ue.progress.tooltip.style.left = r + "%", + e && s(["mouseenter", "mouseleave"], e.type) && m(Ue.progress.tooltip, a, "mouseenter" === e.type) + } + } + function Me(t) { + if (E.hideControls && "audio" !== Ue.type) { + var n = 0, + r = !1, + a = t, + o = f(Ue.container, E.classes.loading); + if (O.boolean(t) || (t && t.type ? (r = "enterfullscreen" === t.type, a = s(["mousemove", "touchstart", "mouseenter", "focus"], t.type), s(["mousemove", "touchmove"], t.type) && (n = 2e3), "focus" === t.type && (n = 3e3)) : a = f(Ue.container, E.classes.hideControls)), e.clearTimeout(Xe.hover), a || Ue.media.paused || o) { + if (m(Ue.container, E.classes.hideControls, !1), Ue.media.paused || o) return; + Ue.browser.isTouch && (n = 3e3) + } + a && Ue.media.paused || (Xe.hover = e.setTimeout(function() { (!Ue.controls.pressed && !Ue.controls.hover || r) && m(Ue.container, E.classes.hideControls, !0) + }, + n)) + } + } + function Oe(e) { + if (!O.undefined(e)) return void Le(e); + var t; + switch (Ue.type) { + case "youtube": + t = Ue.embed.getVideoUrl(); + break; + case "vimeo": + Ue.embed.getVideoUrl.then(function(e) { + t = e + }); + break; + case "soundcloud": + Ue.embed.getCurrentSound(function(e) { + t = e.permalink_url + }); + break; + default: + t = Ue.media.currentSrc + } + return t || "" + } + function Le(e) { + function n() { + if (Ue.embed = null, l(Ue.media), "video" === Ue.type && Ue.videoContainer && l(Ue.videoContainer), Ue.container && Ue.container.removeAttribute("class"), "type" in e && (Ue.type = e.type, "video" === Ue.type)) { + var n = e.sources[0]; + "type" in n && s(E.types.embed, n.type) && (Ue.type = n.type) + } + switch (Ue.supported = F(Ue.type), Ue.type) { + case "video": + Ue.media = t.createElement("video"); + break; + case "audio": + Ue.media = t.createElement("audio"); + break; + case "youtube": + case "vimeo": + case "soundcloud": + Ue.media = t.createElement("div"), + Ue.embedId = e.sources[0].src + } + u(Ue.container, Ue.media), + O.boolean(e.autoplay) && (E.autoplay = e.autoplay), + s(E.types.html5, Ue.type) && (E.crossorigin && Ue.media.setAttribute("crossorigin", ""), E.autoplay && Ue.media.setAttribute("autoplay", ""), "poster" in e && Ue.media.setAttribute("poster", e.poster), E.loop && Ue.media.setAttribute("loop", "")), + m(Ue.container, E.classes.fullscreen.active, Ue.isFullscreen), + m(Ue.container, E.classes.captions.active, Ue.captionsEnabled), + K(), + s(E.types.html5, Ue.type) && J("source", e.sources), + ne(), + s(E.types.html5, Ue.type) && ("tracks" in e && J("track", e.tracks), Ue.media.load()), + (s(E.types.html5, Ue.type) || s(E.types.embed, Ue.type) && !Ue.supported.full) && (We(), Ye()), + E.title = e.title, + Z() + } + return O.object(e) && "sources" in e && e.sources.length ? (m(Ue.container, E.classes.ready, !1), ue(), Ne(), Ce(), qe(), void De(n, !1)) : void ze("Invalid source format") + } + function je(e) { + "video" === Ue.type && Ue.media.setAttribute("poster", e) + } + function Ve() { + function n() { + var e = ce(), + t = Ue.buttons[e ? "play": "pause"], + n = Ue.buttons[e ? "pause": "play"]; + if (n = n && n.length > 1 ? n[n.length - 1] : n[0]) { + var r = f(t, E.classes.tabFocus); + setTimeout(function() { + n.focus(), + r && (m(t, E.classes.tabFocus, !1), m(n, E.classes.tabFocus, !0)) + }, + 100) + } + } + function r() { + var e = t.activeElement; + return e = e && e !== t.body ? t.querySelector(":focus") : null + } + function a(e) { + return e.keyCode ? e.keyCode: e.which + } + function o(e) { + for (var t in Ue.buttons) { + var n = Ue.buttons[t]; + if (O.nodeList(n)) for (var r = 0; r < n.length; r++) m(n[r], E.classes.tabFocus, n[r] === e); + else m(n, E.classes.tabFocus, n === e) + } + } + function i(e) { + function t() { + var e = Ue.media.duration; + O.number(e) && me(e / 10 * (n - 48)) + } + var n = a(e), + r = "keydown" === e.type, + o = r && n === u; + if (O.number(n)) if (r) { + var i = [48, 49, 50, 51, 52, 53, 54, 56, 57, 32, 75, 38, 40, 77, 39, 37, 70, 67]; + switch (s(i, n) && (e.preventDefault(), e.stopPropagation()), n) { + case 48: + case 49: + case 50: + case 51: + case 52: + case 53: + case 54: + case 55: + case 56: + case 57: + o || t(); + break; + case 32: + case 75: + o || ce(); + break; + case 38: + we(); + break; + case 40: + xe(); + break; + case 77: + o || he(); + break; + case 39: + pe(); + break; + case 37: + de(); + break; + case 70: + ge(); + break; + case 67: + o || Se() + } ! N.supportsFullScreen && Ue.isFullscreen && 27 === n && ge(), + u = n + } else u = null + } + var l = Ue.browser.isIE ? "change": "input"; + if (E.keyboardShorcuts.focused) { + var u = null; + E.keyboardShorcuts.global && g(e, "keydown keyup", + function(e) { + var t = a(e), + n = r(), + o = [48, 49, 50, 51, 52, 53, 54, 56, 57, 75, 77, 70, 67], + l = I().length; + 1 !== l || !s(o, t) || O.htmlElement(n) && y(n, E.selectors.editable) || i(e) + }), + g(Ue.container, "keydown keyup", i) + } + g(e, "keyup", + function(e) { + var t = a(e), + n = r(); + 9 === t && o(n) + }), + g(t.body, "click", + function() { + m(U("." + E.classes.tabFocus), E.classes.tabFocus, !1) + }); + for (var c in Ue.buttons) { + var d = Ue.buttons[c]; + g(d, "blur", + function() { + m(d, "tab-focus", !1); + }) + } + b(Ue.buttons.play, "click", E.listeners.play, n), + b(Ue.buttons.pause, "click", E.listeners.pause, n), + b(Ue.buttons.restart, "click", E.listeners.restart, me), + b(Ue.buttons.rewind, "click", E.listeners.rewind, de), + b(Ue.buttons.forward, "click", E.listeners.forward, pe), + b(Ue.buttons.seek, l, E.listeners.seek, me), + b(Ue.volume.input, l, E.listeners.volume, + function() { + ke(Ue.volume.input.value) + }), + b(Ue.buttons.mute, "click", E.listeners.mute, he), + b(Ue.buttons.fullscreen, "click", E.listeners.fullscreen, ge), + N.supportsFullScreen && g(t, N.fullScreenEventName, ge), + g(Ue.buttons.captions, "click", Se), + g(Ue.progress.container, "mouseenter mouseleave mousemove", Pe), + E.hideControls && (g(Ue.container, "mouseenter mouseleave mousemove touchstart touchend touchcancel touchmove enterfullscreen", Me), g(Ue.controls, "mouseenter mouseleave", + function(e) { + Ue.controls.hover = "mouseenter" === e.type + }), g(Ue.controls, "mousedown mouseup touchstart touchend touchcancel", + function(e) { + Ue.controls.pressed = s(["mousedown", "touchstart"], e.type) + }), g(Ue.controls, "focus blur", Me, !0)), + g(Ue.volume.input, "wheel", + function(e) { + e.preventDefault(); + var t = e.webkitDirectionInvertedFromDevice, + n = E.volumeStep / 5; (e.deltaY < 0 || e.deltaX > 0) && (t ? xe(n) : we(n)), + (e.deltaY > 0 || e.deltaX < 0) && (t ? we(n) : xe(n)) + }) + } + function Re() { + if (g(Ue.media, "timeupdate seeking", Ie), g(Ue.media, "timeupdate", W), g(Ue.media, "durationchange loadedmetadata", Ae), g(Ue.media, "ended", + function() { + "video" === Ue.type && E.showPosterOnEnd && ("video" === Ue.type && H(), me(), Ue.media.load()) + }), g(Ue.media, "progress playing", Ee), g(Ue.media, "volumechange", Te), g(Ue.media, "play pause ended", ye), g(Ue.media, "waiting canplay seeked", _e), E.clickToPlay && "audio" !== Ue.type) { + var e = U("." + E.classes.videoWrapper); + if (!e) return; + e.style.cursor = "pointer", + g(e, "click", + function() { + E.hideControls && Ue.browser.isTouch && !Ue.media.paused || (Ue.media.paused ? le() : Ue.media.ended ? (me(), le()) : ue()) + }) + } + E.disableContextMenu && g(Ue.media, "contextmenu", + function(e) { + e.preventDefault() + }), + g(Ue.media, E.events.concat(["keyup", "keydown"]).join(" "), + function(e) { + A(Ue.container, e.type, !0) + }) + } + function qe() { + if (s(E.types.html5, Ue.type)) { + for (var e = Ue.media.querySelectorAll("source"), t = 0; t < e.length; t++) l(e[t]); + Ue.media.setAttribute("src", "https://cdn.selz.com/plyr/blank.mp4"), + Ue.media.load(), + Je("Cancelled network requests") + } + } + function De(n, r) { + function a() { + clearTimeout(Xe.cleanUp), + O.boolean(r) || (r = !0), + O. + function(n) && n.call($e), + r && (Ue.init = !1, Ue.container.parentNode.replaceChild($e, Ue.container), t.body.style.overflow = "", A($e, "destroyed", !0)) + } + if (!Ue.init) return null; + switch (Ue.type) { + case "youtube": + e.clearInterval(Xe.buffering), + e.clearInterval(Xe.playing), + Ue.embed.destroy(), + a(); + break; + case "vimeo": + Ue.embed.unload().then(a), + Xe.cleanUp = e.setTimeout(a, 200); + break; + case "video": + case "audio": + Q(!0), + a() + } + } + function He() { + if (Ue.init) return null; + if (N = _(), Ue.browser = n(), O.htmlElement(Ue.media)) { + ee(); + var e = v.tagName.toLowerCase(); + "div" === e ? (Ue.type = v.getAttribute("data-type"), Ue.embedId = v.getAttribute("data-video-id"), v.removeAttribute("data-type"), v.removeAttribute("data-video-id")) : (Ue.type = e, E.crossorigin = null !== v.getAttribute("crossorigin"), E.autoplay = E.autoplay || null !== v.getAttribute("autoplay"), E.loop = E.loop || null !== v.getAttribute("loop")), + Ue.supported = F(Ue.type), + Ue.supported.basic && (Ue.container = i(v, t.createElement("div")), Ue.container.setAttribute("tabindex", 0), K(), Je("" + Ue.browser.name + " " + Ue.browser.version), ne(), (s(E.types.html5, Ue.type) || s(E.types.embed, Ue.type) && !Ue.supported.full) && (We(), Ye(), Z()), Ue.init = !0) + } + } + function We() { + if (!Ue.supported.full) return ze("Basic support only", Ue.type), + l(U(E.selectors.controls.wrapper)), + l(U(E.selectors.buttons.play)), + void Q(!0); + var e = !B(E.selectors.controls.wrapper).length; + e && z(), + G() && (e && Ve(), Re(), Q(), q(), D(), ke(), Te(), Ie(), ye()) + } + function Ye() { + e.setTimeout(function() { + A(Ue.media, "ready") + }, + 0), + m(Ue.media, M.classes.setup, !0), + m(Ue.container, E.classes.ready, !0), + Ue.media.plyr = Be, + E.autoplay && le() + } + var Be, Ue = this, + Xe = {}; + Ue.media = v; + var $e = v.cloneNode(!0), + Je = function() { + j("log", arguments) + }, + ze = function() { + j("warn", arguments) + }; + return Je("Config", E), + Be = { + getOriginal: function() { + return $e + }, + getContainer: function() { + return Ue.container + }, + getEmbed: function() { + return Ue.embed + }, + getMedia: function() { + return Ue.media + }, + getType: function() { + return Ue.type + }, + getDuration: fe, + getCurrentTime: function() { + return Ue.media.currentTime + }, + getVolume: function() { + return Ue.media.volume + }, + isMuted: function() { + return Ue.media.muted + }, + isReady: function() { + return f(Ue.container, E.classes.ready) + }, + isLoading: function() { + return f(Ue.container, E.classes.loading) + }, + isPaused: function() { + return Ue.media.paused + }, + on: function(e, t) { + return g(Ue.container, e, t), + this + }, + play: le, + pause: ue, + stop: function() { + ue(), + me() + }, + restart: me, + rewind: de, + forward: pe, + seek: me, + source: Oe, + poster: je, + setVolume: ke, + togglePlay: ce, + toggleMute: he, + toggleCaptions: Se, + toggleFullscreen: ge, + toggleControls: Me, + isFullscreen: function() { + return Ue.isFullscreen || !1 + }, + support: function(e) { + return r(Ue, e) + }, + destroy: De + }, + He(), + Ue.init ? Be: null + } + function C(e, n) { + var r = new XMLHttpRequest; + if (!O.string(n) || !O.htmlElement(t.querySelector("#" + n))) { + var a = t.createElement("div"); + a.setAttribute("hidden", ""), + O.string(n) && a.setAttribute("id", n), + t.body.insertBefore(a, t.body.childNodes[0]), + "withCredentials" in r && (r.open("GET", e, !0), r.onload = function() { + a.innerHTML = r.responseText + }, + r.send()) + } + } + function F(e) { + var r = n(), + a = r.isIE && r.version <= 9, + s = r.isIos, + o = r.isIphone, + i = !!t.createElement("audio").canPlayType, + l = !!t.createElement("video").canPlayType, + u = !1, + c = !1; + switch (e) { + case "video": + u = l, + c = u && !a && !o; + break; + case "audio": + u = i, + c = u && !a; + break; + case "vimeo": + u = !0, + c = !a && !s; + break; + case "youtube": + u = !0, + c = !a && !s, + s && !o && r.version >= 10 && (c = !0); + break; + case "soundcloud": + u = !0, + c = !a && !o; + break; + default: + u = i && l, + c = u && !a + } + return { + basic: u, + full: c + } + } + function A(e, n) { + function r(e, t) { + f(t, M.classes.hook) || a.push({ + target: e, + media: t + }) + } + var a = [], + s = [], + o = [M.selectors.html5, M.selectors.embed].join(","); + if (O.string(e) ? e = t.querySelectorAll(e) : O.htmlElement(e) ? e = [e] : O.nodeList(e) || O.array(e) || O.string(e) || (O.undefined(n) && O.object(e) && (n = e), e = t.querySelectorAll(o)), O.nodeList(e) && (e = Array.prototype.slice.call(e)), !F().basic || !e.length) return ! 1; + for (var i = 0; i < e.length; i++) { + var l = e[i], + u = l.querySelectorAll(o); + if (u.length) for (var c = 0; c < u.length; c++) r(l, u[c]); + else y(l, o) && r(l, l) + } + return a.forEach(function(e) { + var t = e.target, + r = e.media, + a = !1; + r === t && (a = !0); + var o = {}; + try { + o = JSON.parse(t.getAttribute("data-plyr")) + } catch(e) {} + var i = x({}, + M, n, o); + if (!i.enabled) return null; + var l = new E(r, i); + if (O.object(l)) { + if (i.debug) { + var u = i.events.concat(["setup", "statechange", "enterfullscreen", "exitfullscreen", "captionsenabled", "captionsdisabled"]); + g(l.getContainer(), u.join(" "), + function(e) { + console.log([i.logPrefix, "event:", e.type].join(" "), e.detail.plyr) + }) + } + h(l.getContainer(), "setup", !0, { + plyr: l + }), + s.push(l) + } + }), + s + } + function I(e) { + if (O.string(e) ? e = t.querySelector(e) : O.undefined(e) && (e = t.body), O.htmlElement(e)) { + var n = e.querySelectorAll("." + M.classes.setup), + r = []; + return Array.prototype.slice.call(n).forEach(function(e) { + O.object(e.plyr) && r.push(e.plyr) + }), + r + } + return [] + } + var N, P = { + x: 0, + y: 0 + }, + M = { + enabled: !0, + debug: !1, + autoplay: !1, + loop: !1, + seekTime: 10, + volume: 10, + volumeMin: 0, + volumeMax: 10, + volumeStep: 1, + duration: null, + displayDuration: !0, + loadSprite: !0, + iconPrefix: "plyr", + iconUrl: "https://cdn.plyr.io/2.0.10/plyr.svg", + clickToPlay: !0, + hideControls: !0, + showPosterOnEnd: !1, + disableContextMenu: !0, + keyboardShorcuts: { + focused: !0, + global: !1 + }, + tooltips: { + controls: !1, + seek: !0 + }, + selectors: { + html5: "video, audio", + embed: "[data-type]", + editable: "input, textarea, select, [contenteditable]", + container: ".plyr", + controls: { + container: null, + wrapper: ".plyr__controls" + }, + labels: "[data-plyr]", + buttons: { + seek: '[data-plyr="seek"]', + play: '[data-plyr="play"]', + pause: '[data-plyr="pause"]', + restart: '[data-plyr="restart"]', + rewind: '[data-plyr="rewind"]', + forward: '[data-plyr="fast-forward"]', + mute: '[data-plyr="mute"]', + captions: '[data-plyr="captions"]', + fullscreen: '[data-plyr="fullscreen"]' + }, + volume: { + input: '[data-plyr="volume"]', + display: ".plyr__volume--display" + }, + progress: { + container: ".plyr__progress", + buffer: ".plyr__progress--buffer", + played: ".plyr__progress--played" + }, + captions: ".plyr__captions", + currentTime: ".plyr__time--current", + duration: ".plyr__time--duration" + }, + classes: { + setup: "plyr--setup", + ready: "plyr--ready", + videoWrapper: "plyr__video-wrapper", + embedWrapper: "plyr__video-embed", + type: "plyr--{0}", + stopped: "plyr--stopped", + playing: "plyr--playing", + muted: "plyr--muted", + loading: "plyr--loading", + hover: "plyr--hover", + tooltip: "plyr__tooltip", + hidden: "plyr__sr-only", + hideControls: "plyr--hide-controls", + isIos: "plyr--is-ios", + isTouch: "plyr--is-touch", + captions: { + enabled: "plyr--captions-enabled", + active: "plyr--captions-active" + }, + fullscreen: { + enabled: "plyr--fullscreen-enabled", + active: "plyr--fullscreen-active" + }, + tabFocus: "tab-focus" + }, + captions: { + defaultActive: !1 + }, + fullscreen: { + enabled: !0, + fallback: !0, + allowAudio: !1 + }, + storage: { + enabled: !0, + key: "plyr" + }, + controls: ["play-large", "play", "progress", "current-time", "mute", "volume", "captions", "fullscreen"], + i18n: { + restart: "Restart", + rewind: "Rewind {seektime} secs", + play: "Play", + pause: "Pause", + forward: "Forward {seektime} secs", + played: "played", + buffered: "buffered", + currentTime: "Current time", + duration: "Duration", + volume: "Volume", + toggleMute: "Toggle Mute", + toggleCaptions: "Toggle Captions", + toggleFullscreen: "Toggle Fullscreen", + frameTitle: "Player for {title}" + }, + types: { + embed: ["youtube", "vimeo", "soundcloud"], + html5: ["video", "audio"] + }, + urls: { + vimeo: { + api: "https://player.vimeo.com/api/player.js" + }, + youtube: { + api: "https://www.youtube.com/iframe_api" + }, + soundcloud: { + api: "https://w.soundcloud.com/player/api.js" + } + }, + listeners: { + seek: null, + play: null, + pause: null, + restart: null, + rewind: null, + forward: null, + mute: null, + volume: null, + captions: null, + fullscreen: null + }, + events: ["ready", "ended", "progress", "stalled", "playing", "waiting", "canplay", "canplaythrough", "loadstart", "loadeddata", "loadedmetadata", "timeupdate", "volumechange", "play", "pause", "error", "seeking", "seeked", "emptied"], + logPrefix: "[Plyr]" + }, + O = { + object: function(e) { + return null !== e && "object" == typeof e + }, + array: function(e) { + return null !== e && "object" == typeof e && e.constructor === Array + }, + number: function(e) { + return null !== e && ("number" == typeof e && !isNaN(e - 0) || "object" == typeof e && e.constructor === Number) + }, + string: function(e) { + return null !== e && ("string" == typeof e || "object" == typeof e && e.constructor === String) + }, + boolean: function(e) { + return null !== e && "boolean" == typeof e + }, + nodeList: function(e) { + return null !== e && e instanceof NodeList + }, + htmlElement: function(e) { + return null !== e && e instanceof HTMLElement + }, + function: function(e) { + return null !== e && "function" == typeof e + }, + undefined: function(e) { + return null !== e && "undefined" == typeof e + } + }, + L = { + supported: function() { + if (! ("localStorage" in e)) return ! 1; + try { + e.localStorage.setItem("___test", "OK"); + var t = e.localStorage.getItem("___test"); + return e.localStorage.removeItem("___test"), + "OK" === t + } catch(e) { + return ! 1 + } + return ! 1 + } () + }; + return { + setup: A, + supported: F, + loadSprite: C, + get: I + } + }), + function() { + function e(e, t) { + t = t || { + bubbles: !1, + cancelable: !1, + detail: void 0 + }; + var n = document.createEvent("CustomEvent"); + return n.initCustomEvent(e, t.bubbles, t.cancelable, t.detail), + n + } + "function" != typeof window.CustomEvent && (e.prototype = window.Event.prototype, window.CustomEvent = e) + } (); exports('plyr', plyr); -}); +}); \ No newline at end of file diff --git a/public/static/res/mods/user.js b/public/static/res/mods/user.js index 18b3949..6a0ca0a 100644 --- a/public/static/res/mods/user.js +++ b/public/static/res/mods/user.js @@ -16,6 +16,7 @@ layui.define(['laypage', 'fly', 'element', 'flow'], function(exports){ var flow = layui.flow; var element = layui.element; var upload = layui.upload; + var table = layui.table; var gather = {}, dom = { mine: $('#LAY_mine') @@ -26,115 +27,109 @@ layui.define(['laypage', 'fly', 'element', 'flow'], function(exports){ //我的相关数据 + + //发贴list + var post = table.render({ + elem: '#art-post' + ,url: artListUrl //进列表接口 + ,title: '' + ,cols: [[ + {type: 'numbers', fixed: 'left'} + ,{field: 'title', title: '标题',minWidth: 250 ,templet: ''} + ,{field: 'status', title: '状态', Width: 80} + ,{field: 'ctime', title: '时间', width: 120} + ,{field: 'datas', title: '数据', width: 120} + ,{title: '操作', width: 150, align: 'center', toolbar: '#artTool'} + ]] + ,text: '对不起,加载出现异常!' + ,page: true + }); + + //收藏list + table.render({ + elem: '#coll-post' + ,url: collListUrl //进列表接口 + ,title: '' + ,cols: [[ + {type: 'numbers', fixed: 'left'} + ,{field: 'title', title: '标题',minWidth: 250,templet: ''} + ,{field: 'auther', title: '作者', width: 120} + ,{field: 'ctime', title: '时间', width: 120} + ,{title: '取消', width: 80, align: 'center', toolbar: '#collTool'} + ]] + ,text: '对不起,加载出现异常!' + ,page: true + }); + + //监听行工具事件 + table.on('tool(art-post)', function(obj){ + var data = obj.data; + var id = data.id; + if(obj.event === 'del'){ + layer.confirm('确定删除吗?',{ + title:'删除文章', + icon:3 + },function(index){ + layer.close(index); + $.post(atrDelUrl,{"id":id},function(data){ + if(data.code == 0){ + layer.msg(data.msg,{ + icon:6, + time:2000 + }); + } else { + layer.open({ + title:'删除失败', + content:data.msg, + icon:5, + adim:6 + }) + } + } + ); + table.reload('art-post'); + }); + + } else if(obj.event === 'edit'){//编辑 + $.post(artEditUrl,{"id":id},function(){ + location.href = artEditUrl + '?id=' + id; + }); + } + + }); + + //监听行工具事件 + table.on('tool(coll-post)', function(obj){ + var id = obj.data.id; + if(obj.event === 'del'){ + layer.confirm('确定取消收藏?',{ + title:'取消收藏', + icon:3 + },function(index){ + layer.close(index); + $.post(collDelUrl,{"id":id},function(data){ + if(data.code == 0){ + layer.msg(data.msg,{ + icon:6, + time:2000 + }); + } else { + layer.open({ + title:'取消失败', + content:data.msg, + icon:5, + adim:6 + }) + } + } + ); + table.reload('coll-post'); + }); + } + }); + var elemUC = $('#LAY_uc'), elemUCM = $('#LAY_ucm'); gather.minelog = {}; -/* - gather.mine = function(index, type, url){ - var tpl = [ - //求解 - '{{# for(var i = 0; i < d.rows.length; i++){ }}\ -
  • \ - {{# if(d.rows[i].collection_time){ }}\ - {{= d.rows[i].title}}\ - {{ d.rows[i].collection_time }} 收藏\ - {{# } else { }}\ - {{# if(d.rows[i].status == 1){ }}\ - \ - {{# } }}\ - {{# if(d.rows[i].accept >= 0){ }}\ - 已结\ - {{# } else { }}\ - 未结\ - {{# } }}\ - {{# if(d.rows[i].status == -1){ }}\ - 审核中\ - {{# } }}\ - {{= d.rows[i].title}}\ - {{ layui.util.timeAgo(d.rows[i].time, 1) }}\ - {{# if(d.rows[i].accept == -1){ }}\ - 编辑\ - {{# } }}\ - {{d.rows[i].hits}}阅/{{d.rows[i].comment}}答\ - {{# } }}\ -
  • \ - {{# } }}' - ]; - - var view = function(res){ - var html = laytpl(tpl[0]).render(res); - dom.mine.children().eq(index).find('span').html(res.count); - elemUCM.children().eq(index).find('ul').html(res.rows.length === 0 ? '
    没有相关数据
    ' : html); - }; - - var page = function(now){ - var curr = now || 1; - if(gather.minelog[type + '-page-' + curr]){ - view(gather.minelog[type + '-page-' + curr]); - } else { - //我收藏的帖 - if(type === 'collection'){ - var nums = 10; //每页出现的数据量 - fly.json(url, {}, function(res){ - res.count = res.rows.length; - - var rows = layui.sort(res.rows, 'collection_timestamp', 'desc') - ,render = function(curr){ - var data = [] - ,start = curr*nums - nums - ,last = start + nums - 1; - - if(last >= rows.length){ - last = curr > 1 ? start + (rows.length - start - 1) : rows.length - 1; - } - - for(var i = start; i <= last; i++){ - data.push(rows[i]); - } - - res.rows = data; - - view(res); - }; - - render(curr) - gather.minelog['collect-page-' + curr] = res; - - now || laypage.render({ - elem: 'LAY_page1' - ,count: rows.length - ,curr: curr - ,jump: function(e, first){ - if(!first){ - render(e.curr); - } - } - }); - }); - } else { - fly.json('/api/'+ type +'/', { - page: curr - }, function(res){ - view(res); - gather.minelog['mine-jie-page-' + curr] = res; - now || laypage.render({ - elem: 'LAY_page' - ,count: res.count - ,curr: curr - ,jump: function(e, first){ - if(!first){ - page(e.curr); - } - } - }); - }); - } - } - }; - - if(!gather.minelog[type]){ - page(); - } - }; if(elemUC[0]){ layui.each(dom.mine.children(), function(index, item){ @@ -142,7 +137,7 @@ layui.define(['laypage', 'fly', 'element', 'flow'], function(exports){ gather.mine(index, othis.data('type'), othis.data('url')); }); } -*/ + //显示当前tab if(location.hash){ element.tabChange('user', location.hash.replace(/^#/, '')); diff --git a/view/taoler/index/article/add.html b/view/taoler/index/article/add.html index 0762dcc..2c6d1bf 100644 --- a/view/taoler/index/article/add.html +++ b/view/taoler/index/article/add.html @@ -1,6 +1,7 @@ {extend name="public/base" /} {block name="title"}发表帖子{/block} +{block name="link"}{/block} {block name="column"}{/block} {block name="content"}
    @@ -142,12 +143,13 @@ }); diff --git a/view/taoler/index/article/cate.html b/view/taoler/index/article/cate.html index f0e3146..5d7be15 100644 --- a/view/taoler/index/article/cate.html +++ b/view/taoler/index/article/cate.html @@ -46,7 +46,6 @@
    - {if ($art.is_top == 1)} {:lang('top')} {/if} {if ($art.is_hot == 1)} {:lang('hot')} {/if}
    diff --git a/view/taoler/index/article/detail.html b/view/taoler/index/article/detail.html index d5788e8..12bcc72 100644 --- a/view/taoler/index/article/detail.html +++ b/view/taoler/index/article/detail.html @@ -3,6 +3,7 @@ {block name="title"}{$article.title}-{$sysInfo.webname}{/block} {block name="keywords"}{$article.title},{$article.tags}{/block} {block name="description"}{$article.title},{:getArtContent($article.content)}{/block} +{block name="link"}{/block} {block name="column"}
    {include file="/public/column" /}
    {/block} {block name="content"}
    @@ -228,10 +229,12 @@ var collectionFind = "{:url('Collection/find')}", commentJiedaDelete = "{:url('Comment/jiedaDelete')}", langCollection = "{:lang('collection')}", langCancelCollection = "{:lang('cancel collection')}"; -layui.use(['fly', 'face','colorpicker'], function(){ + +layui.use(['fly', 'face','colorpicker','plyr'], function(){ var $ = layui.$ ,fly = layui.fly - ,colorpicker = layui.colorpicker; + ,colorpicker = layui.colorpicker + ,plyr = layui.plyr; //预定义颜色项 colorpicker.render({ @@ -322,6 +325,8 @@ layui.use(['fly', 'face','colorpicker'], function(){ var othis = $(this), html = othis.html(); othis.html(fly.content(html)); }) + //加载播放器 + plyr.setup(); }); diff --git a/view/taoler/index/article/edit.html b/view/taoler/index/article/edit.html index dd66117..fe4ec36 100644 --- a/view/taoler/index/article/edit.html +++ b/view/taoler/index/article/edit.html @@ -1,6 +1,7 @@ {extend name="public/base" /} {block name="title"}编辑帖子{/block} +{block name="link"}{/block} {block name="column"}{/block} {block name="content"}
    @@ -139,11 +140,13 @@ {block name="script"} diff --git a/view/taoler/index/public/base.html b/view/taoler/index/public/base.html index f4e8821..ee59b38 100644 --- a/view/taoler/index/public/base.html +++ b/view/taoler/index/public/base.html @@ -8,6 +8,7 @@ + {block name="link"}{/block}