#!/usr/bin/env python
# Copyright (c) 2012 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,
           'From': lambda deps, definition: deps}
  execfile(path, {}, scope)
  return scope

if __name__ == '__main__':
  main()
