Greasy Fork

Greasy Fork is available in English.

学外语视频外挂悬浮可点复制翻译字幕,Learn-foreign-language-video-floating-plug-in-for-clickable-copying-subtitle

显示按钮:电脑鼠标移动或者移动端触摸屏幕, 视频内鼠标滑轮滚动视频快进, 电脑建议配合欧路词典划词翻译, iphone 建议使用快捷指令获取剪贴板翻译, 安卓手机建议使用屏幕取词软件

当前为 2023-12-19 提交的版本,查看 最新版本

// ==UserScript==
// @name         学外语视频外挂悬浮可点复制翻译字幕,Learn-foreign-language-video-floating-plug-in-for-clickable-copying-subtitle
// @description  显示按钮:电脑鼠标移动或者移动端触摸屏幕, 视频内鼠标滑轮滚动视频快进, 电脑建议配合欧路词典划词翻译, iphone 建议使用快捷指令获取剪贴板翻译, 安卓手机建议使用屏幕取词软件
// @require      https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js
// @require      https://cdn.bootcss.com/vConsole/3.3.0/vconsole.min.js
// @include      *
// @match        *://*/*
// @namespace    http://tampermonkey.net/
// @version      2023.12.19.10.05.26
// @icon         https://www.google.com/s2/favicons?sz=64&domain=greasyfork.org
// @author       You
// ==/UserScript==

(()=>{"use strict";const T=(e=[],t=0,o=e?.length,n=Math?.floor((t+o)/2),s=s+1,l=1e3)=>{if(l<s)return clog("栈溢出调用 :",s),!1;l=e?.[n];switch(!0){case l?.startTime<=currentTime&&l?.endTime>=currentTime:var i=item?.text?.split(/\s+/)?.map((e=>`<span  style="user-select:text;  word-wrap: break-word;  overflow-wrap: break-word;  white-space:pre-wrap;  transition: all 0.2s ease-in-out;  line-height: 5vw !important;  padding: 0 .2vw;"   class="clickable_subtitle_word">${e}</span><i> </i>`)).join("");i=(clickable_subtitle_wapper.html(`<p   class="clickable_subtitle_middle"  style="user-select:text;  word-wrap: break-word;  overflow-wrap: break-word;  white-space:pre-wrap;  line-height: 4rvw !important;">${i}</p>`),$(".clickable_subtitle_middle"));i.on("mousedown","span",copyWord),i.on("touchstart","span",copyWord),i.on("mouseenter","span",copyWord),i.on("mouseleave","span",(function(e){isMovesONword=!1,$(this).css({"background-color":"#fff0","border-radius":"1vw"})}));break;case l?.startTime<currentTime:T(e,t,n-1);break;case l?.endTime>currentTime:T(e,n+1,o)}},F=e=>{console.log("%c"+e,`
      background-color: #811f21;
      color: white;
      line-height:1.5rem;
      padding:0 0.5rem;
    `)};function P(e){!function(e){if(document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement||document.msFullscreenElement){if(e===document.fullscreenElement||e===document.mozFullScreenElement||e===document.webkitFullscreenElement||e===document.msFullscreenElement)return console.log("元素处于全屏状态"),1;console.log("元素不处于全屏状态")}else console.log("不处于全屏状态")}(e)?(F("全屏视频"),e.requestFullscreen?e.requestFullscreen():e.mozRequestFullScreen?e.mozRequestFullScreen():e.webkitRequestFullscreen?e.webkitRequestFullscreen():e.msRequestFullscreen&&e.msRequestFullscreen(),void 0!==window.ActiveXObject&&null!=(e=new ActiveXObject("WScript.Shell"))&&e.SendKeys("{F11}")):(F("退出全屏视频"),document.exitFullscreen?document.exitFullscreen():document.mozCancelFullScreen?document.mozCancelFullScreen():document.webkitExitFullscreen?document.webkitExitFullscreen():document.msExitFullscreen&&document.msExitFullscreen())}window.addEventListener("load",(function(){F("视频外挂西悬浮可点复制翻译字幕-floating-plug-in-for-clickable-subtitle-copying"),$("iframe").each((function(){$(this).attr("allowfullscreen","true")}));const t=$("video");let e=!1;t.on("mouseenter",(()=>{e=!0})),t.on("mouseleave",(()=>{e=!1})),t.on("wheel",(function(e){console.log("event :",e),F("视频滚动"),e.stopPropagation(),e.deltaY<0?(console.log("向上滚动"),t.currentTime-=5):(console.log("向下滚动"),t.currentTime+=5)}));var o=t.parent(),n=(o=(o.addClass("videoWrapper"),o.css({position:"relative"}),t.append("<style>video::cue{opacity: 0 !important}</style>"),t.attr("controls","true"),t.attr("playsInline","true"),$("<button class='switchButton'>全屏</button>")),o.on("click",(function(e){e.stopPropagation(),F("全屏开关点击"),P(document.querySelector(".videoWrapper"))})),{"z-index":"2147483647",color:"#fff",position:"absolute",transition:"all 0.2s ease-in-out"}),s={margin:"1vw",display:"block",padding:"0.5vw","border-radius":".5vw","background-color":"#1118","font-size":"1.5vw",cursor:"pointer","user-select":"text","line-height":"2.5rem !important",color:"#fffb",transition:"all 0.2s ease-in-out"},l=(o.css({...s}),$("<button class='switchButton'>显隐</button>"));let i=!0;l.css({...s});const a=$("<div class='floating_plug_in_for_clickable_subtitle_copying'></div>");a.on("wheel",(function(e){console.log("event :",e),F("视频滚动"),e.stopPropagation(),e.deltaY<0?(console.log("向上滚动"),t.currentTime-=5):(console.log("向下滚动"),t.currentTime+=5)})),l.on("click",(function(e){e.stopPropagation(),F("字幕显示开关点击"),i=!i,a.css({display:i?"block":"none"})})),a.click((function(e){F("字幕外层点击"),e.stopPropagation()})),a.on("mousedown",(e=>{e.stopPropagation(),console.log(" :",[t]),t?.[0].pause(),F("视频暂停")})),a.on("touchstart",(e=>{e.stopPropagation(),console.log(" :",[t]),t?.[0].pause(),F("视频暂停")})),a.on("mouseup",(e=>{e.stopPropagation(),window?.getSelection()?.toString()?(console.log(" :",[t]),t?.[0].pause(),F("视频暂停")):(console.log(" :",[t]),v||(t?.[0].play(),F("视频播放")))})),a.on("touchend",(e=>{e.stopPropagation(),window?.getSelection()?.toString()?(console.log(" :",[t]),t?.[0].pause(),F("视频暂停")):(console.log(" :",[t]),t?.[0].play(),F("视频播放"))})),a.css({...n,border:"2px solid #aaa8",transform:"translateX(-50%)",display:"block","user-select":"text",width:"80vw",bottom:"0",left:"50%",padding:"3vw 3vw 10vh 3vw","background-color":"#1b2129ee","font-size":" 3vw","text-align":" center",mask:"linear-gradient(180deg, black 0%, rgba(0, 0, 0, 1) 80%,rgba(0, 0, 0, 0.0) 95%)","border-radius":"3vw 3vw 0 0","box-shadow":"inset 0 0 2vw #666"});var c=$('<track  class="videoTrack" kind = "subtitles" default /> '),r=(c=(t.prepend(c),c.on("loadeddata",(e=>{e.stopPropagation(),F("轨道数据缓存"),console.log("数据 :",e)})),$(`
  <div>
    <input 
      id='input' 
      style='font-size: 2vw;' 
      class='clickable_subtitle_input_file'
      type='file' 
      accept='.vtt'
    ></input>
    <label style='font-size: 2vw;' for='input'>上传字幕文件(.vtt)</label>  
  </div> 
  `)),c.css({"font-size":" 2vw","background-color":"#0004","order-radius":" 2vw !important",padding:"1vw 4vw",display:"flex","justify-content":"space-between","align-items":"center"}),$(`
  <a 
    style='color:#fff;display:block;' 
    href='https://converter.app/cn/srt-vtt/' 
    target='转格式'
  >字幕文件转格式(.srt->.vtt)网站</a>
  <a 
    style='color:#fff;display:block;' 
    href='https://subtitletools.com/convert-subtitles-to-plain-text-online' 
    target='转格式'
  >字幕文件转格式(.srt->.txt)网站1</a>
  <a 
    style='color:#fff;display:block;' 
    href='https://converts.me/tools/conversion/subtitle/srt-to-txt' 
    target='转格式'
  >字幕文件转格式(.srt->.txt)网站2</a>
  `));r.css({"line-height":"5vw"}),c.css({"font-size":"2vw","line-height":"5vw"}),c.on("change",(e=>{e.stopPropagation();e=e.target.files[0];console.log("file :",e),e&&(document.querySelector(".videoTrack").src=URL.createObjectURL(e),console.log("视频元素 :",[t]))}));let u=0,p=-1,d=-1;t.on("timeupdate",(e=>{e.stopPropagation();var t=e?.target,o=t?.currentTime+u,n=t?.textTracks[0]?.cues;if(t?.textTracks[0]?.cues?.length&&p!==parseInt(t?.currentTime))for(let e=0;e<n.length;e++){var s=n[e];s?.startTime<=o&&s?.endTime>=o&&(d!==e&&T(t?.textTracks[0]?.cues),d=e);break}p=parseInt(t?.currentTime)}));var m=$("<a class='clickable_subtitle_find_subtitle_webSite' href='https://assrt.net/' target='字幕网'>找字幕文件网1 </a>"),g=$("<a class='clickable_subtitle_find_subtitle_webSite' href='https://www.opensubtitles.org/zh' target='字幕网'>找字幕文件网2 </a>"),b=$("<a class='clickable_subtitle_find_subtitle_webSite' href='https://subscene.com/' target='字幕网'>找字幕文件网3 </a>"),f=(m.css({color:"#fff"}),g.css({color:"#fff"}),b.css({color:"#fff"}),$("<div class='clickable_subtitle_find_subtitle_wapper'></div>")),w=(f.css({"line-height":"6vw !important"}),$("<div class='clickable_subtitle_find_subtitle_webSite_wapper'></div>"));w.css({display:"flex","justify-content":"space-between","align-items":"center","font-size":"2vw","order-radius":"2vw !important",padding:"1vw 4vw","background-color":"#0004","line-height":"5vw"}),w.append(m),w.append(g),w.append(b),f.append(c),f.append(r),f.append(w),a.prepend(f);let v=!1;a.on("mouseenter",(function(e){e.stopPropagation(),v=!0,console.log("鼠标移入了外框!"),t?.[0].pause(),F("视频暂停")})),a.on("mouseleave",(function(e){e.stopPropagation(),v=!1,console.log("鼠标移出了外框!"),a.css({height:"auto"}),$(".clickable_subtitle_middle").css({"margin-top":"0"}),t?.[0].play(),F("视频播放")}));m=$(".videoWrapper");m.css({"font-size":"2vw",padding:"0 1rem !important"});const h=$('<div class="buttonWrapper"/>');let k=!1,_=void(h.on("mouseenter",(function(){console.log("鼠标移入了按钮!"),k=!0})),h.on("mouseleave",(function(){console.log("鼠标移出了按钮!"),k=!1})),h.css({...n,top:"50%",right:"0",color:"#fff",transform:"translateY(-50%)"}),t.on("touchstart",(e=>{e.stopPropagation(),h.css({opacity:"1",transition:"all 0.2s ease-in-out"})})),t.on("touchend",(e=>{e.stopPropagation(),this.setTimeout((()=>{h.css({opacity:"0.1",transition:"all 0.2s ease-in-out"})}),1e3)})));$(document).on("mousemove",(function(e){e.stopPropagation(),_=!1,clearTimeout($.data(this,"timer")),h.css({opacity:"1",transition:"all 0.2s ease-in-out"}),k||$.data(this,"timer",setTimeout((()=>{k=!1,h.css({opacity:"0.1",transition:"all 0.2s ease-in-out"})}),1e3))}));g=$("<button>加</button>");g.css({...s});const y=$("<div>0秒</div>"),x=(y.css({...s}),()=>{y.text(u+"秒")});g.on("click",(e=>{e.stopPropagation(),u++,x()}));b=$("<button>减</button>");b.css({...s}),b.on("click",(e=>{e.stopPropagation(),u--,x()})),$("<div/>").css({display:"flex","justify-content":"space-between","align-items":"center"}),h.append(o),h.append(l),h.append($("<div>&nbsp;&nbsp;</div>")),h.append(b),h.append(y),h.append(g),m.append(h),m.append(a),$("*").css("user-select","text")}),!1)})();