备份一个算法,用于自动跳转资源站广告

@Ta 1天前发布,1天前修改 29点击
如题,这是一个关于跳过某些视频资源站非法广告的算法,支持引用hls.js播放器,m3u8文件播放时有效,已知问题,有闪屏现象
注意hls版本必须为这个<script src="https://s4.zstatic.net/ajax/libs/hls.js/1.5.6/hls.min.js"></script>其余版本可能会无效,1.5.6以后的版本应该都可以
用法实例
<div id="dplayer"></div>
<script src="https://s4.zstatic.net/ajax/libs/hls.js/1.5.6/hls.min.js"></script>
<script src="https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/dplayer/1.26.0/DPlayer.min.js"></script>

<script>
// 自定义M3U8 Loader用于过滤广告
        class CustomHlsJsLoader extends Hls.DefaultConfig.loader {
            constructor(config) {
                super(config);
                const load = this.load.bind(this);
                this.load = function(context, config, callbacks) {
                    // 拦截manifest和level请求
                    if (context.type === 'manifest' || context.type === 'level') {
                        const onSuccess = callbacks.onSuccess;
                        callbacks.onSuccess = function(response, stats, context) {
                            // 如果是m3u8文件,处理内容以移除广告分段
                            if (response.data && typeof response.data === 'string') {
                                // 过滤掉广告段 - 实现更精确的广告过滤逻辑
                                response.data = filterAdsFromM3U8(response.data, true);
                            }
                            return onSuccess(response, stats, context);
                        };
                    }
                    // 执行原始load方法
                    load(context, config, callbacks);
                };
            }
        }

        // M3U8清单广告过滤函数
        function filterAdsFromM3U8(m3u8Content, strictMode = false) {
            if (!m3u8Content) return '';
            
            // 按行分割M3U8内容
            const lines = m3u8Content.split('\n');
            const filteredLines = [];
            
            for (let i = 0; i < lines.length; i++) {
                const line = lines[i];
                
                // 只过滤#EXT-X-DISCONTINUITY标识
                if (!line.includes('#EXT-X-DISCONTINUITY')) {
                    filteredLines.push(line);
                }
            }
            
            return filteredLines.join('\n');
        }   
//此处为是否跳过广告开关
let adFilteringEnabled = true;
//hls配置文件
const hlsConfig = {
                debug: false,
                loader: adFilteringEnabled ? CustomHlsJsLoader : Hls.DefaultConfig.loader};
//切片广告跳过算法结束


const dp = new DPlayer({
    container: document.getElementById('dplayer'),
    video: {
        url: 'https://sf1-cdn-tos.huoshanstatic.com/obj/media-fe/xgplayer_doc_video/hls/xgplayer-demo.m3u8',
        type: 'hls',
    },
    pluginOptions: {
      //集成广告过滤位置,主要是要引用hlsConfig
        hls: hlsConfig,
    },
});
</script>





回复列表(1|隐藏机器人聊天)
  • @Ta / 1天前 / /
    补充一下,该算法来自于libretv,本文只是提取备份一下。其他播放器引用类似,都是替换hls配置文件,如muiplayer也只是替换hls配置文件即可
    替换前
    var videoObject = {
        container:document.getElementById("a1"),
        src:purl,
        title:vtitle,
        autoplay:true,
        autoFit:true,
        parse:{
            type:'hls',
            loader:Hls,
            config:{
                debug:false
            },
        }
      };
    

    替换后
    var videoObject = {
        container:document.getElementById("a1"),
        src:purl,
        title:vtitle,
        autoplay:true,
        autoFit:true,
        parse:{
            type:'hls',
            loader:Hls,
    //只替换下面这处即可
            config:hlsConfig,
        }
      };
    



添加新回复
回复需要登录