// ==UserScript== // @name HLS(m3u8) Ad Remover // @namespace http://tampermonkey.net/ // @license GNU AGPLv3 // @version 0.1 // @description Remove HLS.js-based(m3u8) ad stream // @author douniwan6 // @match http*://xiaoheimi.net/player* // @match http*://www.yhpdm.net/yxsf/player* // @icon https://www.google.com/s2/favicons?sz=64&domain=greasyfork.org // @grant none // @downloadURL none // ==/UserScript== (function() { 'use strict'; /*global Hls*/ // alert(“HLS Ad Remover”); //debugger // special playlist post processing function function process(playlist) { let adExp = /#EXT-X-DISCONTINUITY\n(?#EXTINF:.*\n.*\n){1,10}#EXT-X-DISCONTINUITY/g; let around = new RegExp(`((?:#EXTINF.*\n.*\n){0,3})(${adExp.source})((?:.*\n){0,3})`, adExp.flags); for (let match of playlist.matchAll(around)) { console.log(match[1]); console.log("*********************REMOVED*********************"); console.log(match[2]); console.log("*********************REMOVED*********************"); console.log(match[3]); console.log(match); } playlist = playlist.replace(adExp, ""); return playlist; } class pLoader extends Hls.DefaultConfig.loader { constructor(config) { super(config); var load = this.load.bind(this); this.load = function (context, config, callbacks) { if (context.type == 'manifest' || context.type == 'level') { var onSuccess = callbacks.onSuccess; callbacks.onSuccess = function (response, stats, context) { response.data = process(response.data); onSuccess(response, stats, context); }; } load(context, config, callbacks); }; } } console.log(Hls.DefaultConfig.pLoader); Hls.DefaultConfig.pLoader = pLoader var loadSource = Hls.prototype.loadSource; Hls.prototype.loadSource = function(src) { console.log(src); loadSource.call(this, src); } console.log(Hls.DefaultConfig.pLoader); })();