@@ -232,9 +232,22 @@ def create_item(
232232
233233def get_product_components (metadata : dict , product_type : str ) -> dict [str :str ]:
234234 components = {}
235+ component_names : list [str ] = None
235236 component_refs = metadata [".zattrs" ]["stac_discovery" ].get ("assets" )
236- if component_refs :
237- for component_name , _ in component_refs .items ():
237+ if component_refs is not None and len (component_refs ) > 0 :
238+ # New versions of CPM put this information into assets (as map)
239+ component_names = component_refs .keys ()
240+ else :
241+ # Older versions of CPM had put this informations into links section (as list)
242+ component_refs = metadata [".zattrs" ]["stac_discovery" ].get ("links" )
243+ for ref in component_refs :
244+ if isinstance (ref , str ):
245+ if component_names is None :
246+ component_names = []
247+ component_names .append (ref )
248+
249+ if component_names is not None :
250+ for component_name in component_names :
238251 if isinstance (component_name , str ):
239252 if product_type in S1_GRD_PRODUCT_TYPES :
240253 key = component_name .split ("_" )[6 ]
@@ -247,14 +260,20 @@ def get_product_components(metadata: dict, product_type: str) -> dict[str:str]:
247260 key = parts [6 ]
248261 components [key ] = component_name
249262 elif product_type in S1_OCN_PRODUCT_TYPES :
250- key = component_name
251- for sub_component in (
252- metadata .get (f"{ component_name .lower ()} /.zattrs" , {})
253- .get ("stac_discovery" , {})
254- .get ("assets" , {})
255- ):
256- if isinstance (sub_component , str ):
257- components [component_name ] = sub_component
263+ sub_component_names : list [str ] = None
264+ sub_component_refs = (
265+ metadata .get (f"{ component_name .lower ()} /.zattrs" , {}).get ("stac_discovery" , {}).get ("assets" )
266+ )
267+ if sub_component_refs is not None :
268+ sub_component_names = sub_component_refs .keys ()
269+ else :
270+ sub_component_names = (
271+ metadata .get (f"{ component_name .lower ()} /.zattrs" , {}).get ("stac_discovery" , {}).get ("links" )
272+ )
273+ if sub_component_names is not None :
274+ for sub_component in sub_component_names :
275+ if isinstance (sub_component , str ):
276+ components [component_name ] = sub_component
258277 else :
259278 # raise ValueError("No references to product components found")
260279 logger .warning ("Cannot detect all product parts. Some assets might not be available!" )
0 commit comments