docs: def band_path(self, band_id, for_gdal=False, absolute=False):
          """Return paths of given band's jp2 files for all granules."""
          band_id = str(band_id).zfill(2)
          if not isinstance(band_id, str) or band_id not in BAND_IDS:
              raise ValueError("band ID not valid: %s" % band_id)
          if self.dataset.is_zip and for_gdal:
              zip_prefix = "/vsizip/"
              if absolute:
                  granule_basepath = zip_prefix + os.path.dirname(os.path.join(
                      self.dataset.path,
                      self.dataset.product_metadata_path
                  ))
              else:
                  granule_basepath = zip_prefix + os.path.dirname(
                      self.dataset.product_metadata_path
                  )
          else:
              if absolute:
                  granule_basepath = os.path.dirname(os.path.join(
                      self.dataset.path,
                      self.dataset.product_metadata_path
                  ))
              else:
                  granule_basepath = os.path.dirname(
                      self.dataset.product_metadata_path
                  )
          product_org = self.dataset._product_metadata.iter(
              "Product_Organisation").next()
          granule_item = [
              g
              for g in chain(*[gl for gl in product_org.iter("Granule_List")])
              if self.granule_identifier == g.attrib["granuleIdentifier"]
          ]
          if len(granule_item) != 1:
              raise S2ReaderMetadataError(
                  "Granule ID cannot be found in product metadata."
              )
          rel_path = [
              f.text for f in granule_item[0].iter() if f.text[-2:] == band_id
          ]
          if len(rel_path) != 1:
              # Apparently some SAFE files don't contain all bands. In such a
              # case, raise a warning and return None.
              warnings.warn(
                  "%s: image path to band %s could not be extracted" % (
                      self.dataset.path, band_id
                  )
              )
              return
          img_path = os.path.join(granule_basepath, rel_path[0]) + ".jp2"
          # Above solution still fails on the "safe" test dataset. Therefore,
          # the path gets checked if it contains the IMG_DATA folder and if not,
          # try to guess the path from the old schema. Not happy with this but
          # couldn't find a better way yet.
          if "IMG_DATA" in img_path:
              return img_path
          else:
              if self.dataset.is_zip:
                  zip_prefix = "/vsizip/"
                  granule_basepath = zip_prefix + os.path.join(
                      self.dataset.path, self.granule_path)
              else:
                  granule_basepath = self.granule_path
              return os.path.join(
                  os.path.join(granule_basepath, "IMG_DATA"),
                  "".join([
                      "_".join((self.granule_identifier).split("_")[:-1]),
                      "_B",
                      band_id,
                      ".jp2"
                  ])
              )