#!/usr/bin/python3
# -*- coding: UTF-8 -*-
#author:Wos
#a script to remove ads that appended to m3u8 file
#一个用于移除m3u8广告的脚本
#version 2
import requests
import os
import sys
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
m3u8_path = os.path.join(BASE_DIR, "removeads.m3u8")


hdr = {
    "User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:102.0) Gecko/20100101 Goanna/5.2 Firefox/102.0 PaleMoon/31.3.0.1"
}
#get absolute m3u8 link    
def get_real_m3u8(url):
    premain = "/".join(str(url).split("/")[:-1])+"/"
    premain_ = "/".join(str(url).split("/")[:3])
    cnt = 0
    while True:
        try:
            if cnt < 3:
                res = requests.get(url,headers=hdr,timeout=(3,7))
                break
            else:
                return
        except:
            cnt += 1
            continue
    temp = str(res.text).split("\n")
    for i in temp:
        if not str(i).startswith("#") and str(i).strip().endswith(".m3u8"):
            if str(i).strip().startswith("http"):
                return get_real_m3u8(str(i).strip())
            else:
                t = str(i).strip().split("/")[1]
                if str(t) in str(premain):
                    url2 = premain_+str(i).strip()
                else:
                    url2 = premain+str(i).strip()
                return get_real_m3u8(url2)
    return url


#移出广告相关的参数    
def removeads(url):
    url = get_real_m3u8(url)
    if not str(url).strip().endswith(".m3u8"):
        return False
    print(url)
    m3u8file = []
    premain = "/".join(str(url).split("/")[:-1])+"/"
    res = requests.get(url,headers=hdr)
    temp = str(res.text).split("\n")
    for i in temp:
        if str(i).startswith("#EXT-X-KEY:METHOD=AES-128"):
            kn = str(i).split("#EXT-X-KEY:METHOD=AES-128,URI=\"")[1].strip()
            premain_ = "/".join(str(premain).split("/")[:3])
            if str(kn).startswith("http"):
                l = "#EXT-X-KEY:METHOD=AES-128,URI=\""+str(kn)
            else:
                if "/" in str(kn):
                    t = str(kn).split("/")[1]                        
                    if str(t) in str(premain):
                        l = "#EXT-X-KEY:METHOD=AES-128,URI=\""+str(premain_)+str(kn)
                else:
                    l = "#EXT-X-KEY:METHOD=AES-128,URI=\""+str(premain)+str(kn)
            m3u8file.append(str(l).strip()) 
        elif not str(i).startswith("#"):
            if str(i).startswith("http"):
                m3u8file.append(i)
            else:
                premain_ = "/".join(str(premain).split("/")[:3])
                if "/" in str(i):
                    t = str(i).split("/")[1]
                    if str(t) in str(premain):
                        l = premain_+str(i)
                else:
                    l = premain+str(i)
                m3u8file.append(l)
        else:
            m3u8file.append(i)

    file_obj = open(m3u8_path,'w',encoding='UTF-8', newline='')
    for i in  m3u8file:
        file_obj.write(str(i)+"\n")
    file_obj.write("#EXT-X-ENDLIST\n")    
    file_obj.close()

    #去广告核心代码---start
    m3u8file = []
    with open(m3u8_path, 'r') as file:
        content = file.read()
    temp = str(content).split("#EXT-X-DISCONTINUITY")
    m3u8file.append(temp[0])
    i = 1
    while i < len(temp):
        if len(temp[i].split("\n")) >= 18:
            m3u8file.append("#EXT-X-DISCONTINUITY")
            m3u8file.append(temp[i])
        i += 1
    file_obj = open(m3u8_path,'w',encoding='UTF-8', newline='')
    for i in m3u8file:
        file_obj.write(str(i))
    file_obj.write("#EXT-X-ENDLIST")
    file_obj.close()
    #去广告核心代码---end

if __name__ == '__main__':
    if len(sys.argv) == 2:
        removeads(sys.argv[1])
        cmdline = ("mpv --stream-lavf-o-append=\"protocol_whitelist=file,http,https,tcp,tls,crypto,hls,applehttp\" --really-quiet --ontop \"%s\""%(m3u8_path))
        os.system(cmdline)
    else:
        print("python removeads.py [m3u8-link]")