17b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org#!/usr/bin/env python 27b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org# Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 37b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org# 47b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org# Use of this source code is governed by a BSD-style license 57b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org# that can be found in the LICENSE file in the root of the source 67b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org# tree. An additional intellectual property rights grant can be found 77b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org# in the file PATENTS. All contributing project authors may 87b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org# be found in the AUTHORS file in the root of the source tree. 97b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org 107b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.orgimport os 117b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.orgimport subprocess 127b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.orgimport sys 137b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org 147b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org_DEFAULT_PADDING = 4 157b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org 167b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org 177b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.orgclass HelperError(Exception): 187b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org """Exception raised for errors in the helper.""" 197b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org pass 207b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org 217b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org 227b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.orgdef zero_pad(number, padding=_DEFAULT_PADDING): 237b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org """Converts an int into a zero padded string. 247b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org 257b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org Args: 267b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org number(int): The number to convert. 277b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org padding(int): The number of chars in the output. Note that if you pass for 287b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org example number=23456 and padding=4, the output will still be '23456', 297b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org i.e. it will not be cropped. If you pass number=2 and padding=4, the 307b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org return value will be '0002'. 317b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org Return: 327b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org (string): The zero padded number converted to string. 337b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org """ 347b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org return str(number).zfill(padding) 357b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org 367b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org 377b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.orgdef run_shell_command(cmd_list, fail_msg=None): 387b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org """Executes a command. 397b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org 407b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org Args: 417b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org cmd_list(list): Command list to execute. 427b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org fail_msg(string): Message describing the error in case the command fails. 437b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org 447b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org Return: 457b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org (string): The standard output from running the command. 467b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org 477b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org Raise: 487b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org HelperError: If command fails. 497b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org """ 507b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org process = subprocess.Popen(cmd_list, stdout=subprocess.PIPE, 517b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org stderr=subprocess.PIPE) 527b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org output, error = process.communicate() 537b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org if process.returncode != 0: 547b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org if fail_msg: 557b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org print >> sys.stderr, fail_msg 567b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org raise HelperError('Failed to run %s: command returned %d and printed ' 577b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org '%s and %s' % (' '.join(cmd_list), process.returncode, 587b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org output, error)) 597b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org return output.strip() 607b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org 617b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org 627b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.orgdef perform_action_on_all_files(directory, file_pattern, file_extension, 637b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org start_number, action, **kwargs): 647b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org """Function that performs a given action on all files matching a pattern. 657b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org 667b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org It is assumed that the files are named file_patternxxxx.file_extension, where 677b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org xxxx are digits. The file names start from 687b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org file_patern0..start_number>.file_extension. 697b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org 707b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org Args: 717b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org directory(string): The directory where the files live. 727b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org file_pattern(string): The name pattern of the files. 737b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org file_extension(string): The files' extension. 747b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org start_number(int): From where to start to count frames. 757b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org action(function): The action to be performed over the files. Must return 767b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org False if the action failed, True otherwise. 777b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org 787b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org Return: 797b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org (bool): Whether performing the action over all files was successful or not. 807b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org """ 817b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org file_prefix = os.path.join(directory, file_pattern) 827b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org file_exists = True 837b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org file_number = start_number 847b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org errors = False 857b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org 867b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org while file_exists: 877b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org zero_padded_file_number = zero_pad(file_number) 887b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org file_name = file_prefix + zero_padded_file_number + '.' + file_extension 897b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org if os.path.isfile(file_name): 907b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org if not action(file_name=file_name, **kwargs): 917b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org errors = True 927b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org break 937b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org file_number += 1 947b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org else: 957b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org file_exists = False 967b6cbc9757efa758349061cdbbaa8e39a831cb6ckjellander@webrtc.org return not errors 97