coub-dl/coub-dl.py

76 lines
2.6 KiB
Python
Raw Normal View History

2017-01-15 19:06:19 +00:00
from subprocess import call, Popen, PIPE
2017-01-15 20:29:09 +00:00
from os import listdir, remove
from re import match
from sys import argv
2017-01-15 19:18:07 +00:00
from enum import Enum
2017-01-15 19:49:27 +00:00
from datetime import timedelta
from math import ceil
2017-01-15 19:06:19 +00:00
2017-01-15 19:18:07 +00:00
class Stream(Enum):
AUDIO = 1
VIDEO = 2
2017-01-15 19:06:19 +00:00
def getCmdStdErr(command):
process = Popen(command, stderr=PIPE, stdout=PIPE)
out, err = process.communicate()
return err
def getDuration(ffprobe_output):
durationPattern = r'.*Duration:\s(.+),\sstart.*'
regex = match(durationPattern, str(ffprobe_output))
duration = regex.groups()[0] if regex else None
if not duration:
raise ValueError('Cannot process ffprobe output!')
return duration
2017-01-15 19:18:07 +00:00
argv.append('https://coub.com/view/aeeuu') # TODO: remove debug line
2017-01-15 19:18:07 +00:00
FILES = {Stream.AUDIO: 'audio', Stream.VIDEO: 'video'}
2017-01-15 19:06:19 +00:00
URL = argv[1] if len(argv) > 0 else '' # youtube-dl error message will be shown if ''
2017-01-15 19:14:01 +00:00
call(('/usr/bin/env', 'youtube-dl', '--extract-audio',
2017-01-15 19:18:07 +00:00
'--output', '{}.%(ext)s'.format(FILES[Stream.AUDIO]),
URL))
2017-01-15 19:18:07 +00:00
call(('/usr/bin/env', 'youtube-dl', '--output', '{}.%(ext)s'.format(FILES[Stream.VIDEO]),
URL))
2017-01-15 19:06:19 +00:00
for file in listdir():
2017-01-15 19:14:01 +00:00
for filename in FILES:
if match('^{}.*'.format(FILES[filename]), file):
FILES[filename] = file
2017-01-15 19:06:19 +00:00
2017-01-15 19:49:27 +00:00
audioData= getDuration(getCmdStdErr(('/usr/bin/env', 'ffprobe', FILES[Stream.AUDIO]))).split(':')
videoData = getDuration(getCmdStdErr(('/usr/bin/env', 'ffprobe', FILES[Stream.VIDEO]))).split(':')
audioLen = timedelta(hours=float(audioData[0]), minutes=float(audioData[1]), seconds=float(audioData[2]))
videoLen = timedelta(hours=float(videoData[0]), minutes=float(videoData[1]), seconds=float(videoData[2]))
2017-01-15 19:06:19 +00:00
print(audioLen)
print(videoLen)
2017-01-15 19:49:27 +00:00
longer = audioLen if audioLen > videoLen else videoLen
shorter = audioLen if audioLen < videoLen else videoLen
2017-01-15 19:59:53 +00:00
shorterFile = FILES[Stream.AUDIO] if audioLen < videoLen else FILES[Stream.VIDEO]
2017-01-15 19:49:27 +00:00
timesLoop = ceil(longer.seconds / shorter.seconds)
2017-01-15 19:59:53 +00:00
with open('list.txt', 'w') as f:
for i in range(timesLoop):
print("file '{}'".format(shorterFile), file=f)
2017-01-15 19:49:27 +00:00
2017-01-15 20:29:09 +00:00
call(('/usr/bin/env', 'ffmpeg', '-f', 'concat', '-i', 'list.txt', '-c', 'copy', 'loopedvideo.mp4'))
call(('/usr/bin/env', 'ffmpeg', '-i', 'loopedvideo.mp4',
'-i', FILES[Stream.AUDIO],
'-map', '0', '-map', '1',
'-c', 'copy', 'output.mp4'))
2017-01-15 20:29:09 +00:00
remove(FILES[Stream.AUDIO])
remove(FILES[Stream.VIDEO])
remove('list.txt')
remove('loopedvideo.mp4')