Skip to content

Commit bbf1f20

Browse files
michaelayeclaude
andcommitted
Add backup URL fallback for CTX index and minor improvements
- CTXIndex: Add backup URL (pdsimage2.wr.usgs.gov) with automatic fallback - CTXIndex: Track successful URL for constructing downstream URLs - index_main.py: Clean up imports - ctx_calib.py: Add optional fname parameter to write_isis_filelist Co-Authored-By: Claude Opus 4.5 <[email protected]>
1 parent cb8eca5 commit bbf1f20

File tree

3 files changed

+46
-15
lines changed

3 files changed

+46
-15
lines changed

src/planetarypy/instruments/mro/ctx/ctx_calib.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -549,10 +549,12 @@ def image_list_lev2_path(self):
549549
"get the path to the image list file"
550550
return self.workdir / "image_list_lev2.lis"
551551

552-
def write_isis_filelist(self, workdir=None, level=1):
552+
def write_isis_filelist(self, workdir=None, fname=None, level=1):
553553
workdir = self.workdir if workdir is None else Path(workdir)
554554
logger.debug(f"{self.workdir=}")
555-
savepath = workdir / f"image_list_lev{level}.lis"
555+
savepath = (
556+
workdir / f"image_list_lev{level}.lis" if fname is None else workdir / fname
557+
)
556558
match level:
557559
case 0:
558560
paths = self.cub_paths

src/planetarypy/pds/dynamic_url_handlers.py

Lines changed: 37 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,24 +4,52 @@
44
__all__ = ["CTXIndex", "LROCIndex"]
55

66
import pandas as pd
7+
from loguru import logger
78
from yarl import URL
89

910

1011
class CTXIndex:
1112
url = "https://planetarydata.jpl.nasa.gov/img/data/mro/ctx/"
13+
backup_url = "https://pdsimage2.wr.usgs.gov/Mars_Reconnaissance_Orbiter/CTX"
1214

1315
def __init__(self):
1416
self._volumes_table = None
17+
self._successful_url = None
1518

1619
@property
1720
def volumes_table(self):
1821
if self._volumes_table is None:
19-
self._volumes_table = (
20-
pd.read_html(self.url)[0]
21-
.dropna(how="all", axis=1)
22-
.dropna(how="all", axis=0)
23-
.iloc[1:, :-1]
24-
)
22+
# Try primary URL first
23+
try:
24+
self._volumes_table = (
25+
pd.read_html(self.url)[0]
26+
.dropna(how="all", axis=1)
27+
.dropna(how="all", axis=0)
28+
.iloc[1:, :-1]
29+
)
30+
self._successful_url = self.url
31+
except Exception as e:
32+
# If primary URL fails, try backup URL
33+
logger.warning(
34+
f"Failed to fetch CTX volumes table from primary URL {self.url}: {e}. "
35+
f"Trying backup URL {self.backup_url}."
36+
)
37+
try:
38+
self._volumes_table = (
39+
pd.read_html(self.backup_url)[0]
40+
.dropna(how="all", axis=1)
41+
.dropna(how="all", axis=0)
42+
.iloc[1:, :-1]
43+
)
44+
self._successful_url = self.backup_url
45+
logger.info(
46+
"Successfully fetched CTX volumes table from backup URL"
47+
)
48+
except Exception as backup_error:
49+
logger.error(
50+
f"Failed to fetch CTX volumes table from backup URL {self.backup_url}: {backup_error}"
51+
)
52+
raise backup_error
2553
return self._volumes_table
2654

2755
@property
@@ -34,7 +62,9 @@ def latest_release_number(self):
3462

3563
@property
3664
def latest_index_label_url(self):
37-
return URL(self.url) / f"{self.latest_release_folder}index/cumindex.lbl"
65+
# Use the successful URL (primary or backup) for constructing the label URL
66+
base_url = self._successful_url if self._successful_url else self.url
67+
return URL(base_url) / f"{self.latest_release_folder}index/cumindex.lbl"
3868

3969

4070
class LROCIndex:

src/planetarypy/pds/index_main.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,20 @@
55

66
__all__ = ["Index", "InventoryIndex"]
77

8-
from pathlib import Path
98
import csv
10-
import pandas as pd
9+
from pathlib import Path
1110

11+
import pandas as pd
1212
from loguru import logger
1313
from yarl import URL
1414

1515
from ..config import config
16-
from ..utils import url_retrieve, have_internet
17-
18-
from .index_labels import IndexLabel
16+
from ..utils import have_internet, url_retrieve
1917
from .dynamic_index import (
20-
DYNAMIC_URL_HANDLERS,
18+
DYNAMIC_URL_HANDLERS, # registry of dynamic index handlers
2119
DynamicRemoteHandler,
2220
)
21+
from .index_labels import IndexLabel
2322
from .static_index import StaticRemoteHandler
2423

2524

0 commit comments

Comments
 (0)