#!/usr/bin/env python
# Copyright (c) 2014 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.

"""Checks if a virtual webcam is running and starts it if not.

Returns a non-zero return code if the webcam could not be started.

Prerequisites:
* The Python interpreter must have the psutil package installed.
* Windows: a scheduled task named 'ManyCam' must exist and be configured to
  launch ManyCam preconfigured to auto-play the test clip.
* Mac: ManyCam must be installed in the default location and be preconfigured
  to auto-play the test clip.
* Linux: Not implemented

NOTICE: When running this script as a buildbot step, make sure to set
usePTY=False for the build step when adding it, or the subprocess will die as
soon the step has executed.

If any command line arguments are passed to the script, it is executed as a
command in a subprocess.
"""

# psutil is not installed on non-Linux machines by default.
import psutil  # pylint: disable=F0401
import subprocess
import sys


WEBCAM_WIN = ('schtasks', '/run', '/tn', 'ManyCam')
WEBCAM_MAC = ('open', '/Applications/ManyCam/ManyCam.app')


def IsWebCamRunning():
  if sys.platform == 'win32':
    process_name = 'ManyCam.exe'
  elif sys.platform.startswith('darwin'):
    process_name = 'ManyCam'
  elif sys.platform.startswith('linux'):
    # TODO(bugs.webrtc.org/9636): Currently a no-op on Linux: sw webcams no
    # longer in use.
    print 'Virtual webcam: no-op on Linux'
    return True
  else:
    raise Exception('Unsupported platform: %s' % sys.platform)
  for p in psutil.process_iter():
    try:
      if process_name == p.name:
        print 'Found a running virtual webcam (%s with PID %s)' % (p.name,
                                                                   p.pid)
        return True
    except psutil.AccessDenied:
      pass  # This is normal if we query sys processes, etc.
  return False


def StartWebCam():
  try:
    if sys.platform == 'win32':
      subprocess.check_call(WEBCAM_WIN)
      print 'Successfully launched virtual webcam.'
    elif sys.platform.startswith('darwin'):
      subprocess.check_call(WEBCAM_MAC)
      print 'Successfully launched virtual webcam.'
    elif sys.platform.startswith('linux'):
      # TODO(bugs.webrtc.org/9636): Currently a no-op on Linux: sw webcams no
      # longer in use.
      print 'Not implemented on Linux'

  except Exception as e:
    print 'Failed to launch virtual webcam: %s' % e
    return False

  return True


def _ForcePythonInterpreter(cmd):
  """Returns the fixed command line to call the right python executable."""
  out = cmd[:]
  if out[0] == 'python':
    out[0] = sys.executable
  elif out[0].endswith('.py'):
    out.insert(0, sys.executable)
  return out


def Main(argv):
  if not IsWebCamRunning():
    if not StartWebCam():
      return 1

  if argv:
    return subprocess.call(_ForcePythonInterpreter(argv))
  else:
    return 0


if __name__ == '__main__':
  sys.exit(Main(sys.argv[1:]))
