mirror of
https://github.com/ytdl-org/youtube-dl.git
synced 2024-12-23 00:16:48 +00:00
JSON-LD: Support top-level @graph expressing implicit default graph
Per W3C JSON-LD v1.1 §4.9 (non-normative ref): When a JSON-LD document's top-level structure is a map that contains no other keys than @graph and optionally @context (properties that are not mapped to an IRI or a keyword are ignored), @graph is considered to express the otherwise implicit default graph. Support such a structure in InfoExtractor._json_ld parsing: Wrap the control flow block in a function, which is called recursively upon such a structure
This commit is contained in:
parent
a803582717
commit
77e8f5353c
@ -1296,8 +1296,16 @@ class InfoExtractor(object):
|
|||||||
})
|
})
|
||||||
extract_interaction_statistic(e)
|
extract_interaction_statistic(e)
|
||||||
|
|
||||||
|
def traverse_json_ld(json_ld, info, at_top_level=True):
|
||||||
for e in json_ld:
|
for e in json_ld:
|
||||||
if '@context' in e:
|
if at_top_level and '@context' not in e:
|
||||||
|
continue
|
||||||
|
if at_top_level and all(k in ('@context', '@graph') for k in e):
|
||||||
|
graph = e['@graph']
|
||||||
|
if isinstance(graph, dict):
|
||||||
|
graph = [graph]
|
||||||
|
traverse_json_ld(graph, info, at_top_level=False)
|
||||||
|
break
|
||||||
item_type = e.get('@type')
|
item_type = e.get('@type')
|
||||||
if expected_type is not None and expected_type != item_type:
|
if expected_type is not None and expected_type != item_type:
|
||||||
continue
|
continue
|
||||||
@ -1345,6 +1353,8 @@ class InfoExtractor(object):
|
|||||||
continue
|
continue
|
||||||
else:
|
else:
|
||||||
break
|
break
|
||||||
|
traverse_json_ld(json_ld, info)
|
||||||
|
|
||||||
return dict((k, v) for k, v in info.items() if v is not None)
|
return dict((k, v) for k, v in info.items() if v is not None)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
Loading…
Reference in New Issue
Block a user