diff --git a/weboob/backends/youporn/backend.py b/weboob/backends/youporn/backend.py index 880d6ee2..a8a76ded 100644 --- a/weboob/backends/youporn/backend.py +++ b/weboob/backends/youporn/backend.py @@ -53,6 +53,9 @@ class YoupornBackend(Backend, ICapVideoProvider): def get_video(self, _id): return self.browser.get_video(_id) + def iter_search_results(self, pattern=None): + return self.browser.iter_search_results(pattern) + @need_url def iter_page_urls(self, mozaic_url): raise NotImplementedError() diff --git a/weboob/backends/youporn/browser.py b/weboob/backends/youporn/browser.py index 7c67f478..74ec48b2 100644 --- a/weboob/backends/youporn/browser.py +++ b/weboob/backends/youporn/browser.py @@ -19,6 +19,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. """ import re +import urllib from weboob.tools.browser import Browser @@ -29,6 +30,7 @@ class YoupornBrowser(Browser): DOMAIN = 'youporn.com' PROTOCOL = 'http' PAGES = {'http://[w\.]*youporn\.com/?': IndexPage, + 'http://[w\.]*youporn\.com/search.*': IndexPage, 'http://[w\.]*youporn\.com/watch/.+': VideoPage, } @@ -38,10 +40,19 @@ class YoupornBrowser(Browser): def id2url(self, _id): if isinstance(_id, int) or isinstance(_id, (str,unicode)) and _id.isdigit(): - return 'http://www.youporn.com/watch/%d' % _id + return 'http://www.youporn.com/watch/%d' % int(_id) else: return str(_id) + def iter_search_results(self, pattern): + if not pattern: + self.home() + else: + self.location('/search?query=%s' % urllib.quote_plus(pattern)) + + assert self.is_on_page(IndexPage) + return self.page.iter_videos() + def get_video(self, _id): self.location(self.id2url(_id)) return self.page.video diff --git a/weboob/backends/youporn/pages/index.py b/weboob/backends/youporn/pages/index.py index 4d184dd6..1c115baa 100644 --- a/weboob/backends/youporn/pages/index.py +++ b/weboob/backends/youporn/pages/index.py @@ -19,8 +19,17 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. """ from .base import PornPage +from weboob.capabilities.video import Video class IndexPage(PornPage): - def loaded(self): - if not PornPage.loaded(self): - return + def iter_videos(self): + for h1 in self.document.getiterator('h1'): + a = h1.find('a') + if a is None: + continue + + url = a.attrib['href'] + _id = url[len('/watch/'):] + _id = _id[:_id.find('/')] + title = a.text + yield Video(int(_id), title) diff --git a/weboob/capabilities/video.py b/weboob/capabilities/video.py index bbb88229..4fa098e9 100644 --- a/weboob/capabilities/video.py +++ b/weboob/capabilities/video.py @@ -35,6 +35,15 @@ class ICapVideoProvider(ICap): def iter_page_urls(self, mozaic_url): raise NotImplementedError() + def iter_search_results(self, pattern=None): + """ + Iter results of a search on a pattern. Note that if pattern is None, + it get the latest videos. + + @param pattern [str] pattern to search on + """ + raise NotImplementedError() + def get_video(self, _id): """ Get a Video from an ID. diff --git a/weboob/frontends/videoob/application.py b/weboob/frontends/videoob/application.py index 9f032157..db2996c4 100644 --- a/weboob/frontends/videoob/application.py +++ b/weboob/frontends/videoob/application.py @@ -49,6 +49,24 @@ class Videoob(ConsoleApplication): print u"| Rating | %s" % video.rating print u"'-----------------' " + @ConsoleApplication.command('Search videos') + def command_search(self, pattern=None): + print u'.------------------------------------------------------------------------------.' + if pattern: + print u'| %-76s |' % (u'Search: %s' % pattern) + else: + print u'| %-76s |' % 'Last videos' + print u"+------------.-----------------------------------------------------------------'" + for backend in self.weboob.iter_backends(): + try: + iterator = backend.iter_search_results(pattern) + except NotImplementedError: + continue + else: + for video in iterator: + print u"| %10d | %-63s |" % (video.id, video.title) + print u"'--------------'---------------------------------------------------------------'" + @ConsoleApplication.command('Get video file URL from page URL') def command_file_url(self, url): for backend in self.weboob.iter_backends(ICapVideoProvider):