# __init__.py

#

Copyright (C) 2010 Google Inc.

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

    import googlecl
    import googlecl.base
    import re

    service_name = __name__.split('.')[-1]
    LOGGER_NAME = __name__
    SECTION_HEADER = service_name.upper()

#

Map an access string to a value YouTube will understand.

    def _map_access_string(access_string):

#

In this case, YouTube only cares about "is private" so 'public' gets mapped to False, everything else to True.

Returns: Boolean indicating True (is private) or False (is not private).

      if not access_string:
        return False
      if access_string == 'public':
        return False
      return True

#

    class VideoEntryToStringWrapper(googlecl.base.BaseEntryToStringWrapper):

#

Author.

      @property
      def author(self):

#

Name of author 'x' name is in entry.author[x].name.text

        text_extractor = lambda entry: getattr(getattr(entry, 'name'), 'text')
        return self._join(self.entry.author, text_extractor=text_extractor)
      owner = author

#

Length of the video, in minutes (MM:SS).

      @property
      def minutes(self):

#

        minutes = int(self.seconds) / 60
        seconds = int(self.seconds) % 60
        return '%d:%#02d' % (minutes, seconds)
      time = minutes
      length = minutes
      duration = minutes

#

Length of the video, in seconds.

      @property
      def seconds(self):

#

        return self.entry.media.duration.seconds

#

Status of the video.

      @property
      def status(self):

#

        if self.entry.control:

#

Apparently the structure for video entries isn't fully fleshed out, so use a regex on the xml.

          xml_string = self.xml
          reason_regex = r'<ns1:control .*? name="(\w+)" reasonCode="(\w+)"'
          match = re.search(reason_regex, xml_string)
          if match:
            return '%s (%s)' % (match.group(1), match.group(2))
        if self.entry.media.private:
          return 'private'
        if self.entry.racy:
          return 'racy'
        else:

#

Can't find a difference between public and unlisted videos, in the XML or self.entry data structure...

          return 'public/unlisted'

#

Tags / keywords or labels.

      @property
      def tags(self):

#

        tags_text = self.entry.media.keywords.text
        tags_text = tags_text.replace(', ', ',')
        tags_list = tags_text.split(',')
        return self.intra_property_delimiter.join(tags_list)
      labels = tags
      keywords = tags

#

###### ######################################################################### <span id="each-of-the-following-run*-functions-execute-a-particular-task.

keyword-arguments: -client:-client-to-the-service-being-used. -options:-contains-all-attributes-required-to-perform-the-task -args:-additional-arguments-passed-in-on-the-command-line,-may-or-may-not-be -------required" href="each-of-the-following-run*-functions-execute-a-particular-task.

keyword-arguments: -client:-client-to-the-service-being-used. -options:-contains-all-attributes-required-to-perform-the-task -args:-additional-arguments-passed-in-on-the-command-line,-may-or-may-not-be -------required"> Each of the following run* functions execute a particular task.

Keyword arguments: client: Client to the service being used. options: Contains all attributes required to perform the task args: Additional arguments passed in on the command line, may or may not be required

    def _run_list(client, options, args):
      titles_list = googlecl.build_titles_list(options.title, args)
      entries = client.GetVideos(user=options.owner or 'default',
                                 titles=titles_list)
      for vid in entries:
        print googlecl.base.compile_entry_string(VideoEntryToStringWrapper(vid),
                                                 options.fields.split(','),
                                                 delimiter=options.delimiter)

#

    def _run_post(client, options, args):
      video_list = options.src + args
      is_private = _map_access_string(options.access)
      client.PostVideos(video_list, title=options.title, desc=options.summary,
                        tags=options.tags, category=options.category,
                        is_private=is_private)

#

    def _run_tag(client, options, args):
      titles_list = googlecl.build_titles_list(options.title, args)
      video_entries = client.GetVideos(titles=titles_list)
      if options.category:
        client.CategorizeVideos(video_entries, options.category)
      if options.tags:
        client.TagVideos(video_entries, options.tags)

#

    def _run_delete(client, options, args):
      titles_list = googlecl.build_titles_list(options.title, args)
      entries = client.GetVideos(titles=titles_list)
      client.DeleteEntryList(entries, 'video', options.prompt)

    TASKS = {'post': googlecl.base.Task('Post a video.', callback=_run_post,
                                        required=['src', 'category', 'devkey'],
                                        optional=['title', 'summary', 'tags',
                                                  'access']),
             'list': googlecl.base.Task('List videos by user.',
                                        callback=_run_list,
                                        required=['fields', 'delimiter'],
                                        optional=['title', 'owner']),
             'tag': googlecl.base.Task('Add tags to a video and/or ' +\
                                       'change its category.',
                                       callback=_run_tag,
                                       required=['title', ['tags', 'category'],
                                                 'devkey']),
             'delete': googlecl.base.Task('Delete videos.', callback=_run_delete,
                                          required=['title', 'devkey'])}