Stream Skipper

skip intro and ending

  1. // ==UserScript==
  2. // @name Stream Skipper
  3. // @name:ja Stream Skipper
  4. // @name:en Stream Skipper
  5. // @name:zh-CN Stream Skipper
  6. // @name:ko Stream Skipper
  7. // @name:ru Stream Skipper
  8. // @name:de Stream Skipper
  9. // @description skip intro and ending
  10. // @description:ja イントロとエンディングをスキップする
  11. // @description:en skip intro and ending
  12. // @description:zh-CN 跳过介绍和结尾
  13. // @description:ko 인트로와 엔딩을 스킵합니다
  14. // @description:ru пропускает интро и окончание
  15. // @description:de Überspringt Intro und Ende
  16. // @version 2.3.7
  17. // @author Yos_sy
  18. // @match *://*.amazon.com/*
  19. // @match *://*.amazon.ca/*
  20. // @match *://*.amazon.com.mx/*
  21. // @match *://*.amazon.co.uk/*
  22. // @match *://*.amazon.de/*
  23. // @match *://*.amazon.fr/*
  24. // @match *://*.amazon.it/*
  25. // @match *://*.amazon.es/*
  26. // @match *://*.amazon.nl/*
  27. // @match *://*.amazon.se/*
  28. // @match *://*.amazon.pl/*
  29. // @match *://*.amazon.co.jp/*
  30. // @match *://*.amazon.com.au/*
  31. // @match *://*.amazon.in/*
  32. // @match *://*.amazon.cn/*
  33. // @match *://*.amazon.com.br/*
  34. // @match *://*.amazon.sa/*
  35. // @match *://*.amazon.ae/*
  36. // @match *://*.amazon.sg/*
  37. // @match *://*.amazon.com.tr/*
  38. // @match *://*.www.netflix.com/*
  39. // @namespace http://tampermonkey.net/
  40. // @icon data:image/png;base64,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
  41. // @license MIT
  42. // @grant GM_setValue
  43. // @grant GM_getValue
  44. // ==/UserScript==
  45.  
  46. (function () {
  47. "use strict";
  48.  
  49. class IntroEndingSkipper {
  50. constructor() {
  51. this.skipIntroEnabled = this.loadState("skipIntroEnabled", true);
  52. this.skipEndingEnabled = this.loadState("skipEndingEnabled", true);
  53. this.skipEnabled = this.loadState("skipEnabled", true);
  54. this.initToggleButton();
  55. this.setupShortcut();
  56. this.updateToggleButton();
  57. this.initHUD();
  58. this.setupFullscreenHandler();
  59.  
  60. this.buttonSelectors = {
  61. primeVideo: {
  62. intro: {
  63. type: "single",
  64. delay: 1500,
  65. selector:
  66. "button.fqye4e3.f1ly7q5u.fk9c3ap.fz9ydgy.f1xrlb00.f1hy0e6n.fgbpje3.f1uteees.f1h2a8xb.atvwebplayersdk-skipelement-button.fjgzbz9.fiqc9rt.fg426ew.f1ekwadg",
  67. },
  68. ending: {
  69. type: "multi",
  70. delay: 1500,
  71. selector:
  72. "div.atvwebplayersdk-nextupcard-button.fixbm5z.f1nog967.fobx3y5",
  73. offSelector:
  74. "div.fxviu8c > button.atvwebplayersdk-nextupcardhide-button",
  75. },
  76. nextEpisode: {
  77. selector: "button.atvwebplayersdk-nexttitle-button",
  78. },
  79. },
  80. netflix: {
  81. intro: {
  82. type: "single",
  83. delay: 0,
  84. selector: "button.watch-video--skip-content-button",
  85. },
  86. ending: {
  87. type: "multi",
  88. delay: 0,
  89. selector: "button[data-uia='next-episode-seamless-button']",
  90. offSelector: "button[data-uia='watch-credits-seamless-button']",
  91. },
  92. nextEpisode: {
  93. selector: "button[data-uia='control-next']",
  94. },
  95. },
  96. };
  97. }
  98.  
  99. // ローカルストレージから状態を読み込み
  100. loadState(key, defaultValue) {
  101. const storedState = GM_getValue(key, null);
  102. return storedState === null ? defaultValue : storedState;
  103. }
  104.  
  105. // ローカルストレージに保存
  106. saveState(key, value) {
  107. GM_setValue(key, value);
  108. }
  109.  
  110. // イントロをスキップ
  111. skipIntro() {
  112. for (const service in this.buttonSelectors) {
  113. const { selector, delay } = this.buttonSelectors[service].intro;
  114.  
  115. if (this.skipEnabled && this.skipIntroEnabled) {
  116. const introButton = document.querySelector(selector);
  117. if (introButton) {
  118. setTimeout(() => {
  119. introButton.click();
  120. console.log(`Intro skipped for ${service}`);
  121. }, delay);
  122. break;
  123. }
  124. }
  125. }
  126. }
  127.  
  128. // エンディングをスキップ
  129. skipEnding() {
  130. for (const service in this.buttonSelectors) {
  131. const { selector, offSelector, delay } =
  132. this.buttonSelectors[service].ending;
  133.  
  134. if (this.skipEnabled && this.skipEndingEnabled) {
  135. // ON の場合 selector をクリック
  136. const endingButton = document.querySelector(selector);
  137. if (endingButton) {
  138. setTimeout(() => {
  139. endingButton.click();
  140. console.log(`Ending skipped for ${service}`);
  141. }, delay);
  142. }
  143. } else {
  144. // OFF の場合 offSelector をクリック
  145. const offButton = document.querySelector(offSelector);
  146. if (offButton) {
  147. setTimeout(() => {
  148. offButton.click();
  149. console.log(`Watch credits for ${service}`);
  150. }, delay);
  151. }
  152. }
  153. }
  154. }
  155.  
  156. // 次のエピソードボタンをクリック
  157. clickNextEpisode() {
  158. for (const service in this.buttonSelectors) {
  159. if (this.buttonSelectors[service].nextEpisode) {
  160. const { selector } = this.buttonSelectors[service].nextEpisode;
  161. const nextButton = document.querySelector(selector);
  162. if (nextButton) {
  163. nextButton.click();
  164. console.log(`Next episode clicked for ${service}`);
  165. break;
  166. }
  167. }
  168. }
  169. }
  170.  
  171. // トグルボタンを初期化
  172. initToggleButton() {
  173. this.toggleButton = document.createElement("div");
  174. this.toggleButton.textContent = this.skipEnabled
  175. ? "Skip: ON"
  176. : "Skip: OFF";
  177. this.toggleButton.style.cssText = `
  178. position: fixed;
  179. bottom: 24px;
  180. right: 24px;
  181. z-index: 2147483647;
  182. color: #fff;
  183. background-color: ${this.skipEnabled ? "rgba(0, 128, 0, 0.7)" : "rgba(255, 0, 0, 0.7)"};
  184. border: 2px solid #fff;
  185. padding: 10px 20px;
  186. border-radius: 25px;
  187. font: bold 16px/1.6 Arial, sans-serif;
  188. transition: opacity 0.3s ease-in-out;
  189. box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
  190. display: none;
  191. `;
  192. document.body.appendChild(this.toggleButton);
  193. }
  194.  
  195. // トグルボタンの表示を更新
  196. updateToggleButton() {
  197. this.toggleButton.textContent = this.skipEnabled
  198. ? "Skip: ON"
  199. : "Skip: OFF";
  200. this.toggleButton.style.backgroundColor = this.skipEnabled
  201. ? "rgba(0, 128, 0, 0.7)"
  202. : "rgba(255, 0, 0, 0.7)";
  203. }
  204.  
  205. // スキップ機能の全体的な切り替え
  206. toggleSkipping() {
  207. this.skipEnabled = !this.skipEnabled;
  208. this.saveState("skipEnabled", this.skipEnabled);
  209. this.updateToggleButton();
  210.  
  211. this.toggleButton.style.display = "block";
  212. this.toggleButton.style.opacity = "1";
  213.  
  214. setTimeout(() => {
  215. this.toggleButton.style.opacity = "0";
  216. setTimeout(() => {
  217. this.toggleButton.style.display = "none";
  218. }, 100);
  219. }, 1000);
  220.  
  221. console.log(`Skipping is ${this.skipEnabled ? "enabled" : "disabled"}`);
  222. }
  223.  
  224. // イントロスキップの切り替え
  225. toggleSkipIntro() {
  226. if (!this.skipEnabled) return;
  227. this.skipIntroEnabled = !this.skipIntroEnabled;
  228. this.saveState("skipIntroEnabled", this.skipIntroEnabled);
  229. this.updateHUD();
  230.  
  231. console.log(
  232. `Intro Skipping is ${this.skipIntroEnabled ? "enabled" : "disabled"}`
  233. );
  234. }
  235.  
  236. // エンディングスキップの切り替え
  237. toggleSkipEnding() {
  238. if (!this.skipEnabled) return;
  239. this.skipEndingEnabled = !this.skipEndingEnabled;
  240. this.saveState("skipEndingEnabled", this.skipEndingEnabled);
  241. this.updateHUD();
  242.  
  243. console.log(
  244. `Ending Skipping is ${this.skipEndingEnabled ? "enabled" : "disabled"}`
  245. );
  246. }
  247.  
  248. // キーボードショートカットの設定
  249. setupShortcut() {
  250. document.addEventListener("keydown", (event) => {
  251. if (event.altKey && event.key === "z") this.toggleSkipping();
  252. else if (event.altKey && event.key === "x") this.toggleSkipIntro();
  253. else if (event.altKey && event.key === "c") this.toggleSkipEnding();
  254. else if (event.key === "n") this.clickNextEpisode();
  255. });
  256. }
  257.  
  258. // HUDを初期化
  259. initHUD() {
  260. this.hudElement = document.createElement("div");
  261. this.hudElement.style.cssText = `
  262. position: fixed;
  263. top: 24px;
  264. left: 24px;
  265. z-index: 2147483647;
  266. color: #fff;
  267. background: #000000CC;
  268. padding: 16px 24px;
  269. border-radius: 16px;
  270. font: 16px/1.6 Arial, sans-serif;
  271. transition: opacity 0.3s ease-in-out;
  272. box-shadow: rgba(0, 0, 0, 0.3) 0px 4px 8px;
  273. text-align: center;
  274. display: none;
  275. `;
  276. document.body.appendChild(this.hudElement);
  277. }
  278.  
  279. // HUDを更新
  280. updateHUD() {
  281. this.hudElement.innerHTML = `
  282. <strong>Status</strong><br>
  283. Intro: ${this.skipIntroEnabled ? "ON" : "OFF"}<br>
  284. Ending: ${this.skipEndingEnabled ? "ON" : "OFF"}
  285. `;
  286. this.hudElement.style.display = "block";
  287. this.hudElement.style.opacity = "1";
  288. setTimeout(() => {
  289. this.hudElement.style.opacity = "0";
  290. setTimeout(() => {
  291. this.hudElement.style.display = "none";
  292. }, 100);
  293. }, 1000);
  294. }
  295.  
  296. // DOMの変更を監視し、スキップ機能を適用
  297. observe() {
  298. const observer = new MutationObserver(() => {
  299. if (this.skipEnabled) {
  300. this.skipIntro();
  301. this.skipEnding();
  302. }
  303. });
  304. observer.observe(document.body, { childList: true, subtree: true });
  305. }
  306.  
  307. setupFullscreenHandler() {
  308. document.addEventListener("fullscreenchange", () => {
  309. if (document.fullscreenElement) {
  310. this.moveElementsToFullscreen();
  311. } else {
  312. this.restoreElementsPosition();
  313. }
  314. });
  315. }
  316.  
  317. moveElementsToFullscreen() {
  318. const fullscreenElement = document.fullscreenElement;
  319. if (fullscreenElement) {
  320. fullscreenElement.appendChild(this.toggleButton);
  321. fullscreenElement.appendChild(this.hudElement);
  322. }
  323. }
  324.  
  325. restoreElementsPosition() {
  326. document.body.appendChild(this.toggleButton);
  327. document.body.appendChild(this.hudElement);
  328. }
  329. }
  330.  
  331. const skipper = new IntroEndingSkipper();
  332. skipper.observe();
  333. })();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址