made interaction with user more friendly

This commit is contained in:
Kjistóf 2017-01-15 23:43:21 +01:00
parent 84e9340b56
commit 72910c3367

View File

@ -1,6 +1,6 @@
from subprocess import call, Popen, PIPE, check_output from subprocess import call, Popen, PIPE, check_output, DEVNULL
from os import listdir, remove from os import listdir, remove
from os.path import splitext from os.path import splitext, exists
from re import match from re import match
from sys import argv from sys import argv
from enum import Enum from enum import Enum
@ -32,11 +32,17 @@ def getDuration(ffprobe_output):
return duration return duration
def downloadStreams(): def downloadStreams():
print('Downloading audio stream... ', end='', flush=True)
call(('/usr/bin/env', 'youtube-dl', '--extract-audio', call(('/usr/bin/env', 'youtube-dl', '--extract-audio',
'--output', '{}.%(ext)s'.format(FILES[Stream.AUDIO]), '--output', '{}.%(ext)s'.format(FILES[Stream.AUDIO]),
URL)) URL),
stdout=DEVNULL, stderr=DEVNULL)
print('Done!')
print('Downloading video stream... ', end='', flush=True)
call(('/usr/bin/env', 'youtube-dl', '--output', '{}.%(ext)s'.format(FILES[Stream.VIDEO]), call(('/usr/bin/env', 'youtube-dl', '--output', '{}.%(ext)s'.format(FILES[Stream.VIDEO]),
URL)) URL),
stdout=DEVNULL, stderr=DEVNULL)
print('Done!')
def readExtensions(): def readExtensions():
for file in listdir(): for file in listdir():
@ -44,6 +50,28 @@ def readExtensions():
if match('^{}.*'.format(FILES[filename]), file): if match('^{}.*'.format(FILES[filename]), file):
FILES[filename] = file FILES[filename] = file
def yes_no_question(question, default):
valid = {"yes": True, "y": True, "ye": True,
"no": False, "n": False}
if default is None:
prompt = " [y/n] "
elif default == "yes":
prompt = " [Y/n] "
elif default == "no":
prompt = " [y/N] "
else:
raise ValueError("Invalid default answer: {}!".format(default))
while True:
print(question + prompt)
choice = input().lower()
if default is not None and choice == '':
return valid[default]
elif choice in valid:
return valid[choice]
else:
print("Please respond with 'yes'(y) or 'no'(n)!")
FILES = {Stream.AUDIO: 'audio', Stream.VIDEO: 'video', FILES = {Stream.AUDIO: 'audio', Stream.VIDEO: 'video',
File.LIST: 'list.txt', File.LOOP: 'loop', File.OUTPUT: 'output.mp4'} File.LIST: 'list.txt', File.LOOP: 'loop', File.OUTPUT: 'output.mp4'}
@ -51,6 +79,19 @@ OUTPUT_KEYS = [File.OUTPUT]
URL = argv[1] if len(argv) > 0 else '' # youtube-dl error message will be shown if '' URL = argv[1] if len(argv) > 0 else '' # youtube-dl error message will be shown if ''
# fetch video title
FILES[File.OUTPUT] = check_output(('/usr/bin/env', 'youtube-dl', '--get-title', argv[1])).decode('utf-8').strip() + '.mp4'
# ask what to do if output exists
if exists(FILES[File.OUTPUT]):
answer = yes_no_question('A file named "{}" already exists! Overwrite?'.format(FILES[File.OUTPUT]), default='no')
if not answer:
print('Exiting!')
exit()
else:
remove(FILES[File.OUTPUT])
# download streams and update FILE dict with extensions
downloadStreams() downloadStreams()
readExtensions() readExtensions()
@ -74,16 +115,18 @@ with open(FILES[File.LIST], 'w') as f:
for i in range(timesLoop): for i in range(timesLoop):
print("file '{}'".format(shorterFile), file=f) print("file '{}'".format(shorterFile), file=f)
# fetch video title
FILES[File.OUTPUT] = check_output(('/usr/bin/env', 'youtube-dl', '--get-title', argv[1])).decode('utf-8').strip() + '.mp4'
# loop & mux # loop & mux
call(('/usr/bin/env', 'ffmpeg', '-f', 'concat', '-i', FILES[File.LIST], '-c', 'copy', FILES[File.LOOP])) print('Looping shorter stream... ', end='', flush=True)
call(('/usr/bin/env', 'ffmpeg', '-f', 'concat', '-i', FILES[File.LIST], '-c', 'copy', FILES[File.LOOP]),
stdout=DEVNULL, stderr=DEVNULL)
print('Done!')
print('Muxing streams... ', end='', flush=True)
call(('/usr/bin/env', 'ffmpeg', '-i', FILES[File.LOOP], call(('/usr/bin/env', 'ffmpeg', '-i', FILES[File.LOOP],
'-i', FILES[Stream.AUDIO], '-i', FILES[Stream.AUDIO],
'-map', '0', '-map', '1', '-map', '0', '-map', '1',
'-c', 'copy', FILES[File.OUTPUT])) '-c', 'copy', FILES[File.OUTPUT]),
stdout=DEVNULL, stderr=DEVNULL)
print('Done!')
# cleanup # cleanup
for key in FILES: for key in FILES: