Package elisa :: Package plugins :: Package ugly :: Package youtube :: Module youtube_client
[hide private]
[frames] | no frames]

Source Code for Module elisa.plugins.ugly.youtube.youtube_client

  1  # -*- coding: utf-8 -*- 
  2  # Elisa - Home multimedia server 
  3  # Copyright (C) 2006-2008 Fluendo Embedded S.L. (www.fluendo.com). 
  4  # All rights reserved. 
  5  # 
  6  # This file is available under one of two license agreements. 
  7  # 
  8  # This file is licensed under the GPL version 3. 
  9  # See "LICENSE.GPL" in the root of this distribution including a special 
 10  # exception to use Elisa with Fluendo's plugins. 
 11  # 
 12  # The GPL part of Elisa is also available under a commercial licensing 
 13  # agreement from Fluendo. 
 14  # See "LICENSE.Elisa" in the root directory of this distribution package 
 15  # for details on that license. 
 16   
 17  import gdata.service 
 18  import urllib2 
 19  import re 
 20  import traceback 
 21   
 22  try: 
 23    from xml.etree import cElementTree as ElementTree 
 24  except ImportError: 
 25    try: 
 26      import cElementTree as ElementTree 
 27    except ImportError: 
 28      from elementtree import ElementTree 
 29   
 30   
31 -class YouTubeClient:
32 33 users_feed = "http://gdata.youtube.com/feeds/users" 34 std_feeds = "http://gdata.youtube.com/feeds/standardfeeds" 35 video_name_re = re.compile(r'[,{]t:\'([^\']*)\'') 36
37 - def _request(self, feed, *params):
38 service = gdata.service.GDataService(server="gdata.youtube.com") 39 return service.Get(feed % params)
40 43
44 - def top_rated(self):
45 return self._request("%s/top_rated" % self.std_feeds).entry
46
47 - def most_viewed(self):
48 return self._request("%s/most_viewed" % self.std_feeds).entry
49
50 - def videos_upload_by(self, username):
51 return self._request("%s/%s/uploads", self.users_feed, 52 username).entry
53
54 - def favorite_videos(self, username):
55 return self._request("%s/%s/favorites", self.users_feed, 56 username).entry
57
58 - def get_contacts(self, username):
59 users = self._request("%s/%s/contacts", self.users_feed, 60 username).entry 61 contacts = [ user.title.text for user in users ] 62 return contacts
63
64 - def get_categories(self):
65 feed_url = "http://gdata.youtube.com/schemas/2007/categories.cat" 66 xml = self._request(feed_url) 67 tree = ElementTree.fromstring(xml) 68 categories = {} 69 for child in tree.getchildren(): 70 categories[child.get('term')] = child.get('label') 71 return categories
72
73 - def get_category(self, cid):
74 feed_url = "http://gdata.youtube.com/feeds/videos/-/%s" % cid 75 return self._request(feed_url).entry
76
77 - def get_thumbnails(self, video):
78 doc = video._ToElementTree() 79 urls = {} 80 for c in doc.findall(".//{http://search.yahoo.com/mrss/}group"): 81 for cc in c.findall("{http://search.yahoo.com/mrss/}thumbnail"): 82 width = int(cc.get("width")) 83 height = int(cc.get("height")) 84 size = (width, height) 85 url = cc.get("url") 86 if size not in urls: 87 urls[size] = [url,] 88 else: 89 urls[size].append(url) 90 return urls
91
92 - def get_largest_thumbnail(self, video):
93 thumbnails = self.get_thumbnails(video) 94 sizes = thumbnails.keys() 95 sizes.sort() 96 return thumbnails[sizes[-1]][0]
97
98 - def get_flv_video_url(self, url):
99 flv_url = '' 100 doc = urllib2.urlopen(url) 101 data = doc.read() 102 103 # extract video name 104 match = self.video_name_re.search(data) 105 if match is not None: 106 video_name = match.group(1) 107 108 # extract video id 109 url_splited = url.split("watch?v=") 110 video_id = url_splited[1] 111 112 flv_url = "http://www.youtube.com/get_video?video_id=%s&t=%s" 113 flv_url = flv_url % (video_id, video_name) 114 return flv_url
115 116 if __name__ == '__main__': 117 cli = YouTubeClient() 118 import pdb; pdb.set_trace() 119