1 # -*- coding: iso-8859-1 -*-
4 import gdata.youtube.service
5 from gdata.service import BadAuthentication
6 from Tools.LoadPixmap import LoadPixmap
7 from Components.config import config, Config, ConfigSelection, ConfigText, getConfigListEntry, ConfigSubsection, ConfigYesNo, ConfigIP, ConfigNumber
8 from Components.ConfigList import ConfigListScreen
9 from Components.config import KEY_DELETE, KEY_BACKSPACE, KEY_LEFT, KEY_RIGHT, KEY_HOME, KEY_END, KEY_TOGGLEOW, KEY_ASCII, KEY_TIMEOUT
11 from twisted.web import client
12 from twisted.internet import reactor
13 from urllib2 import Request, URLError, HTTPError
14 from socket import gaierror,error
15 import re, os, sys, socket
17 from urllib import FancyURLopener, quote
19 from httplib import HTTPConnection,CannotSendRequest,BadStatusLine
20 HTTPConnection.debuglevel = 1
22 #config.plugins.mytube = ConfigSubsection()
23 #config.plugins.mytube.general = ConfigSubsection()
24 #config.plugins.mytube.general.useHTTPProxy = ConfigYesNo(default = False)
25 #config.plugins.mytube.general.ProxyIP = ConfigIP(default=[0,0,0,0])
26 #config.plugins.mytube.general.ProxyPort = ConfigNumber(default=8080)
28 class MyOpener(FancyURLopener):
29 version = 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.12) Gecko/20070731 Ubuntu/dapper-security Firefox/1.5.0.12'
32 class GoogleSuggestions():
33 def __init__(self, callback, ds = None, json = None, hl = None):
34 self.callback = callback
35 self.conn = HTTPConnection("google.com")
36 self.prepQuerry = "/complete/search?"
38 self.prepQuerry = self.prepQuerry + "ds=" + ds + "&"
40 self.prepQuerry = self.prepQuerry + "json=" + json + "&"
42 self.prepQuerry = self.prepQuerry + "hl=" + hl + "&"
43 self.prepQuerry = self.prepQuerry + "jsonp=self.gotSuggestions&q="
45 def gotSuggestions(self, suggestslist):
46 self.callback(suggestslist)
48 def getSuggestions(self, querryString):
49 if querryString is not "":
50 querry = self.prepQuerry + quote(querryString)
52 self.conn.request("GET", querry)
53 except (CannotSendRequest, gaierror, error):
54 print "[YTB] Can not send request for suggestions"
58 response = self.conn.getresponse()
60 print "[YTB] Can not get a response from google"
63 if response.status == 200:
64 data = response.read()
73 class MyTubeFeedEntry():
74 def __init__(self, feed, entry, favoritesFeed = False):
77 self.favoritesFeed = favoritesFeed
79 self.myopener = MyOpener()
80 urllib.urlopen = MyOpener().open
81 """if config.plugins.mytube.general.useHTTPProxy.value is True:
82 proxy = {'http': 'http://'+str(config.plugins.mytube.general.ProxyIP.getText())+':'+str(config.plugins.mytube.general.ProxyPort.value)}
83 self.myopener = MyOpener(proxies=proxy)
84 urllib.urlopen = MyOpener(proxies=proxy).open
86 self.myopener = MyOpener()
87 urllib.urlopen = MyOpener().open"""
89 def isPlaylistEntry(self):
93 #print "[MyTubeFeedEntry] getTubeId"
95 if self.entry.media.player:
96 ret = self.entry.media.player.url.split("=").pop()
100 #print "[MyTubeFeedEntry] getTitle",self.entry.media.title.text
101 return self.entry.media.title.text
103 def getDescription(self):
104 #print "[MyTubeFeedEntry] getDescription"
105 if self.entry.media is not None and self.entry.media.description is not None:
106 return self.entry.media.description.text
107 return "not vailable"
109 def getThumbnailUrl(self, index = 0):
110 #print "[MyTubeFeedEntry] getThumbnailUrl"
111 if index < len(self.entry.media.thumbnail):
112 return self.entry.media.thumbnail[index].url
115 def getPublishedDate(self):
116 if self.entry.published is not None:
117 return self.entry.published.text
121 if self.entry.statistics is not None:
122 return self.entry.statistics.view_count
123 return "not available"
125 def getDuration(self):
126 if self.entry.media is not None and self.entry.media.duration is not None:
127 return self.entry.media.duration.seconds
131 def getRatingAverage(self):
132 if self.entry.rating is not None:
133 return self.entry.rating.average
137 def getNumRaters(self):
138 if self.entry.rating is not None:
139 return self.entry.rating.num_raters
144 for author in self.entry.author:
145 authors.append(author.name.text)
146 author = ", ".join(authors)
149 def PrintEntryDetails(self):
150 EntryDetails = { 'Title': None, 'TubeID': None, 'Published': None, 'Published': None, 'Description': None, 'Category': None, 'Tags': None, 'Duration': None, 'Views': None, 'Rating': None, 'Thumbnails': None}
151 EntryDetails['Title'] = self.entry.media.title.text
152 EntryDetails['TubeID'] = self.getTubeId()
153 EntryDetails['Description'] = self.getDescription()
154 EntryDetails['Category'] = self.entry.media.category[0].text
155 EntryDetails['Tags'] = self.entry.media.keywords.text
156 EntryDetails['Published'] = self.getPublishedDate()
157 EntryDetails['Views'] = self.getViews()
158 EntryDetails['Duration'] = self.getDuration()
159 EntryDetails['Rating'] = self.getNumRaters()
160 EntryDetails['RatingAverage'] = self.getRatingAverage()
161 EntryDetails['Author'] = self.getAuthor()
164 for thumbnail in self.entry.media.thumbnail:
165 print 'Thumbnail url: %s' % thumbnail.url
166 list.append(str(thumbnail.url))
167 EntryDetails['Thumbnails'] = list
172 def getVideoUrl(self):
174 isHDAvailable = False
175 req = "http://www.youtube.com/watch?v=" + str(self.getTubeId())
177 response = urllib.urlopen(req)
178 """if config.plugins.mytube.general.useHTTPProxy.value is True:
179 proxy = {'http': str(config.plugins.mytube.general.ProxyIP.getText())+':'+str(config.plugins.mytube.general.ProxyPort.value)}
180 print "USING PRXY---->",proxy
181 response = urllib.urlopen(req,proxies=proxy)
183 response = urllib.urlopen(req)"""
185 print "[MyTube] The server coundn't fulfill the request."
186 print "[MyTube] Error code: ", e.code
188 print "[MyTube] We failed to reach a server."
189 print "[MyTube] Reason: ", e.reason
191 print "[MyTube] We failed to reach a server."
192 print "[MyTube] Reason: ", e
196 data = response.readline()
200 if "isHDAvailable = true" in data:
205 m = re.search("watch_fullscreen\\?(?P<vid_query>.*?)&title=(?P<name>.*)';\n", data)
210 t= re.match (".*[?&]t=([^&]+)", m.group('vid_query')).groups()[0]
211 if isHDAvailable is True:
212 mrl = "http://www.youtube.com/get_video?video_id=" + quote(self.getTubeId()) + "&t=" + t + "&fmt=22"
213 print "[MyTube] GOT HD URL: ", mrl
215 mrl = "http://www.youtube.com/get_video?video_id=" + quote(self.getTubeId()) + "&t=" + t + "&fmt=18"
216 print "[MyTube] GOT SD URL: ", mrl
219 print "[MyTube] No valid mp4-url found"
220 #self.myopener = MyOpener()
221 #urllib.urlopen = MyOpener().open
224 def getRelatedVideos(self):
225 print "[MyTubeFeedEntry] getResponseVideos()"
226 for link in self.entry.link:
227 #print "Related link: ", link.rel.endswith
228 if link.rel.endswith("video.related"):
229 print "Found Related: ", link.href
232 def getResponseVideos(self):
233 print "[MyTubeFeedEntry] getResponseVideos()"
234 for link in self.entry.link:
235 #print "Responses link: ", link.rel.endswith
236 if link.rel.endswith("video.responses"):
237 print "Found Responses: ", link.href
240 class MyTubePlayerService():
241 # Do not change the client_id and developer_key in the login-section!
242 # ClientId: ytapi-dream-MyTubePlayer-i0kqrebg-0
243 # DeveloperKey: AI39si4AjyvU8GoJGncYzmqMCwelUnqjEMWTFCcUtK-VUzvWygvwPO-sadNwW5tNj9DDCHju3nnJEPvFy4WZZ6hzFYCx8rJ6Mw
245 print "[MyTube] MyTubePlayerService - init"
246 self.feedentries = []
249 def startService(self):
250 print "[MyTube] MyTubePlayerService - startService"
251 self.yt_service = gdata.youtube.service.YouTubeService()
252 self.yt_service.developer_key = 'AI39si4AjyvU8GoJGncYzmqMCwelUnqjEMWTFCcUtK-VUzvWygvwPO-sadNwW5tNj9DDCHju3nnJEPvFy4WZZ6hzFYCx8rJ6Mw'
253 self.yt_service.client_id = 'ytapi-dream-MyTubePlayer-i0kqrebg-0'
254 self.loggedIn = False
255 #os.environ['http_proxy'] = 'http://169.229.50.12:3128'
256 #proxy = os.environ.get('http_proxy')
257 #print "FOUND ENV PROXY-->",proxy
258 #for a in os.environ.keys():
261 def stopService(self):
262 print "[MyTube] MyTubePlayerService - stopService"
264 self.loggedIn = False
266 def isLoggedIn(self):
269 def getFeed(self, url):
270 print "[MyTube] MyTubePlayerService - getFeed:",url
271 self.feedentries = []
272 self.feed = self.yt_service.GetYouTubeVideoFeed(url)
273 for entry in self.feed.entry:
274 MyFeedEntry = MyTubeFeedEntry(self, entry)
275 self.feedentries.append(MyFeedEntry)
278 def search(self, searchTerms, startIndex = 1, maxResults = 25,
279 orderby = "relevance", racy = "include",
280 author = "", lr = "", categories = "", sortOrder = "ascending"):
281 print "[MyTube] MyTubePlayerService - search()"
282 self.feedentries = []
283 query = gdata.youtube.service.YouTubeVideoQuery()
284 query.vq = searchTerms
285 query.orderby = orderby
287 query.sortorder = sortOrder
290 if categories[0] is not None:
291 query.categories = categories
292 query.start_index = startIndex
293 query.max_results = maxResults
295 feed = self.yt_service.YouTubeQuery(query)
300 for entry in self.feed.entry:
301 MyFeedEntry = MyTubeFeedEntry(self, entry)
302 self.feedentries.append(MyFeedEntry)
306 return self.feed.title.text
308 def getEntries(self):
309 return self.feedentries
312 return self.feed.items_per_page.text
314 def getTotalResults(self):
315 return self.feed.total_results.text
317 def getNextFeedEntriesURL(self):
318 for link in self.feed.link:
319 if link.rel == "next":
324 myTubeService = MyTubePlayerService()