def main(): parser = argparse.ArgumentParser() parser.add_argument('file', type=str, help='video file') parser.add_argument('title', type=str, nargs='?', help='post title') parser.add_argument('time', type=int, nargs='?', help='time for pre segment', default=0) parser.add_argument('-c, --config', type=str, dest='config', help='change the configuration file path') args = parser.parse_args() load_dotenv(args.config) tmpdir = path.dirname(path.abspath(__file__)) + '/tmp' command = genslice(path.abspath(args.file), args.time) if sameparams(tmpdir, command): os.chdir(tmpdir) else: os.mkdir(tmpdir) os.chdir(tmpdir) os.system(command) open('command.sh', 'w').write(command) failures, completions = 0, 0 lines = encrypt(repairer(open('out.m3u8', 'r').read())) executor = ThreadPoolExecutor(max_workers=15) futures = { executor.submit(uploader().handle, chunk): chunk for chunk in tsfiles(lines) } for future in as_completed(futures): completions += 1 result = future.result() if not result: failures += 1 print('[%s/%s] Uploaded failed: %s' % (completions, len(futures), futures[future])) continue lines = lines.replace(futures[future], result) print('[%s/%s] Uploaded %s to %s' % (completions, len(futures), futures[future], result)) #Write to file open('out.m3u8', 'w').write(lines) open('params.json', 'w').write(json.dumps(uploader().params())) if failures: print('Partially successful: %d/%d' % (completions - failures, completions)) print('You can re-execute this program with the same parameters') exit(2) publish(lines, args.title or path.splitext(path.basename(args.file))[0])
def upload(lines, uploadList): failures, completions = 0, 0 executor = ThreadPoolExecutor(max_workers=15) futures = { executor.submit(uploader().handle, chunk): chunk for chunk in uploadList } uploadList = [] for future in as_completed(futures): completions += 1 result = future.result() if not result: failures += 1 print('[%s/%s] Uploaded failed: %s' % (completions, len(futures), futures[future])) uploadList.append(futures[future]) continue lines = lines.replace(futures[future], result) print('[%s/%s] Uploaded %s to %s' % (completions, len(futures), futures[future], result)) if (len(uploadList) > 0): print('retry upload') lines = upload(lines, uploadList) return lines
def upload(lines, uploadList): failures, completions = 0, 0 executor = ThreadPoolExecutor(max_workers=15) futures = {executor.submit(uploader().handle, chunk): chunk for chunk in uploadList} uploadList = [] for future in as_completed(futures): completions += 1 result = future.result() if not result: failures += 1 print('[%s/%s] Uploaded failed: %s' % (completions, len(futures), futures[future])) uploadList.append(futures[future]) continue if _('PROXY') == 'YES': result = str(base64.b64encode(result.encode('utf-8')), 'utf8') lines = lines.replace(futures[future], _('APIURL')+'/p/'+result) else: lines = lines.replace(futures[future], result) print('[%s/%s] Uploaded %s to %s' % (completions, len(futures), futures[future], result)) if(len(uploadList)>0): print('retry upload') lines = upload(lines, uploadList) return lines
def main(): tmpdir = os.path.dirname(os.path.abspath(__file__)) + '/tmp' os.chdir(tmpdir) lines = open('outtiny.m3u8', 'r').read() llen = len(lines)+64 wh = math.ceil(llen/3) print('文本大小:%s,图片尺寸:%s' % (llen, wh)) new_img_file_name = new_image(wh, wh, 'out', show_image=False) print('生成图片:%s' % (new_img_file_name)) in_img = cv2.imread(new_img_file_name) steg = LSBSteg(in_img) done = base64.b64encode(lines.encode('utf-8')) done = zlib.compress(done) res = steg.encode_binary(done) cv2.imwrite('outtiny.png', res) m3u8url = uploader().handle('outtiny.png') if _('PROXY') == 'YES': m3u8url = str(base64.b64encode(m3u8url.encode('utf-8')),'utf8') print('This video\'s m3u8 has been published to: %s/p/%s' % (_('APIURL'),m3u8url)) else: print('This video\'s m3u8 has been published to: %s/p/%s' % (_('APIURL'),m3u8url))
def publish(code, title=None): if _('NOSERVER') == 'YES': return print('The m3u8 file has been dumped to tmp/out.m3u8') r = api('POST', 'publish', data={'code': code, 'title': title, 'params': json.dumps(uploader().params())}) if r: url = '%s/play/%s' % (_('APIURL'), r) print('This video has been published to: %s' % url) print('You can also download it directly: %s.m3u8' % url)
def checker(code): flag = False limit = uploader().MAX_BYTES for file in pngfiles(code): if os.path.getsize(file) >= limit: flag = True print('File too large: tmp/%s' % file) return exit(1) if flag else code
def main(): title = argv[2] if argv[2] else os.path.splitext(os.path.basename( argv[1]))[0] tmpdir = os.path.dirname(os.path.abspath(__file__)) + '/tmp' command = command_generator(os.path.abspath(argv[1])) if sameparams(tmpdir, command): os.chdir(tmpdir) else: os.mkdir(tmpdir) os.chdir(tmpdir) os.system(command) open('command.sh', 'w').write(command) failures, completions = 0, 0 lines = encrypt(open('out.m3u8', 'r').read()) #TODO for file in tsfiles(lines): if os.path.getsize(file) >= upload_limit[_('UPLOAD_DRIVE')]: print('file too large: %s' % file) exit(1) executor = ThreadPoolExecutor(max_workers=10) futures = { executor.submit(uploader(), chunk): chunk for chunk in tsfiles(lines) } for future in as_completed(futures): completions += 1 result = future.result() if not result: failures += 1 print('[%s/%s] Uploaded failed: %s' % (completions, len(futures), futures[future])) continue lines = lines.replace(futures[future], result) print('[%s/%s] Uploaded %s to %s' % (completions, len(futures), futures[future], result)) print('\n') #Write to file open('out.m3u8', 'w').write(lines) if not failures: publish(lines, title) else: print('Partially successful: %d/%d' % (completions, completions - failures)) print('You can re-execute this program with the same parameters')
def publish(code, title=None): if _('NOSERVER') == 'YES': return print('The m3u8 file has been dumped to tmp/out.m3u8') r = api('POST', 'publish', data={ 'code': code, 'title': title, 'params': json.dumps(uploader().params()) }) if r: url = '%s/play/%s' % (_('APIURL'), r['slug']) print(f'This video has been published to: {url}') print(f'You can also download it directly: {url}.m3u8') print('---') print('Click here to edit the information for this video:\n%s' % manageurl(f'video/{r["id"]}'))
def repairer(code): limit = uploader().MAX_BYTES for file in tsfiles(code): if path.getsize(file) > limit: tmp = 'rep.%s' % file os.system(genrepair(file, tmp, limit * 8)) os.rename(tmp, file) if path.getsize(file) > limit: open('out.m3u8', 'w').write(code) print(f'File too large: tmp/{file}') print( 'Adjust parameters or continue execution with the same parameters' ) exit(2) open('out.m3u8', 'w').write(code) return code
def command_generator(file): sub = '' rate = bit_rate(file) vcodec = video_codec(file) max_bits = uploader().MAX_BYTES * 8 segment_time = min(10, int(max_bits / (rate * 1.35))) #LIMITED if rate > 6e6 or argv[3] == 'LIMITED': maxrate = max_bits / 20 / 2.5 sub += ' -b:v %d -maxrate %d -bufsize %d' % (min(rate, maxrate*0.9), maxrate, maxrate/1.5) vcodec, segment_time = 'h264', 10 #SEGMENT_TIME if argv[3].isnumeric(): sub += ' -segment_time %d' % float(argv[3]) else: sub += ' -segment_time %d' % segment_time return 'ffmpeg -i %s -vcodec %s -acodec aac -bsf:v h264_mp4toannexb -map 0:v:0 -map 0:a? -f segment -segment_list out.m3u8 %s out%%05d.ts' % (safename(file), vcodec, sub)
def main(): d = tempfile.mkdtemp() os.chdir(d) name = 'video%s' % os.path.splitext(argv[1])[1] shutil.copyfile(argv[1], name) bitrate = bit_rate(name) maxbitrate = maxbit_rate(name) duration = video_duration(name) repaircmd = genrepair(name, name, uploader().MAX_BYTES) os.system('clear') print('\n=================================') print('file: %s' % argv[1]) print('size: %s' % os.path.getsize(name)) print('bitrate: %s' % bitrate) print('max_bitrate: %s' % maxbitrate) print('duration: %s' % duration) print('genrepair: %s' % repaircmd) print('=================================\n') exec(['rm', '-rf', d])
import os, tempfile, time from os import getenv as _ from utils import uploader from dotenv import load_dotenv load_dotenv() os.environ['UPLOAD_DRIVE'] = os.sys.argv[1] handle, params = uploader().handle, uploader().params() def upload(size): fd, path = tempfile.mkstemp() with open(path, 'wb') as f: f.write(os.urandom(size * 1048576 - params['padding'])) r = handle(path) os.close(fd) os.unlink(path) return r def test(curr, step): maps = {} reve = False reve_inc = None print('Starting test %s:' % _('UPLOAD_DRIVE')) while True: if curr in maps: result = maps[curr] else: result = maps[curr] = upload(curr) print('%dM\t%s\t%s' % (curr, 'OK' if result else 'FAIL', result))
def main(): title = argv[2] if argv[2] else os.path.splitext(os.path.basename(argv[1]))[0] tmpdir = os.path.dirname(os.path.abspath(__file__)) + '/tmp' command = command_generator(os.path.abspath(argv[1])) print('commend:%s'%command) if sameparams(tmpdir, command): os.chdir(tmpdir) else: os.mkdir(tmpdir) os.chdir(tmpdir) os.system(command) open('command.sh', 'w').write(command) lines = checker(encrypt(open('out.m3u8', 'r').read())) #return # failures, completions = 0, 0 # executor = ThreadPoolExecutor(max_workers=15) # futures = {executor.submit(uploader().handle, chunk): chunk for chunk in pngfiles(lines)} # # for future in as_completed(futures): # completions += 1 # result = future.result() # # if not result: # failures += 1 # print('[%s/%s] Uploaded failed: %s' % (completions, len(futures), futures[future])) # continue # # lines = lines.replace(futures[future], result) # print('[%s/%s] Uploaded %s to %s' % (completions, len(futures), futures[future], result)) # 上传 lines = upload(lines, pngfiles(lines)) """ head = read_bytes(os.path.dirname(os.path.abspath(__file__)) + '/dangdai-32x32.png') head1 = head[0:-12] head2 = head[-12:] done = base64.b64encode(lines.encode('utf-8')) done = zlib.compress(done) open('out.png', 'wb').write(head1 + done+head2) """ llen = len(lines)+64 wh = math.ceil(llen/3) print('文本大小:%s,图片尺寸:%s' % (llen, wh)) new_img_file_name = new_image(wh, wh, 'out', show_image=False) print('生成图片:%s' % (new_img_file_name)) in_img = cv2.imread(new_img_file_name) steg = LSBSteg(in_img) done = base64.b64encode(lines.encode('utf-8')) done = zlib.compress(done) res = steg.encode_binary(done) cv2.imwrite('out.png', res) m3u8url = uploader().handle('out.png') if _('PROXY') == 'YES': m3u8url = str(base64.b64encode(m3u8url.encode('utf-8')), 'utf8') print('This video\'s m3u8 has been published to: %s/p/%s' % (_('APIURL'),m3u8url)) else: print('This video\'s m3u8 has been published to: %s/p/%s' % (_('APIURL'),m3u8url)) publish(lines, title)
from utils import uploader from dotenv import load_dotenv load_dotenv() if __name__ == '__main__': handle = uploader().handle print(handle('/Users/ika/Desktop/9913509E9DE4492E0E903B4C2C66E98D.gif')) # print(handle('/Users/ika/Desktop/ACFC928140EE4FA072F4D6EB7CB35245.jpg')) # print(handle('/Users/ika/Desktop/out00006.ts'))
from utils import uploader from dotenv import load_dotenv load_dotenv() if __name__ == '__main__': upload = uploader() print(upload('/Users/ika/Desktop/9913509E9DE4492E0E903B4C2C66E98D.gif')) print(upload('/Users/ika/Desktop/ACFC928140EE4FA072F4D6EB7CB35245.jpg')) print(upload('/Users/ika/Desktop/out00006.ts'))