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
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, socket.gaierror, socket.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
195 data = response.readline()
199 if "isHDAvailable = true" in data:
204 m = re.search("watch_fullscreen\\?(?P<vid_query>.*?)&title=(?P<name>.*)';\n", data)
209 t= re.match (".*[?&]t=([^&]+)", m.group('vid_query')).groups()[0]
210 if isHDAvailable is True:
211 mrl = "http://www.youtube.com/get_video?video_id=" + quote(self.getTubeId()) + "&t=" + t + "&fmt=22"
212 print "[MyTube] GOT HD URL: ", mrl
214 mrl = "http://www.youtube.com/get_video?video_id=" + quote(self.getTubeId()) + "&t=" + t + "&fmt=18"
215 print "[MyTube] GOT SD URL: ", mrl
218 print "[MyTube] No valid mp4-url found"
219 #self.myopener = MyOpener()
220 #urllib.urlopen = MyOpener().open
223 def getRelatedVideos(self):
224 print "[MyTubeFeedEntry] getResponseVideos()"
225 for link in self.entry.link:
226 #print "Related link: ", link.rel.endswith
227 if link.rel.endswith("video.related"):
228 print "Found Related: ", link.href
231 def getResponseVideos(self):
232 print "[MyTubeFeedEntry] getResponseVideos()"
233 for link in self.entry.link:
234 #print "Responses link: ", link.rel.endswith
235 if link.rel.endswith("video.responses"):
236 print "Found Responses: ", link.href
239 class MyTubePlayerService():
240 # Do not change the client_id and developer_key in the login-section!
241 # ClientId: ytapi-dream-MyTubePlayer-i0kqrebg-0
242 # DeveloperKey: AI39si4AjyvU8GoJGncYzmqMCwelUnqjEMWTFCcUtK-VUzvWygvwPO-sadNwW5tNj9DDCHju3nnJEPvFy4WZZ6hzFYCx8rJ6Mw
244 print "[MyTube] MyTubePlayerService - init"
245 self.feedentries = []
248 def startService(self):
249 print "[MyTube] MyTubePlayerService - startService"
250 self.yt_service = gdata.youtube.service.YouTubeService()
251 self.yt_service.developer_key = 'AI39si4AjyvU8GoJGncYzmqMCwelUnqjEMWTFCcUtK-VUzvWygvwPO-sadNwW5tNj9DDCHju3nnJEPvFy4WZZ6hzFYCx8rJ6Mw'
252 self.yt_service.client_id = 'ytapi-dream-MyTubePlayer-i0kqrebg-0'
253 self.loggedIn = False
254 #os.environ['http_proxy'] = 'http://169.229.50.12:3128'
255 #proxy = os.environ.get('http_proxy')
256 #print "FOUND ENV PROXY-->",proxy
257 #for a in os.environ.keys():
260 def stopService(self):
261 print "[MyTube] MyTubePlayerService - stopService"
263 self.loggedIn = False
265 def isLoggedIn(self):
268 def getFeed(self, url):
269 print "[MyTube] MyTubePlayerService - getFeed:",url
270 self.feedentries = []
271 self.feed = self.yt_service.GetYouTubeVideoFeed(url)
272 for entry in self.feed.entry:
273 MyFeedEntry = MyTubeFeedEntry(self, entry)
274 self.feedentries.append(MyFeedEntry)
277 def search(self, searchTerms, startIndex = 1, maxResults = 25,
278 orderby = "relevance", racy = "include",
279 author = "", lr = "", categories = "", sortOrder = "ascending"):
280 print "[MyTube] MyTubePlayerService - search()"
281 self.feedentries = []
282 query = gdata.youtube.service.YouTubeVideoQuery()
283 query.vq = searchTerms
284 query.orderby = orderby
286 query.sortorder = sortOrder
289 if categories[0] is not None:
290 query.categories = categories
291 query.start_index = startIndex
292 query.max_results = maxResults
294 feed = self.yt_service.YouTubeQuery(query)
299 for entry in self.feed.entry:
300 MyFeedEntry = MyTubeFeedEntry(self, entry)
301 self.feedentries.append(MyFeedEntry)
305 return self.feed.title.text
307 def getEntries(self):
308 return self.feedentries
311 return self.feed.items_per_page.text
313 def getTotalResults(self):
314 return self.feed.total_results.text
316 def getNextFeedEntriesURL(self):
317 for link in self.feed.link:
318 if link.rel == "next":
323 myTubeService = MyTubePlayerService()