def main(): print('AutoCutter started @ ' + getTimeStr() + '!') args = parseArguments() print(args) while (checkSanityDir(args.directorySrc, args.directoryDst) == False): print('Failed sanity check, looping..') time.sleep(5) # concatenateVideos(args) # dumpExifInfo(args) segments = buildSegments(args) events = createEvents() for k, v in segments.items(): scheduler = SegmentScheduler(args.directoryTmp, events) scheduler.set_date(v[0].getStartTime()) cutter = SegmentCutter(args.directoryTmp) joiner = SegmentJoiner(args.directoryDst, args.directoryTmp) ret = scheduler.calculate(v) for team, cutList in ret.items(): for cut in cutList: cutter.run(cut, args.dryRun) joiner.ffmpegJoin(team, cutList, args.dryRun) for cut in cutList: if shouldDelete(cut, events, args): print("Would unlink: " + cut.cutFilePath) os.unlink(cut.cutFilePath) else: print("Would NOT unlink: " + cut.cutFilePath)
def test_set_date(self): dt = datetime.strptime("2018:10:31_07:03:27", "%Y:%m:%d_%H:%M:%S") dt_expected = datetime.strptime("2018:10:31_00:00:00", "%Y:%m:%d_%H:%M:%S") scheduler = SegmentScheduler('/tmp/', self.events) scheduler.set_date(dt) self.assertTrue(scheduler.m_dateAtMidnight == dt_expected)
def test_calculation_segment_is_in_the_middle_of_event(self): cutter = SegmentCutter('/tmp/') scheduler = SegmentScheduler('/tmp/', self.events) scheduler.set_date( datetime.strptime("2018:10:31_07:03:27", "%Y:%m:%d_%H:%M:%S")) segments = [] segments.append( createVideoSegment('/tmp/middle_alegria', '2018:10:31 18:35:00', 1353.352)) segments.append( createVideoSegment('/tmp/middle_footwork', '2018:10:31 20:35:00', 1353.352)) segments.append( createVideoSegment('/tmp/middle_ritmo', '2018:10:31 21:15:00', 1353.352)) ret = scheduler.calculate(segments) for k, value in ret.items(): # print (f"Key: {k}") for cut in ret[k]: pass # print ("Got command: " + cutter.run(cut)) self.assertTrue(len(ret['Alegria']) == 1) self.assertTrue( ret['Alegria'][0].segment.filePath == '/tmp/middle_alegria') self.assertTrue(len(ret['Footwork']) == 1) self.assertTrue( ret['Footwork'][0].segment.filePath == '/tmp/middle_footwork') self.assertTrue(len(ret['Ritmo']) == 1) self.assertTrue( ret['Ritmo'][0].segment.filePath == '/tmp/middle_ritmo')
def test_calculation_and_cut(self): cutter = SegmentCutter('/tmp/') dt = datetime.strptime("2018:10:31_07:03:27", "%Y:%m:%d_%H:%M:%S") scheduler = SegmentScheduler('/tmp/', self.events) scheduler.set_date(dt) ret = scheduler.calculate(self.segments) for k, value in ret.items(): # print (f"Key: {k}") for cut in ret[k]: pass
def test_calculation_and_cut_and_join(self): cutter = SegmentCutter('/tmp/') joiner = SegmentJoiner('/tmp/out/', '/tmp/') dt = datetime.strptime("2018:10:31_07:03:27", "%Y:%m:%d_%H:%M:%S") scheduler = SegmentScheduler('/tmp/', self.events) scheduler.set_date(dt) runList = [] ret = scheduler.calculate(self.segments) for k, value in ret.items(): # new_cuts = value for cutSegment in value: cutter.run(cutSegment, dryRun=True)
def test_calculation(self): dt = datetime.strptime("2018:10:31_07:03:27", "%Y:%m:%d_%H:%M:%S") scheduler = SegmentScheduler('/tmp/', self.events) scheduler.set_date(dt) ret = scheduler.calculate(self.segments) for k, value in ret.items(): # print (f"Key : {k}") cut_duration = timedelta(seconds=0) for cut in ret[k]: # print (f" File: {cut.segment.filePath}") # print (f" Dura: {cut.segment.duration}") # print (f" Dura: {cut.cutDuration}") cut_duration += cut.cutDuration
def test_calculation_segment_is_after_all_events(self): cutter = SegmentCutter('/tmp/') scheduler = SegmentScheduler('/tmp/', self.events) scheduler.set_date( datetime.strptime("2018:10:31_07:03:27", "%Y:%m:%d_%H:%M:%S")) segments = [] segments.append( createVideoSegment('/tmp/end_alegria_begin_footwork', '2018:10:31 22:48:00', 1353.352)) ret = scheduler.calculate(segments) self.assertTrue(len(ret['Alegria']) == 0) self.assertTrue(len(ret['Footwork']) == 0) self.assertTrue(len(ret['Ritmo']) == 0)
def test_get_event_date(self): dt = datetime.strptime("2018:10:31_07:03:27", "%Y:%m:%d_%H:%M:%S") expected_start = datetime.strptime("2018:10:31_18:30:00", "%Y:%m:%d_%H:%M:%S") expected_start = pytz.timezone('US/Eastern').localize(expected_start) expected_end = datetime.strptime("2018:10:31_20:05:00", "%Y:%m:%d_%H:%M:%S") expected_end = pytz.timezone('US/Eastern').localize( datetime.strptime("2018:10:31_20:05:00", "%Y:%m:%d_%H:%M:%S")) expected_dur = timedelta(hours=1, minutes=35) scheduler = SegmentScheduler('/tmp/', self.events) scheduler.set_date(dt) ev_date = scheduler.get_event_date(self.events[0]) # print (f"Start : {ev_date.getStartTime()}") # print (f"Durat : {ev_date.getDuration()}") # print (f"End : {ev_date.getEndTime()}") self.assertTrue(ev_date.getStartTime() == expected_start) self.assertTrue(ev_date.getEndTime() == expected_end) self.assertTrue(ev_date.getDuration() == expected_dur)
def test_calculation_segment_is_in_the_middle_of_two_events(self): cutter = SegmentCutter('/tmp/') scheduler = SegmentScheduler('/tmp/', self.events) scheduler.set_date( datetime.strptime("2018:10:31_07:03:27", "%Y:%m:%d_%H:%M:%S")) segments = [] segments.append( createVideoSegment('/tmp/end_alegria_begin_footwork', '2018:10:31 19:55:00', 1353.352)) ret = scheduler.calculate(segments) self.assertTrue(len(ret['Alegria']) == 1) self.assertTrue(ret['Alegria'][0].segment.filePath == '/tmp/end_alegria_begin_footwork') # print("here: " + str(ret['Alegria'][0].segment.getDuration())) self.assertTrue(ret['Alegria'][0].cutDuration == timedelta( seconds=600)) self.assertTrue(len(ret['Footwork']) == 1) self.assertTrue(ret['Footwork'][0].segment.filePath == '/tmp/end_alegria_begin_footwork') self.assertTrue(ret['Footwork'][0].cutDuration == timedelta( seconds=300)) self.assertTrue(len(ret['Ritmo']) == 0)
def test_should_delete(self): ParsedArgs = namedtuple( 'ParsedArgs', ['directorySrc', 'directoryDst', 'directoryTmp', 'dryRun']) args = ParsedArgs(directorySrc=self.dirSrc, directoryDst=self.dirDst, directoryTmp=self.dirTmp, dryRun=True) events = [] events.append( ScheduledEvent(name='Alegria', hour=6, minute=30, second=0, PM=True, duration='1:35:00')) events.append( ScheduledEvent(name='Footwork', hour=8, minute=00, second=0, PM=True, duration='1:05:00')) events.append( ScheduledEvent(name='Ritmo', hour=9, minute=00, second=0, PM=True, duration='1:35:00')) segments = [] segments.append( createVideoSegment('/mnt/tmp/Footwork_2', '2018:10:31 20:06:00', 1353.352)) segments.append( createVideoSegment('/mnt/tmp/Footwork_3', '2018:10:31 20:28:00', 1353.352)) clippedForRitmo = createVideoSegment('/mnt/tmp/Footwork_1', '2018:10:31 20:55:00', 1353.352) segments.append(clippedForRitmo) for s in segments: self.fs.create_file(s.filePath) scheduler = SegmentScheduler(args.directoryTmp, events) dt = datetime.strptime("2018:10:31_07:03:27", "%Y:%m:%d_%H:%M:%S") scheduler.set_date(dt) ret = scheduler.calculate(segments) for team, cutList in ret.items(): for cut in cutList: ret = shouldDelete(cut, events, args) if cut.segment == clippedForRitmo: print("asserting: Segment must be deleted:" + cut.cutFilePath + " vs " + str(ret)) self.assertTrue(ret) else: print("asserting: Segment must not be deleted:" + cut.cutFilePath) self.assertFalse(ret)