diff --git a/coub-dl.py b/coub-dl.py index 6d99409..40545b0 100755 --- a/coub-dl.py +++ b/coub-dl.py @@ -16,6 +16,7 @@ from argparse import ArgumentParser from signal import signal, SIGINT from sys import exit from copy import deepcopy +from collections import namedtuple import utility from utility import call_verbose, print_opt, get_output, temporary_directory, yes_no_question, check_dependencies @@ -46,6 +47,7 @@ class coub_dl: self._url = url self._files_dict = files_dict self._directory = directory + self._loopdata = namedtuple('loopdata', ('base', 'fraction', 'time', 'file')) def __call__(self): @@ -56,30 +58,16 @@ class coub_dl: self.check_downloads() self.fix_video_stream() - # get stream lengths via ffprobe - audioLen = coub_dl.get_length(self._files_dict[Stream.AUDIO]) - videoLen = coub_dl.get_length(self._files_dict[Stream.VIDEO]) - - # decide which stream needs some looping - longer = audioLen if audioLen > videoLen else videoLen - shorter = audioLen if audioLen < videoLen else videoLen - shorterFile = self._files_dict[Stream.AUDIO] if audioLen < videoLen else self._files_dict[Stream.VIDEO] - self._files_dict[File.LOOP] += splitext(shorterFile)[1] - self._files_dict[File.FRACTION] += splitext(shorterFile)[1] - - # calculate how many times to loop - times = longer.total_seconds() / shorter.total_seconds() - timesLoop_base = int(floor(times)) - timesLoop_fraction = times % 1 + self.calculate_loops() # write concat helper file for ffmpeg with open(self._files_dict[File.LIST], 'w') as f: - for i in range(timesLoop_base): - print("file '{}'".format(shorterFile), file=f) + for i in range(self._loopdata.base): + print("file '{}'".format(self._loopdata.file), file=f) print("file '{}'".format(self._files_dict[File.FRACTION]), file=f) # loop & mux streams - self.loop_shorter_stream(shorter, shorterFile, timesLoop_fraction) + self.loop_shorter_stream() self.mux_streams() @@ -119,9 +107,25 @@ class coub_dl: f.write(bytes(2)) - def loop_shorter_stream(self, shorter, shorter_file, loop_fraction): + def calculate_loops(self): + audioLen = coub_dl.get_length(self._files_dict[Stream.AUDIO]) + videoLen = coub_dl.get_length(self._files_dict[Stream.VIDEO]) + + longer = audioLen if audioLen > videoLen else videoLen + self._loopdata.time = audioLen if audioLen < videoLen else videoLen + self._loopdata.file = self._files_dict[Stream.AUDIO] if audioLen < videoLen else self._files_dict[Stream.VIDEO] + self._files_dict[File.LOOP] += splitext(self._loopdata.file)[1] + self._files_dict[File.FRACTION] += splitext(self._loopdata.file)[1] + + times = longer.total_seconds() / self._loopdata.time.total_seconds() + self._loopdata.base = int(floor(times)) + self._loopdata.fraction = times % 1 + + + def loop_shorter_stream(self): # prepare last fractional loop - call(('ffmpeg', '-i', shorter_file, '-t', str(loop_fraction * shorter.total_seconds()), + call(('ffmpeg', '-i', self._loopdata.file, '-t', str(self._loopdata.fraction * + self._loopdata.time.total_seconds()), self._files_dict[File.FRACTION]), stdout=DEVNULL, stderr=DEVNULL)