Managing Files on the Seestar

The data module provides functions for listing, downloading, and deleting files stored on the Seestar’s internal eMMC storage. Listing uses the JSON-RPC API (port 4700), downloading uses the Seestar’s built-in HTTP server (port 80), and deletion uses SMB (port 445).

Listing folders and files

See what observation folders are on the Seestar:

from seestarpy import data

folders = data.list_folders()
for name, count in folders.items():
    print(f"{name}: {count} entries")

Example output:

M 81: 3
M 81_sub: 2053
Lunar: 2

List individual files in a folder, optionally filtering by type:

# All files
files = data.list_folder_contents("M 81")

# Only FITS files
fits = data.list_folder_contents("M 81_sub", filetype="fit")

# Only thumbnails
thumbs = data.list_folder_contents("M 81", filetype="thn.jpg")

for name, size in list(fits.items())[:3]:
    print(f"{name}: {size / 1024:.0f} KB")

Available file type filters: "*" (all), "fit", "jpg", "thn.jpg", "*jpg" (all JPEGs).

Downloading a single file

Use download_file() to grab a specific file via HTTP:

path = data.download_file(
    "M 81",
    "DSO_Stacked_33_M 81_20.0s_20260311_213509.fit",
    dest="./downloads",
)
print(f"Saved to: {path}")

The destination directory is created automatically if it doesn’t exist. The function returns the absolute path to the downloaded file.

If the file doesn’t exist on the Seestar, a FileNotFoundError is raised. If the Seestar can’t be reached, a ConnectionError is raised.

Downloading an entire folder

To download all files in a folder at once (via SMB):

data.download_folder("M 81", dest="./astro_data")

This prints progress as each file completes:

Downloading 3 files from 'M 81' (45.2 MB)...
  [1/3] DSO_Stacked_33_M 81_20.0s_20260311_213509.fit (12.15 MB) OK
  [2/3] DSO_Stacked_33_M 81_20.0s_20260311_213509.jpg (5.32 MB) OK
  [3/3] DSO_Stacked_33_M 81_20.0s_20260311_213509_thn.jpg (0.03 MB) OK
OK Download complete: 3 files

Deleting files

Delete specific files from a folder:

result = data.delete_files("M 81", [
    "old_stack.fit",
    "old_stack.jpg",
    "old_stack_thn.jpg",
])

for name, ok in result.items():
    print(f"  {name}: {'deleted' if ok else 'not found'}")

Each filename maps to True (deleted) or False (not found or failed). Files that don’t exist are silently skipped.

Deleting an entire folder

Warning

This permanently removes data from the Seestar’s internal storage. There is no undo.

data.delete_folder("M 81_sub")

Multi-Seestar usage

All data functions support the ips keyword for multi-Seestar operations:

from seestarpy import connection

connection.find_available_ips(3)

# List folders on all Seestars
data.list_folders(ips="all")

# Download from a specific Seestar
data.download_file("M 81", "stack.fit", ips=2)