cli.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. #!/usr/bin/env python
  2. #
  3. # Upload videos to Youtube from the command-line using APIv3.
  4. #
  5. # Author: Arnau Sanchez <pyarnau@gmail.com>
  6. # Project: https://github.com/tokland/youtube-upload
  7. """
  8. Upload a video to Youtube from the command-line.
  9. $ youtube-upload --title="A.S. Mutter playing" \
  10. --description="Anne Sophie Mutter plays Beethoven" \
  11. --category=Music \
  12. --tags="mutter, beethoven" \
  13. anne_sophie_mutter.flv
  14. pxzZ-fYjeYs
  15. """
  16. import sys
  17. import argparse
  18. import googleapiclient.errors
  19. import oauth2client
  20. from . import upload
  21. from . import lib
  22. class OptionsError(Exception): pass
  23. EXIT_CODES = {
  24. OptionsError: 2,
  25. upload.InvalidCategory: 3,
  26. upload.RequestError: 3,
  27. upload.AuthenticationError: 4,
  28. oauth2client.client.FlowExchangeError: 4,
  29. NotImplementedError: 5,
  30. }
  31. WATCH_VIDEO_URL = "https://www.youtube.com/watch?v={id}"
  32. def cli(arguments):
  33. """Upload videos to Youtube."""
  34. usage = """Usage: %prog [OPTIONS] VIDEO
  35. Upload videos to Youtube."""
  36. parser = argparse.ArgumentParser(usage)
  37. # Video metadata
  38. parser.add_argument('-t', '--title', dest='title', type=str,
  39. help='Video title')
  40. parser.add_argument('-c', '--category', dest='category', type=str,
  41. help='Video category')
  42. parser.add_argument('-d', '--description', dest='description', type=str,
  43. help='Video description')
  44. parser.add_argument('--tags', dest='tags', type=str,
  45. help='Video tags (separated by commas: "tag1, tag2,...")')
  46. parser.add_argument('--privacy', dest='privacy', metavar="STRING",
  47. default="public", help='Privacy status (public | unlisted | private)')
  48. parser.add_argument('--publish-at', dest='publish_at', metavar="datetime",
  49. default=None, help='Publish date (ISO 8601): YYYY-MM-DDThh:mm:ss.sZ')
  50. parser.add_argument('--location', dest='location', type=str,
  51. default=None, metavar="latitude=VAL,longitude=VAL[,altitude=VAL]",
  52. help='Video location"')
  53. parser.add_argument('--recording-date', dest='recording_date', metavar="datetime",
  54. default=None, help="Recording date (ISO 8601): YYYY-MM-DDThh:mm:ss.sZ")
  55. parser.add_argument('--default-language', dest='default_language', type=str,
  56. default=None, metavar="string",
  57. help="Default language (ISO 639-1: en | fr | de | ...)")
  58. parser.add_argument('--default-audio-language', dest='default_audio_language', type=str,
  59. default=None, metavar="string",
  60. help="Default audio language (ISO 639-1: en | fr | de | ...)")
  61. parser.add_argument('--thumbnail', dest='thumb', type=str, metavar="FILE",
  62. help='Image file to use as video thumbnail (JPEG or PNG)')
  63. parser.add_argument('--playlist', dest='playlist', type=str,
  64. help='Playlist title (if it does not exist, it will be created)')
  65. # Authentication
  66. parser.add_argument('--client-secrets', dest='client_secrets',
  67. type=str, help='Client secrets JSON path file')
  68. parser.add_argument('--credentials-file', dest='credentials_file',
  69. type=str, help='Credentials JSON path file')
  70. parser.add_argument('--auth-browser', dest='auth_browser', action='store_true',
  71. help='Open a GUI browser to authenticate if required')
  72. #Additional options
  73. parser.add_argument('--open-link', dest='open_link', action='store_true',
  74. help='Opens video URL in a web browser')
  75. # Positional arguments
  76. parser.add_argument('video_path', metavar="VIDEO PATH", type=str,
  77. help="Video to upload (local path)")
  78. options = parser.parse_args(arguments)
  79. resource = upload.get_resource(options)
  80. video_id = upload.upload_video(resource, options.video_path, options)
  81. video_url = WATCH_VIDEO_URL.format(id=video_id)
  82. lib.debug("Video URL: {0}".format(video_url))
  83. sys.stdout.write(video_id + "\n")
  84. def run():
  85. sys.exit(lib.catch_exceptions(EXIT_CODES, cli, sys.argv[1:]))
  86. if __name__ == '__main__':
  87. run()