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():
    return data['FollowMeUrl'].split('=')[1].split('&')[0]
name = get_Name()

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,
        'DNT': '1',
        'Request-Context': 'appId=cid-v1:38f2af30-5097-4319-9b38-eaf0a703b171',
        'Request-Id': '|3mdyC.yDw52',
        '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():
    return data['ServerTicks']
versionId = get_versionId()


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


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

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


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


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, str(sep='\n'))
print(name, 'KEY: ' + keys)
print()

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

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

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

print('\nDecrypt video...')
decrypt_audio = subprocess.Popen([mp4decryptexe, '--show-progress', '--key', keys, 'Downloads/temp/{name}_video_enc.mp4', 'Downloads/temp/{name}_video_dec.mp4'])
decrypt_audio.wait()
os.remove('Downloads/temp/{name}_video_enc.mp4')
print('Done!')
print('\nDemuxing video...')
demux_audio = subprocess.Popen([ffmpegexe, '-loglevel', 'quiet', '-i', 'Downloads/temp/{name}_video_dec.mp4', '-vcodec', 'copy', '-stats', 'Downloads/{name}_video.mp4'])
demux_audio.wait()
os.remove('Downloads/temp/{name}_video_dec.mp4')
print('Done!')

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