Code python3 (file :"hls_me.py")
Wait part 3...
import sys import threading import queue import m3u8 import requests import shutil import tempfile import os import posixpath import urllib.parse import re import time from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes from cryptography.hazmat.backends import default_backend import hashlib print(hashlib.md5("whatever your string is".encode('utf-8')).hexdigest()) UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36" UserAgent2= "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36" def is_url(uri): return re.match(r'https?://', uri) is not None # c = threading.Condition() countIdm= 0 firtRun = 0 # data_lock = threading.Lock() class SegmentDownloadThread(threading.Thread): def __init__(self, downloadqueue, location, total, soLuong, refUrl): threading.Thread.__init__(self) self.downloadQueue = downloadqueue self.location = location self.total = total self.soLuong= soLuong self.refUrl= refUrl def run(self): global countIdm,firtRun while True: # print(countIdm) # with data_lock: # countIdm+=1 if(countIdm>= self.soLuong): time.sleep(0.7) continue # if(firtRun!=0): # continue firtRun= 1 countIdm+=1 item = self.downloadQueue.get() if item is None: countIdm-=1 return print('download thread: ', countIdm) self.execute(item) # with data_lock: # countIdm-=1 countIdm-=1 self.downloadQueue.task_done() def execute(self, item): if item[1] and not is_url(item[2]): url = item[1] + "/" + item[2] else: url = item[2] item[2] = os.path.basename(urllib.parse.urlparse(url).path) if item[3]: backend = default_backend() r = requests.get(item[3].uri) key = r.content cipher = Cipher(algorithms.AES(key), modes.CBC(bytes.fromhex(item[3].iv[2:])), backend=backend) decryptor = cipher.decryptor() def lol(int_try, userAgent): if(int_try> 3): print('# requests.exceptions.RequestException #') else: try: #r = requests.get(url, stream=True, timeout=10) print(url) r= requests.get(url, headers={"User-Agent": userAgent, 'Referer': self.refUrl}, stream=True, timeout=10) tenfile_fix2= item[4] # with open(os.path.join(self.location, item[2]), 'wb') as f: with open(os.path.join(self.location, tenfile_fix2), 'wb') as f: for chunk in r.iter_content(chunk_size=1024): if chunk: if item[3]: f.write(decryptor.update(chunk)) else: f.write(chunk) except requests.exceptions.RequestException as e: if('Read timed out' in str(e) or 'ConnectTimeoutError' in str(e)): print("> ", int_try, ': ', url) time.sleep(3* (int_try+1)) # sleep 3s lol(int_try+1, UserAgent2) except Exception as g: print(g) lol(0, UserAgent) def concatenate_files(filelist, source, destination, name): print(os.path.join(destination, name)) with open(os.path.join(destination, name), 'ab') as outfile: for file in filelist: print(os.path.join(source, file)) # shutil.copy2(os.path.join(source, file), 'C:/Users/Admin/Documents/PyProject/hlsMe/temp') if(os.path.isfile( os.path.join(source, file) )): print('join the file: ', file) with open(os.path.join(source, file), 'rb') as readfile: shutil.copyfileobj(readfile, outfile) outfile.close() #sys.exit(0) def m3u8_load(uri): r = requests.get(uri) m3u8_obj = m3u8.M3U8(r.text) return m3u8_obj def m3u8_load_file(uri): file1 = open(uri,"r") m3u8_obj = m3u8.M3U8(file1.read()) file1.close() return m3u8_obj def hls_fetch(playlist_location, storage_location, name, soLuong, refUrl, prefixURL): oldSegmentList = list() print("Downloading %s" % name) while True: print('...') download_queue = queue.Queue() tsSliceList = list() with tempfile.TemporaryDirectory() as download_location: if(is_url(playlist_location)): playlist = m3u8_load(playlist_location) else: playlist = m3u8_load_file(playlist_location) playlist_location= prefixURL print(playlist) parsed_url = urllib.parse.urlparse(playlist_location) prefix = parsed_url.scheme + '://' + parsed_url.netloc base_path = posixpath.normpath(parsed_url.path + '/..') base_uri = urllib.parse.urljoin(prefix, base_path) pool = list() total = 0 for number, file in enumerate(playlist.segments): if not is_url(file.uri): playlist.base_uri = base_uri tenfile_fix2= hashlib.md5(file.uri.encode('utf-8')).hexdigest() if tenfile_fix2 not in oldSegmentList: total += 1 # print('Downing, ',tenfile_fix2) oldSegmentList.append(tenfile_fix2) tsSliceList.append(tenfile_fix2) download_queue.put([number, playlist.base_uri, file.uri, file.key,tenfile_fix2]) if total == 0: print('Please choose one in playlists:') # print(playlist.playlists[0].uri) for playlist in playlist.playlists: print("resolution {0}: {1}".format(playlist.stream_info.resolution, playlist.uri)) break # for debug #total = 10 for i in range(total): thread = SegmentDownloadThread(download_queue, download_location, total, soLuong, refUrl) thread.daemon = True thread.start() pool.append(thread) download_queue.join() for i in range(total): download_queue.put(None) for thread in pool: thread.join() print('Start joining the file') concatenate_files(tsSliceList, download_location, storage_location, name) tsSliceList.clear() break
Wait part 3...
Comments
Post a Comment