diff --git a/CHANGELOG.txt b/CHANGELOG.txt index a50f8656..b7de915c 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,6 +1,14 @@ Changelog ========= +0.3.8 +----- + +*Date: 2013-04-05* + +* Add support for: + - Coursera + 0.3.7 ----- diff --git a/README.md b/README.md index c87afafc..6983b5b5 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,7 @@ Fork me on GitHub: * YouTube * Vimeo +* Coursera * Blip * Dailymotion * Facebook @@ -22,6 +23,7 @@ Fork me on GitHub: * Vine * SoundCloud * Mixcloud +* Freesound * JPopsuki * VID48 * Niconico (ニコニコ動画) @@ -226,6 +228,7 @@ You-Get基于优酷下载脚本[iambus/youku-lixian](https://github.com/iambus/y * YouTube * Vimeo +* Coursera * Blip * Dailymotion * Facebook @@ -234,6 +237,7 @@ You-Get基于优酷下载脚本[iambus/youku-lixian](https://github.com/iambus/y * Vine * SoundCloud * Mixcloud +* Freesound * JPopsuki * VID48 * NICONICO动画 diff --git a/README.txt b/README.txt index ddcb5bc3..5df26fe4 100644 --- a/README.txt +++ b/README.txt @@ -17,6 +17,7 @@ Supported Sites (As of Now) * YouTube http://www.youtube.com * Vimeo http://vimeo.com +* Coursera https://www.coursera.org * Blip http://blip.tv * Dailymotion http://dailymotion.com * Facebook http://facebook.com @@ -25,6 +26,7 @@ Supported Sites (As of Now) * Vine http://vine.co * SoundCloud http://soundcloud.com * Mixcloud http://www.mixcloud.com +* Freesound http://www.freesound.org * JPopsuki http://jpopsuki.tv * VID48 http://vid48.com * Niconico (ニコニコ動画) http://www.nicovideo.jp @@ -47,7 +49,7 @@ Supported Sites (As of Now) * Sohu (搜狐视频) http://tv.sohu.com * 56 (56网) http://www.56.com * Xiami (虾米) http://www.xiami.com -* Baidu (百度音乐) +* Baidu (百度音乐) http://music.baidu.com Dependencies ------------ diff --git a/src/you_get/__main__.py b/src/you_get/__main__.py index 7f5472ed..6733baea 100644 --- a/src/you_get/__main__.py +++ b/src/you_get/__main__.py @@ -24,9 +24,11 @@ def url_to_module(url): 'bilibili': bilibili, 'blip': blip, 'cntv': cntv, + 'coursera': coursera, 'dailymotion': dailymotion, 'douban': douban, 'facebook': facebook, + 'freesound': freesound, 'google': googleplus, 'iask': sina, 'ifeng': ifeng, diff --git a/src/you_get/downloader/__init__.py b/src/you_get/downloader/__init__.py index 95136ae0..11fa7b77 100644 --- a/src/you_get/downloader/__init__.py +++ b/src/you_get/downloader/__init__.py @@ -4,9 +4,11 @@ from .acfun import * from .bilibili import * from .blip import * from .cntv import * +from .coursera import * from .dailymotion import * from .douban import * from .facebook import * +from .freesound import * from .googleplus import * from .ifeng import * from .iqiyi import * diff --git a/src/you_get/downloader/coursera.py b/src/you_get/downloader/coursera.py new file mode 100644 index 00000000..3570c511 --- /dev/null +++ b/src/you_get/downloader/coursera.py @@ -0,0 +1,115 @@ +#!/usr/bin/env python + +__all__ = ['coursera_download'] + +from ..common import * + +def coursera_login(user, password, csrf_token): + url = 'https://www.coursera.org/maestro/api/user/login' + my_headers = { + 'Cookie': ('csrftoken=%s' % csrf_token), + 'Referer': 'https://www.coursera.org', + 'X-CSRFToken': csrf_token, + } + + values = { + 'email_address': user, + 'password': password, + } + form_data = parse.urlencode(values).encode('utf-8') + + response = request.urlopen(request.Request(url, headers = my_headers, data = form_data)) + + return response.headers + +def coursera_download(url, output_dir = '.', merge = True, info_only = False): + course_code = r1(r'coursera.org/([^/]+)', url) + + request.install_opener(request.build_opener(request.HTTPCookieProcessor())) + + response = request.urlopen(request.Request(url)) + csrf_token = r1(r'csrf_token=([^;]+);', response.headers['Set-Cookie']) + + import netrc, getpass + info = netrc.netrc().authenticators('coursera.org') + if info is None: + user = input("User: ") + password = getpass.getpass("Password: ") + else: + user, password = info[0], info[2] + print("Logging in...") + + coursera_login(user, password, csrf_token) + + request.urlopen("https://class.coursera.org/%s/auth/auth_redirector?type=login&subtype=normal" % course_code) # necessary! + + html = get_html(url) + + course_name = "%s (%s)" % (r1(r'course_strings_name = "([^"]+)"', html), course_code) + output_dir = os.path.join(output_dir, course_name) + + materials = re.findall(r'