| #!/usr/bin/env python |
| # Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. |
| # |
| # Use of this source code is governed by a BSD-style license |
| # that can be found in the LICENSE file in the root of the source |
| # tree. An additional intellectual property rights grant can be found |
| # in the file PATENTS. All contributing project authors may |
| # be found in the AUTHORS file in the root of the source tree. |
| |
| __author__ = 'kjellander@webrtc.org (Henrik Kjellander)' |
| |
| """Downloads WebRTC resources files from a remote host.""" |
| |
| from optparse import OptionParser |
| from urlparse import urljoin |
| import os |
| import shutil |
| import sys |
| import tarfile |
| import tempfile |
| import urllib2 |
| |
| |
| def main(): |
| """ |
| Downloads WebRTC resources files from a remote host. |
| |
| This script will download WebRTC resource files used for testing, like audio |
| and video files. It will check the current version in the DEPS file and |
| compare it with the one downloaded (kept in a text file in the download dir). |
| If the DEPS version is different than the one downloaded, the correct version |
| will be downloaded. |
| """ |
| # Constants. |
| deps_key = 'webrtc_resources_revision' |
| remote_url_base = 'http://commondatastorage.googleapis.com/webrtc-resources/' |
| version_filename = 'webrtc-resources-version' |
| filename_prefix = 'webrtc-resources-' |
| extension = '.tgz' |
| |
| # Variables used by the script. |
| project_root_dir = os.path.normpath(sys.path[0] + '/../../') |
| deps_file = os.path.join(project_root_dir, 'DEPS') |
| downloads_dir = os.path.join(project_root_dir, 'resources') |
| current_version_file = os.path.join(downloads_dir, version_filename) |
| |
| # Ensure the downloads dir is created. |
| if not os.path.isdir(downloads_dir): |
| os.mkdir(downloads_dir) |
| |
| # Define and parse arguments. |
| parser = OptionParser() |
| parser.add_option('-f', '--force', action='store_true', dest='force', |
| help='forces download and removes all existing resources.') |
| (options, unused_args) = parser.parse_args() |
| |
| # Check if we have an existing version already downloaded. |
| current_version = 0 |
| if os.path.isfile(current_version_file): |
| f = open(current_version_file) |
| current_version = int(f.read()) |
| f.close() |
| print 'Found downloaded resources: version: %s' % current_version |
| |
| # Check the DEPS file for the latest version number. |
| deps_vars = EvalDepsFile(deps_file)['vars'] |
| latest_version = int(deps_vars[deps_key]) |
| print 'Version in DEPS file: %d' % latest_version |
| |
| # Download archive if forced or DEPS version is different than our current. |
| if latest_version != current_version or options.force: |
| temp_dir = tempfile.mkdtemp(prefix='webrtc-resources-') |
| archive_name = '%s%s%s' % (filename_prefix, latest_version, extension) |
| remote_archive_url = urljoin(remote_url_base, archive_name) |
| # Download into the temporary directory with display of progress, inspired |
| # by the Stack Overflow post at http://goo.gl/JIrbo |
| temp_file = os.path.join(temp_dir, archive_name) |
| print 'Downloading: %s' % remote_archive_url |
| u = urllib2.urlopen(remote_archive_url) |
| f = open(temp_file, 'wb') |
| meta = u.info() |
| file_size = int(meta.getheaders('Content-Length')[0]) |
| print 'Progress: %s bytes: %s' % (archive_name, file_size) |
| |
| file_size_dl = 0 |
| block_size = 65536 |
| while True: |
| file_buffer = u.read(block_size) |
| if not file_buffer: |
| break |
| file_size_dl += len(file_buffer) |
| f.write(file_buffer) |
| status = r'%10d [%3.2f%%]' % (file_size_dl, |
| file_size_dl * 100. / file_size) |
| status += chr(8) * (len(status) + 1) |
| print status, |
| print |
| f.close() |
| |
| # Clean up the existing resources dir. |
| print 'Removing old resources in %s' % downloads_dir |
| shutil.rmtree(downloads_dir) |
| os.mkdir(downloads_dir) |
| |
| # Write the downloaded version to a text file in the resources dir to avoid |
| # re-download of the same version in the future. |
| new_version_file = os.path.join(downloads_dir, version_filename) |
| f = open(new_version_file, 'w') |
| f.write('%d' % latest_version) |
| f.close() |
| |
| # Extract the archive. |
| archive = tarfile.open(temp_file, 'r:gz') |
| archive.extractall(downloads_dir) |
| archive.close() |
| print 'Extracted resource files into %s' % downloads_dir |
| # Clean up the temp dir. |
| shutil.rmtree(temp_dir) |
| else: |
| print 'Already have correct version: %s' % current_version |
| |
| |
| def EvalDepsFile(path): |
| scope = {'Var': lambda name: scope['vars'][name], |
| 'File': lambda name: name} |
| execfile(path, {}, scope) |
| return scope |
| |
| if __name__ == '__main__': |
| main() |