From f4ced6c5cc7fa0a9d5bb57509faf6731f5a2a1a9 Mon Sep 17 00:00:00 2001 From: Samweli Date: Tue, 28 Feb 2023 12:58:20 +0300 Subject: [PATCH 1/3] fallback to asset href content type if stac asset type is not avaialble --- src/qgis_stac/gui/asset_widget.py | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/src/qgis_stac/gui/asset_widget.py b/src/qgis_stac/gui/asset_widget.py index c6917a3..51b1254 100644 --- a/src/qgis_stac/gui/asset_widget.py +++ b/src/qgis_stac/gui/asset_widget.py @@ -5,6 +5,9 @@ import os +import requests +import mimetypes + from qgis.PyQt import ( QtCore, QtGui, @@ -59,19 +62,37 @@ def initialize_ui(self): self.title_la.setText(self.asset.title) self.type_la.setText(self.asset.type) - self.load_box.setEnabled(self.asset.type in ''.join(layer_types)) + self.load_box.setEnabled(self.asset_loadable()) self.load_box.toggled.connect(self.asset_load_selected) self.load_box.stateChanged.connect(self.asset_load_selected) self.download_box.toggled.connect(self.asset_download_selected) self.download_box.stateChanged.connect(self.asset_download_selected) - if self.asset.type not in layer_types: + if self.asset_loadable(): self.load_box.setToolTip( tr("Asset contains {} media type which " "cannot be loaded as a map layer in QGIS" ).format(self.asset.type) ) + def asset_loadable(self): + """ Returns if asset can be added into QGIS""" + + layer_types = [ + AssetLayerType.COG.value, + AssetLayerType.COPC.value, + AssetLayerType.GEOTIFF.value, + AssetLayerType.NETCDF.value, + ] + + if self.asset.type is not None: + return self.asset.type in ''.join(layer_types) + else: + response = requests.get(self.asset.href) + content_type = response.headers['content-type'] + + return content_type in ''.join(layer_types) + def asset_load_selected(self, state=None): """ Emits the needed signal when an asset has been selected for loading. From 8b222481ed7d9dda46c25dd8437ec2ab59342af3 Mon Sep 17 00:00:00 2001 From: Samweli Date: Tue, 11 Apr 2023 16:30:33 +0300 Subject: [PATCH 2/3] fetch asset type from the asset url if the STAC asset media type is missing --- src/qgis_stac/gui/asset_widget.py | 44 ++++++++++++++++++++----------- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/src/qgis_stac/gui/asset_widget.py b/src/qgis_stac/gui/asset_widget.py index 51b1254..027a66b 100644 --- a/src/qgis_stac/gui/asset_widget.py +++ b/src/qgis_stac/gui/asset_widget.py @@ -5,9 +5,6 @@ import os -import requests -import mimetypes - from qgis.PyQt import ( QtCore, QtGui, @@ -16,9 +13,11 @@ ) from qgis.PyQt.uic import loadUiType +from qgis.core import QgsNetworkAccessManager + from ..api.models import AssetLayerType -from ..utils import tr +from ..utils import log, tr WidgetUi, _ = loadUiType( os.path.join(os.path.dirname(__file__), "../ui/asset_widget.ui") @@ -52,13 +51,6 @@ def __init__( def initialize_ui(self): """ Populate UI inputs when loading the widget""" - layer_types = [ - AssetLayerType.COG.value, - AssetLayerType.COPC.value, - AssetLayerType.GEOTIFF.value, - AssetLayerType.NETCDF.value, - ] - self.title_la.setText(self.asset.title) self.type_la.setText(self.asset.type) @@ -88,10 +80,32 @@ def asset_loadable(self): if self.asset.type is not None: return self.asset.type in ''.join(layer_types) else: - response = requests.get(self.asset.href) - content_type = response.headers['content-type'] - - return content_type in ''.join(layer_types) + try: + request = QtNetwork.QNetworkRequest( + QtCore.QUrl(self.asset.href) + ) + response = QgsNetworkAccessManager().\ + instance().blockingGet(request) + content_type = response.rawHeader( + QtCore.QByteArray( + 'content-type'.encode() + ) + ) + content_type = str(content_type, 'utf-8') + + for layer_type in layer_types: + layer_type_values = layer_type.split(' ') + for value in layer_type_values: + if value in content_type: + return True + + except Exception as e: + log(f"Problem fetching asset " + f"type from the asset url {self.asset.href}," + f" error {e}" + ) + + return False def asset_load_selected(self, state=None): """ Emits the needed signal when an asset has been selected From a868804a0d1932e6bde66d26d5350a1b26914c19 Mon Sep 17 00:00:00 2001 From: Samweli Date: Thu, 13 Apr 2023 13:09:56 +0300 Subject: [PATCH 3/3] enforce only single fetch of asset media type in case the STAC item asset media type is not avaialable --- src/qgis_stac/gui/asset_widget.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/qgis_stac/gui/asset_widget.py b/src/qgis_stac/gui/asset_widget.py index 027a66b..c872c7c 100644 --- a/src/qgis_stac/gui/asset_widget.py +++ b/src/qgis_stac/gui/asset_widget.py @@ -53,14 +53,15 @@ def initialize_ui(self): self.title_la.setText(self.asset.title) self.type_la.setText(self.asset.type) + asset_load = self.asset_loadable() - self.load_box.setEnabled(self.asset_loadable()) + self.load_box.setEnabled(asset_load) self.load_box.toggled.connect(self.asset_load_selected) self.load_box.stateChanged.connect(self.asset_load_selected) self.download_box.toggled.connect(self.asset_download_selected) self.download_box.stateChanged.connect(self.asset_download_selected) - if self.asset_loadable(): + if asset_load: self.load_box.setToolTip( tr("Asset contains {} media type which " "cannot be loaded as a map layer in QGIS"