From 8a07b7a9cec6e9e3338240bfa93f0f0fac1677a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Revol?= Date: Sun, 17 Mar 2013 22:30:51 +0100 Subject: [PATCH] gdcvault: implement login MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * since there is a limited number of usable concurrent sessions we force a logout on exit. Signed-off-by: François Revol --- modules/gdcvault/backend.py | 21 ++++++++++++++- modules/gdcvault/browser.py | 51 ++++++++++++++++++++++++++++++++++--- modules/gdcvault/pages.py | 12 ++++++++- 3 files changed, 79 insertions(+), 5 deletions(-) diff --git a/modules/gdcvault/backend.py b/modules/gdcvault/backend.py index f311420b..cdb827b5 100644 --- a/modules/gdcvault/backend.py +++ b/modules/gdcvault/backend.py @@ -22,8 +22,9 @@ from __future__ import with_statement from weboob.capabilities.video import ICapVideo, BaseVideo -from weboob.tools.backend import BaseBackend +from weboob.tools.backend import BaseBackend, BackendConfig from weboob.capabilities.collection import ICapCollection, CollectionNotFound +from weboob.tools.value import Value, ValueBackendPassword from .browser import GDCVaultBrowser from .video import GDCVaultVideo @@ -40,6 +41,24 @@ class GDCVaultBackend(BaseBackend, ICapVideo, ICapCollection): DESCRIPTION = 'Game Developers Conferences Vault video streaming website' LICENSE = 'AGPLv3+' BROWSER = GDCVaultBrowser + CONFIG = BackendConfig(Value('username', label='Username', default=''), + ValueBackendPassword('password', label='Password', default='')) + + def create_default_browser(self): + username = self.config['username'].get() + if len(username) > 0: + password = self.config['password'].get() + else: + password = None + return self.create_browser(username, password) + + def deinit(self): + # don't need to logout if the browser hasn't been used. + if not self._browser: + return + + with self.browser: + self.browser.close_session() def get_video(self, _id): with self.browser: diff --git a/modules/gdcvault/browser.py b/modules/gdcvault/browser.py index a4f5d971..a15fb7d5 100644 --- a/modules/gdcvault/browser.py +++ b/modules/gdcvault/browser.py @@ -18,11 +18,13 @@ # You should have received a copy of the GNU Affero General Public License # along with weboob. If not, see . -from weboob.tools.browser import BaseBrowser +import urllib + +from weboob.tools.browser import BaseBrowser, BrowserIncorrectPassword, BrowserUnavailable from weboob.tools.browser.decorators import id2url #from .pages.index import IndexPage -from .pages import VideoPage +from .pages import VideoPage, IndexPage from .video import GDCVaultVideo @@ -31,13 +33,56 @@ __all__ = ['GDCVaultBrowser'] class GDCVaultBrowser(BaseBrowser): DOMAIN = 'gdcvault.com' - ENCODING = None + ENCODING = 'utf-8' PAGES = {r'http://[w\.]*gdcvault.com/play/(?P[\d]+)/?.*': VideoPage, + r'http://[w\.]*gdcvault.com/': IndexPage, } + def is_logged(self): + if self.password is None: + return True + + if not self.page: + return False + + obj = self.parser.select(self.page.document.getroot(), 'h3[id=welcome_user_name]', 1) + if obj is None: + return False + + return obj.attrib.get('class','') != "hidden" + + def login(self): + if self.password is None: + return + + params = {'remember_me': 0, + 'email': self.username, + 'password': self.password, + } + + data = self.readurl('http://gdcvault.com/api/login.php', + urllib.urlencode(params)) + # data is returned as JSON, not sure yet if it's useful + + print data + if data is None: + raise BrowserBanned('Too many open sessions?') + + self.location('/', no_login=True) + + if not self.is_logged(): + raise BrowserIncorrectPassword() + + def close_session(self): + print "logging out..." + self.openurl('/logout', '') + @id2url(GDCVaultVideo.id2url) def get_video(self, url, video=None): self.location(url) + # redirects to /login means the video is not public + if not isinstance(self.page, VideoPage): + raise BrowserUnavailable('Requires account') return self.page.get_video(video) # def search_videos(self, pattern, sortby): diff --git a/modules/gdcvault/pages.py b/modules/gdcvault/pages.py index 9df3663e..8cff3c3b 100644 --- a/modules/gdcvault/pages.py +++ b/modules/gdcvault/pages.py @@ -35,9 +35,19 @@ from .video import GDCVaultVideo #import lxml.etree -__all__ = ['VideoPage'] +__all__ = ['IndexPage', 'VideoPage'] +class IndexPage(BasePage): + def iter_videos(self): + for a in self.parser.select(self.document.getroot(), 'section.conference ul.media_items li.featured a.session_item'): + print a + #m = re.match('id-(\d+)', a.attrib.get('class', '')) + #if not m: + # continue + # FIXME + yield None + class VideoPage(BasePage): def get_video(self, video=None): if video is None: