Repository: CS-SI/eodag
Pull request #1657 (2025-05-15 09:00:03)

fix(core): remove quotes around arrays in query param
If a search on a provider using `StacSearch` (e.g. `dedl`) was done using an array in the input for one or several of the query parameters (e.g. ` {"provider": "dedl", "productType": "SIS_HYDRO_MET_PROJ", "ecmwf:time_aggregation": ["annual_mean", "monthly_mean"]`), the search was failing due to a json parsing error. This has now been fixed by removing the quotes around arrays in the query string.

github-actions[bot]: ## Test Results
    4 files  ±0      4 suites  ±0   6m 7s ⏱️ +4s
  628 tests +1    625 ✅ +1    3 💤 ±0  0 ❌ ±0 
2 512 runs  +4  2 410 ✅ +4  102 💤 ±0  0 ❌ ±0 

Results for commit 4df601de. ± Comparison against base commit 2546986a.

[test-results]:data:application/gzip;base64,H4sIANCtJWgC/02MzQ7CIBAGX6Xh7AFYftSXMRTYhNgWQ+FkfHehttjjzLc7b4Jh8iu5D+IykLWE3MGVZHKIS0VQuoo65TYqfj3osRZrNyX/6hle7acLNGGqgnbhU4ppN6ksrckl4zsdTS4Y7erXZLQfnaIbn5s2znPIFYhwqChzHjgaFM4COqZx1JaCkFojjDchwXDy+QKzOmmYCQEAAA==

eodag-bot: ![badge](https://raw.githubusercontent.com/CS-SI/eodag/_xml_coverage_reports/data/fix-stac-provider-array/./badge.svg)


## Code Coverage (Ubuntu)

<details>


```
Filename                                     Stmts    Miss  Cover    Missing
-----------------------------------------  -------  ------  -------  ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
__init__.py                                      8       0  100.00%
cli.py                                         323      64  80.19%   62-63, 87, 674-737, 839-890, 894
config.py                                      433      27  93.76%   80-82, 91, 99, 103-105, 176, 187, 701-703, 817-820, 863-864, 873-874, 979, 1038-1043, 1045
crunch.py                                        5       5  0.00%    20-24
api/__init__.py                                  0       0  100.00%
api/core.py                                    784      73  90.69%   316-317, 367, 657, 701-704, 742, 786, 820, 865-870, 896, 987, 1055, 1278-1290, 1326, 1328, 1356, 1360-1371, 1384-1390, 1473-1476, 1509-1529, 1598-1603, 1615-1618, 1954, 1978-1984, 2235, 2239-2243, 2252-2254, 2298-2299, 2328-2329
api/search_result.py                            56       4  92.86%   80, 89, 96, 110
api/product/__init__.py                          6       0  100.00%
api/product/_assets.py                          52       5  90.38%   97, 183, 191, 194-198
api/product/_product.py                        201      19  90.55%   70-72, 236-237, 312, 339, 440, 458, 482-485, 494-497, 552-555
api/product/metadata_mapping.py                712      63  91.15%   120-122, 220, 252-253, 310-322, 324, 335, 360, 400-401, 438, 459-462, 485, 493-494, 587-588, 612-613, 619-622, 637-638, 787, 838, 991, 1000-1004, 1021-1026, 1153, 1167-1187, 1207, 1212, 1360, 1374, 1399, 1445, 1497, 1520-1521, 1541-1545, 1561, 1569
api/product/drivers/__init__.py                 20       2  90.00%   33-36
api/product/drivers/base.py                     29       1  96.55%   98
api/product/drivers/generic.py                   7       0  100.00%
api/product/drivers/sentinel1.py                15       0  100.00%
api/product/drivers/sentinel2.py                15       0  100.00%
plugins/__init__.py                              0       0  100.00%
plugins/base.py                                 21       2  90.48%   48, 55
plugins/manager.py                             173      16  90.75%   105-110, 154, 192, 214, 218, 242, 281-282, 382-385, 397-398
plugins/apis/__init__.py                         0       0  100.00%
plugins/apis/base.py                             4       0  100.00%
plugins/apis/ecmwf.py                           97      10  89.69%   167-169, 216-217, 243-245, 298-299
plugins/apis/usgs.py                           180      26  85.56%   156, 258, 292, 327-329, 334, 360-361, 366, 396-403, 414-419, 441-447, 478
plugins/authentication/__init__.py               6       1  83.33%   31
plugins/authentication/aws_auth.py              20       0  100.00%
plugins/authentication/base.py                  17       2  88.24%   45, 58
plugins/authentication/generic.py               14       2  85.71%   51, 61
plugins/authentication/header.py                19       0  100.00%
plugins/authentication/keycloak.py              46       7  84.78%   151-154, 175-180
plugins/authentication/oauth.py                 13       7  46.15%   43-45, 49-52
plugins/authentication/openid_connect.py       208      28  86.54%   80-81, 93-111, 149, 155-183, 191, 323-326, 352, 386
plugins/authentication/qsauth.py                34       1  97.06%   91
plugins/authentication/sas_auth.py              47       1  97.87%   76
plugins/authentication/token.py                127       9  92.91%   168, 205, 277-278, 328-332
plugins/authentication/token_exchange.py        36      14  61.11%   75, 92-120
plugins/crunch/__init__.py                       0       0  100.00%
plugins/crunch/base.py                          10       1  90.00%   43
plugins/crunch/filter_date.py                   59      14  76.27%   52-57, 69, 78, 87, 90, 102-104, 113-115, 122
plugins/crunch/filter_latest_intersect.py       47       8  82.98%   52-53, 69, 78-81, 83, 90-93
plugins/crunch/filter_latest_tpl_name.py        31       1  96.77%   83
plugins/crunch/filter_overlap.py                66      18  72.73%   28-30, 66-69, 76-79, 85, 93, 104-120
plugins/crunch/filter_property.py               30       5  83.33%   55-60, 63-64
plugins/download/__init__.py                     0       0  100.00%
plugins/download/aws.py                        528     158  70.08%   272, 285, 365-368, 382-386, 476-478, 482, 515-516, 522-526, 556, 589, 593, 600, 630-638, 642, 677-685, 696-698, 729-810, 828-886, 897-902, 955, 970-972, 975, 985-993, 1001-1015, 1025-1048, 1055-1068, 1106, 1132, 1177-1179, 1399
plugins/download/base.py                       253      42  83.40%   127, 155, 235-238, 291-292, 340-344, 350-351, 393, 396-410, 422, 426, 490-494, 524-525, 550-558, 560-564, 607, 629, 651, 659
plugins/download/creodias_s3.py                 25       9  64.00%   55-69
plugins/download/http.py                       541      93  82.81%   227, 269-272, 333-336, 339, 346-351, 382-384, 401, 416, 470, 505, 519, 533, 541-543, 559-564, 575, 593, 629-632, 653, 663, 667, 687, 764, 783-794, 802-807, 817-834, 852, 882-891, 927, 952-953, 972-977, 986, 1001-1003, 1007, 1010, 1025-1026, 1061, 1123, 1138, 1197-1198, 1204, 1214, 1250, 1286, 1306, 1341-1343
plugins/download/s3rest.py                     116      24  79.31%   119, 153, 160, 195, 222-229, 232-234, 238, 249-255, 263-264, 267-271, 294, 315-318
plugins/search/__init__.py                      22       0  100.00%
plugins/search/base.py                         148      11  92.57%   101, 105, 129-135, 276, 296, 431
plugins/search/build_search_result.py          473      56  88.16%   245-246, 282, 285, 310, 313, 344-346, 555, 557, 561, 564, 691, 693, 754, 761, 785, 820, 871, 920-935, 980, 1005, 1008, 1012, 1132-1133, 1142-1151, 1211, 1232, 1251-1260, 1377-1378, 1423, 1432-1434, 1491, 1537
plugins/search/cop_marine.py                   250      47  81.20%   56, 64-66, 76-77, 82, 87-88, 104, 106, 109, 175-176, 232, 238, 242, 246, 259, 270-271, 279, 307, 311, 332, 336, 340, 344, 348-352, 358-361, 364-378, 395, 444-448, 453, 465
plugins/search/creodias_s3.py                   25       1  96.00%   51
plugins/search/csw.py                          105      81  22.86%   98-99, 103-104, 112-160, 166-179, 187-219, 237-278
plugins/search/data_request_search.py          202      69  65.84%   189-192, 208, 219, 223-224, 235, 240, 245, 252, 265-268, 322-323, 327, 337-343, 348, 374-377, 385-396, 413, 415, 422-425, 427-428, 446-450, 483, 493, 504, 517, 523-538, 543
plugins/search/qssearch.py                     708      86  87.85%   452, 510, 524, 528-534, 562-566, 679-691, 736-739, 810-811, 859, 878, 885, 897, 954, 975, 978-979, 988-989, 998-999, 1008-1009, 1036, 1120-1125, 1129-1138, 1172, 1194, 1267-1268, 1274, 1364, 1525, 1528, 1534-1535, 1556, 1584-1596, 1603, 1635-1637, 1647-1653, 1683, 1706, 1711-1712, 1727, 1743, 1827, 1834, 1845, 1868-1873, 1882, 1891
plugins/search/stac_list_assets.py              25      10  60.00%   44-51, 75-85
plugins/search/static_stac_search.py            79      13  83.54%   100-126, 170, 183
rest/__init__.py                                 4       2  50.00%   21-22
rest/cache.py                                   33       7  78.79%   35-37, 53-55, 59, 68
rest/config.py                                  25       0  100.00%
rest/constants.py                                6       0  100.00%
rest/core.py                                   260      62  76.15%   258, 301, 316-352, 446, 483-522, 599, 629-632, 705, 712-765
rest/errors.py                                  69       5  92.75%   112, 122, 133, 158-159
rest/server.py                                 192      24  87.50%   86, 109-111, 285-290, 318, 514-516, 533-538, 567, 569, 573-574, 578-579
rest/stac.py                                   319      63  80.25%   309, 331, 383-386, 413-440, 471-473, 496, 528-529, 611-651, 673-689, 781-785, 792, 846-847, 908, 998-1000
rest/types/__init__.py                           0       0  100.00%
rest/types/collections_search.py                13      13  0.00%    18-44
rest/types/eodag_search.py                     180       5  97.22%   225-229, 282, 285, 353
rest/types/queryables.py                        64      12  81.25%   61, 71-79, 105-110, 174
rest/types/stac_search.py                      125       7  94.40%   128, 174, 189-191, 199, 203
rest/utils/__init__.py                          94      12  87.23%   101-102, 121-123, 175, 185-199
rest/utils/cql_evaluate.py                      48       5  89.58%   69, 76, 90, 97, 105
rest/utils/rfc3339.py                           23       3  86.96%   48, 60, 62
types/__init__.py                              148      40  72.97%   67, 80-84, 95-107, 135-137, 144-149, 239, 249-265, 270, 272, 294, 299, 307, 317
types/bbox.py                                   43      19  55.81%   46-61, 72-74, 85-87, 99-101, 113-115, 123
types/download_args.py                           9       0  100.00%
types/queryables.py                            110       0  100.00%
types/search_args.py                            70      18  74.29%   60-64, 71-88, 103
types/whoosh.py                                 81      16  80.25%   129-132, 136-143, 155-161, 174-176
utils/__init__.py                              539      40  92.58%   81, 198-199, 208-235, 238, 253, 333-337, 410-414, 433-435, 449, 541, 556, 596-597, 626, 1001-1004, 1012-1013, 1051-1052, 1099-1100, 1240
utils/exceptions.py                             46       0  100.00%
utils/import_system.py                          28      19  32.14%   64-78, 89-99
utils/logging.py                                28       1  96.43%   41
utils/notebook.py                               44      23  47.73%   25-29, 36-41, 58-62, 72-78, 83-87
utils/repr.py                                   38       8  78.95%   51, 53, 57, 98, 122-129
utils/requests.py                               55      29  47.27%   51-52, 64, 85-96, 107-124, 128
utils/rest.py                                   36       1  97.22%   55
utils/s3.py                                     69       3  95.65%   162-163, 226
utils/stac_reader.py                           113      44  61.06%   63-85, 95-97, 101, 138, 154-159, 206-216, 226-256
TOTAL                                        10383    1617  84.43%
```

</details>


### Diff against develop

```
Filename                           Stmts    Miss  Cover
-------------------------------  -------  ------  -------
api/product/metadata_mapping.py      +10       0  +0.12%
TOTAL                                +10       0  +0.02%
```


Results for commit: 4df601de32faf4dc3fd17fb7c034577f3b9453a2


_Minimum allowed coverage is `70%`_


:recycle: This comment has been updated with latest results


<!-- Sticky Pull Request Commentartifacts/unit-test-results-python3.13-ubuntu-latest/coverage.xml -->
eodag-bot: ![badge](https://raw.githubusercontent.com/CS-SI/eodag/_xml_coverage_reports_win/data/fix-stac-provider-array/./badge.svg)


## Code Coverage (Windows)

<details>


```
Filename                                     Stmts    Miss  Cover    Missing
-----------------------------------------  -------  ------  -------  ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
__init__.py                                      8       0  100.00%
cli.py                                         323      64  80.19%   62-63, 87, 674-737, 839-890, 894
config.py                                      433      28  93.53%   80-82, 91, 99, 103-105, 176, 187, 701-703, 817-820, 863-864, 873-874, 979, 1008, 1038-1043, 1045
crunch.py                                        5       5  0.00%    20-24
api/__init__.py                                  0       0  100.00%
api/core.py                                    784      73  90.69%   316-317, 367, 657, 701-704, 742, 786, 820, 865-870, 896, 987, 1055, 1278-1290, 1326, 1328, 1356, 1360-1371, 1384-1390, 1473-1476, 1509-1529, 1598-1603, 1615-1618, 1954, 1978-1984, 2235, 2239-2243, 2252-2254, 2298-2299, 2328-2329
api/search_result.py                            56       4  92.86%   80, 89, 96, 110
api/product/__init__.py                          6       0  100.00%
api/product/_assets.py                          52       5  90.38%   97, 183, 191, 194-198
api/product/_product.py                        201      19  90.55%   70-72, 236-237, 312, 339, 440, 458, 482-485, 494-497, 552-555
api/product/metadata_mapping.py                712      63  91.15%   120-122, 220, 252-253, 310-322, 324, 335, 360, 400-401, 438, 459-462, 485, 493-494, 587-588, 612-613, 619-622, 637-638, 787, 838, 991, 1000-1004, 1021-1026, 1153, 1167-1187, 1207, 1212, 1360, 1374, 1399, 1445, 1497, 1520-1521, 1541-1545, 1561, 1569
api/product/drivers/__init__.py                 20       2  90.00%   33-36
api/product/drivers/base.py                     29       1  96.55%   98
api/product/drivers/generic.py                   7       0  100.00%
api/product/drivers/sentinel1.py                15       0  100.00%
api/product/drivers/sentinel2.py                15       0  100.00%
plugins/__init__.py                              0       0  100.00%
plugins/base.py                                 21       3  85.71%   48, 55, 68
plugins/manager.py                             173      16  90.75%   105-110, 154, 192, 214, 218, 242, 281-282, 382-385, 397-398
plugins/apis/__init__.py                         0       0  100.00%
plugins/apis/base.py                             4       0  100.00%
plugins/apis/ecmwf.py                           97      10  89.69%   167-169, 216-217, 243-245, 298-299
plugins/apis/usgs.py                           180      26  85.56%   156, 258, 292, 327-329, 334, 360-361, 366, 396-403, 414-419, 441-447, 478
plugins/authentication/__init__.py               6       1  83.33%   31
plugins/authentication/aws_auth.py              20       0  100.00%
plugins/authentication/base.py                  17       2  88.24%   45, 58
plugins/authentication/generic.py               14       2  85.71%   51, 61
plugins/authentication/header.py                19       0  100.00%
plugins/authentication/keycloak.py              46       7  84.78%   151-154, 175-180
plugins/authentication/oauth.py                 13       7  46.15%   43-45, 49-52
plugins/authentication/openid_connect.py       208      28  86.54%   80-81, 93-111, 149, 155-183, 191, 323-326, 352, 386
plugins/authentication/qsauth.py                34       1  97.06%   91
plugins/authentication/sas_auth.py              47       1  97.87%   76
plugins/authentication/token.py                127       9  92.91%   168, 205, 277-278, 328-332
plugins/authentication/token_exchange.py        36      14  61.11%   75, 92-120
plugins/crunch/__init__.py                       0       0  100.00%
plugins/crunch/base.py                          10       1  90.00%   43
plugins/crunch/filter_date.py                   59      14  76.27%   52-57, 69, 78, 87, 90, 102-104, 113-115, 122
plugins/crunch/filter_latest_intersect.py       47      33  29.79%   49-54, 67-112
plugins/crunch/filter_latest_tpl_name.py        31       1  96.77%   83
plugins/crunch/filter_overlap.py                66      18  72.73%   28-30, 66-69, 76-79, 85, 93, 104-120
plugins/crunch/filter_property.py               30       5  83.33%   55-60, 63-64
plugins/download/__init__.py                     0       0  100.00%
plugins/download/aws.py                        528     158  70.08%   272, 285, 365-368, 382-386, 476-478, 482, 515-516, 522-526, 556, 589, 593, 600, 630-638, 642, 677-685, 696-698, 729-810, 828-886, 897-902, 955, 970-972, 975, 985-993, 1001-1015, 1025-1048, 1055-1068, 1106, 1132, 1177-1179, 1399
plugins/download/base.py                       253      44  82.61%   127, 155, 222-224, 235-238, 291-292, 340-344, 350-351, 393, 396-410, 422, 426, 490-494, 524-525, 550-558, 560-564, 607, 629, 651, 659
plugins/download/creodias_s3.py                 25       9  64.00%   55-69
plugins/download/http.py                       541      93  82.81%   227, 269-272, 333-336, 339, 346-351, 382-384, 401, 416, 470, 505, 519, 533, 541-543, 559-564, 575, 593, 629-632, 653, 663, 667, 687, 764, 783-794, 802-807, 817-834, 852, 882-891, 927, 952-953, 972-977, 986, 1001-1003, 1007, 1010, 1025-1026, 1061, 1123, 1138, 1197-1198, 1204, 1214, 1250, 1286, 1306, 1341-1343
plugins/download/s3rest.py                     116      24  79.31%   119, 153, 160, 195, 222-229, 232-234, 238, 249-255, 263-264, 267-271, 294, 315-318
plugins/search/__init__.py                      22       0  100.00%
plugins/search/base.py                         148      11  92.57%   101, 105, 129-135, 276, 296, 431
plugins/search/build_search_result.py          473      63  86.68%   245-246, 282, 285, 310, 313, 344-346, 553-564, 691, 693, 754, 761, 785, 820, 871, 886, 920-935, 980, 1005, 1008, 1012, 1132-1133, 1142-1151, 1211, 1226, 1232, 1251-1260, 1377-1378, 1423, 1432-1434, 1491, 1537
plugins/search/cop_marine.py                   250      47  81.20%   56, 64-66, 76-77, 82, 87-88, 104, 106, 109, 175-176, 232, 238, 242, 246, 259, 270-271, 279, 307, 311, 332, 336, 340, 344, 348-352, 358-361, 364-378, 395, 444-448, 453, 465
plugins/search/creodias_s3.py                   25       1  96.00%   51
plugins/search/csw.py                          105      81  22.86%   98-99, 103-104, 112-160, 166-179, 187-219, 237-278
plugins/search/data_request_search.py          202      69  65.84%   189-192, 208, 219, 223-224, 235, 240, 245, 252, 265-268, 322-323, 327, 337-343, 348, 374-377, 385-396, 413, 415, 422-425, 427-428, 446-450, 483, 493, 504, 517, 523-538, 543
plugins/search/qssearch.py                     708      99  86.02%   452, 510, 524, 528-534, 562-566, 679-691, 736-739, 810-811, 859, 878, 885, 897, 954, 975, 978-979, 988-989, 998-999, 1008-1009, 1036, 1120-1125, 1129-1138, 1172, 1194, 1267-1268, 1274, 1364, 1461-1465, 1525, 1528, 1534-1535, 1556, 1584-1596, 1603, 1635-1637, 1647-1653, 1683, 1706, 1711-1712, 1727, 1743, 1815, 1827, 1834, 1845, 1868-1873, 1882, 1890-1900, 1918, 1929, 1935-1939
plugins/search/stac_list_assets.py              25      10  60.00%   44-51, 75-85
plugins/search/static_stac_search.py            79      13  83.54%   100-126, 170, 183
rest/__init__.py                                 4       2  50.00%   21-22
rest/cache.py                                   33      22  33.33%   35-37, 44-70
rest/config.py                                  25       1  96.00%   35
rest/constants.py                                6       0  100.00%
rest/core.py                                   260     153  41.15%   157, 159, 161, 164-165, 179-189, 198-199, 205, 208, 249-303, 316-352, 383-420, 435-451, 467-476, 483-522, 539, 581-666, 705, 712-765
rest/errors.py                                  69      49  28.99%   62, 67-106, 111-114, 121-124, 132-162, 170-175, 190-196
rest/server.py                                 192     192  0.00%    18-592
rest/stac.py                                   319      68  78.68%   243, 309, 331, 383-386, 413-440, 471-473, 496, 528-529, 611-651, 673-689, 716, 781-785, 792, 846-847, 853, 908, 946, 979, 998-1000
rest/types/__init__.py                           0       0  100.00%
rest/types/collections_search.py                13      13  0.00%    18-44
rest/types/eodag_search.py                     180      20  88.89%   225-229, 262-264, 282, 285, 291, 295, 353, 371-386
rest/types/queryables.py                        64      20  68.75%   54-55, 60-63, 68-79, 105-110, 119-120, 174
rest/types/stac_search.py                      125      11  91.20%   126-128, 174, 189-191, 199, 203, 251, 254
rest/utils/__init__.py                          94      30  68.09%   72-78, 98, 101-102, 121-123, 136, 143, 168-176, 183-204
rest/utils/cql_evaluate.py                      48       5  89.58%   69, 76, 90, 97, 105
rest/utils/rfc3339.py                           23       5  78.26%   43-44, 48, 60, 62
types/__init__.py                              148      42  71.62%   67, 71, 80-84, 95-107, 135-137, 144-149, 204, 239, 249-265, 270, 272, 294, 299, 307, 317
types/bbox.py                                   43      19  55.81%   46-61, 72-74, 85-87, 99-101, 113-115, 123
types/download_args.py                           9       0  100.00%
types/queryables.py                            110       0  100.00%
types/search_args.py                            70      18  74.29%   60-64, 71-88, 103
types/whoosh.py                                 81      16  80.25%   129-132, 136-143, 155-161, 174-176
utils/__init__.py                              539      40  92.58%   81, 198-199, 208-235, 238, 253, 333-337, 410-414, 433-435, 449, 541, 556, 596-597, 626, 1001-1004, 1012-1013, 1051-1052, 1099-1100, 1240
utils/exceptions.py                             46       0  100.00%
utils/import_system.py                          28      19  32.14%   64-78, 89-99
utils/logging.py                                28       1  96.43%   41
utils/notebook.py                               44      23  47.73%   25-29, 36-41, 58-62, 72-78, 83-87
utils/repr.py                                   38       8  78.95%   51, 53, 57, 98, 122-129
utils/requests.py                               55      29  47.27%   51-52, 64, 85-96, 107-124, 128
utils/rest.py                                   36       1  97.22%   55
utils/s3.py                                     69       3  95.65%   162-163, 226
utils/stac_reader.py                           113      44  61.06%   63-85, 95-97, 101, 138, 154-159, 206-216, 226-256
TOTAL                                        10383    2039  80.36%
```

</details>


### Diff against develop

```
Filename                           Stmts    Miss  Cover
-------------------------------  -------  ------  -------
api/product/metadata_mapping.py      +10       0  +0.12%
TOTAL                                +10       0  +0.02%
```


Results for commit: 4df601de32faf4dc3fd17fb7c034577f3b9453a2


_Minimum allowed coverage is `70%`_


:recycle: This comment has been updated with latest results


<!-- Sticky Pull Request Commentartifacts/unit-test-results-python3.13-windows-latest/coverage.xml -->

Patch:
diff --git a/eodag/api/product/metadata_mapping.py b/eodag/api/product/metadata_mapping.py
index 642f8c70..0464fbc0 100644
--- a/eodag/api/product/metadata_mapping.py
+++ b/eodag/api/product/metadata_mapping.py
@@ -49,6 +49,7 @@ from eodag.utils import (
     get_timestamp,
     items_recursive_apply,
     nested_pairs2dict,
+    remove_str_array_quotes,
     sanitize,
     string_to_jsonpath,
     update_nested_dict,
@@ -1317,6 +1318,10 @@ def format_query_params(
                     # retrieve values from hashes where keys are given in the param
                     if "}[" in formatted_query_param:
                         formatted_query_param = _resolve_hashes(formatted_query_param)
+                    # remove quotes around arrays
+                    formatted_query_param = remove_str_array_quotes(
+                        formatted_query_param
+                    )
                     # json query string (for POST request)
                     update_nested_dict(
                         query_params,
diff --git a/eodag/plugins/search/base.py b/eodag/plugins/search/base.py
index d1a87af6..00b2497c 100644
--- a/eodag/plugins/search/base.py
+++ b/eodag/plugins/search/base.py
@@ -369,6 +369,9 @@ class Search(PluginTopic):
             if not product_type
             else ""
         )
+        discover_metadata = getattr(self.config, "discover_metadata", {})
+        auto_discovery = discover_metadata.get("auto_discovery", False)
+
         if product_type or getattr(self.config, "discover_queryables", {}).get(
             "fetch_url", ""
         ):
@@ -376,6 +379,7 @@ class Search(PluginTopic):
                 self.config.product_type_config = product_type_configs[product_type]
             queryables = self._get_product_type_queryables(product_type, alias, filters)
             queryables.additional_information = additional_info
+            queryables.additional_properties = auto_discovery
 
             return queryables
         else:
@@ -390,7 +394,7 @@ class Search(PluginTopic):
                     Queryables.model_fields.get(k, Field(None)), "default", None
                 )
             return QueryablesDict(
-                additional_properties=True,
+                additional_properties=auto_discovery,
                 additional_information=additional_info,
                 **all_queryables,
             )
diff --git a/eodag/plugins/search/build_search_result.py b/eodag/plugins/search/build_search_result.py
index 6a99f5a7..ea26dfb0 100644
--- a/eodag/plugins/search/build_search_result.py
+++ b/eodag/plugins/search/build_search_result.py
@@ -470,7 +470,7 @@ class ECMWFSearch(PostJsonSearch):
         self.config.__dict__.setdefault(
             "discover_metadata",
             {
-                "auto_discovery": True,
+                "auto_discovery": False,
                 "search_param": "{metadata}",
                 "metadata_pattern": "^[a-zA-Z0-9][a-zA-Z0-9_]*$",
             },
@@ -1179,6 +1179,9 @@ class ECMWFSearch(PostJsonSearch):
                 + "_ORDERABLE_"
                 + query_hash
             )
+            # use product_type_config as default properties
+            product_type_config = getattr(self.config, "product_type_config", {})
+            properties = dict(product_type_config, **properties)
 
         qs = geojson.dumps(sorted_unpaginated_qp)
 
@@ -1445,6 +1448,9 @@ class MeteoblueSearch(ECMWFSearch):
             productType=product_type,
             properties=properties,
         )
+        # use product_type_config as default properties
+        product_type_config = getattr(self.config, "product_type_config", {})
+        product.properties = dict(product_type_config, **product.properties)
 
         return [
             product,
diff --git a/eodag/plugins/search/cop_marine.py b/eodag/plugins/search/cop_marine.py
index 4f99cf71..a717f98f 100644
--- a/eodag/plugins/search/cop_marine.py
+++ b/eodag/plugins/search/cop_marine.py
@@ -285,6 +285,9 @@ class CopMarineSearch(StaticStacSearch):
             }
         }
         product = EOProduct(self.provider, properties, productType=product_type)
+        # use product_type_config as default properties
+        product_type_config = getattr(self.config, "product_type_config", {})
+        product.properties = dict(product_type_config, **product.properties)
         product.assets = AssetsDict(product, assets)
         return product
 
diff --git a/eodag/utils/__init__.py b/eodag/utils/__init__.py
index a4e2dccc..8bc1bf49 100644
--- a/eodag/utils/__init__.py
+++ b/eodag/utils/__init__.py
@@ -1541,3 +1541,24 @@ def dict_md5sum(input_dict: dict[str, Any]) -> str:
     >>> assert(dict_md5sum({"a": 4, "b": {"b": 3, "c": 1, "a": 2}}) == hd)
     """
     return obj_md5sum(sort_dict(input_dict))
+
+
+def remove_str_array_quotes(input_str: str) -> str:
+    """Remove quotes around arrays to avoid json parsing errors
+
+    :param input_str: string to format
+    :returns: string without quotes surrounding array brackets
+
+    >>> remove_str_array_quotes('"a":"["a", "b"]"')
+    '"a":["a", "b"]'
+    >>> remove_str_array_quotes('{"a":"["a", "b"]", "b": ["c", "d"]}')
+    '{"a":["a", "b"], "b": ["c", "d"]}'
+    """
+    output_str = ""
+    for i in range(0, len(input_str)):
+        if i < len(input_str) - 1 and input_str[i] == '"' and input_str[i + 1] == "[":
+            continue
+        if input_str[i] == '"' and input_str[i - 1] == "]":
+            continue
+        output_str += input_str[i]
+    return output_str


Test patch:
diff --git a/tests/units/test_core.py b/tests/units/test_core.py
index e7cc777b..6ae33cff 100644
--- a/tests/units/test_core.py
+++ b/tests/units/test_core.py
@@ -1516,6 +1516,44 @@ class TestCore(TestCoreBase):
                 {"productType": "S1_SAR_GRD", "snowCover": 500}
             )
 
+    @mock.patch(
+        "eodag.plugins.search.build_search_result.ECMWFSearch.discover_queryables",
+        autospec=True,
+    )
+    def test_additional_properties_in_list_queryables(
+        self, mock_discover_queryables: mock.Mock
+    ):
+        """additional_properties in queryables must be adapted to provider's configuration"""
+        # Check if discover_metadata.auto_discovery is False
+        self.assertFalse(
+            self.dag.providers_config["cop_marine"].search.discover_metadata[
+                "auto_discovery"
+            ]
+        )
+        cop_marine_queryables = self.dag.list_queryables(provider="cop_marine")
+        self.assertFalse(cop_marine_queryables.additional_properties)
+
+        item_cop_marine_queryables = self.dag.list_queryables(
+            productType="MO_INSITU_GLO_PHY_TS_OA_NRT_013_002", provider="cop_marine"
+        )
+        self.assertFalse(item_cop_marine_queryables.additional_properties)
+
+        # Check if discover_metadata.auto_discovery is True
+        self.assertTrue(
+            self.dag.providers_config["peps"].search.discover_metadata["auto_discovery"]
+        )
+        peps_queryables = self.dag.list_queryables(provider="peps")
+        self.assertTrue(peps_queryables.additional_properties)
+
+        item_peps_queryables = self.dag.list_queryables(
+            productType="S2_MSI_L1C", provider="peps"
+        )
+        self.assertTrue(item_peps_queryables.additional_properties)
+
+        # additional_properties set to False for EcmwfSearch plugin
+        cop_cds_queryables = self.dag.list_queryables(provider="cop_cds")
+        self.assertFalse(cop_cds_queryables.additional_properties)
+
     @mock.patch(
         "eodag.plugins.search.build_search_result.ECMWFSearch.discover_queryables",
         autospec=True,
diff --git a/tests/units/test_search_plugins.py b/tests/units/test_search_plugins.py
index 7c31381e..0406812e 100644
--- a/tests/units/test_search_plugins.py
+++ b/tests/units/test_search_plugins.py
@@ -1825,6 +1825,8 @@ class TestSearchPluginMeteoblueSearch(BaseSearchPluginTest):
 
         # custom query for meteoblue
         custom_query = {"queries": {"foo": "bar"}}
+        product_type_config = {"platform": "NEMSGLOBAL", "alias": "THE.ALIAS"}
+        setattr(self.search_plugin.config, "product_type_config", product_type_config)
         products, estimate = self.search_plugin.query(
             prep=PreparedSearch(auth_plugin=self.auth_plugin, auth=self.auth),
             **custom_query,
@@ -1864,6 +1866,8 @@ class TestSearchPluginMeteoblueSearch(BaseSearchPluginTest):
                 }
             ),
         )
+        self.assertEqual(products[0].properties["platform"], "NEMSGLOBAL")
+        self.assertEqual(products[0].properties["alias"], "THE.ALIAS")
 
 
 class MockResponse:
@@ -2343,9 +2347,10 @@ class TestSearchPluginECMWFSearch(unittest.TestCase):
             "productType": self.product_type,
             "missionStartDate": "1985-10-26",
             "missionEndDate": "2015-10-21",
+            "alias": "THE.ALIAS",
         }
         results, _ = self.search_plugin.query(
-            productType=self.product_type,
+            productType="THE.ALIAS",
         )
         eoproduct = results[0]
         self.assertEqual(
@@ -2356,6 +2361,7 @@ class TestSearchPluginECMWFSearch(unittest.TestCase):
             eoproduct.properties["completionTimeFromAscendingNode"],
             "1985-10-26T00:00:00.000Z",
         )
+        self.assertEqual("THE.ALIAS", eoproduct.properties["alias"])
 
     def test_plugins_search_ecmwfsearch_with_year_month_day_filter(self):
         """ECMWFSearch.query must use have datetime in response if year, month, day used in filters"""
@@ -3036,6 +3042,8 @@ class TestSearchPluginCopMarineSearch(BaseSearchPluginTest):
         ]
 
         search_plugin = self.get_search_plugin("PRODUCT_A", self.provider)
+        product_type_config = {"platform": "P1"}
+        setattr(search_plugin.config, "product_type_config", product_type_config)
 
         with mock.patch("eodag.plugins.search.cop_marine._get_s3_client") as s3_stub:
             s3_stub.return_value = self.s3
@@ -3093,6 +3101,7 @@ class TestSearchPluginCopMarineSearch(BaseSearchPluginTest):
                 "2020-01-03T00:00:00Z",
                 products_dataset2[0].properties["completionTimeFromAscendingNode"],
             )
+            self.assertEqual("P1", products_dataset2[0].properties["platform"])
 
     @mock.patch("eodag.plugins.search.cop_marine.requests.get")
     def test_plugins_search_cop_marine_query_no_dates_in_id(self, mock_requests_get):