# -*- coding: utf-8 -*- # Copyright(C) 2015 Vincent A # # This file is part of a weboob module. # # This weboob module is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This weboob module is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this weboob module. If not, see . from __future__ import unicode_literals from weboob.browser import LoginBrowser, URL, need_login from weboob.browser.exceptions import HTTPNotFound from weboob.exceptions import BrowserIncorrectPassword from weboob.capabilities.image import Thumbnail from .pages import PageLogin, PageDashboard, PageChapter, PageSection from .video import MoocVideo import re class FunmoocBrowser(LoginBrowser): BASEURL = 'https://www.fun-mooc.fr' login = URL('/login', '/login_ajax', PageLogin) dashboard = URL('/dashboard', PageDashboard) course = URL('/courses/(?P[^/]+/[^/]+/[^/]+)/courseware/?$', '/courses/(?P[^/]+/[^/]+/[^/]+)/info/?$', PageChapter) chapter = URL('/courses/(?P[^/]+/[^/]+/[^/]+)/courseware' '/(?P[0-9a-f]+)/$', PageChapter) section = URL('/courses/(?P[^/]+/[^/]+/[^/]+)/courseware/' '(?P[0-9a-f]+)/(?P
[0-9a-f]+)/$', PageSection) file = URL(r'https://.*\.cloudfront\.net/videos/(?P[^/]+)/' r'(?P\w+)\.mp4') def __init__(self, username, password, quality='hd', *args, **kwargs): super(FunmoocBrowser, self).__init__(username, password, *args, **kwargs) self.quality = quality def do_login(self): self.login.stay_or_go() csrf = self.session.cookies.get('csrftoken') self.page.login(self.username, self.password, csrf) self.dashboard.stay_or_go() if not self.page.logged: raise BrowserIncorrectPassword() def get_video(self, url): v = MoocVideo(url) v.url = url v.ext = 'mp4' v.title = re.sub(r'[:/"]', '-', url) return v @need_login def iter_videos(self, course, chapter, section): course = course.replace('-', '/') assert self.section.stay_or_go(course=course, chapter=chapter, section=section) for n, d in enumerate(self.page.iter_videos()): video = self.get_video(d['url']) if d.get('thumbnail'): video.thumbnail = Thumbnail(d['thumbnail']) if d.get('title'): video.title = d['title'] yield video @need_login def iter_sections(self, courseid, chapter): course = courseid.replace('-', '/') assert self.chapter.stay_or_go(course=course, chapter=chapter) for coll in self.page.iter_sections(): if coll.split_path[:2] == [courseid, chapter]: yield coll @need_login def iter_chapters(self, courseid): course = courseid.replace('-', '/') assert self.course.stay_or_go(course=course) return self.page.iter_chapters() @need_login def iter_courses(self): assert self.dashboard.stay_or_go() return self.page.iter_courses() @need_login def check_collection(self, path): if len(path) == 0: return True elif len(path) > 3: return False parts = list(zip(('course', 'chapter', 'section'), path)) parts[0] = (parts[0][0], parts[0][1].replace('-', '/')) try: getattr(self, parts[-1][0]).open(**dict(parts)) except HTTPNotFound: return False return True