diff --git a/src/you_get/extractors/qq.py b/src/you_get/extractors/qq.py index 9ca8af82..f1707527 100644 --- a/src/you_get/extractors/qq.py +++ b/src/you_get/extractors/qq.py @@ -7,22 +7,67 @@ from .qie import download as qieDownload from urllib.parse import urlparse,parse_qs def qq_download_by_vid(vid, title, output_dir='.', merge=True, info_only=False): - api = "http://h5vv.video.qq.com/getinfo?otype=json&platform=10901&vid=%s" % vid - content = get_html(api) - output_json = json.loads(match1(content, r'QZOutputJson=(.*)')[:-1]) - url = output_json['vl']['vi'][0]['ul']['ui'][0]['url'] - fvkey = output_json['vl']['vi'][0]['fvkey'] - mp4 = output_json['vl']['vi'][0]['cl'].get('ci', None) - if mp4: - mp4 = mp4[0]['keyid'].replace('.10', '.p') + '.mp4' - else: - mp4 = output_json['vl']['vi'][0]['fn'] - url = '%s/%s?vkey=%s' % ( url, mp4, fvkey ) - _, ext, size = url_info(url, faker=True) + info_api = 'http://vv.video.qq.com/getinfo?otype=json&appver=3%2E2%2E19%2E333&platform=11&defnpayver=1&vid=' + vid + info = get_html(info_api) + video_json = json.loads(match1(info, r'QZOutputJson=(.*)')[:-1]) + parts_vid = video_json['vl']['vi'][0]['vid'] + parts_ti = video_json['vl']['vi'][0]['ti'] + parts_prefix = video_json['vl']['vi'][0]['ul']['ui'][0]['url'] + parts_formats = video_json['fl']['fi'] + # find best quality + # only looking for fhd(1080p) and shd(720p) here. + # 480p usually come with a single file, will be downloaded as fallback. + best_quality = '' + for part_format in parts_formats: + if part_format['name'] == 'fhd': + best_quality = 'fhd' + break - print_info(site_info, title, ext, size) - if not info_only: - download_urls([url], title, ext, size, output_dir=output_dir, merge=merge) + if part_format['name'] == 'shd': + best_quality = 'shd' + + for part_format in parts_formats: + if (not best_quality == '') and (not part_format['name'] == best_quality): + continue + part_format_id = part_format['id'] + part_format_sl = part_format['sl'] + if part_format_sl == 0: + part_urls= [] + total_size = 0 + try: + # For fhd(1080p), every part is about 100M and 6 minutes + # try 100 parts here limited download longest single video of 10 hours. + for part in range(1,100): + filename = vid + '.p' + str(part_format_id % 1000) + '.' + str(part) + '.mp4' + key_api = "http://vv.video.qq.com/getkey?otype=json&platform=11&format=%s&vid=%s&filename=%s" % (part_format_id, parts_vid, filename) + #print(filename) + #print(key_api) + part_info = get_html(key_api) + key_json = json.loads(match1(part_info, r'QZOutputJson=(.*)')[:-1]) + #print(key_json) + vkey = key_json['key'] + url = '%s/%s?vkey=%s' % (parts_prefix, filename, vkey) + part_urls.append(url) + _, ext, size = url_info(url, faker=True) + total_size += size + except: + pass + print_info(site_info, parts_ti, ext, total_size) + if not info_only: + download_urls(part_urls, parts_ti, ext, total_size, output_dir=output_dir, merge=merge) + else: + fvkey = output_json['vl']['vi'][0]['fvkey'] + mp4 = output_json['vl']['vi'][0]['cl'].get('ci', None) + if mp4: + mp4 = mp4[0]['keyid'].replace('.10', '.p') + '.mp4' + else: + mp4 = output_json['vl']['vi'][0]['fn'] + url = '%s/%s?vkey=%s' % ( parts_prefix, mp4, fvkey ) + _, ext, size = url_info(url, faker=True) + + print_info(site_info, title, ext, size) + if not info_only: + download_urls([url], title, ext, size, output_dir=output_dir, merge=merge) def qq_download(url, output_dir='.', merge=True, info_only=False, **kwargs):