您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
取得動畫的m3u8網址
当前为
// ==UserScript== // @name 動畫瘋下載器 // @namespace // @description 取得動畫的m3u8網址 // @version 1.0 // @author maple3142/XPRAMT // @match https://ani.gamer.com.tw/animeVideo.php?sn=* // @connect ani.gamer.com.tw/animeVideo.php // @require https://cdn.jsdelivr.net/npm/[email protected]/dist/m3u8-parser.min.js // @require https://unpkg.com/[email protected]/xfetch.min.js // @require https://unpkg.com/[email protected]/gmxhr-fetch.min.js // @grant GM_xmlhttpRequest // @grant unsafeWindow // @grant GM_getValue // @grant GM_setValue // ==/UserScript== (function () { 'use strict'; var $ = jQuery; const select = (DOM) => document.querySelector(DOM); function hookSetter(obj, prop, cb) { var value, canceled = false; Object.defineProperty(obj, prop, { set: function set(v) { value = v; if (!canceled) cb(v); }, get: function get() { return value; } }); return function () { return canceled = true; }; } function cvtM3U8_to_playlist(baseurl) { return function (m3u8) { var parser = new m3u8Parser.Parser(); parser.push(m3u8); parser.end(); var pls = parser.manifest.playlists.map(function (pl) { return { url: new URL(pl.uri,baseurl)+'@'+title, res: pl.attributes.RESOLUTION }; }); return pls; }; } function render(pls) { pls.map(function (pl) { return $('<a>').addClass('anig-tb').text(pl.res.height + 'p').on('click', function (e) { navigator.clipboard.writeText(pl.url); }) }).forEach(function (el) { return m3u8container.append(el); }); } function onPlaylistUrl(playlisturl) { if (playlisturl.indexOf('gamer_ad') !== -1) { //is ad return; } var baseurl = playlisturl.replace(/playlist\.m3u8.*/, ''); fetch(playlisturl).then(function (r) { return r.text();}). then(cvtM3U8_to_playlist(baseurl)). then(function (pls) { return window.unsafeWindow = pls;}). then(render); } var restore = hookSetter(animefun, 'danmu', function (danmu) { text = JSON.stringify(danmu); title = $('.anime_name h1').text(); restore(); }); var text, title; var it = setInterval(function () { if (typeof videojs !== 'undefined' && videojs.getPlayer('ani_video')) { clearInterval(it); var vid = videojs.getPlayer('ani_video'); unsafeWindow.ani_video = vid; var fn = vid.src.bind(vid); vid.src = function (src) { if (!src) { return fn(); } onPlaylistUrl(typeof src === 'string' ? src : src.src); fn(src); }; } }, 100); //var exportdanmu = $('<a>').text('複製').addClass('anig-tb'); var m3u8container = $('<div>').addClass('anig-ct'); //顯示按鍵 //var $ct = $('<div>').addClass('anig-ct'); //$ct.append(exportdanmu); //$('.anime_name').append($ct).append(m3u8container); $('.anime_name').append(m3u8container); //樣式 function styleInject(css, ref) { if ( ref === void 0 ) ref = {}; var insertAt = ref.insertAt; if (!css || typeof document === 'undefined') { return; } var head = document.head || document.getElementsByTagName('head')[0]; var style = document.createElement('style'); style.type = 'text/css'; if (insertAt === 'top') { if (head.firstChild) { head.insertBefore(style, head.firstChild); } else { head.appendChild(style); } } else { head.appendChild(style); } if (style.styleSheet) { style.styleSheet.cssText = css; } else { style.appendChild(document.createTextNode(css)); } } var css = ".anig-ct {\r\n\tdisplay: flex;\r\n\twidth: 100%;\r\n\tmargin: 5px;\r\n}\r\n\r\n.anig-tb {\r\n\tdisplay: inline-block;\r\n\tpadding: 5px;\r\n\tbackground: #00B4D8;\r\n\tcolor: #FFF;\r\n\tmargin-right: 5px;\r\n\tborder: 1px solid #BBB;\r\n}\r\n\r\n.tdn{\r\n\ttext-decoration: none;\r\n}\r\n"; styleInject(css); }());