Greasy Fork

Greasy Fork is available in English.

视频外挂悬浮可点复制翻译字幕,floating-plug-in-for-clickable-subtitle-copying

视频外挂悬浮可点复制翻译字幕,floating plug-in for clickable subtitle copying

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

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         视频外挂悬浮可点复制翻译字幕,floating-plug-in-for-clickable-subtitle-copying
// @description  视频外挂悬浮可点复制翻译字幕,floating plug-in for clickable subtitle copying
// @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.18.21.09.00
// @icon         https://www.google.com/s2/favicons?sz=64&domain=greasyfork.org
// @author       You
// ==/UserScript==

(()=>{"use strict";const P=e=>{console.log("%c"+e,`
      background-color: #811f21;
      color: white;
      line-height:1.5rem;
      padding:0 0.5rem;
    `)};function T(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)?(P("全屏视频"),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}")):(P("退出全屏视频"),document.exitFullscreen?document.exitFullscreen():document.mozCancelFullScreen?document.mozCancelFullScreen():document.webkitExitFullscreen?document.webkitExitFullscreen():document.msExitFullscreen&&document.msExitFullscreen())}window.addEventListener("load",(function(){P("视频外挂西悬浮可点复制翻译字幕-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),P("视频滚动"),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(),P("全屏开关点击"),T(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),P("视频滚动"),e.stopPropagation(),e.deltaY<0?(console.log("向上滚动"),t.currentTime-=5):(console.log("向下滚动"),t.currentTime+=5)})),l.on("click",(function(e){e.stopPropagation(),P("字幕显示开关点击"),i=!i,a.css({display:i?"block":"none"})})),a.click((function(e){P("字幕外层点击"),e.stopPropagation()})),a.on("mousedown",(e=>{e.stopPropagation(),console.log(" :",[t]),t?.[0].pause(),P("视频暂停")})),a.on("touchstart",(e=>{e.stopPropagation(),console.log(" :",[t]),t?.[0].pause(),P("视频暂停")})),a.on("mouseup",(e=>{e.stopPropagation(),window?.getSelection()?.toString()?(console.log(" :",[t]),t?.[0].pause(),P("视频暂停")):(console.log(" :",[t]),k||(t?.[0].play(),P("视频播放")))})),a.on("touchend",(e=>{e.stopPropagation(),window?.getSelection()?.toString()?(console.log(" :",[t]),t?.[0].pause(),P("视频暂停")):(console.log(" :",[t]),t?.[0].play(),P("视频播放"))})),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(),P("轨道数据缓存"),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>
  `));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,g=!1;function m(e){P($(this).text()+"被点击了"),$(this).css({"background-color":"#fff3","border-radius":"1vw"}),console.log("单词元素 :",[this]);var t=document?.createRange();t?.selectNode(this),window?.getSelection()?.addRange(t);const o=e?.target?.textContent.match(/\b[\w]+\b/);navigator?.clipboard?.writeText(o)?.then((()=>{P("复制成功 "+o)}))?.catch((()=>{P("复制失败 "+o)}))}t.on("timeupdate",(e=>{e.stopPropagation();e=e?.target;var t=e?.currentTime+u,o=e?.textTracks[0]?.cues;if(e?.textTracks[0]?.cues?.length&&p!==parseInt(e?.currentTime))for(let e=0;e<o.length;e++){var n=o[e];if(n?.startTime<=t&&n?.endTime>=t){d!==e&&(n=n?.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(""),a.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;">${n}</p>`),(n=$(".clickable_subtitle_middle")).on("mousedown","span",m),n.on("touchstart","span",m),n.on("mouseenter","span",m),n.on("mouseleave","span",(function(e){g=!1,$(this).css({"background-color":"#fff0","border-radius":"1vw"})})),d=e);break}}p=parseInt(e?.currentTime)}));var b=$("<a class='clickable_subtitle_find_subtitle_webSite' href='https://assrt.net/' target='字幕网'>找字幕文件网1 </a>"),f=$("<a class='clickable_subtitle_find_subtitle_webSite' href='https://www.opensubtitles.org/zh' target='字幕网'>找字幕文件网2 </a>"),w=$("<a class='clickable_subtitle_find_subtitle_webSite' href='https://subscene.com/' target='字幕网'>找字幕文件网3 </a>"),v=(b.css({color:"#fff"}),f.css({color:"#fff"}),w.css({color:"#fff"}),$("<div class='clickable_subtitle_find_subtitle_wapper'></div>")),h=(v.css({"line-height":"6vw !important"}),$("<div class='clickable_subtitle_find_subtitle_webSite_wapper'></div>"));h.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"}),h.append(b),h.append(f),h.append(w),v.append(c),v.append(r),v.append(h),a.prepend(v);let k=!1;a.on("mouseenter",(function(e){e.stopPropagation(),k=!0,console.log("鼠标移入了外框!"),t?.[0].pause(),P("视频暂停")})),a.on("mouseleave",(function(e){e.stopPropagation(),k=!1,console.log("鼠标移出了外框!"),a.css({height:"auto"}),$(".clickable_subtitle_middle").css({"margin-top":"0"}),t?.[0].play(),P("视频播放")}));b=$(".videoWrapper");b.css({"font-size":"2vw",padding:"0 1rem !important"});const _=$('<div class="buttonWrapper"/>');let y=!1,x=void(_.on("mouseenter",(function(){console.log("鼠标移入了按钮!"),y=!0})),_.on("mouseleave",(function(){console.log("鼠标移出了按钮!"),y=!1})),_.css({...n,top:"50%",right:"0",color:"#fff",transform:"translateY(-50%)"}),t.on("touchstart",(e=>{e.stopPropagation(),_.css({opacity:"1",transition:"all 0.2s ease-in-out"})})),t.on("touchend",(e=>{e.stopPropagation(),this.setTimeout((()=>{_.css({opacity:"0.1",transition:"all 0.2s ease-in-out"})}),1e3)})));$(document).on("mousemove",(function(e){e.stopPropagation(),x=!1,clearTimeout($.data(this,"timer")),_.css({opacity:"1",transition:"all 0.2s ease-in-out"}),y||$.data(this,"timer",setTimeout((()=>{y=!1,_.css({opacity:"0.1",transition:"all 0.2s ease-in-out"})}),1e3))}));f=$("<button>加</button>");f.css({...s});const F=$("<div>0秒</div>"),S=(F.css({...s}),()=>{F.text(u+"秒")});f.on("click",(e=>{e.stopPropagation(),u++,S()}));w=$("<button>减</button>");w.css({...s}),w.on("click",(e=>{e.stopPropagation(),u--,S()})),$("<div/>").css({display:"flex","justify-content":"space-between","align-items":"center"}),_.append(o),_.append(l),_.append($("<div>&nbsp;&nbsp;</div>")),_.append(w),_.append(F),_.append(f),b.append(_),b.append(a),$("*").css("user-select","text")}),!1)})();