@@ -313,7 +313,6 @@ def download(
313
313
"EO product is unable to download itself due to lacking of a "
314
314
"download plugin"
315
315
)
316
-
317
316
auth = (
318
317
self .downloader_auth .authenticate ()
319
318
if self .downloader_auth is not None
@@ -323,7 +322,6 @@ def download(
323
322
progress_callback , close_progress_callback = self ._init_progress_bar (
324
323
progress_callback
325
324
)
326
-
327
325
fs_path = self .downloader .download (
328
326
self ,
329
327
auth = auth ,
@@ -369,6 +367,47 @@ def _init_progress_bar(
369
367
progress_callback .refresh ()
370
368
return (progress_callback , close_progress_callback )
371
369
370
+ def _download_quicklook (
371
+ self ,
372
+ quicklook_file : str ,
373
+ progress_callback : ProgressCallback ,
374
+ ssl_verify : Optional [bool ] = None ,
375
+ auth : Optional [AuthBase ] = None ,
376
+ ):
377
+
378
+ """Download the quicklook image from the EOProduct's quicklook URL.
379
+
380
+ This method performs an HTTP GET request to retrieve the quicklook image and saves it
381
+ locally at the specified path. It optionally verifies SSL certificates, uses HTTP
382
+ authentication, and can display a download progress if a callback is provided.
383
+
384
+ :param quicklook_file: The full path (including filename) where the quicklook will be saved.
385
+ :param progress_callback: A callable that accepts the current and total download sizes
386
+ to display or log the download progress. It must support `reset(total)`
387
+ and be callable with downloaded chunk sizes.
388
+ :param ssl_verify: (optional) Whether to verify SSL certificates. Defaults to True.
389
+ :param auth: (optional) Authentication credentials (e.g., tuple or object) used for the
390
+ HTTP request if the resource requires authentication.
391
+ :raises HTTPError: If the HTTP request to the quicklook URL fails.
392
+ """
393
+ with requests .get (
394
+ self .properties ["quicklook" ],
395
+ stream = True ,
396
+ auth = auth ,
397
+ headers = USER_AGENT ,
398
+ timeout = DEFAULT_STREAM_REQUESTS_TIMEOUT ,
399
+ verify = ssl_verify ,
400
+ ) as stream :
401
+ stream .raise_for_status ()
402
+ stream_size = int (stream .headers .get ("content-length" , 0 ))
403
+ progress_callback .reset (stream_size )
404
+ with open (quicklook_file , "wb" ) as fhandle :
405
+ for chunk in stream .iter_content (chunk_size = 64 * 1024 ):
406
+ if chunk :
407
+ fhandle .write (chunk )
408
+ progress_callback (len (chunk ))
409
+ logger .info ("Download recorded in %s" , quicklook_file )
410
+
372
411
def get_quicklook (
373
412
self ,
374
413
filename : Optional [str ] = None ,
@@ -378,6 +417,9 @@ def get_quicklook(
378
417
"""Download the quicklook image of a given EOProduct from its provider if it
379
418
exists.
380
419
420
+ This method retrieves the quicklook URL from the EOProduct metadata and delegates
421
+ the download to the internal `download_quicklook` method.
422
+
381
423
:param filename: (optional) The name to give to the downloaded quicklook. If not
382
424
given, it defaults to the product's ID (without file extension).
383
425
:param output_dir: (optional) The absolute path of the directory where to store
@@ -403,18 +445,6 @@ def format_quicklook_address() -> None:
403
445
}
404
446
)
405
447
406
- # progress bar init
407
- if progress_callback is None :
408
- progress_callback = ProgressCallback ()
409
- # one shot progress callback to close after download
410
- close_progress_callback = True
411
- else :
412
- close_progress_callback = False
413
- # update units as bar may have been previously used for extraction
414
- progress_callback .unit = "B"
415
- progress_callback .unit_scale = True
416
- progress_callback .desc = "quicklooks/%s" % self .properties .get ("id" , "" )
417
-
418
448
if self .properties .get ("quicklook" , None ) is None :
419
449
logger .warning (
420
450
"Missing information to retrieve quicklook for EO product: %s" ,
@@ -442,6 +472,18 @@ def format_quicklook_address() -> None:
442
472
)
443
473
444
474
if not os .path .isfile (quicklook_file ):
475
+
476
+ # progress bar init
477
+ if progress_callback is None :
478
+ progress_callback = ProgressCallback ()
479
+ # one shot progress callback to close after download
480
+ close_progress_callback = True
481
+ else :
482
+ close_progress_callback = False
483
+ # update units as bar may have been previously used for extraction
484
+ progress_callback .unit = "B"
485
+ progress_callback .unit_scale = True
486
+ progress_callback .desc = "quicklooks/%s" % self .properties .get ("id" , "" )
445
487
# VERY SPECIAL CASE (introduced by the onda provider): first check if
446
488
# it is a HTTP URL. If not, we assume it is a base64 string, in which case
447
489
# we just decode the content, write it into the quicklook_file and return it.
@@ -468,30 +510,25 @@ def format_quicklook_address() -> None:
468
510
if self .downloader
469
511
else True
470
512
)
471
- with requests .get (
472
- self .properties ["quicklook" ],
473
- stream = True ,
474
- auth = auth ,
475
- headers = USER_AGENT ,
476
- timeout = DEFAULT_STREAM_REQUESTS_TIMEOUT ,
477
- verify = ssl_verify ,
478
- ) as stream :
479
- try :
480
- stream .raise_for_status ()
481
- except RequestException as e :
482
- import traceback as tb
513
+ try :
514
+ self ._download_quicklook (
515
+ quicklook_file , progress_callback , ssl_verify , auth
516
+ )
517
+ except RequestException as e :
483
518
484
- logger .error ("Error while getting resource :\n %s" , tb .format_exc ())
519
+ logger .debug (
520
+ f"Error while getting resource with authentication. { e } \n Trying without authentication..."
521
+ )
522
+ try :
523
+ self ._download_quicklook (
524
+ quicklook_file , progress_callback , ssl_verify , None
525
+ )
526
+ except RequestException as e_no_auth :
527
+ logger .error (
528
+ f"Failed to get resource with authentication: { e } \n \
529
+ Failed to get resource even without authentication. { e_no_auth } "
530
+ )
485
531
return str (e )
486
- else :
487
- stream_size = int (stream .headers .get ("content-length" , 0 ))
488
- progress_callback .reset (stream_size )
489
- with open (quicklook_file , "wb" ) as fhandle :
490
- for chunk in stream .iter_content (chunk_size = 64 * 1024 ):
491
- if chunk :
492
- fhandle .write (chunk )
493
- progress_callback (len (chunk ))
494
- logger .info ("Download recorded in %s" , quicklook_file )
495
532
496
533
# close progress bar if needed
497
534
if close_progress_callback :
0 commit comments