From 3c9a77429c0d4ff5757e5302c8488ad038d0836e Mon Sep 17 00:00:00 2001 From: cnbeining Date: Sun, 26 Oct 2014 23:00:19 +0800 Subject: [PATCH 1/6] Add Letvcloud support, as in #422 Have to redo this sh*t for 3 times due to the stupidity of the damned editor and Git. FML. --- src/you_get/common.py | 3 ++- src/you_get/extractors/__init__.py | 1 + src/you_get/extractors/letvcloud.py | 40 +++++++++++++++++++++++++++++ 3 files changed, 43 insertions(+), 1 deletion(-) mode change 100644 => 100755 src/you_get/common.py mode change 100644 => 100755 src/you_get/extractors/__init__.py create mode 100755 src/you_get/extractors/letvcloud.py diff --git a/src/you_get/common.py b/src/you_get/common.py old mode 100644 new mode 100755 index 8bfc422c..8240680d --- a/src/you_get/common.py +++ b/src/you_get/common.py @@ -898,7 +898,7 @@ def script_main(script_name, download, download_playlist = None): sys.exit(1) def url_to_module(url): - from .extractors import netease, w56, acfun, baidu, bilibili, blip, catfun, cntv, cbs, coursera, dailymotion, dongting, douban, ehow, facebook, freesound, google, sina, ifeng, alive, instagram, iqiyi, joy, jpopsuki, khan, ku6, kugou, kuwo, letv, magisto, miomio, mixcloud, mtv81, nicovideo, pptv, qq, sohu, songtaste, soundcloud, ted, theplatform, tudou, tucao, tumblr, vid48, videobam, vimeo, vine, vk, xiami, yinyuetai, youku, youtube + from .extractors import netease, w56, acfun, baidu, bilibili, blip, catfun, cntv, cbs, coursera, dailymotion, dongting, douban, ehow, facebook, freesound, google, sina, ifeng, alive, instagram, iqiyi, joy, jpopsuki, khan, ku6, kugou, kuwo, letv, letvcloud, magisto, miomio, mixcloud, mtv81, nicovideo, pptv, qq, sohu, songtaste, soundcloud, ted, theplatform, tudou, tucao, tumblr, vid48, videobam, vimeo, vine, vk, xiami, yinyuetai, youku, youtube video_host = r1(r'https?://([^/]+)/', url) video_url = r1(r'https?://[^/]+(.*)', url) @@ -941,6 +941,7 @@ def url_to_module(url): 'kugou': kugou, 'kuwo': kuwo, 'letv': letv, + 'letvcloud': letvcloud, 'magisto': magisto, 'miomio': miomio, 'mixcloud': mixcloud, diff --git a/src/you_get/extractors/__init__.py b/src/you_get/extractors/__init__.py old mode 100644 new mode 100755 index 98aae05f..8b58a43f --- a/src/you_get/extractors/__init__.py +++ b/src/you_get/extractors/__init__.py @@ -24,6 +24,7 @@ from .ku6 import * from .kugou import * from .kuwo import * from .letv import * +from .letvcloud import * from .magisto import * from .miomio import * from .mixcloud import * diff --git a/src/you_get/extractors/letvcloud.py b/src/you_get/extractors/letvcloud.py new file mode 100755 index 00000000..fa17e4d5 --- /dev/null +++ b/src/you_get/extractors/letvcloud.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python + +__all__ = ['letvcloud_download', 'letvcloud_download_by_vu'] + +from ..common import * +import urllib.request +import json +import hashlib + + +def letvcloud_download_by_vu(vu, title = None, output_dir = '.', merge = True, info_only = False): + str2Hash = 'cfflashformatjsonran0.7214574650861323uu2d8c027396ver2.1vu' + vu + 'bie^#@(%27eib58' + sign = hashlib.md5(str2Hash.encode('utf-8')).hexdigest() + request_info = urllib.request.Request('http://api.letvcloud.com/gpc.php?&sign='+sign+'&cf=flash&vu='+vu+'&ver=2.1&ran=0.7214574650861323&qr=2&format=json&uu=2d8c027396') + try: + response = urllib.request.urlopen(request_info) + data = response.read() + info = json.loads(data.decode('utf-8')) + if info['code'] == 0: + for i in info['data']['video_info']['media']: + type_available.append({'video_url': info['data']['video_info']['media'][i]['play_url']['main_url'], 'video_quality': int(info['data']['video_info']['media'][i]['play_url']['vtype'])}) + url = [b64decode(sorted(type_available ,key = lambda x:x['video_quality'])[-1]['video_url'])] + else: + raise ValueError('Cannot get URL!') + except: + print('ERROR: Cannot get video URL!') + download_urls([url], title, ext, size, output_dir, merge = merge) + + +def letvcloud_download(url, output_dir = '.', merge = True, info_only = False): + for i in url.split('&'): + if 'vu=' in i: + vu = i[3:] + if len(vu) == 0: + raise ValueError('Cannot get vu!') + letvcloud_download_by_vu(vu, title, output_dir, merge = merge, info_only = info_only) + +site_info = "Letvcloud" +download = letvcloud_download +download_playlist = playlist_not_supported('letvcloud') \ No newline at end of file From 1b5894df11387b6d9a86607f0f95ada5686d5467 Mon Sep 17 00:00:00 2001 From: Mort Yao Date: Fri, 31 Oct 2014 09:14:58 +0100 Subject: [PATCH 2/6] fix 3c9a774 to get everything works --- src/you_get/common.py | 4 +- src/you_get/extractors/__init__.py | 1 - .../{letvcloud.py => _letvcloud.py} | 30 +++++----- src/you_get/extractors/letv.py | 56 ++++++++++++++----- 4 files changed, 58 insertions(+), 33 deletions(-) mode change 100755 => 100644 src/you_get/common.py mode change 100755 => 100644 src/you_get/extractors/__init__.py rename src/you_get/extractors/{letvcloud.py => _letvcloud.py} (62%) mode change 100755 => 100644 diff --git a/src/you_get/common.py b/src/you_get/common.py old mode 100755 new mode 100644 index 8240680d..82e6dccb --- a/src/you_get/common.py +++ b/src/you_get/common.py @@ -898,7 +898,7 @@ def script_main(script_name, download, download_playlist = None): sys.exit(1) def url_to_module(url): - from .extractors import netease, w56, acfun, baidu, bilibili, blip, catfun, cntv, cbs, coursera, dailymotion, dongting, douban, ehow, facebook, freesound, google, sina, ifeng, alive, instagram, iqiyi, joy, jpopsuki, khan, ku6, kugou, kuwo, letv, letvcloud, magisto, miomio, mixcloud, mtv81, nicovideo, pptv, qq, sohu, songtaste, soundcloud, ted, theplatform, tudou, tucao, tumblr, vid48, videobam, vimeo, vine, vk, xiami, yinyuetai, youku, youtube + from .extractors import netease, w56, acfun, baidu, bilibili, blip, catfun, cntv, cbs, coursera, dailymotion, dongting, douban, ehow, facebook, freesound, google, sina, ifeng, alive, instagram, iqiyi, joy, jpopsuki, khan, ku6, kugou, kuwo, letv, magisto, miomio, mixcloud, mtv81, nicovideo, pptv, qq, sohu, songtaste, soundcloud, ted, theplatform, tudou, tucao, tumblr, vid48, videobam, vimeo, vine, vk, xiami, yinyuetai, youku, youtube video_host = r1(r'https?://([^/]+)/', url) video_url = r1(r'https?://[^/]+(.*)', url) @@ -941,7 +941,6 @@ def url_to_module(url): 'kugou': kugou, 'kuwo': kuwo, 'letv': letv, - 'letvcloud': letvcloud, 'magisto': magisto, 'miomio': miomio, 'mixcloud': mixcloud, @@ -993,4 +992,3 @@ def any_download_playlist(url, **kwargs): def main(): script_main('you-get', any_download, any_download_playlist) - diff --git a/src/you_get/extractors/__init__.py b/src/you_get/extractors/__init__.py old mode 100755 new mode 100644 index 8b58a43f..98aae05f --- a/src/you_get/extractors/__init__.py +++ b/src/you_get/extractors/__init__.py @@ -24,7 +24,6 @@ from .ku6 import * from .kugou import * from .kuwo import * from .letv import * -from .letvcloud import * from .magisto import * from .miomio import * from .mixcloud import * diff --git a/src/you_get/extractors/letvcloud.py b/src/you_get/extractors/_letvcloud.py old mode 100755 new mode 100644 similarity index 62% rename from src/you_get/extractors/letvcloud.py rename to src/you_get/extractors/_letvcloud.py index fa17e4d5..99f56231 --- a/src/you_get/extractors/letvcloud.py +++ b/src/you_get/extractors/_letvcloud.py @@ -6,35 +6,37 @@ from ..common import * import urllib.request import json import hashlib - +import base64 def letvcloud_download_by_vu(vu, title = None, output_dir = '.', merge = True, info_only = False): str2Hash = 'cfflashformatjsonran0.7214574650861323uu2d8c027396ver2.1vu' + vu + 'bie^#@(%27eib58' sign = hashlib.md5(str2Hash.encode('utf-8')).hexdigest() request_info = urllib.request.Request('http://api.letvcloud.com/gpc.php?&sign='+sign+'&cf=flash&vu='+vu+'&ver=2.1&ran=0.7214574650861323&qr=2&format=json&uu=2d8c027396') + #response = urllib.request.urlopen(request_info) + #data = response.read() + #info = json.loads(data.decode('utf-8')) + #type_available = [] + #for i in info['data']['video_info']['media']: + # type_available.append({'video_url': info['data']['video_info']['media'][i]['play_url']['main_url'], 'video_quality': int(info['data']['video_info']['media'][i]['play_url']['vtype'])}) + #url = [base64.b64decode(sorted(type_available ,key = lambda x:x['video_quality'])[-1]['video_url'])] + #print(url)# + #exit(0)# try: response = urllib.request.urlopen(request_info) data = response.read() info = json.loads(data.decode('utf-8')) + type_available = [] if info['code'] == 0: for i in info['data']['video_info']['media']: type_available.append({'video_url': info['data']['video_info']['media'][i]['play_url']['main_url'], 'video_quality': int(info['data']['video_info']['media'][i]['play_url']['vtype'])}) - url = [b64decode(sorted(type_available ,key = lambda x:x['video_quality'])[-1]['video_url'])] + url = [base64.b64decode(sorted(type_available, key = lambda x:x['video_quality'])[-1]['video_url'])] else: raise ValueError('Cannot get URL!') except: print('ERROR: Cannot get video URL!') + #\mp4\ download_urls([url], title, ext, size, output_dir, merge = merge) - -def letvcloud_download(url, output_dir = '.', merge = True, info_only = False): - for i in url.split('&'): - if 'vu=' in i: - vu = i[3:] - if len(vu) == 0: - raise ValueError('Cannot get vu!') - letvcloud_download_by_vu(vu, title, output_dir, merge = merge, info_only = info_only) - -site_info = "Letvcloud" -download = letvcloud_download -download_playlist = playlist_not_supported('letvcloud') \ No newline at end of file +#site_info = "Letvcloud" +#download = letvcloud_download +#download_playlist = playlist_not_supported('letvcloud') diff --git a/src/you_get/extractors/letv.py b/src/you_get/extractors/letv.py index 9977c2e8..2ce16a84 100644 --- a/src/you_get/extractors/letv.py +++ b/src/you_get/extractors/letv.py @@ -1,10 +1,12 @@ #!/usr/bin/env python -__all__ = ['letv_download'] +__all__ = ['letv_download', 'letvcloud_download', 'letvcloud_download_by_vu'] import json import random import xml.etree.ElementTree as ET +import base64, hashlib, urllib + from ..common import * def get_timestamp(): @@ -21,7 +23,6 @@ def get_key(t): t += e return t ^ 185025305 - def video_info(vid): tn = get_timestamp() key = get_key(tn) @@ -40,12 +41,11 @@ def video_info(vid): # url += '&termid=1&format=0&hwtype=un&ostype=Windows7&tag=letv&sign=letv&expect=1&pay=0&rateid={}'.format(k) # return url, title - url="http://api.letv.com/mms/out/common/geturl?platid=3&splatid=301&playid=0&vtype=9,13,21,28&version=2.0&tss=no&vid={}&domain=www.letv.com&tkey={}".format(vid,key) r = get_content(url, decoded=False) info=json.loads(str(r,"utf-8")) size=0 - for i in info["data"][0]["infos"]: #0 means only one file not truncated.need to upgrade + for i in info["data"][0]["infos"]: #0 means only one file not truncated.need to upgrade if int(i["gsize"])>size: size=int(i["gsize"]) url=i["mainUrl"] @@ -56,8 +56,6 @@ def video_info(vid): info2=json.loads(str(r2,"utf-8")) return info2["location"] - # return url - def letv_download_by_vid(vid,title, output_dir='.', merge=True, info_only=False): url= video_info(vid) _, _, size = url_info(url) @@ -66,17 +64,45 @@ def letv_download_by_vid(vid,title, output_dir='.', merge=True, info_only=False) if not info_only: download_urls([url], title, ext, size, output_dir=output_dir, merge=merge) +def letvcloud_download_by_vu(vu, title=None, output_dir='.', merge=True, info_only=False): + str2Hash = 'cfflashformatjsonran0.7214574650861323uu2d8c027396ver2.1vu' + vu + 'bie^#@(%27eib58' + sign = hashlib.md5(str2Hash.encode('utf-8')).hexdigest() + request_info = urllib.request.Request('http://api.letvcloud.com/gpc.php?&sign='+sign+'&cf=flash&vu='+vu+'&ver=2.1&ran=0.7214574650861323&qr=2&format=json&uu=2d8c027396') + response = urllib.request.urlopen(request_info) + data = response.read() + info = json.loads(data.decode('utf-8')) + type_available = [] + for i in info['data']['video_info']['media']: + type_available.append({'video_url': info['data']['video_info']['media'][i]['play_url']['main_url'], 'video_quality': int(info['data']['video_info']['media'][i]['play_url']['vtype'])}) + urls = [base64.b64decode(sorted(type_available, key = lambda x:x['video_quality'])[-1]['video_url']).decode("utf-8")] + size = urls_size(urls) + ext = 'mp4' + print_info(site_info, title, ext, size) + if not info_only: + download_urls(urls, title, ext, size, output_dir=output_dir, merge=merge) + +def letvcloud_download(url, output_dir='.', merge=True, info_only=False): + for i in url.split('&'): + if 'vu=' in i: + vu = i[3:] + if len(vu) == 0: + raise ValueError('Cannot get vu!') + title = "LETV-%s" % vu + letvcloud_download_by_vu(vu, title=title, output_dir=output_dir, merge=merge, info_only=info_only) + def letv_download(url, output_dir='.', merge=True, info_only=False): - html = get_content(url) - #to get title - if re.match(r'http://www.letv.com/ptv/vplay/(\d+).html', url): - vid = match1(url, r'http://www.letv.com/ptv/vplay/(\d+).html') + if re.match(r'http://yuntv.letv.com/', url): + letvcloud_download(url, output_dir=output_dir, merge=merge, info_only=info_only) else: - vid = match1(html, r'vid="(\d+)"') - title=match1(html,r'name="irTitle" content="(.*?)"') - letv_download_by_vid(vid,title, output_dir=output_dir, merge=merge, info_only=info_only) + html = get_content(url) + #to get title + if re.match(r'http://www.letv.com/ptv/vplay/(\d+).html', url): + vid = match1(url, r'http://www.letv.com/ptv/vplay/(\d+).html') + else: + vid = match1(html, r'vid="(\d+)"') + title = match1(html,r'name="irTitle" content="(.*?)"') + letv_download_by_vid(vid, title=title, output_dir=output_dir, merge=merge, info_only=info_only) - -site_info = "letv.com" +site_info = "LeTV.com" download = letv_download download_playlist = playlist_not_supported('letv') From a5eff0ec88d5219939fbc93cb22be746bce9d7f5 Mon Sep 17 00:00:00 2001 From: Mort Yao Date: Fri, 31 Oct 2014 09:16:30 +0100 Subject: [PATCH 3/6] remove unused _letvcloud.py --- src/you_get/extractors/_letvcloud.py | 42 ---------------------------- 1 file changed, 42 deletions(-) delete mode 100644 src/you_get/extractors/_letvcloud.py diff --git a/src/you_get/extractors/_letvcloud.py b/src/you_get/extractors/_letvcloud.py deleted file mode 100644 index 99f56231..00000000 --- a/src/you_get/extractors/_letvcloud.py +++ /dev/null @@ -1,42 +0,0 @@ -#!/usr/bin/env python - -__all__ = ['letvcloud_download', 'letvcloud_download_by_vu'] - -from ..common import * -import urllib.request -import json -import hashlib -import base64 - -def letvcloud_download_by_vu(vu, title = None, output_dir = '.', merge = True, info_only = False): - str2Hash = 'cfflashformatjsonran0.7214574650861323uu2d8c027396ver2.1vu' + vu + 'bie^#@(%27eib58' - sign = hashlib.md5(str2Hash.encode('utf-8')).hexdigest() - request_info = urllib.request.Request('http://api.letvcloud.com/gpc.php?&sign='+sign+'&cf=flash&vu='+vu+'&ver=2.1&ran=0.7214574650861323&qr=2&format=json&uu=2d8c027396') - #response = urllib.request.urlopen(request_info) - #data = response.read() - #info = json.loads(data.decode('utf-8')) - #type_available = [] - #for i in info['data']['video_info']['media']: - # type_available.append({'video_url': info['data']['video_info']['media'][i]['play_url']['main_url'], 'video_quality': int(info['data']['video_info']['media'][i]['play_url']['vtype'])}) - #url = [base64.b64decode(sorted(type_available ,key = lambda x:x['video_quality'])[-1]['video_url'])] - #print(url)# - #exit(0)# - try: - response = urllib.request.urlopen(request_info) - data = response.read() - info = json.loads(data.decode('utf-8')) - type_available = [] - if info['code'] == 0: - for i in info['data']['video_info']['media']: - type_available.append({'video_url': info['data']['video_info']['media'][i]['play_url']['main_url'], 'video_quality': int(info['data']['video_info']['media'][i]['play_url']['vtype'])}) - url = [base64.b64decode(sorted(type_available, key = lambda x:x['video_quality'])[-1]['video_url'])] - else: - raise ValueError('Cannot get URL!') - except: - print('ERROR: Cannot get video URL!') - #\mp4\ - download_urls([url], title, ext, size, output_dir, merge = merge) - -#site_info = "Letvcloud" -#download = letvcloud_download -#download_playlist = playlist_not_supported('letvcloud') From 9466981f4f546cfcde4d5117d3f5b19e4460a6a1 Mon Sep 17 00:00:00 2001 From: Mort Yao Date: Fri, 31 Oct 2014 10:09:12 +0100 Subject: [PATCH 4/6] AcFun: fix #422 --- src/you_get/extractors/acfun.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/you_get/extractors/acfun.py b/src/you_get/extractors/acfun.py index 26d99708..e00c1c52 100644 --- a/src/you_get/extractors/acfun.py +++ b/src/you_get/extractors/acfun.py @@ -4,6 +4,7 @@ __all__ = ['acfun_download'] from ..common import * +from .letv import letvcloud_download_by_vu from .qq import qq_download_by_id from .sina import sina_download_by_vid from .tudou import tudou_download_by_iid @@ -33,6 +34,8 @@ def acfun_download_by_vid(vid, title=None, output_dir='.', merge=True, info_only tudou_download_by_iid(sourceId, title, output_dir=output_dir, merge=merge, info_only=info_only) elif sourceType == 'qq': qq_download_by_id(sourceId, title, output_dir=output_dir, merge=merge, info_only=info_only) + elif sourceType == 'letv': + letvcloud_download_by_vu(sourceId, title, output_dir=output_dir, merge=merge, info_only=info_only) else: raise NotImplementedError(sourceType) From e2cba21ad93fe6cb0e2f57593a0100053cb3aafe Mon Sep 17 00:00:00 2001 From: Mort Yao Date: Fri, 31 Oct 2014 10:21:30 +0100 Subject: [PATCH 5/6] NetEase: fix #428 --- src/you_get/extractors/netease.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/you_get/extractors/netease.py b/src/you_get/extractors/netease.py index 824e4a37..a4a3b903 100644 --- a/src/you_get/extractors/netease.py +++ b/src/you_get/extractors/netease.py @@ -48,7 +48,7 @@ def netease_cloud_music_download(url, output_dir='.', merge=True, info_only=Fals def netease_song_download(song, output_dir='.', info_only=False): title = "%s. %s" % (song['position'], song['name']) # url = song['mp3Url'] - url_best = make_url(song['bMusic']['dfsId']) + url_best = make_url(song['hMusic']['dfsId']) songtype, ext, size = url_info(url_best) print_info(site_info, title, songtype, size) if not info_only: From f6977972a03dc120714ca9ba99286a199c86083f Mon Sep 17 00:00:00 2001 From: pl <0x00-pl@gmail.com> Date: Fri, 10 Oct 2014 22:48:00 +0800 Subject: [PATCH 6/6] support live.bilibili.com support douyutv.com --- src/you_get/common.py | 14 +++++++------ src/you_get/extractors/__init__.py | 1 + src/you_get/extractors/bilibili.py | 7 ++++--- src/you_get/extractors/douyutv.py | 32 ++++++++++++++++++++++++++++++ 4 files changed, 45 insertions(+), 9 deletions(-) create mode 100644 src/you_get/extractors/douyutv.py diff --git a/src/you_get/common.py b/src/you_get/common.py index 82e6dccb..2be49803 100644 --- a/src/you_get/common.py +++ b/src/you_get/common.py @@ -199,8 +199,8 @@ def url_size(url, faker = False): else: response = request.urlopen(url) - size = int(response.headers['content-length']) - return size + size = response.headers['content-length'] + return int(size) if size!=None else float('inf') # TO BE DEPRECATED # urls_size() does not have a faker @@ -246,7 +246,7 @@ def url_info(url, faker = False): ext = None if headers['transfer-encoding'] != 'chunked': - size = int(headers['content-length']) + size = headers['content-length'] and int(headers['content-length']) else: size = None @@ -284,7 +284,7 @@ def url_save(url, filepath, bar, refer = None, is_part = False, faker = False): elif not os.path.exists(os.path.dirname(filepath)): os.mkdir(os.path.dirname(filepath)) - temp_filepath = filepath + '.download' + temp_filepath = filepath + '.download' if file_size!=float('inf') else filepath received = 0 if not force: open_mode = 'ab' @@ -312,7 +312,8 @@ def url_save(url, filepath, bar, refer = None, is_part = False, faker = False): 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']) + content_length = response.headers['content-length'] + range_length = int(content_length) if content_length!=None else float('inf') if file_size != received + range_length: received = 0 @@ -898,7 +899,7 @@ def script_main(script_name, download, download_playlist = None): sys.exit(1) def url_to_module(url): - from .extractors import netease, w56, acfun, baidu, bilibili, blip, catfun, cntv, cbs, coursera, dailymotion, dongting, douban, ehow, facebook, freesound, google, sina, ifeng, alive, instagram, iqiyi, joy, jpopsuki, khan, ku6, kugou, kuwo, letv, magisto, miomio, mixcloud, mtv81, nicovideo, pptv, qq, sohu, songtaste, soundcloud, ted, theplatform, tudou, tucao, tumblr, vid48, videobam, vimeo, vine, vk, xiami, yinyuetai, youku, youtube + from .extractors import netease, w56, acfun, baidu, bilibili, blip, catfun, cntv, cbs, coursera, dailymotion, dongting, douban, douyutv, ehow, facebook, freesound, google, sina, ifeng, alive, instagram, iqiyi, joy, jpopsuki, khan, ku6, kugou, kuwo, letv, magisto, miomio, mixcloud, mtv81, nicovideo, pptv, qq, sohu, songtaste, soundcloud, ted, theplatform, tudou, tucao, tumblr, vid48, videobam, vimeo, vine, vk, xiami, yinyuetai, youku, youtube video_host = r1(r'https?://([^/]+)/', url) video_url = r1(r'https?://[^/]+(.*)', url) @@ -924,6 +925,7 @@ def url_to_module(url): 'dailymotion': dailymotion, 'dongting': dongting, 'douban': douban, + 'douyutv': douyutv, 'ehow': ehow, 'facebook': facebook, 'freesound': freesound, diff --git a/src/you_get/extractors/__init__.py b/src/you_get/extractors/__init__.py index 98aae05f..da19036b 100644 --- a/src/you_get/extractors/__init__.py +++ b/src/you_get/extractors/__init__.py @@ -11,6 +11,7 @@ from .cntv import * from .coursera import * from .dailymotion import * from .douban import * +from .douyutv import * from .ehow import * from .facebook import * from .freesound import * diff --git a/src/you_get/extractors/bilibili.py b/src/you_get/extractors/bilibili.py index 588a4a87..1869f955 100644 --- a/src/you_get/extractors/bilibili.py +++ b/src/you_get/extractors/bilibili.py @@ -116,7 +116,7 @@ def bilibili_download_by_cid(id, title, output_dir='.', merge=True, info_only=Fa size = 0 for url in urls: _, _, temp = url_info(url) - size += temp + size += temp or 0 print_info(site_info, title, type, size) if not info_only: @@ -125,12 +125,13 @@ def bilibili_download_by_cid(id, title, output_dir='.', merge=True, info_only=Fa def bilibili_download(url, output_dir='.', merge=True, info_only=False): html = get_html(url) - title = r1(r']*>([^<>]+)', html) + title = r1_of([r'',r']*>([^<>]+)'], html) title = unescape_html(title) title = escape_file_path(title) - flashvars = r1_of([r'(cid=\d+)', r'flashvars="([^"]+)"', r'"https://[a-z]+\.bilibili\.com/secure,(cid=\d+)(?:&aid=\d+)?"'], html) + flashvars = r1_of([r'(cid=\d+)', r'(cid: \d+)', r'flashvars="([^"]+)"', r'"https://[a-z]+\.bilibili\.com/secure,(cid=\d+)(?:&aid=\d+)?"'], html) assert flashvars + flashvars = flashvars.replace(': ','=') t, id = flashvars.split('=', 1) id = id.split('&')[0] if t == 'cid': diff --git a/src/you_get/extractors/douyutv.py b/src/you_get/extractors/douyutv.py new file mode 100644 index 00000000..b4d347e9 --- /dev/null +++ b/src/you_get/extractors/douyutv.py @@ -0,0 +1,32 @@ +#!/usr/bin/env python + +__all__ = ['douyutv_download'] + +from ..common import * +import re +import json + +def douyutv_download(url, output_dir = '.', merge = True, info_only = False): + html = get_html(url) + room_id_patt = r'"room_id":(\d{1,99}),' + title_patt = r'
\s*

([^<]{1,9999})

\s*
' + + roomid = re.findall(room_id_patt,html)[0] + title = unescape_html(re.findall(title_patt,html)[0]) + + conf = get_html("http://www.douyutv.com/api/client/room/"+roomid) + metadata = json.loads(conf) + + rtmp_live= metadata.get('data').get('rtmp_live') + rtmp_url= metadata.get('data').get('rtmp_url') + real_url = rtmp_url+'/'+rtmp_live + + type, _, _ = url_info(real_url) + + print_info(site_info, title, 'flv', float('inf')) + if not info_only: + download_urls([real_url], title, 'flv', None, output_dir, merge = merge) + +site_info = "douyutv.com" +download = douyutv_download +download_playlist = playlist_not_supported('douyutv')