From 226c7adaaf2d988c3a0152795c6a9eb54256aa9d Mon Sep 17 00:00:00 2001 From: zuoht Date: Tue, 16 Apr 2013 17:00:45 +0800 Subject: [PATCH 01/19] xiami album 3332 UnicodeEncodeError --- src/you_get/downloader/xiami.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/you_get/downloader/xiami.py b/src/you_get/downloader/xiami.py index 75c61b42..42f6b754 100644 --- a/src/you_get/downloader/xiami.py +++ b/src/you_get/downloader/xiami.py @@ -30,7 +30,7 @@ def location_dec(str): def xiami_download_lyric(lrc_url, file_name, output_dir): lrc = get_html(lrc_url, faker = True) if len(lrc) > 0: - with open(output_dir + "/" + file_name.replace('/', '-') + '.lrc', 'w') as x: + with open(output_dir + "/" + file_name.replace('/', '-') + '.lrc', 'w', encoding='utf-8') as x: x.write(lrc) def xiami_download_song(sid, output_dir = '.', merge = True, info_only = False): From 04670164d524eb01e8ba012900a560a71a784c10 Mon Sep 17 00:00:00 2001 From: Mort Yao Date: Tue, 16 Apr 2013 21:29:00 +0200 Subject: [PATCH 02/19] Google+: use Content-Disposition filename --- src/you_get/downloader/googleplus.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/you_get/downloader/googleplus.py b/src/you_get/downloader/googleplus.py index fb386c39..e3e0e66b 100644 --- a/src/you_get/downloader/googleplus.py +++ b/src/you_get/downloader/googleplus.py @@ -47,12 +47,17 @@ def googleplus_download(url, output_dir = '.', merge = True, info_only = False): if real_url: break real_url = unicodize(real_url) - + type, ext, size = url_info(real_url) if not ext: ext = 'mp4' + response = request.urlopen(request.Request(real_url)) + if response.headers['content-disposition']: + filename = parse.unquote(r1(r'filename="?(.+)"?', response.headers['content-disposition'])).split('.') + title = ''.join(filename[:-1]) + print_info(site_info, title, ext, size) if not info_only: download_urls([real_url], title, ext, size, output_dir, merge = merge) From 77e3f0da9bec64c2bf0f34faec735a29f1a74284 Mon Sep 17 00:00:00 2001 From: Mort Yao Date: Tue, 16 Apr 2013 21:33:32 +0200 Subject: [PATCH 03/19] remove test for Google+ --- tests/test.py | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/tests/test.py b/tests/test.py index 76851123..f7544d7d 100644 --- a/tests/test.py +++ b/tests/test.py @@ -17,16 +17,6 @@ class YouGetTests(unittest.TestCase): "http://www.freesound.org/people/Corsica_S/sounds/184419/", ]) - def test_googleplus(self): - test_urls([ - "http://plus.google.com/102663035987142737445/posts/jJRu43KQFT5", - "http://plus.google.com/+%E5%B9%B3%E7%94%B0%E6%A2%A8%E5%A5%88/posts/jJRu43KQFT5", - "http://plus.google.com/+平田梨奈/posts/jJRu43KQFT5", - "http://plus.google.com/photos/102663035987142737445/albums/5844078581209509505/5844078587839097874", - "http://plus.google.com/photos/+%E5%B9%B3%E7%94%B0%E6%A2%A8%E5%A5%88/albums/5844078581209509505/5844078587839097874", - "http://plus.google.com/photos/+平田梨奈/albums/5844078581209509505/5844078587839097874", - ]) - def test_jpopsuki(self): test_urls([ "http://jpopsuki.tv/video/Dragon-Ash---Run-to-the-Sun/8ad7aec604badd0b0798cd999b63ae17", From bbd50c4e6cf61427c8feede51b17630bb0995c29 Mon Sep 17 00:00:00 2001 From: Mort Yao Date: Wed, 17 Apr 2013 12:27:14 +0200 Subject: [PATCH 04/19] avoid using the libav fork of FFmpeg, as in #159 --- src/you_get/processor/ffmpeg.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/you_get/processor/ffmpeg.py b/src/you_get/processor/ffmpeg.py index 4b5d1db7..50172071 100644 --- a/src/you_get/processor/ffmpeg.py +++ b/src/you_get/processor/ffmpeg.py @@ -5,10 +5,14 @@ import subprocess def has_ffmpeg_installed(): try: - subprocess.call(['ffmpeg', '-loglevel', '0']) - return True + p = subprocess.Popen(['ffmpeg', '-version'], stdout=subprocess.PIPE) + out, err = p.communicate() + import re + assert re.search('Libav', str(out, 'utf-8').split('\n')[0]) is None except: return False + else: + return True def ffmpeg_convert_ts_to_mkv(files, output = 'output.mkv'): for file in files: From 2e033fb75d61dbd78df4510d48d5a0106ac0c231 Mon Sep 17 00:00:00 2001 From: Mort Yao Date: Wed, 17 Apr 2013 14:38:13 +0200 Subject: [PATCH 05/19] supporting both ffmpeg 1.x and libav, fix #159 --- src/you_get/processor/ffmpeg.py | 35 ++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/src/you_get/processor/ffmpeg.py b/src/you_get/processor/ffmpeg.py index 50172071..0d6c309a 100644 --- a/src/you_get/processor/ffmpeg.py +++ b/src/you_get/processor/ffmpeg.py @@ -3,21 +3,25 @@ import os.path import subprocess -def has_ffmpeg_installed(): +def get_usable_ffmpeg(cmd): try: - p = subprocess.Popen(['ffmpeg', '-version'], stdout=subprocess.PIPE) + p = subprocess.Popen([cmd, '-version'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) out, err = p.communicate() - import re - assert re.search('Libav', str(out, 'utf-8').split('\n')[0]) is None + vers = str(out, 'utf-8').split('\n')[0].split(' ') + assert (vers[0] == 'ffmpeg' and vers[2][0] > '0') or (vers[0] == 'avconv') + return cmd except: - return False - else: - return True + return None + +FFMPEG = get_usable_ffmpeg('ffmpeg') or get_usable_ffmpeg('avconv') + +def has_ffmpeg_installed(): + return FFMPEG is not None def ffmpeg_convert_ts_to_mkv(files, output = 'output.mkv'): for file in files: if os.path.isfile(file): - params = ['ffmpeg', '-i'] + params = [FFMPEG, '-i'] params.append(file) params.append(output) subprocess.call(params) @@ -27,7 +31,7 @@ def ffmpeg_convert_ts_to_mkv(files, output = 'output.mkv'): def ffmpeg_concat_mp4_to_mpg(files, output = 'output.mpg'): for file in files: if os.path.isfile(file): - params = ['ffmpeg', '-i'] + params = [FFMPEG, '-i'] params.append(file) params.append(file + '.mpg') subprocess.call(params) @@ -37,7 +41,7 @@ def ffmpeg_concat_mp4_to_mpg(files, output = 'output.mpg'): for input in inputs: o.write(input.read()) - params = ['ffmpeg', '-i'] + params = [FFMPEG, '-i'] params.append(output + '.mpg') params += ['-vcodec', 'copy', '-acodec', 'copy'] params.append(output) @@ -50,7 +54,7 @@ def ffmpeg_concat_mp4_to_mpg(files, output = 'output.mpg'): return def ffmpeg_concat_ts_to_mkv(files, output = 'output.mkv'): - params = ['ffmpeg', '-isync', '-i'] + params = [FFMPEG, '-isync', '-i'] params.append('concat:') for file in files: if os.path.isfile(file): @@ -68,20 +72,23 @@ def ffmpeg_concat_ts_to_mkv(files, output = 'output.mkv'): def ffmpeg_concat_flv_to_mp4(files, output = 'output.mp4'): for file in files: if os.path.isfile(file): - params = ['ffmpeg', '-i'] + params = [FFMPEG, '-i'] params.append(file) params += ['-map', '0', '-c', 'copy', '-f', 'mpegts', '-bsf:v', 'h264_mp4toannexb'] params.append(file + '.ts') subprocess.call(params) - params = ['ffmpeg', '-i'] + params = [FFMPEG, '-i'] params.append('concat:') for file in files: f = file + '.ts' if os.path.isfile(f): params[-1] += f + '|' - params += ['-c', 'copy', '-absf', 'aac_adtstoasc', output] + if FFMPEG == 'avconv': + params += ['-c', 'copy', output] + else: + params += ['-c', 'copy', '-absf', 'aac_adtstoasc', output] if subprocess.call(params) == 0: for file in files: From 4ca5b1061ff37698ddc06c5fd0ba3172f15db0a7 Mon Sep 17 00:00:00 2001 From: Mort Yao Date: Thu, 18 Apr 2013 01:31:18 +0200 Subject: [PATCH 06/19] using Content-Range; workaround of #160 --- src/you_get/common.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/you_get/common.py b/src/you_get/common.py index e963cf90..fc91186b 100644 --- a/src/you_get/common.py +++ b/src/you_get/common.py @@ -207,9 +207,17 @@ def url_save(url, filepath, bar, refer = None, is_part = False, faker = False): headers['Referer'] = refer response = request.urlopen(request.Request(url, headers = headers), None) + try: + range_start = int(response.headers['content-range'][6:].split('/')[0].split('-')[0]) + end_length = end = int(response.headers['content-range'][6:].split('/')[1]) + range_length = end_length - range_start + except: + range_length = int(response.headers['content-length']) - if file_size != received + int(response.headers['content-length']): + if file_size != received + range_length: received = 0 + if bar: + bar.received = 0 open_mode = 'wb' with open(temp_filepath, open_mode) as output: From 762ced5dbac84cf1f4cb35a0e8fc8c9e42f2b9d6 Mon Sep 17 00:00:00 2001 From: Mort Yao Date: Thu, 18 Apr 2013 17:33:54 +0200 Subject: [PATCH 07/19] version 0.3.10 --- CHANGELOG.txt | 9 +++++++++ src/you_get/version.py | 4 ++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.txt b/CHANGELOG.txt index f11e33db..1c088c11 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,6 +1,15 @@ Changelog ========= +0.3.10 +------ + +*Date: 2013-04-19* + +* Add support for: + - SongTaste +* Support Libav as well as FFmpeg. + 0.3.9 ----- diff --git a/src/you_get/version.py b/src/you_get/version.py index ea16e46b..60a473f1 100644 --- a/src/you_get/version.py +++ b/src/you_get/version.py @@ -2,5 +2,5 @@ __all__ = ['__version__', '__date__'] -__version__ = '0.3.9' -__date__ = '2013-04-12' +__version__ = '0.3.10' +__date__ = '2013-04-19' From 7d3beda2a865b06111f846095b34c13acc9962bd Mon Sep 17 00:00:00 2001 From: Mort Yao Date: Fri, 19 Apr 2013 15:05:07 +0200 Subject: [PATCH 08/19] update tests --- tests/test.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/test.py b/tests/test.py index f7544d7d..d931fa51 100644 --- a/tests/test.py +++ b/tests/test.py @@ -25,7 +25,6 @@ class YouGetTests(unittest.TestCase): def test_mixcloud(self): test_urls([ "http://www.mixcloud.com/beatbopz/beat-bopz-disco-mix/", - "http://www.mixcloud.com/beatbopz/tokyo-taste-vol4/", "http://www.mixcloud.com/DJVadim/north-america-are-you-ready/", ]) From 8f19b4e302c4bcddfb5bb72c2c5cf10f901a0fe0 Mon Sep 17 00:00:00 2001 From: Mort Yao Date: Sat, 20 Apr 2013 04:58:33 +0200 Subject: [PATCH 09/19] add support for MIME type: video/quicktime --- src/you_get/common.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/you_get/common.py b/src/you_get/common.py index fc91186b..8978071a 100644 --- a/src/you_get/common.py +++ b/src/you_get/common.py @@ -124,6 +124,7 @@ def url_info(url, faker = False): 'video/f4v': 'flv', 'video/mp4': 'mp4', 'video/MP2T': 'ts', + 'video/quicktime': 'mov', 'video/webm': 'webm', 'video/x-flv': 'flv', 'video/x-ms-asf': 'asf', @@ -536,6 +537,7 @@ def playlist_not_supported(name): return f def print_info(site_info, title, type, size): + type = type.lower() if type in ['3gp']: type = 'video/3gpp' elif type in ['asf', 'wmv']: @@ -546,6 +548,8 @@ def print_info(site_info, title, type, size): type = 'audio/mpeg' elif type in ['mp4']: type = 'video/mp4' + elif type in ['mov']: + type = 'video/quicktime' elif type in ['ts']: type = 'video/MP2T' elif type in ['webm']: @@ -563,8 +567,8 @@ def print_info(site_info, title, type, size): type_info = "WebM video (%s)" % type #elif type in ['video/ogg']: # type_info = "Ogg video (%s)" % type - #elif type in ['video/quicktime']: - # type_info = "QuickTime video (%s)" % type + elif type in ['video/quicktime']: + type_info = "QuickTime video (%s)" % type #elif type in ['video/x-matroska']: # type_info = "Matroska video (%s)" % type #elif type in ['video/x-ms-wmv']: From ad1512b484c621c5378c242ba7fccd6f8c5f6e69 Mon Sep 17 00:00:00 2001 From: Mort Yao Date: Sat, 20 Apr 2013 12:50:12 +0200 Subject: [PATCH 10/19] Google+: fix #161 --- src/you_get/downloader/googleplus.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/you_get/downloader/googleplus.py b/src/you_get/downloader/googleplus.py index e3e0e66b..0a46cd11 100644 --- a/src/you_get/downloader/googleplus.py +++ b/src/you_get/downloader/googleplus.py @@ -20,7 +20,7 @@ def googleplus_download(url, output_dir = '.', merge = True, info_only = False): html = get_html(url2) html = parse.unquote(html.replace('\/', '/')) - real_url = unicodize(r1(r'"(https://video.googleusercontent.com/[^"]*)",1\]', html).replace('\/', '/')) + real_url = unicodize(r1(r'"(https://video.googleusercontent.com/[^"]*)",\d\]', html).replace('\/', '/')) if real_url: type, ext, size = url_info(real_url) if not real_url or not size: From 1c63f70022f934667be936f3e21d62bc8108cc06 Mon Sep 17 00:00:00 2001 From: Mort Yao Date: Sun, 21 Apr 2013 12:51:47 +0200 Subject: [PATCH 11/19] Coursera: use http.client instead, fix #163 --- src/you_get/downloader/coursera.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/you_get/downloader/coursera.py b/src/you_get/downloader/coursera.py index 3570c511..f8cdbf9b 100644 --- a/src/you_get/downloader/coursera.py +++ b/src/you_get/downloader/coursera.py @@ -27,7 +27,11 @@ def coursera_download(url, output_dir = '.', merge = True, info_only = False): request.install_opener(request.build_opener(request.HTTPCookieProcessor())) - response = request.urlopen(request.Request(url)) + import http.client + conn = http.client.HTTPConnection('class.coursera.org') + conn.request('GET', "/%s/lecture/index" % course_code) + response = conn.getresponse() + csrf_token = r1(r'csrf_token=([^;]+);', response.headers['Set-Cookie']) import netrc, getpass From 54f0a37152cdfbc64ac575ac1d4c88412635a116 Mon Sep 17 00:00:00 2001 From: Mort Yao Date: Sun, 21 Apr 2013 12:55:46 +0200 Subject: [PATCH 12/19] Coursera: handle more general form of URL --- src/you_get/downloader/coursera.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/you_get/downloader/coursera.py b/src/you_get/downloader/coursera.py index f8cdbf9b..b9da9488 100644 --- a/src/you_get/downloader/coursera.py +++ b/src/you_get/downloader/coursera.py @@ -24,6 +24,7 @@ def coursera_login(user, password, csrf_token): def coursera_download(url, output_dir = '.', merge = True, info_only = False): course_code = r1(r'coursera.org/([^/]+)', url) + url = "http://class.coursera.org/%s/lecture/index" % course_code request.install_opener(request.build_opener(request.HTTPCookieProcessor())) From 34e0efda870507a46456eacecf6a0d82acd88c71 Mon Sep 17 00:00:00 2001 From: Mort Yao Date: Sun, 21 Apr 2013 17:26:14 +0200 Subject: [PATCH 13/19] add support for Google Drive, close #165 --- README.md | 2 + README.txt | 1 + src/you_get/__main__.py | 2 +- src/you_get/downloader/__init__.py | 2 +- src/you_get/downloader/google.py | 88 ++++++++++++++++++++++++++++ src/you_get/downloader/googleplus.py | 67 --------------------- 6 files changed, 93 insertions(+), 69 deletions(-) create mode 100644 src/you_get/downloader/google.py delete mode 100644 src/you_get/downloader/googleplus.py diff --git a/README.md b/README.md index ceaabd42..7579f81a 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,7 @@ Fork me on GitHub: * Dailymotion * Facebook * Google+ +* Google Drive * Tumblr * Vine * SoundCloud @@ -234,6 +235,7 @@ You-Get基于优酷下载脚本[iambus/youku-lixian](https://github.com/iambus/y * Dailymotion * Facebook * Google+ +* Google Drive * Tumblr * Vine * SoundCloud diff --git a/README.txt b/README.txt index 487c34b0..d90bd5d1 100644 --- a/README.txt +++ b/README.txt @@ -22,6 +22,7 @@ Supported Sites (As of Now) * Dailymotion http://dailymotion.com * Facebook http://facebook.com * Google+ http://plus.google.com +* Google Drive http://docs.google.com * Tumblr http://www.tumblr.com * Vine http://vine.co * SoundCloud http://soundcloud.com diff --git a/src/you_get/__main__.py b/src/you_get/__main__.py index cd35a477..568082f5 100644 --- a/src/you_get/__main__.py +++ b/src/you_get/__main__.py @@ -30,7 +30,7 @@ def url_to_module(url): 'douban': douban, 'facebook': facebook, 'freesound': freesound, - 'google': googleplus, + 'google': google, 'iask': sina, 'ifeng': ifeng, 'iqiyi': iqiyi, diff --git a/src/you_get/downloader/__init__.py b/src/you_get/downloader/__init__.py index 36b097b7..0b85ad8a 100644 --- a/src/you_get/downloader/__init__.py +++ b/src/you_get/downloader/__init__.py @@ -10,7 +10,7 @@ from .dailymotion import * from .douban import * from .facebook import * from .freesound import * -from .googleplus import * +from .google import * from .ifeng import * from .iqiyi import * from .joy import * diff --git a/src/you_get/downloader/google.py b/src/you_get/downloader/google.py new file mode 100644 index 00000000..3ca761a8 --- /dev/null +++ b/src/you_get/downloader/google.py @@ -0,0 +1,88 @@ +#!/usr/bin/env python + +__all__ = ['google_download'] + +from ..common import * + +import re + +def google_download(url, output_dir = '.', merge = True, info_only = False): + # Percent-encoding Unicode URL + url = parse.quote(url, safe = ':/+%') + + service = url.split('/')[2].split('.')[0] + + if service == 'plus': # Google Plus + + html = get_html(url) + html = parse.unquote(html).replace('\/', '/') + + title = r1(r'(.*)', html) or r1(r'(.*)\n', html) or r1(r'<meta property="og:title" content="([^"]*)"', html) + + url2 = r1(r'<a href="([^"]+)" target="_blank" class="Mn" >', html) + if url2: + html = get_html(url2) + html = parse.unquote(html.replace('\/', '/')) + + real_url = unicodize(r1(r'"(https://video.googleusercontent.com/[^"]*)",\d\]', html).replace('\/', '/')) + if real_url: + type, ext, size = url_info(real_url) + if not real_url or not size: + url_data = re.findall(r'(\[[^\[\"]+\"http://redirector.googlevideo.com/.*\"\])', html) + for itag in [ + '38', + '46', '37', + '102', '45', '22', + '84', + '120', + '85', + '44', '35', + '101', '100', '43', '34', '82', '18', + '6', + '83', '5', '36', + '17', + '13', + ]: + real_url = None + for url_item in url_data: + if itag == str(eval(url_item)[0]): + real_url = eval(url_item)[3] + break + if real_url: + break + real_url = unicodize(real_url) + + type, ext, size = url_info(real_url) + + if not ext: + ext = 'mp4' + + response = request.urlopen(request.Request(real_url)) + if response.headers['content-disposition']: + filename = parse.unquote(r1(r'filename="?(.+)"?', response.headers['content-disposition'])).split('.') + title = ''.join(filename[:-1]) + + elif service in ['docs', 'drive'] : # Google Docs + + html = get_html(url) + + title = r1(r'"title":"([^"]*)"', html) or r1(r'<meta itemprop="name" content="([^"]*)"', html) + if len(title.split('.')) > 1: + title = ".".join(title.split('.')[:-1]) + + docid = r1(r'"docid":"([^"]*)"', html) + + request.install_opener(request.build_opener(request.HTTPCookieProcessor())) + + request.urlopen(request.Request("https://docs.google.com/uc?id=%s&export=download" % docid)) + real_url ="https://docs.google.com/uc?export=download&confirm=no_antivirus&id=%s" % docid + + type, ext, size = url_info(real_url) + + print_info(site_info, title, ext, size) + if not info_only: + download_urls([real_url], title, ext, size, output_dir, merge = merge) + +site_info = "Google.com" +download = google_download +download_playlist = playlist_not_supported('google') diff --git a/src/you_get/downloader/googleplus.py b/src/you_get/downloader/googleplus.py deleted file mode 100644 index 0a46cd11..00000000 --- a/src/you_get/downloader/googleplus.py +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/bin/env python - -__all__ = ['googleplus_download'] - -from ..common import * - -import re - -def googleplus_download(url, output_dir = '.', merge = True, info_only = False): - # Percent-encoding Unicode URL - url = parse.quote(url, safe = ':/+%') - - html = get_html(url) - html = parse.unquote(html).replace('\/', '/') - - title = r1(r'<title>(.*)', html) or r1(r'(.*)\n', html) or r1(r'<meta property="og:title" content="([^"]*)"', html) - - url2 = r1(r'<a href="([^"]+)" target="_blank" class="Mn" >', html) - if url2: - html = get_html(url2) - html = parse.unquote(html.replace('\/', '/')) - - real_url = unicodize(r1(r'"(https://video.googleusercontent.com/[^"]*)",\d\]', html).replace('\/', '/')) - if real_url: - type, ext, size = url_info(real_url) - if not real_url or not size: - url_data = re.findall(r'(\[[^\[\"]+\"http://redirector.googlevideo.com/.*\"\])', html) - for itag in [ - '38', - '46', '37', - '102', '45', '22', - '84', - '120', - '85', - '44', '35', - '101', '100', '43', '34', '82', '18', - '6', - '83', '5', '36', - '17', - '13', - ]: - real_url = None - for url_item in url_data: - if itag == str(eval(url_item)[0]): - real_url = eval(url_item)[3] - break - if real_url: - break - real_url = unicodize(real_url) - - type, ext, size = url_info(real_url) - - if not ext: - ext = 'mp4' - - response = request.urlopen(request.Request(real_url)) - if response.headers['content-disposition']: - filename = parse.unquote(r1(r'filename="?(.+)"?', response.headers['content-disposition'])).split('.') - title = ''.join(filename[:-1]) - - print_info(site_info, title, ext, size) - if not info_only: - download_urls([real_url], title, ext, size, output_dir, merge = merge) - -site_info = "plus.google.com" -download = googleplus_download -download_playlist = playlist_not_supported('googleplus') From 575600d72854d19a89411ae3af80d40f5e94c344 Mon Sep 17 00:00:00 2001 From: Mort Yao <mort.yao@gmail.com> Date: Sun, 21 Apr 2013 17:30:14 +0200 Subject: [PATCH 14/19] add support for MIME type: video/x-matroska --- src/you_get/common.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/you_get/common.py b/src/you_get/common.py index 8978071a..9049fb81 100644 --- a/src/you_get/common.py +++ b/src/you_get/common.py @@ -544,6 +544,8 @@ def print_info(site_info, title, type, size): type = 'video/x-ms-asf' elif type in ['flv', 'f4v']: type = 'video/x-flv' + elif type in ['mkv']: + type = 'video/x-matroska' elif type in ['mp3']: type = 'audio/mpeg' elif type in ['mp4']: @@ -569,8 +571,8 @@ def print_info(site_info, title, type, size): # type_info = "Ogg video (%s)" % type elif type in ['video/quicktime']: type_info = "QuickTime video (%s)" % type - #elif type in ['video/x-matroska']: - # type_info = "Matroska video (%s)" % type + elif type in ['video/x-matroska']: + type_info = "Matroska video (%s)" % type #elif type in ['video/x-ms-wmv']: # type_info = "Windows Media video (%s)" % type elif type in ['video/x-ms-asf']: From ac131d78b51c9679fe40e3aa2888a13181dc21e1 Mon Sep 17 00:00:00 2001 From: Mort Yao <mort.yao@gmail.com> Date: Tue, 23 Apr 2013 13:05:11 +0200 Subject: [PATCH 15/19] QQ: fix #167 --- src/you_get/downloader/qq.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/you_get/downloader/qq.py b/src/you_get/downloader/qq.py index 6c092c80..b59c68bc 100644 --- a/src/you_get/downloader/qq.py +++ b/src/you_get/downloader/qq.py @@ -29,6 +29,10 @@ def qq_download(url, output_dir = '.', merge = True, info_only = False): aid = r1(r'(.*)\.html', r_url) url = "%s/%s.html" % (aid, vid) + if re.match(r'http://static.video.qq.com/.*vid=', url): + vid = r1(r'http://static.video.qq.com/.*vid=(\w+)', url) + url = "http://v.qq.com/page/%s.html" % vid + html = get_html(url) title = r1(r'title:"([^"]+)"', html) From e859acce4db25fce60b7656d98b1bb2b4ce63e7b Mon Sep 17 00:00:00 2001 From: Mort Yao <mort.yao@gmail.com> Date: Tue, 23 Apr 2013 17:49:08 +0200 Subject: [PATCH 16/19] Google+: fix #168 --- src/you_get/downloader/google.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/you_get/downloader/google.py b/src/you_get/downloader/google.py index 3ca761a8..2094514d 100644 --- a/src/you_get/downloader/google.py +++ b/src/you_get/downloader/google.py @@ -19,7 +19,7 @@ def google_download(url, output_dir = '.', merge = True, info_only = False): title = r1(r'<title>(.*)', html) or r1(r'(.*)\n', html) or r1(r'<meta property="og:title" content="([^"]*)"', html) - url2 = r1(r'<a href="([^"]+)" target="_blank" class="Mn" >', html) + url2 = r1(r'<a href="(https://plus.google.com/photos/[^"]+)" target="_blank" class', html) if url2: html = get_html(url2) html = parse.unquote(html.replace('\/', '/')) From 8552bccb91755c3a69d1435976cfeffef1e1137e Mon Sep 17 00:00:00 2001 From: Mort Yao <mort.yao@gmail.com> Date: Thu, 25 Apr 2013 15:47:57 +0200 Subject: [PATCH 17/19] Coursera: handle exceptions, fix #169 --- src/you_get/downloader/coursera.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/you_get/downloader/coursera.py b/src/you_get/downloader/coursera.py index b9da9488..d88c7068 100644 --- a/src/you_get/downloader/coursera.py +++ b/src/you_get/downloader/coursera.py @@ -83,10 +83,14 @@ def coursera_download(url, output_dir = '.', merge = True, info_only = False): ext = r1(r'format=(.+)', resource_url) or r1(r'\.(\w\w\w\w|\w\w\w|\w\w|\w)$', resource_url) or r1(r'download.(mp4)', resource_url) _, _, size = url_info(resource_url) - if ext == 'mp4': - download_urls([resource_url], title, ext, size, output_dir, merge = merge) - else: - download_url_chunked(resource_url, title, ext, size, output_dir, merge = merge) + try: + if ext == 'mp4': + download_urls([resource_url], title, ext, size, output_dir, merge = merge) + else: + download_url_chunked(resource_url, title, ext, size, output_dir, merge = merge) + except Exception as err: + print('Skipping %s: %s\n' % (resource_url, err)) + continue return From bb4890383844d4959a706066dcb60d0a41217cb2 Mon Sep 17 00:00:00 2001 From: Mort Yao <mort.yao@gmail.com> Date: Thu, 25 Apr 2013 15:56:44 +0200 Subject: [PATCH 18/19] fix issue for unknown type --- src/you_get/common.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/you_get/common.py b/src/you_get/common.py index 9049fb81..12b3c73a 100644 --- a/src/you_get/common.py +++ b/src/you_get/common.py @@ -537,7 +537,8 @@ def playlist_not_supported(name): return f def print_info(site_info, title, type, size): - type = type.lower() + if type: + type = type.lower() if type in ['3gp']: type = 'video/3gpp' elif type in ['asf', 'wmv']: From f8ac919be1e91304a5f3c2f368c238a2dff5ec09 Mon Sep 17 00:00:00 2001 From: Mort Yao <mort.yao@gmail.com> Date: Thu, 25 Apr 2013 15:58:40 +0200 Subject: [PATCH 19/19] version 0.3.11 --- CHANGELOG.txt | 8 ++++++++ src/you_get/version.py | 4 ++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 1c088c11..a8272f0d 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,6 +1,14 @@ Changelog ========= +0.3.11 +------ + +*Date: 2013-04-26* + +* Add support for: + - Google Drive (Google Docs) + 0.3.10 ------ diff --git a/src/you_get/version.py b/src/you_get/version.py index 60a473f1..dbba337b 100644 --- a/src/you_get/version.py +++ b/src/you_get/version.py @@ -2,5 +2,5 @@ __all__ = ['__version__', '__date__'] -__version__ = '0.3.10' -__date__ = '2013-04-19' +__version__ = '0.3.11' +__date__ = '2013-04-26'