diff --git a/youtube_dl/__init__.py b/youtube_dl/__init__.py index 6bbe9d3df..ebd333f79 100644 --- a/youtube_dl/__init__.py +++ b/youtube_dl/__init__.py @@ -745,6 +745,7 @@ def _real_main(argv=None): 'playliststart': opts.playliststart, 'playlistend': opts.playlistend, 'noplaylist': opts.noplaylist, + 'joinparts': opts.joinparts, 'logtostderr': opts.outtmpl == '-', 'consoletitle': opts.consoletitle, 'nopart': opts.nopart, diff --git a/youtube_dl/extractor/common.py b/youtube_dl/extractor/common.py index facfbf2f5..c47fc58b9 100644 --- a/youtube_dl/extractor/common.py +++ b/youtube_dl/extractor/common.py @@ -1,4 +1,5 @@ import base64 +from collections import defaultdict import hashlib import json import os @@ -534,6 +535,29 @@ class InfoExtractor(object): ) formats.sort(key=_formats_key) + def _entry_formats_to_parts(self, entries): + '''Transforms entries with formats to formats with parts. Used when joinparts is set.''' + ekeys = None + fmt_map = defaultdict(dict) + fkeys = None + for entry in entries: + if ekeys is None: + ekeys = set(entry.keys()) - set(['formats']) + for fmt in entry['formats']: + if fkeys is None: + fkeys = set(fmt.keys()) - set(['url']) + fid = fmt['format_id'] + if 'parts' not in fmt_map[fid]: + for k in fkeys: + fmt_map[fid][k] = fmt[k] + fmt_map[fid]['parts'] = [] + part = dict([(k, entry[k]) for k in ekeys]) + part['url'] = fmt['url'] + fmt_map[fid]['parts'].append(part) + formats = fmt_map.values() + self._sort_formats(formats) + return formats + class SearchInfoExtractor(InfoExtractor): """