#!/usr/bin/python # # Copyright (C) 2009 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. """Contains the data classes of the YouTube Data API""" __author__ = 'j.s@google.com (Jeff Scudder)' import atom.core import atom.data import gdata.data import gdata.geo.data import gdata.media.data import gdata.opensearch.data import gdata.youtube.data YT_TEMPLATE = '{http://gdata.youtube.com/schemas/2007/}%s' class ComplaintEntry(gdata.data.GDEntry): """Describes a complaint about a video""" class ComplaintFeed(gdata.data.GDFeed): """Describes complaints about a video""" entry = [ComplaintEntry] class RatingEntry(gdata.data.GDEntry): """A rating about a video""" rating = gdata.data.Rating class RatingFeed(gdata.data.GDFeed): """Describes ratings for a video""" entry = [RatingEntry] class YouTubeMediaContent(gdata.media.data.MediaContent): """Describes a you tube media content""" _qname = gdata.media.data.MEDIA_TEMPLATE % 'content' format = 'format' class YtAge(atom.core.XmlElement): """User's age""" _qname = YT_TEMPLATE % 'age' class YtBooks(atom.core.XmlElement): """User's favorite books""" _qname = YT_TEMPLATE % 'books' class YtCompany(atom.core.XmlElement): """User's company""" _qname = YT_TEMPLATE % 'company' class YtDescription(atom.core.XmlElement): """Description""" _qname = YT_TEMPLATE % 'description' class YtDuration(atom.core.XmlElement): """Video duration""" _qname = YT_TEMPLATE % 'duration' seconds = 'seconds' class YtFirstName(atom.core.XmlElement): """User's first name""" _qname = YT_TEMPLATE % 'firstName' class YtGender(atom.core.XmlElement): """User's gender""" _qname = YT_TEMPLATE % 'gender' class YtHobbies(atom.core.XmlElement): """User's hobbies""" _qname = YT_TEMPLATE % 'hobbies' class YtHometown(atom.core.XmlElement): """User's hometown""" _qname = YT_TEMPLATE % 'hometown' class YtLastName(atom.core.XmlElement): """User's last name""" _qname = YT_TEMPLATE % 'lastName' class YtLocation(atom.core.XmlElement): """Location""" _qname = YT_TEMPLATE % 'location' class YtMovies(atom.core.XmlElement): """User's favorite movies""" _qname = YT_TEMPLATE % 'movies' class YtMusic(atom.core.XmlElement): """User's favorite music""" _qname = YT_TEMPLATE % 'music' class YtNoEmbed(atom.core.XmlElement): """Disables embedding for the video""" _qname = YT_TEMPLATE % 'noembed' class YtOccupation(atom.core.XmlElement): """User's occupation""" _qname = YT_TEMPLATE % 'occupation' class YtPlaylistId(atom.core.XmlElement): """Playlist id""" _qname = YT_TEMPLATE % 'playlistId' class YtPosition(atom.core.XmlElement): """Video position on the playlist""" _qname = YT_TEMPLATE % 'position' class YtPrivate(atom.core.XmlElement): """Flags the entry as private""" _qname = YT_TEMPLATE % 'private' class YtQueryString(atom.core.XmlElement): """Keywords or query string associated with a subscription""" _qname = YT_TEMPLATE % 'queryString' class YtRacy(atom.core.XmlElement): """Mature content""" _qname = YT_TEMPLATE % 'racy' class YtRecorded(atom.core.XmlElement): """Date when the video was recorded""" _qname = YT_TEMPLATE % 'recorded' class YtRelationship(atom.core.XmlElement): """User's relationship status""" _qname = YT_TEMPLATE % 'relationship' class YtSchool(atom.core.XmlElement): """User's school""" _qname = YT_TEMPLATE % 'school' class YtStatistics(atom.core.XmlElement): """Video and user statistics""" _qname = YT_TEMPLATE % 'statistics' favorite_count = 'favoriteCount' video_watch_count = 'videoWatchCount' view_count = 'viewCount' last_web_access = 'lastWebAccess' subscriber_count = 'subscriberCount' class YtStatus(atom.core.XmlElement): """Status of a contact""" _qname = YT_TEMPLATE % 'status' class YtUserProfileStatistics(YtStatistics): """User statistics""" _qname = YT_TEMPLATE % 'statistics' class YtUsername(atom.core.XmlElement): """Youtube username""" _qname = YT_TEMPLATE % 'username' class FriendEntry(gdata.data.BatchEntry): """Describes a contact in friend list""" username = YtUsername status = YtStatus email = gdata.data.Email class FriendFeed(gdata.data.BatchFeed): """Describes user's friends""" entry = [FriendEntry] class YtVideoStatistics(YtStatistics): """Video statistics""" _qname = YT_TEMPLATE % 'statistics' class ChannelEntry(gdata.data.GDEntry): """Describes a video channel""" class ChannelFeed(gdata.data.GDFeed): """Describes channels""" entry = [ChannelEntry] class FavoriteEntry(gdata.data.BatchEntry): """Describes a favorite video""" class FavoriteFeed(gdata.data.BatchFeed): """Describes favorite videos""" entry = [FavoriteEntry] class YouTubeMediaCredit(gdata.media.data.MediaCredit): """Describes a you tube media credit""" _qname = gdata.media.data.MEDIA_TEMPLATE % 'credit' type = 'type' class YouTubeMediaRating(gdata.media.data.MediaRating): """Describes a you tube media rating""" _qname = gdata.media.data.MEDIA_TEMPLATE % 'rating' country = 'country' class YtAboutMe(atom.core.XmlElement): """User's self description""" _qname = YT_TEMPLATE % 'aboutMe' class UserProfileEntry(gdata.data.BatchEntry): """Describes an user's profile""" relationship = YtRelationship description = YtDescription location = YtLocation statistics = YtUserProfileStatistics school = YtSchool music = YtMusic first_name = YtFirstName gender = YtGender occupation = YtOccupation hometown = YtHometown company = YtCompany movies = YtMovies books = YtBooks username = YtUsername about_me = YtAboutMe last_name = YtLastName age = YtAge thumbnail = gdata.media.data.MediaThumbnail hobbies = YtHobbies class UserProfileFeed(gdata.data.BatchFeed): """Describes a feed of user's profile""" entry = [UserProfileEntry] class YtAspectRatio(atom.core.XmlElement): """The aspect ratio of a media file""" _qname = YT_TEMPLATE % 'aspectRatio' class YtBasePublicationState(atom.core.XmlElement): """Status of an unpublished entry""" _qname = YT_TEMPLATE % 'state' help_url = 'helpUrl' class YtPublicationState(YtBasePublicationState): """Status of an unpublished video""" _qname = YT_TEMPLATE % 'state' name = 'name' reason_code = 'reasonCode' class YouTubeAppControl(atom.data.Control): """Describes a you tube app control""" _qname = (atom.data.APP_TEMPLATE_V1 % 'control', atom.data.APP_TEMPLATE_V2 % 'control') state = YtPublicationState class YtCaptionPublicationState(YtBasePublicationState): """Status of an unpublished caption track""" _qname = YT_TEMPLATE % 'state' reason_code = 'reasonCode' name = 'name' class YouTubeCaptionAppControl(atom.data.Control): """Describes a you tube caption app control""" _qname = atom.data.APP_TEMPLATE_V2 % 'control' state = YtCaptionPublicationState class CaptionTrackEntry(gdata.data.GDEntry): """Describes a caption track""" class CaptionTrackFeed(gdata.data.GDFeed): """Describes caption tracks""" entry = [CaptionTrackEntry] class YtCountHint(atom.core.XmlElement): """Hint as to how many entries the linked feed contains""" _qname = YT_TEMPLATE % 'countHint' class PlaylistLinkEntry(gdata.data.BatchEntry): """Describes a playlist""" description = YtDescription playlist_id = YtPlaylistId count_hint = YtCountHint private = YtPrivate class PlaylistLinkFeed(gdata.data.BatchFeed): """Describes list of playlists""" entry = [PlaylistLinkEntry] class YtModerationStatus(atom.core.XmlElement): """Moderation status""" _qname = YT_TEMPLATE % 'moderationStatus' class YtPlaylistTitle(atom.core.XmlElement): """Playlist title""" _qname = YT_TEMPLATE % 'playlistTitle' class SubscriptionEntry(gdata.data.BatchEntry): """Describes user's channel subscritpions""" count_hint = YtCountHint playlist_title = YtPlaylistTitle thumbnail = gdata.media.data.MediaThumbnail username = YtUsername query_string = YtQueryString playlist_id = YtPlaylistId class SubscriptionFeed(gdata.data.BatchFeed): """Describes list of user's video subscriptions""" entry = [SubscriptionEntry] class YtSpam(atom.core.XmlElement): """Indicates that the entry probably contains spam""" _qname = YT_TEMPLATE % 'spam' class CommentEntry(gdata.data.BatchEntry): """Describes a comment for a video""" spam = YtSpam class CommentFeed(gdata.data.BatchFeed): """Describes comments for a video""" entry = [CommentEntry] class YtUploaded(atom.core.XmlElement): """Date/Time at which the video was uploaded""" _qname = YT_TEMPLATE % 'uploaded' class YtVideoId(atom.core.XmlElement): """Video id""" _qname = YT_TEMPLATE % 'videoid' class YouTubeMediaGroup(gdata.media.data.MediaGroup): """Describes a you tube media group""" _qname = gdata.media.data.MEDIA_TEMPLATE % 'group' videoid = YtVideoId private = YtPrivate duration = YtDuration aspect_ratio = YtAspectRatio uploaded = YtUploaded class VideoEntryBase(gdata.data.GDEntry): """Elements that describe or contain videos""" group = YouTubeMediaGroup statistics = YtVideoStatistics racy = YtRacy recorded = YtRecorded where = gdata.geo.data.GeoRssWhere rating = gdata.data.Rating noembed = YtNoEmbed location = YtLocation comments = gdata.data.Comments class PlaylistEntry(gdata.data.BatchEntry): """Describes a video in a playlist""" description = YtDescription position = YtPosition class PlaylistFeed(gdata.data.BatchFeed): """Describes videos in a playlist""" private = YtPrivate group = YouTubeMediaGroup playlist_id = YtPlaylistId entry = [PlaylistEntry] class VideoEntry(gdata.data.BatchEntry): """Describes a video""" class VideoFeed(gdata.data.BatchFeed): """Describes a video feed""" entry = [VideoEntry] class VideoMessageEntry(gdata.data.BatchEntry): """Describes a video message""" description = YtDescription class VideoMessageFeed(gdata.data.BatchFeed): """Describes videos in a videoMessage""" entry = [VideoMessageEntry] class UserEventEntry(gdata.data.GDEntry): """Describes a user event""" playlist_id = YtPlaylistId videoid = YtVideoId username = YtUsername query_string = YtQueryString rating = gdata.data.Rating class UserEventFeed(gdata.data.GDFeed): """Describes list of events""" entry = [UserEventEntry] class VideoModerationEntry(gdata.data.GDEntry): """Describes video moderation""" moderation_status = YtModerationStatus videoid = YtVideoId class VideoModerationFeed(gdata.data.GDFeed): """Describes a video moderation feed""" entry = [VideoModerationEntry] class TrackContent(atom.data.Content): lang = atom.data.XML_TEMPLATE % 'lang' class TrackEntry(gdata.data.GDEntry): """Represents the URL for a caption track""" content = TrackContent def get_caption_track_id(self): """Extracts the ID of this caption track. Returns: The caption track's id as a string. """ if self.id.text: match = CAPTION_TRACK_ID_PATTERN.match(self.id.text) if match: return match.group(2) return None GetCaptionTrackId = get_caption_track_id class CaptionFeed(gdata.data.GDFeed): """Represents a caption feed for a video on YouTube.""" entry = [TrackEntry]