mirror of
https://github.com/the1812/Bilibili-Evolved.git
synced 2025-11-04 21:22:45 +08:00
1 line
9.3 KiB
JavaScript
1 line
9.3 KiB
JavaScript
const getEventHandler=(element,event)=>element.data("events")[event][0].handler,getPosition=element=>{let x=0,y=0;for(;element&&!isNaN(element.offsetLeft)&&!isNaN(element.offsetTop);)x+=element.offsetLeft-element.scrollLeft,y+=element.offsetTop-element.scrollTop,element=element.offsetParent;return{x:x,y:y}};class Swiper{constructor(element){this.action=new SwipeAction(element),this.onTouchStart=void 0,this.onTouchEnd=void 0,this._direction=null,element.addEventListener("touchstart",e=>{this._xDown=e.touches[0].clientX,this._yDown=e.touches[0].clientY,this.onTouchStart&&this.onTouchStart(e)}),element.addEventListener("touchmove",e=>{if(!this._xDown||!this._yDown)return;const xUp=e.touches[0].clientX,yUp=e.touches[0].clientY,elementPosition=getPosition(element),position={x:(e.touches[0].pageX-elementPosition.x)/element.clientWidth,y:(e.touches[0].pageY-elementPosition.y)/element.clientHeight,width:element.clientWidth,height:element.clientHeight},xDiff=this._xDown-xUp,yDiff=this._yDown-yUp;if(this._direction)"vertical"===this._direction?this.action.startAction(this._direction,yDiff,position):"horizontal"===this._direction&&this.action.startAction(this._direction,-xDiff,position),e.preventDefault();else{let direction="";direction=Math.abs(xDiff)>Math.abs(yDiff)?"horizontal":"vertical",this._direction=direction,e.preventDefault()}}),element.addEventListener("touchend",e=>{this._xDown=null,this._yDown=null,this._direction=null,this.onTouchEnd&&this.onTouchEnd(e)})}}class SwipeAction{constructor(element){this.lowSpeedForward=void 0,this.lowSpeedBackward=void 0,this.mediumSpeedForward=void 0,this.mediumSpeedBackward=void 0,this.highSpeedForward=void 0,this.highSpeedBackward=void 0,this.lowVolumeUp=void 0,this.lowVolumeDown=void 0,this.mediumVolumeUp=void 0,this.mediumVolumeDown=void 0,this.highVolumeUp=void 0,this.highVolumeDown=void 0,this.speedCancel=void 0,this.volumeCancel=void 0,this.minSwipeDistance=20,this.onActionStart=void 0,this.onActionEnd=void 0,this._element=element,this._touchStart=!1,this._startPosition=null,this._lastAction=null,element.addEventListener("touchstart",()=>{this._touchStart=!0}),element.addEventListener("touchend",()=>{this._startPosition=null,this.onActionEnd&&this.onActionEnd(this._lastAction),this._lastAction=null})}startAction(direction,distance,position){if(this._touchStart&&(this.onActionStart&&this.onActionStart(),this._startPosition=position,this._touchStart=!1),"vertical"===direction)if(Math.abs(distance)<this.minSwipeDistance)this.volumeCancel&&this.volumeCancel(),this._lastAction=null;else{let volumeFactor=0,upHandler=void 0,downHandler=void 0;if(this._startPosition.x<1/3?(volumeFactor=.4,upHandler=this.lowVolumeUp,downHandler=this.lowVolumeDown):this._startPosition.x>=1/3&&this._startPosition.x<=2/3?(volumeFactor=1,upHandler=this.mediumVolumeUp,downHandler=this.mediumVolumeDown):(volumeFactor=2,upHandler=this.highVolumeUp,downHandler=this.highVolumeDown),distance>0){const volumeChange=Math.round(100*volumeFactor*(distance-this.minSwipeDistance)/(1.5*position.height));upHandler&&upHandler(volumeChange),this._lastAction={type:"volume",volume:volumeChange}}else{const volumeChange=Math.round(100*volumeFactor*(distance+this.minSwipeDistance)/(1.5*position.height));downHandler&&downHandler(volumeChange),this._lastAction={type:"volume",volume:volumeChange}}}else if("horizontal"===direction)if(position.y<1/3&&(position.x<.1||position.x>.9)||Math.abs(distance)<this.minSwipeDistance)this.speedCancel&&this.speedCancel(),this._lastAction=null;else{let speedFactor=0,forwardHandler=void 0,backwardHandler=void 0;if(this._startPosition.y<1/3?(speedFactor=.05,forwardHandler=this.lowSpeedForward,backwardHandler=this.lowSpeedBackward):this._startPosition.y>=1/3&&this._startPosition.y<=2/3?(speedFactor=.2,forwardHandler=this.mediumSpeedForward,backwardHandler=this.mediumSpeedBackward):(speedFactor=1,forwardHandler=this.highSpeedForward,backwardHandler=this.highSpeedBackward),distance>0){const seconds=(distance-this.minSwipeDistance)*speedFactor;forwardHandler&&forwardHandler(seconds),this._lastAction={type:"playback",seconds:seconds}}else{const seconds=(distance+this.minSwipeDistance)*speedFactor;backwardHandler&&backwardHandler(seconds),this._lastAction={type:"playback",seconds:seconds}}}}}function touchVideoPlayer(){if(waitForQuery()(()=>$(".bilibili-player-video-web-fullscreen"),it=>it.length>0,fullscreenButton=>{if(!fullscreenButton.hasClass("bilibili-player-video-btn")&&$(".bilibili-player-video-btn-fullscreen").data("events")){const clickHandler=getEventHandler($(".bilibili-player-video-btn-fullscreen"),"click");fullscreenButton.detach().insertAfter(".bilibili-player-video-btn-widescreen").addClass("bilibili-player-video-btn").on("click",clickHandler)}}),waitForQuery()(()=>$(".bilibili-player-iconfont,.bilibili-player-video-quality-menu"),it=>it.length>0,icons=>icons.unbind("click")),waitForQuery()(()=>$(".bilibili-player-video"),it=>it.length>0&&$("video").length>0,player=>{if(0===$(".touch-video-box").length){$(".bilibili-player-video-subtitle").before("<div class='touch-video-box-wrapper'>\n <div class='touch-video-box'>\n <div class='touch-video-info'></div>\n </div>\n </div>");const swiper=new Swiper(player.get(0)),text=document.getElementsByClassName("touch-video-info")[0],box=document.getElementsByClassName("touch-video-box")[0];swiper.action.speedCancel=(()=>{text.innerHTML="松开手指,取消进退"}),swiper.action.volumeCancel=(()=>{text.innerHTML="松开手指,取消调整"}),swiper.action.onActionStart=(()=>{box.style.display="flex",text.innerHTML=""});const fixed=(number,precision=1)=>{const str=number.toString(),index=str.indexOf(".");return-1!==index?str.length-index>precision+1?str.substring(0,index+precision+1):str:str+".0"},secondsToTime=sec=>{sec=Math.abs(sec);const hours=Math.floor(sec/3600),minutes=Math.floor((sec-3600*hours)/60),seconds=sec-3600*hours-60*minutes;let result=fixed(seconds)+"秒";return minutes>0&&(result=minutes+"分"+result),hours>0&&(result=hours+"小时"+result),result},secondsToHms=sec=>{sec=Math.abs(sec);const hours=Math.floor(sec/3600),minutes=Math.floor((sec-3600*hours)/60),seconds=sec-3600*hours-60*minutes;let result=(seconds<10?"0":"")+fixed(seconds);return result=(hours<10?"0":"")+hours+":"+(result=(minutes<10?"0":"")+minutes+":"+result)},video=$("video"),videoDuration=video.prop("duration"),speedChange=speed=>sec=>{const current=video.prop("currentTime");let info=`<div class='touch-row'><span class='touch-speed'>${speed}速</span><span class='touch-info'>进度: ${sec>0?"+":"-"}`;const commonInfoPart="</span></div><div class='touch-row'><div class='videoshot'></div><span class='touch-result'>",finalTime=current+sec;info+=finalTime>videoDuration?`${secondsToTime(videoDuration-current)}${commonInfoPart}${secondsToHms(current)} → ${secondsToHms(videoDuration)} (100%)`:finalTime<0?`${secondsToTime(current)}${commonInfoPart}${secondsToHms(current)} → ${secondsToHms(0)} (0%)`:`${secondsToTime(sec)}${commonInfoPart}${secondsToHms(current)} → ${secondsToHms(finalTime)} (${fixed(100*finalTime/videoDuration)}%)`,text.innerHTML=info+"</span></div>"};swiper.action.lowSpeedBackward=speedChange("低"),swiper.action.lowSpeedForward=speedChange("低"),swiper.action.mediumSpeedBackward=speedChange("中"),swiper.action.mediumSpeedForward=speedChange("中"),swiper.action.highSpeedBackward=speedChange("高"),swiper.action.highSpeedForward=speedChange("高");const volumeChange=speed=>volume=>{const current=Math.round(100*video.prop("volume"));let info=`<div class='touch-row'><span class='touch-speed'>${speed}速</span><span class='touch-info'>音量: ${volume>0?"+":"-"}`;const commonInfoPart="</span></div><div class='touch-row'><span class='touch-result'>",finalVolume=current+volume;info+=finalVolume>100?`${100-current}${commonInfoPart}${current} → 100`:finalVolume<0?`${current}${commonInfoPart}${current} → 0`:`${Math.abs(volume)}${commonInfoPart}${current} → ${finalVolume}`,text.innerHTML=info+"</span></div>"};swiper.action.lowVolumeUp=volumeChange("低"),swiper.action.lowVolumeDown=volumeChange("低"),swiper.action.mediumVolumeUp=volumeChange("中"),swiper.action.mediumVolumeDown=volumeChange("中"),swiper.action.highVolumeUp=volumeChange("高"),swiper.action.highVolumeDown=volumeChange("高"),swiper.action.onActionEnd=(action=>{if(box.style.display="none",text.innerHTML="",action)if("volume"===action.type){let volume=video.prop("volume");(volume+=action.volume/100)<0?volume=0:volume>1&&(volume=1),video.prop("volume",volume),$(".bilibili-player-video-volume-num").text(Math.round(100*volume)),$(".bpui-slider-progress").css("height",100*volume+"%"),$(".bpui-slider-handle").css("bottom",(35+230*volume)/3+"%"),0===volume?($(".icon-24soundoff").show(),$(".icon-24soundlarge").hide(),$(".icon-24soundsmall").hide()):volume>=.5?($(".icon-24soundoff").hide(),$(".icon-24soundlarge").show(),$(".icon-24soundsmall").hide()):($(".icon-24soundoff").hide(),$(".icon-24soundlarge").hide(),$(".icon-24soundsmall").show())}else if("playback"===action.type){let time=video.prop("currentTime");(time+=action.seconds)<0?time=0:time>videoDuration&&(time=videoDuration),video.prop("currentTime",time)}})}}),0===$("#bilibili-touch-video-player").length){const style=getStyle("touchPlayerStyle"),videoPlayerStyles=`<style id='bilibili-touch-video-player'>${style}</style>`;$("body").after(videoPlayerStyles)}} |