/gdata/youtube/__init__.py

http://radioappz.googlecode.com/ · Python · 684 lines · 552 code · 75 blank · 57 comment · 3 complexity · 996d04927b8530a93b31a1d830a9b67a MD5 · raw file

  1. #!/usr/bin/python
  2. #
  3. # Copyright (C) 2008 Google Inc.
  4. #
  5. # Licensed under the Apache License, Version 2.0 (the "License");
  6. # you may not use this file except in compliance with the License.
  7. # You may obtain a copy of the License at
  8. #
  9. # http://www.apache.org/licenses/LICENSE-2.0
  10. #
  11. # Unless required by applicable law or agreed to in writing, software
  12. # distributed under the License is distributed on an "AS IS" BASIS,
  13. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. # See the License for the specific language governing permissions and
  15. # limitations under the License.
  16. __author__ = ('api.stephaniel@gmail.com (Stephanie Liu)'
  17. ', api.jhartmann@gmail.com (Jochen Hartmann)')
  18. import atom
  19. import gdata
  20. import gdata.media as Media
  21. import gdata.geo as Geo
  22. YOUTUBE_NAMESPACE = 'http://gdata.youtube.com/schemas/2007'
  23. YOUTUBE_FORMAT = '{http://gdata.youtube.com/schemas/2007}format'
  24. YOUTUBE_DEVELOPER_TAG_SCHEME = '%s/%s' % (YOUTUBE_NAMESPACE,
  25. 'developertags.cat')
  26. YOUTUBE_SUBSCRIPTION_TYPE_SCHEME = '%s/%s' % (YOUTUBE_NAMESPACE,
  27. 'subscriptiontypes.cat')
  28. class Username(atom.AtomBase):
  29. """The YouTube Username element"""
  30. _tag = 'username'
  31. _namespace = YOUTUBE_NAMESPACE
  32. class QueryString(atom.AtomBase):
  33. """The YouTube QueryString element"""
  34. _tag = 'queryString'
  35. _namespace = YOUTUBE_NAMESPACE
  36. class FirstName(atom.AtomBase):
  37. """The YouTube FirstName element"""
  38. _tag = 'firstName'
  39. _namespace = YOUTUBE_NAMESPACE
  40. class LastName(atom.AtomBase):
  41. """The YouTube LastName element"""
  42. _tag = 'lastName'
  43. _namespace = YOUTUBE_NAMESPACE
  44. class Age(atom.AtomBase):
  45. """The YouTube Age element"""
  46. _tag = 'age'
  47. _namespace = YOUTUBE_NAMESPACE
  48. class Books(atom.AtomBase):
  49. """The YouTube Books element"""
  50. _tag = 'books'
  51. _namespace = YOUTUBE_NAMESPACE
  52. class Gender(atom.AtomBase):
  53. """The YouTube Gender element"""
  54. _tag = 'gender'
  55. _namespace = YOUTUBE_NAMESPACE
  56. class Company(atom.AtomBase):
  57. """The YouTube Company element"""
  58. _tag = 'company'
  59. _namespace = YOUTUBE_NAMESPACE
  60. class Hobbies(atom.AtomBase):
  61. """The YouTube Hobbies element"""
  62. _tag = 'hobbies'
  63. _namespace = YOUTUBE_NAMESPACE
  64. class Hometown(atom.AtomBase):
  65. """The YouTube Hometown element"""
  66. _tag = 'hometown'
  67. _namespace = YOUTUBE_NAMESPACE
  68. class Location(atom.AtomBase):
  69. """The YouTube Location element"""
  70. _tag = 'location'
  71. _namespace = YOUTUBE_NAMESPACE
  72. class Movies(atom.AtomBase):
  73. """The YouTube Movies element"""
  74. _tag = 'movies'
  75. _namespace = YOUTUBE_NAMESPACE
  76. class Music(atom.AtomBase):
  77. """The YouTube Music element"""
  78. _tag = 'music'
  79. _namespace = YOUTUBE_NAMESPACE
  80. class Occupation(atom.AtomBase):
  81. """The YouTube Occupation element"""
  82. _tag = 'occupation'
  83. _namespace = YOUTUBE_NAMESPACE
  84. class School(atom.AtomBase):
  85. """The YouTube School element"""
  86. _tag = 'school'
  87. _namespace = YOUTUBE_NAMESPACE
  88. class Relationship(atom.AtomBase):
  89. """The YouTube Relationship element"""
  90. _tag = 'relationship'
  91. _namespace = YOUTUBE_NAMESPACE
  92. class Recorded(atom.AtomBase):
  93. """The YouTube Recorded element"""
  94. _tag = 'recorded'
  95. _namespace = YOUTUBE_NAMESPACE
  96. class Statistics(atom.AtomBase):
  97. """The YouTube Statistics element."""
  98. _tag = 'statistics'
  99. _namespace = YOUTUBE_NAMESPACE
  100. _attributes = atom.AtomBase._attributes.copy()
  101. _attributes['viewCount'] = 'view_count'
  102. _attributes['videoWatchCount'] = 'video_watch_count'
  103. _attributes['subscriberCount'] = 'subscriber_count'
  104. _attributes['lastWebAccess'] = 'last_web_access'
  105. _attributes['favoriteCount'] = 'favorite_count'
  106. def __init__(self, view_count=None, video_watch_count=None,
  107. favorite_count=None, subscriber_count=None, last_web_access=None,
  108. extension_elements=None, extension_attributes=None, text=None):
  109. self.view_count = view_count
  110. self.video_watch_count = video_watch_count
  111. self.subscriber_count = subscriber_count
  112. self.last_web_access = last_web_access
  113. self.favorite_count = favorite_count
  114. atom.AtomBase.__init__(self, extension_elements=extension_elements,
  115. extension_attributes=extension_attributes, text=text)
  116. class Status(atom.AtomBase):
  117. """The YouTube Status element"""
  118. _tag = 'status'
  119. _namespace = YOUTUBE_NAMESPACE
  120. class Position(atom.AtomBase):
  121. """The YouTube Position element. The position in a playlist feed."""
  122. _tag = 'position'
  123. _namespace = YOUTUBE_NAMESPACE
  124. class Racy(atom.AtomBase):
  125. """The YouTube Racy element."""
  126. _tag = 'racy'
  127. _namespace = YOUTUBE_NAMESPACE
  128. class Description(atom.AtomBase):
  129. """The YouTube Description element."""
  130. _tag = 'description'
  131. _namespace = YOUTUBE_NAMESPACE
  132. class Private(atom.AtomBase):
  133. """The YouTube Private element."""
  134. _tag = 'private'
  135. _namespace = YOUTUBE_NAMESPACE
  136. class NoEmbed(atom.AtomBase):
  137. """The YouTube VideoShare element. Whether a video can be embedded or not."""
  138. _tag = 'noembed'
  139. _namespace = YOUTUBE_NAMESPACE
  140. class Comments(atom.AtomBase):
  141. """The GData Comments element"""
  142. _tag = 'comments'
  143. _namespace = gdata.GDATA_NAMESPACE
  144. _children = atom.AtomBase._children.copy()
  145. _attributes = atom.AtomBase._attributes.copy()
  146. _children['{%s}feedLink' % gdata.GDATA_NAMESPACE] = ('feed_link',
  147. [gdata.FeedLink])
  148. def __init__(self, feed_link=None, extension_elements=None,
  149. extension_attributes=None, text=None):
  150. self.feed_link = feed_link
  151. atom.AtomBase.__init__(self, extension_elements=extension_elements,
  152. extension_attributes=extension_attributes, text=text)
  153. class Rating(atom.AtomBase):
  154. """The GData Rating element"""
  155. _tag = 'rating'
  156. _namespace = gdata.GDATA_NAMESPACE
  157. _attributes = atom.AtomBase._attributes.copy()
  158. _attributes['min'] = 'min'
  159. _attributes['max'] = 'max'
  160. _attributes['numRaters'] = 'num_raters'
  161. _attributes['average'] = 'average'
  162. def __init__(self, min=None, max=None,
  163. num_raters=None, average=None, extension_elements=None,
  164. extension_attributes=None, text=None):
  165. self.min = min
  166. self.max = max
  167. self.num_raters = num_raters
  168. self.average = average
  169. atom.AtomBase.__init__(self, extension_elements=extension_elements,
  170. extension_attributes=extension_attributes, text=text)
  171. class YouTubePlaylistVideoEntry(gdata.GDataEntry):
  172. """Represents a YouTubeVideoEntry on a YouTubePlaylist."""
  173. _tag = gdata.GDataEntry._tag
  174. _namespace = gdata.GDataEntry._namespace
  175. _children = gdata.GDataEntry._children.copy()
  176. _attributes = gdata.GDataEntry._attributes.copy()
  177. _children['{%s}feedLink' % gdata.GDATA_NAMESPACE] = ('feed_link',
  178. [gdata.FeedLink])
  179. _children['{%s}description' % YOUTUBE_NAMESPACE] = ('description',
  180. Description)
  181. _children['{%s}rating' % gdata.GDATA_NAMESPACE] = ('rating', Rating)
  182. _children['{%s}comments' % gdata.GDATA_NAMESPACE] = ('comments', Comments)
  183. _children['{%s}statistics' % YOUTUBE_NAMESPACE] = ('statistics', Statistics)
  184. _children['{%s}location' % YOUTUBE_NAMESPACE] = ('location', Location)
  185. _children['{%s}position' % YOUTUBE_NAMESPACE] = ('position', Position)
  186. _children['{%s}group' % gdata.media.MEDIA_NAMESPACE] = ('media', Media.Group)
  187. def __init__(self, author=None, category=None, content=None,
  188. atom_id=None, link=None, published=None, title=None,
  189. updated=None, feed_link=None, description=None,
  190. rating=None, comments=None, statistics=None,
  191. location=None, position=None, media=None,
  192. extension_elements=None, extension_attributes=None):
  193. self.feed_link = feed_link
  194. self.description = description
  195. self.rating = rating
  196. self.comments = comments
  197. self.statistics = statistics
  198. self.location = location
  199. self.position = position
  200. self.media = media
  201. gdata.GDataEntry.__init__(self, author=author, category=category,
  202. content=content, atom_id=atom_id,
  203. link=link, published=published, title=title,
  204. updated=updated,
  205. extension_elements=extension_elements,
  206. extension_attributes=extension_attributes)
  207. class YouTubeVideoCommentEntry(gdata.GDataEntry):
  208. """Represents a comment on YouTube."""
  209. _tag = gdata.GDataEntry._tag
  210. _namespace = gdata.GDataEntry._namespace
  211. _children = gdata.GDataEntry._children.copy()
  212. _attributes = gdata.GDataEntry._attributes.copy()
  213. class YouTubeSubscriptionEntry(gdata.GDataEntry):
  214. """Represents a subscription entry on YouTube."""
  215. _tag = gdata.GDataEntry._tag
  216. _namespace = gdata.GDataEntry._namespace
  217. _children = gdata.GDataEntry._children.copy()
  218. _attributes = gdata.GDataEntry._attributes.copy()
  219. _children['{%s}username' % YOUTUBE_NAMESPACE] = ('username', Username)
  220. _children['{%s}queryString' % YOUTUBE_NAMESPACE] = (
  221. 'query_string', QueryString)
  222. _children['{%s}feedLink' % gdata.GDATA_NAMESPACE] = ('feed_link',
  223. [gdata.FeedLink])
  224. def __init__(self, author=None, category=None, content=None,
  225. atom_id=None, link=None, published=None, title=None,
  226. updated=None, username=None, query_string=None, feed_link=None,
  227. extension_elements=None, extension_attributes=None):
  228. gdata.GDataEntry.__init__(self, author=author, category=category,
  229. content=content, atom_id=atom_id, link=link,
  230. published=published, title=title, updated=updated)
  231. self.username = username
  232. self.query_string = query_string
  233. self.feed_link = feed_link
  234. def GetSubscriptionType(self):
  235. """Retrieve the type of this subscription.
  236. Returns:
  237. A string that is either 'channel, 'query' or 'favorites'
  238. """
  239. for category in self.category:
  240. if category.scheme == YOUTUBE_SUBSCRIPTION_TYPE_SCHEME:
  241. return category.term
  242. class YouTubeVideoResponseEntry(gdata.GDataEntry):
  243. """Represents a video response. """
  244. _tag = gdata.GDataEntry._tag
  245. _namespace = gdata.GDataEntry._namespace
  246. _children = gdata.GDataEntry._children.copy()
  247. _attributes = gdata.GDataEntry._attributes.copy()
  248. _children['{%s}rating' % gdata.GDATA_NAMESPACE] = ('rating', Rating)
  249. _children['{%s}noembed' % YOUTUBE_NAMESPACE] = ('noembed', NoEmbed)
  250. _children['{%s}statistics' % YOUTUBE_NAMESPACE] = ('statistics', Statistics)
  251. _children['{%s}racy' % YOUTUBE_NAMESPACE] = ('racy', Racy)
  252. _children['{%s}group' % gdata.media.MEDIA_NAMESPACE] = ('media', Media.Group)
  253. def __init__(self, author=None, category=None, content=None, atom_id=None,
  254. link=None, published=None, title=None, updated=None, rating=None,
  255. noembed=None, statistics=None, racy=None, media=None,
  256. extension_elements=None, extension_attributes=None):
  257. gdata.GDataEntry.__init__(self, author=author, category=category,
  258. content=content, atom_id=atom_id, link=link,
  259. published=published, title=title, updated=updated)
  260. self.rating = rating
  261. self.noembed = noembed
  262. self.statistics = statistics
  263. self.racy = racy
  264. self.media = media or Media.Group()
  265. class YouTubeContactEntry(gdata.GDataEntry):
  266. """Represents a contact entry."""
  267. _tag = gdata.GDataEntry._tag
  268. _namespace = gdata.GDataEntry._namespace
  269. _children = gdata.GDataEntry._children.copy()
  270. _attributes = gdata.GDataEntry._attributes.copy()
  271. _children['{%s}username' % YOUTUBE_NAMESPACE] = ('username', Username)
  272. _children['{%s}status' % YOUTUBE_NAMESPACE] = ('status', Status)
  273. def __init__(self, author=None, category=None, content=None, atom_id=None,
  274. link=None, published=None, title=None, updated=None,
  275. username=None, status=None, extension_elements=None,
  276. extension_attributes=None, text=None):
  277. gdata.GDataEntry.__init__(self, author=author, category=category,
  278. content=content, atom_id=atom_id, link=link,
  279. published=published, title=title, updated=updated)
  280. self.username = username
  281. self.status = status
  282. class YouTubeVideoEntry(gdata.GDataEntry):
  283. """Represents a video on YouTube."""
  284. _tag = gdata.GDataEntry._tag
  285. _namespace = gdata.GDataEntry._namespace
  286. _children = gdata.GDataEntry._children.copy()
  287. _attributes = gdata.GDataEntry._attributes.copy()
  288. _children['{%s}rating' % gdata.GDATA_NAMESPACE] = ('rating', Rating)
  289. _children['{%s}comments' % gdata.GDATA_NAMESPACE] = ('comments', Comments)
  290. _children['{%s}noembed' % YOUTUBE_NAMESPACE] = ('noembed', NoEmbed)
  291. _children['{%s}statistics' % YOUTUBE_NAMESPACE] = ('statistics', Statistics)
  292. _children['{%s}recorded' % YOUTUBE_NAMESPACE] = ('recorded', Recorded)
  293. _children['{%s}racy' % YOUTUBE_NAMESPACE] = ('racy', Racy)
  294. _children['{%s}group' % gdata.media.MEDIA_NAMESPACE] = ('media', Media.Group)
  295. _children['{%s}where' % gdata.geo.GEORSS_NAMESPACE] = ('geo', Geo.Where)
  296. def __init__(self, author=None, category=None, content=None, atom_id=None,
  297. link=None, published=None, title=None, updated=None, rating=None,
  298. noembed=None, statistics=None, racy=None, media=None, geo=None,
  299. recorded=None, comments=None, extension_elements=None,
  300. extension_attributes=None):
  301. self.rating = rating
  302. self.noembed = noembed
  303. self.statistics = statistics
  304. self.racy = racy
  305. self.comments = comments
  306. self.media = media or Media.Group()
  307. self.geo = geo
  308. self.recorded = recorded
  309. gdata.GDataEntry.__init__(self, author=author, category=category,
  310. content=content, atom_id=atom_id, link=link,
  311. published=published, title=title, updated=updated,
  312. extension_elements=extension_elements,
  313. extension_attributes=extension_attributes)
  314. def GetSwfUrl(self):
  315. """Return the URL for the embeddable Video
  316. Returns:
  317. URL of the embeddable video
  318. """
  319. if self.media.content:
  320. for content in self.media.content:
  321. if content.extension_attributes[YOUTUBE_FORMAT] == '5':
  322. return content.url
  323. else:
  324. return None
  325. def AddDeveloperTags(self, developer_tags):
  326. """Add a developer tag for this entry.
  327. Developer tags can only be set during the initial upload.
  328. Arguments:
  329. developer_tags: A list of developer tags as strings.
  330. Returns:
  331. A list of all developer tags for this video entry.
  332. """
  333. for tag_text in developer_tags:
  334. self.media.category.append(gdata.media.Category(
  335. text=tag_text, label=tag_text, scheme=YOUTUBE_DEVELOPER_TAG_SCHEME))
  336. return self.GetDeveloperTags()
  337. def GetDeveloperTags(self):
  338. """Retrieve developer tags for this video entry."""
  339. developer_tags = []
  340. for category in self.media.category:
  341. if category.scheme == YOUTUBE_DEVELOPER_TAG_SCHEME:
  342. developer_tags.append(category)
  343. if len(developer_tags) > 0:
  344. return developer_tags
  345. def GetYouTubeCategoryAsString(self):
  346. """Convenience method to return the YouTube category as string.
  347. YouTubeVideoEntries can contain multiple Category objects with differing
  348. schemes. This method returns only the category with the correct
  349. scheme, ignoring developer tags.
  350. """
  351. for category in self.media.category:
  352. if category.scheme != YOUTUBE_DEVELOPER_TAG_SCHEME:
  353. return category.text
  354. class YouTubeUserEntry(gdata.GDataEntry):
  355. """Represents a user on YouTube."""
  356. _tag = gdata.GDataEntry._tag
  357. _namespace = gdata.GDataEntry._namespace
  358. _children = gdata.GDataEntry._children.copy()
  359. _attributes = gdata.GDataEntry._attributes.copy()
  360. _children['{%s}username' % YOUTUBE_NAMESPACE] = ('username', Username)
  361. _children['{%s}firstName' % YOUTUBE_NAMESPACE] = ('first_name', FirstName)
  362. _children['{%s}lastName' % YOUTUBE_NAMESPACE] = ('last_name', LastName)
  363. _children['{%s}age' % YOUTUBE_NAMESPACE] = ('age', Age)
  364. _children['{%s}books' % YOUTUBE_NAMESPACE] = ('books', Books)
  365. _children['{%s}gender' % YOUTUBE_NAMESPACE] = ('gender', Gender)
  366. _children['{%s}company' % YOUTUBE_NAMESPACE] = ('company', Company)
  367. _children['{%s}description' % YOUTUBE_NAMESPACE] = ('description',
  368. Description)
  369. _children['{%s}hobbies' % YOUTUBE_NAMESPACE] = ('hobbies', Hobbies)
  370. _children['{%s}hometown' % YOUTUBE_NAMESPACE] = ('hometown', Hometown)
  371. _children['{%s}location' % YOUTUBE_NAMESPACE] = ('location', Location)
  372. _children['{%s}movies' % YOUTUBE_NAMESPACE] = ('movies', Movies)
  373. _children['{%s}music' % YOUTUBE_NAMESPACE] = ('music', Music)
  374. _children['{%s}occupation' % YOUTUBE_NAMESPACE] = ('occupation', Occupation)
  375. _children['{%s}school' % YOUTUBE_NAMESPACE] = ('school', School)
  376. _children['{%s}relationship' % YOUTUBE_NAMESPACE] = ('relationship',
  377. Relationship)
  378. _children['{%s}statistics' % YOUTUBE_NAMESPACE] = ('statistics', Statistics)
  379. _children['{%s}feedLink' % gdata.GDATA_NAMESPACE] = ('feed_link',
  380. [gdata.FeedLink])
  381. _children['{%s}thumbnail' % gdata.media.MEDIA_NAMESPACE] = ('thumbnail',
  382. Media.Thumbnail)
  383. def __init__(self, author=None, category=None, content=None, atom_id=None,
  384. link=None, published=None, title=None, updated=None,
  385. username=None, first_name=None, last_name=None, age=None,
  386. books=None, gender=None, company=None, description=None,
  387. hobbies=None, hometown=None, location=None, movies=None,
  388. music=None, occupation=None, school=None, relationship=None,
  389. statistics=None, feed_link=None, extension_elements=None,
  390. extension_attributes=None, text=None):
  391. self.username = username
  392. self.first_name = first_name
  393. self.last_name = last_name
  394. self.age = age
  395. self.books = books
  396. self.gender = gender
  397. self.company = company
  398. self.description = description
  399. self.hobbies = hobbies
  400. self.hometown = hometown
  401. self.location = location
  402. self.movies = movies
  403. self.music = music
  404. self.occupation = occupation
  405. self.school = school
  406. self.relationship = relationship
  407. self.statistics = statistics
  408. self.feed_link = feed_link
  409. gdata.GDataEntry.__init__(self, author=author, category=category,
  410. content=content, atom_id=atom_id,
  411. link=link, published=published,
  412. title=title, updated=updated,
  413. extension_elements=extension_elements,
  414. extension_attributes=extension_attributes,
  415. text=text)
  416. class YouTubeVideoFeed(gdata.GDataFeed, gdata.LinkFinder):
  417. """Represents a video feed on YouTube."""
  418. _tag = gdata.GDataFeed._tag
  419. _namespace = gdata.GDataFeed._namespace
  420. _children = gdata.GDataFeed._children.copy()
  421. _attributes = gdata.GDataFeed._attributes.copy()
  422. _children['{%s}entry' % atom.ATOM_NAMESPACE] = ('entry', [YouTubeVideoEntry])
  423. class YouTubePlaylistEntry(gdata.GDataEntry):
  424. """Represents a playlist in YouTube."""
  425. _tag = gdata.GDataEntry._tag
  426. _namespace = gdata.GDataEntry._namespace
  427. _children = gdata.GDataEntry._children.copy()
  428. _attributes = gdata.GDataEntry._attributes.copy()
  429. _children['{%s}description' % YOUTUBE_NAMESPACE] = ('description',
  430. Description)
  431. _children['{%s}private' % YOUTUBE_NAMESPACE] = ('private',
  432. Private)
  433. _children['{%s}feedLink' % gdata.GDATA_NAMESPACE] = ('feed_link',
  434. [gdata.FeedLink])
  435. def __init__(self, author=None, category=None, content=None,
  436. atom_id=None, link=None, published=None, title=None,
  437. updated=None, private=None, feed_link=None,
  438. description=None, extension_elements=None,
  439. extension_attributes=None):
  440. self.description = description
  441. self.private = private
  442. self.feed_link = feed_link
  443. gdata.GDataEntry.__init__(self, author=author, category=category,
  444. content=content, atom_id=atom_id,
  445. link=link, published=published, title=title,
  446. updated=updated,
  447. extension_elements=extension_elements,
  448. extension_attributes=extension_attributes)
  449. class YouTubePlaylistFeed(gdata.GDataFeed, gdata.LinkFinder):
  450. """Represents a feed of a user's playlists """
  451. _tag = gdata.GDataFeed._tag
  452. _namespace = gdata.GDataFeed._namespace
  453. _children = gdata.GDataFeed._children.copy()
  454. _attributes = gdata.GDataFeed._attributes.copy()
  455. _children['{%s}entry' % atom.ATOM_NAMESPACE] = ('entry',
  456. [YouTubePlaylistEntry])
  457. class YouTubePlaylistVideoFeed(gdata.GDataFeed, gdata.LinkFinder):
  458. """Represents a feed of video entry on a playlist."""
  459. _tag = gdata.GDataFeed._tag
  460. _namespace = gdata.GDataFeed._namespace
  461. _children = gdata.GDataFeed._children.copy()
  462. _attributes = gdata.GDataFeed._attributes.copy()
  463. _children['{%s}entry' % atom.ATOM_NAMESPACE] = ('entry',
  464. [YouTubePlaylistVideoEntry])
  465. class YouTubeContactFeed(gdata.GDataFeed, gdata.LinkFinder):
  466. """Represents a feed of a users contacts."""
  467. _tag = gdata.GDataFeed._tag
  468. _namespace = gdata.GDataFeed._namespace
  469. _children = gdata.GDataFeed._children.copy()
  470. _attributes = gdata.GDataFeed._attributes.copy()
  471. _children['{%s}entry' % atom.ATOM_NAMESPACE] = ('entry',
  472. [YouTubeContactEntry])
  473. class YouTubeSubscriptionFeed(gdata.GDataFeed, gdata.LinkFinder):
  474. """Represents a feed of a users subscriptions."""
  475. _tag = gdata.GDataFeed._tag
  476. _namespace = gdata.GDataFeed._namespace
  477. _children = gdata.GDataFeed._children.copy()
  478. _attributes = gdata.GDataFeed._attributes.copy()
  479. _children['{%s}entry' % atom.ATOM_NAMESPACE] = ('entry',
  480. [YouTubeSubscriptionEntry])
  481. class YouTubeVideoCommentFeed(gdata.GDataFeed, gdata.LinkFinder):
  482. """Represents a feed of comments for a video."""
  483. _tag = gdata.GDataFeed._tag
  484. _namespace = gdata.GDataFeed._namespace
  485. _children = gdata.GDataFeed._children.copy()
  486. _attributes = gdata.GDataFeed._attributes.copy()
  487. _children['{%s}entry' % atom.ATOM_NAMESPACE] = ('entry',
  488. [YouTubeVideoCommentEntry])
  489. class YouTubeVideoResponseFeed(gdata.GDataFeed, gdata.LinkFinder):
  490. """Represents a feed of video responses."""
  491. _tag = gdata.GDataFeed._tag
  492. _namespace = gdata.GDataFeed._namespace
  493. _children = gdata.GDataFeed._children.copy()
  494. _attributes = gdata.GDataFeed._attributes.copy()
  495. _children['{%s}entry' % atom.ATOM_NAMESPACE] = ('entry',
  496. [YouTubeVideoResponseEntry])
  497. def YouTubeVideoFeedFromString(xml_string):
  498. return atom.CreateClassFromXMLString(YouTubeVideoFeed, xml_string)
  499. def YouTubeVideoEntryFromString(xml_string):
  500. return atom.CreateClassFromXMLString(YouTubeVideoEntry, xml_string)
  501. def YouTubeContactFeedFromString(xml_string):
  502. return atom.CreateClassFromXMLString(YouTubeContactFeed, xml_string)
  503. def YouTubeContactEntryFromString(xml_string):
  504. return atom.CreateClassFromXMLString(YouTubeContactEntry, xml_string)
  505. def YouTubeVideoCommentFeedFromString(xml_string):
  506. return atom.CreateClassFromXMLString(YouTubeVideoCommentFeed, xml_string)
  507. def YouTubeVideoCommentEntryFromString(xml_string):
  508. return atom.CreateClassFromXMLString(YouTubeVideoCommentEntry, xml_string)
  509. def YouTubeUserFeedFromString(xml_string):
  510. return atom.CreateClassFromXMLString(YouTubeVideoFeed, xml_string)
  511. def YouTubeUserEntryFromString(xml_string):
  512. return atom.CreateClassFromXMLString(YouTubeUserEntry, xml_string)
  513. def YouTubePlaylistFeedFromString(xml_string):
  514. return atom.CreateClassFromXMLString(YouTubePlaylistFeed, xml_string)
  515. def YouTubePlaylistVideoFeedFromString(xml_string):
  516. return atom.CreateClassFromXMLString(YouTubePlaylistVideoFeed, xml_string)
  517. def YouTubePlaylistEntryFromString(xml_string):
  518. return atom.CreateClassFromXMLString(YouTubePlaylistEntry, xml_string)
  519. def YouTubePlaylistVideoEntryFromString(xml_string):
  520. return atom.CreateClassFromXMLString(YouTubePlaylistVideoEntry, xml_string)
  521. def YouTubeSubscriptionFeedFromString(xml_string):
  522. return atom.CreateClassFromXMLString(YouTubeSubscriptionFeed, xml_string)
  523. def YouTubeSubscriptionEntryFromString(xml_string):
  524. return atom.CreateClassFromXMLString(YouTubeSubscriptionEntry, xml_string)
  525. def YouTubeVideoResponseFeedFromString(xml_string):
  526. return atom.CreateClassFromXMLString(YouTubeVideoResponseFeed, xml_string)
  527. def YouTubeVideoResponseEntryFromString(xml_string):
  528. return atom.CreateClassFromXMLString(YouTubeVideoResponseEntry, xml_string)