@@ -701,6 +701,10 @@ def merge(cls, band_lists: Iterable[_BandList]) -> _BandList:
701701 return cls (unique (all_bands , key = lambda b : b .name ))
702702
703703
704+ _ON_EMPTY_WARN = "warn"
705+ _ON_EMPTY_IGNORE = "ignore"
706+
707+
704708class _StacMetadataParser :
705709 """
706710 Helper to extract openEO metadata from STAC metadata resource
@@ -791,7 +795,7 @@ def bands_from_stac_object(self, obj: Union[pystac.STACObject, pystac.Asset]) ->
791795 else :
792796 raise ValueError (f"Unsupported STAC object: { obj !r} " )
793797
794- def bands_from_stac_catalog (self , catalog : pystac .Catalog ) -> _BandList :
798+ def bands_from_stac_catalog (self , catalog : pystac .Catalog , * , on_empty : str = _ON_EMPTY_WARN ) -> _BandList :
795799 # TODO: "eo:bands" vs "bands" priority based on STAC and EO extension version information
796800 summaries = catalog .extra_fields .get ("summaries" , {})
797801 if "eo:bands" in summaries :
@@ -801,12 +805,17 @@ def bands_from_stac_catalog(self, catalog: pystac.Catalog) -> _BandList:
801805 elif "bands" in summaries :
802806 return _BandList (self ._band_from_common_bands_metadata (b ) for b in summaries ["bands" ])
803807
804- # TODO: instead of warning: exception, or return None?
805- self ._warn ("bands_from_stac_catalog: no band name source found" )
808+ if on_empty == _ON_EMPTY_WARN :
809+ self ._warn ("bands_from_stac_catalog: no band name source found" )
806810 return _BandList ([])
807811
808812 def bands_from_stac_collection (
809- self , collection : pystac .Collection , * , consult_items : bool = True , consult_assets : bool = True
813+ self ,
814+ collection : pystac .Collection ,
815+ * ,
816+ consult_items : bool = True ,
817+ consult_assets : bool = True ,
818+ on_empty : str = _ON_EMPTY_WARN ,
810819 ) -> _BandList :
811820 # TODO: "eo:bands" vs "bands" priority based on STAC and EO extension version information
812821 self ._log (f"bands_from_stac_collection with { collection .summaries .lists .keys ()= } " )
@@ -836,18 +845,25 @@ def bands_from_stac_collection(
836845 # If no band metadata so far: traverse items in collection
837846 elif consult_items :
838847 bands = _BandList .merge (
839- self .bands_from_stac_item (item = i , consult_collection = False , consult_assets = consult_assets )
848+ self .bands_from_stac_item (
849+ item = i , consult_collection = False , consult_assets = consult_assets , on_empty = _ON_EMPTY_IGNORE
850+ )
840851 for i in collection .get_items ()
841852 )
842853 if bands :
843854 return bands
844855
845- # TODO: instead of warning: exception, or return None?
846- self ._warn ("bands_from_stac_collection: no band name source found" )
856+ if on_empty == _ON_EMPTY_WARN :
857+ self ._warn ("bands_from_stac_collection: no band name source found" )
847858 return _BandList ([])
848859
849860 def bands_from_stac_item (
850- self , item : pystac .Item , * , consult_collection : bool = True , consult_assets : bool = True
861+ self ,
862+ item : pystac .Item ,
863+ * ,
864+ consult_collection : bool = True ,
865+ consult_assets : bool = True ,
866+ on_empty : str = _ON_EMPTY_WARN ,
851867 ) -> _BandList :
852868 # TODO: "eo:bands" vs "bands" priority based on STAC and EO extension version information
853869 self ._log (f"bands_from_stac_item with { item .properties .keys ()= } " )
@@ -859,19 +875,21 @@ def bands_from_stac_item(
859875 return self .bands_from_stac_collection (collection = parent_collection )
860876 elif consult_assets :
861877 # TODO: filter on asset roles?
862- bands = _BandList .merge (self .bands_from_stac_asset (asset = a ) for a in item .get_assets ().values ())
878+ bands = _BandList .merge (
879+ self .bands_from_stac_asset (asset = a , on_empty = _ON_EMPTY_IGNORE ) for a in item .get_assets ().values ()
880+ )
863881 if bands :
864882 return bands
865883
866- # TODO: instead of warning: exception, or return None?
867- self ._warn ("bands_from_stac_item: no band name source found" )
884+ if on_empty == _ON_EMPTY_WARN :
885+ self ._warn ("bands_from_stac_item: no band name source found" )
868886 return _BandList ([])
869887
870888 def _warn_undeclared_metadata (self , * , field : str , ext : str ):
871889 """Helper to warn about using metadata from undeclared STAC extension"""
872890 self ._warn (f"Using { field !r} metadata, but STAC extension { ext } was not declared." )
873891
874- def bands_from_stac_asset (self , asset : pystac .Asset ) -> _BandList :
892+ def bands_from_stac_asset (self , asset : pystac .Asset , * , on_empty : str = _ON_EMPTY_WARN ) -> _BandList :
875893 # TODO: "eo:bands" vs "bands" priority based on STAC and EO extension version information
876894 if _PYSTAC_1_9_EXTENSION_INTERFACE and asset .owner and asset .ext .has ("eo" ) and asset .ext .eo .bands is not None :
877895 return _BandList (self ._band_from_eo_bands_metadata (b ) for b in asset .ext .eo .bands )
@@ -883,8 +901,8 @@ def bands_from_stac_asset(self, asset: pystac.Asset) -> _BandList:
883901 # TODO: avoid `extra_fields`, but built-in "bands" support seems to be scheduled for pystac V2
884902 return _BandList (self ._band_from_common_bands_metadata (b ) for b in asset .extra_fields ["bands" ])
885903
886- # TODO: instead of warning: exception, or return None?
887- self ._warn ("bands_from_stac_asset: no band name source found" )
904+ if on_empty == _ON_EMPTY_WARN :
905+ self ._warn ("bands_from_stac_asset: no band name source found" )
888906 return _BandList ([])
889907
890908 def _bands_from_item_asset_definition (
0 commit comments