import http.cookiejar
import re
import subprocess
import os
import sys
import html
import requests
import json
import urllib
import urllib.request
import base64
from bs4 import BeautifulSoup
from pywidevine.decrypt.wvdecryptcustom import WvDecrypt
from binaries.youtube_dl import *

mp4decryptexe = f'binaries/mp4decrypt.exe'
ffmpegexe = f'binaries/ffmpeg.exe'
#mp4decryptexe = './mp4decrypt'
#ffmpegexe = 'ffmpeg'

def get_cookies():
    cj = http.cookiejar.MozillaCookieJar('cookies/cookies_bein.txt')
    cj.load()
    cookies = str()
    for cookie in cj:
        cookie.value = urllib.parse.unquote(html.unescape(cookie.value))
        cookies = cookies + cookie.name + '=' + cookie.value + ';'
    cookies = list(cookies)
    del cookies[-1]
    cookies = ''.join(cookies)
    return cookies
cookies = get_cookies()


playRequest = 'https://www.beinconnect.com.tr/content/playRequest'
UserAgent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'
f = open('response.txt', 'r')
data = f.read()
import json
data = json.loads(data)

def get_Name(data):
    return data['FollowMeUrl'].split('=')[1].split('&')[0]
name = get_Name(data)

def get_Headers():
    global_headers = {
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
        'Accept-Encoding': 'gzip, deflate, br',
        'Accept-Language': 'tr-TR,tr;q=0.9,en;q=0.8',
        'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
        'Connection': 'keep-alive',
        'Cookie': cookies,
        'Host': 'www.beinconnect.com.tr',
        'Sec-Fetch-Mode': 'navigate',
        'Sec-Fetch-Site': 'none',
        'Sec-Fetch-User': '?1',
        'Upgrade-Insecure-Requests': '1',
        'User-Agent': UserAgent,}
    return global_headers
global_headers = get_Headers()


def get_versionId(data):
    # return data['PlayerAssets'][0]['AssetItemModel']['VersionId']
    return data['ServerTicks']
versionId = get_versionId(data)


def get_contentId(data):
    return data['FollowMeUrl'].split('=')[1].split('&')[0]
contentId = get_contentId(data)

form_data = {
    'contentId': contentId,
    'versionId': versionId,
    'videoType': '1'
}

def get_DrmTicket(data):
    ticket = data['DrmTicket']
    return ticket
ticket = get_DrmTicket(data)


def get_MPD(data):
    mpd = data['CdnUrl']
    return mpd
mpd_url = get_MPD(data)


def do_decrypt(pssh, license_url, license_headers):
    wvdecrypt = WvDecrypt(bytes(pssh.encode()), cert_data_b64=None)
    chal = wvdecrypt.get_challenge()
    license_decoded = requests.post(url=license_url, data=chal, headers=license_headers).content
    license_b64 = base64.b64encode(license_decoded)
    wvdecrypt.update_license(license_b64)
    Correct, keys = wvdecrypt.start_process()
    return keys


def getKEY():
    lic_headers = {'X-ErDRM-Message': ticket}
    lic_url = 'https://digiturk-drm.ercdn.com/widevine/api/erproxy'
    pssh = 'AAAARHBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAACQIARIQdbRwFE5LKA2d8rKN2aPoLRoIZXJzdHJlYW0iBGVyc3M='
    keys = do_decrypt(pssh=pssh, license_url=lic_url, license_headers=lic_headers)
    for key in keys: return key
keys = getKEY()

print()
print(name, 'KEY: ' + keys, sep='\n')
print()

f = open('KEYS/KEYS_beINCONNECT.txt', 'a')
f.write(name + '\n' +  keys + '\n'*2)
f.close()

ydl_options = {
    #'verbose': True,
    'format': 'bestaudio',
    'restrictfilenames': True,
    'ignoreerrors': True,
    'no_warnings': True,
    'hls_prefer_native': True,
    'outtmpl': f'Downloads/temp/{name}_enc.mp4',
}

with YoutubeDL(ydl_options) as ydl:
    ydl.download([mpd_url])

print('\nDecrypt audio...')
decrypt_audio = subprocess.Popen([mp4decryptexe, '--show-progress', '--key', keys, f'Downloads/temp/{name}_enc.mp4', f'Downloads/temp/{name}_dec.mp4'])
decrypt_audio.wait()
os.remove(f'Downloads/temp/{name}_enc.mp4')
print('Done!')
print('\nDemuxing audio...')
demux_audio = subprocess.Popen([ffmpegexe, '-loglevel', 'quiet', '-i', f'Downloads/temp/{name}_dec.mp4', '-acodec', 'copy', '-stats', f'Downloads/{name} beIN (tur).m4a'])
demux_audio.wait()
os.remove(f'Downloads/temp/{name}_dec.mp4')
print('Done!')

input('\nPress Enter to exit.')
exit()
