What are Seeds?
Seeds are Datoso’s plugin system that extends the core functionality to support different DAT file sources. Each seed implements the logic needed to:
Fetch : Download DAT files from a specific source
Parse : Understand source-specific naming and organization
Process : Apply custom rules for organizing ROMs
Think of seeds as adapters that teach Datoso how to work with different ROM preservation communities and their DAT repositories.
Architecture
Each seed is a standalone Python package that follows a standard structure:
datoso-seed-{name}/
├── __init__.py # Metadata (__version__, __author__, __description__)
├── fetch.py # Download logic
├── actions.py # Processing pipeline definition
├── rules.py # System detection and folder organization
└── args.py (optional) # Additional CLI arguments
Seed Lifecycle
Available Official Seeds
Datoso supports multiple ROM preservation communities through official seeds:
Active Seeds
FBNeo Final Burn Neo arcade emulator DATs
No-Intro No-Intro Datomatic - Cartridge-based systems
Redump Redump - Disc-based systems
Pleasuredome Pleasuredome MAME sets
VPinMAME Visual Pinball ROM sets
WHDLoad Amiga WHDLoad packages
Eggman Teknoparrot and ALL.Net arcade ROMs
Deprecated Seeds
The following seeds are deprecated and included for backwards compatibility:
md_enhanced : Mega Drive Enhanced (use enhanced seed)
sfc_enhancedcolors : Super Famicom Enhanced Colors (use enhanced seed)
sfc_msu1 : Super Famicom MSU1 (use enhanced seed)
sfc_speedhacks : Super Famicom Speed Hacks (use enhanced seed)
translatedenglish : Translated English ROMs (superseded by newer organization)
Seed Details
FBNeo
Package : datoso-seed-fbneo
Final Burn Neo is a multi-system arcade emulator. This seed manages DAT files for arcade ROM sets.
Installation
Usage
Features
pip install datoso[fbneo]
# or
pip install datoso-seed-fbneo
# Fetch arcade DATs
datoso fbneo --fetch
# Process and organize
datoso fbneo --process
Arcade system detection
Board/hardware classification
BIOS file handling
Clone relationship management
No-Intro
Package : datoso-seed-nointro
No-Intro maintains preservation sets for cartridge-based systems through Datomatic.
Installation
Usage
Systems Covered
pip install datoso[nointro]
# or
pip install datoso-seed-nointro
# Fetch all No-Intro DATs
datoso nointro --fetch
# Process only Nintendo systems
datoso nointro --process --filter Nintendo
Nintendo (NES, SNES, N64, GameCube, Wii, etc.)
Sega (Genesis, Master System, Game Gear, etc.)
Sony handhelds (PSP, PS Vita)
Handheld systems (Game Boy, DS, 3DS, etc.)
Many other cartridge-based platforms
No-Intro DATs may require solving CAPTCHAs during fetch. Datoso will pause and prompt you if needed.
Redump
Package : datoso-seed-redump
Redump preserves disc-based systems with verified dumps including hashes for all tracks.
Installation
Usage
Systems Covered
pip install datoso[redump]
# or
pip install datoso-seed-redump
# Fetch Redump DATs
datoso redump --fetch
# Process PlayStation systems only
datoso redump --process --filter PlayStation
Sony (PlayStation, PS2, PS3, PSP)
Microsoft (Xbox, Xbox 360)
Nintendo (GameCube, Wii, Wii U)
Sega (Dreamcast, Saturn, CD, etc.)
PC and CD-ROM based systems
Pleasuredome
Package : datoso-seed-pleasuredome
Pleasuredome provides MAME ROM sets and related arcade preservation.
Installation
Usage
Features
pip install datoso[pleasuredome]
# or
pip install datoso-seed-pleasuredome
datoso pleasuredome --fetch
datoso pleasuredome --process
MAME full ROM sets
CHD (Compressed Hunks of Data) support
Software lists
BIOS collections
TDC (Total DOS Collection)
Package : datoso-seed-tdc
Total DOS Collection preserves DOS games and software.
pip install datoso[tdc]
# or
pip install datoso-seed-tdc
datoso tdc --fetch
datoso tdc --process
VPinMAME
Package : datoso-seed-vpinmame
Visual Pinball ROM sets for pinball machine emulation.
pip install datoso[vpinmame]
# or
pip install datoso-seed-vpinmame
datoso vpinmame --fetch
datoso vpinmame --process
WHDLoad
Package : datoso-seed-whdload
WHDLoad packages for Amiga games installed to hard disk.
pip install datoso[whdload]
# or
pip install datoso-seed-whdload
datoso whdload --fetch
datoso whdload --process
Eggman
Package : datoso-seed-eggman
Teknoparrot and ALL.Net arcade system ROMs.
pip install datoso[eggman]
# or
pip install datoso-seed-eggman
datoso eggman --fetch
datoso eggman --process
Installing Multiple Seeds
Install all official seeds at once:
Or select specific seeds:
pip install datoso[redump,nointro,fbneo]
Managing Seeds
List Installed Seeds
Output example:
Installed seeds:
* fbneo - Final Burn Neo arcade emulator DATs
* nointro - No-Intro Datomatic cartridge-based systems
* redump - Redump disc-based systems preservation
View Seed Details
datoso seed details redump
Output:
Seed redump details:
* Name: datoso_seed_redump
* Version: 1.0.1
* Author: Lacides Miranda
* Description: Redump disc-based systems preservation
Check Seed Health
# Check all seeds
datoso doctor
# Check specific seed
datoso doctor redump
The doctor command validates:
Python dependencies are installed
Module can be imported correctly
Required configuration exists
Network connectivity (for fetch operations)
Processing All Seeds
Process DATs from all installed seeds at once:
# Fetch from all seeds
datoso all --fetch
# Process all seeds
datoso all --process
# Combined operation
datoso all --fetch --process
How Seeds Work
Fetch Module
Each seed’s fetch.py implements the download logic:
def fetch ():
"""Download DAT files from source."""
# 1. Connect to source (HTTP, FTP, API, etc.)
# 2. Authenticate if needed
# 3. List available DATs
# 4. Download to tmp/{seed}/dats/
# 5. Handle errors and retries
Common fetch patterns:
HTTP scraping : Parse HTML to find download links
API calls : Use REST APIs where available
Direct downloads : Simple file downloads from known URLs
FTP : Connect to FTP servers for file retrieval
Rules Module
The rules.py module defines how to detect systems and organize folders:
from datoso.seeds.rules import Rules
class SeedRules ( Rules ):
def get_company ( self , name ):
"""Extract company from DAT name."""
if "Sony" in name:
return "Sony"
if "Nintendo" in name:
return "Nintendo"
return None
def get_system ( self , name ):
"""Extract system/platform."""
if "PlayStation 2" in name:
return "PlayStation 2"
return None
Actions Module
The actions.py module defines the processing pipeline:
def get_actions ():
"""Return action pipeline for processing."""
return {
' {dat_origin} ' : [
{ 'action' : 'LoadDatFile' , '_class' : DatFile},
{ 'action' : 'DeleteOld' , 'folder' : ' {dat_destination} ' },
{ 'action' : 'Copy' , 'folder' : ' {dat_destination} ' },
{ 'action' : 'Deduplicate' },
{ 'action' : 'SaveToDatabase' },
{ 'action' : 'MarkMias' },
]
}
Available actions:
LoadDatFile : Parse DAT file
DeleteOld : Remove outdated versions
Copy : Copy to organized location
Deduplicate : Remove duplicate ROMs
AutoMerge : Merge related DATs
SaveToDatabase : Persist metadata
MarkMias : Flag missing ROMs
Seed Configuration
Seeds can have their own configuration sections in datoso.config:
[REDUMP]
# Seed-specific settings
Username = your_username
Password = your_password
[NOINTRO]
# Override default actions
OverrideActions = LoadDatFile,Copy,SaveToDatabase
Creating Custom Seeds
While this documentation covers official seeds, you can create your own:
Clone the base seed template
git clone https://github.com/laromicas/datoso_seed_base
Implement required modules
__init__.py: Metadata
fetch.py: Download logic
actions.py: Processing pipeline
rules.py: System detection
Install and test
pip install -e .
datoso doctor your_seed
For detailed instructions on developing custom seeds, see the datoso_seed_base repository.
Seed Best Practices
Implement respectful rate limiting in fetch modules to avoid overwhelming source servers: import time
def fetch ():
for dat in dats:
download(dat)
time.sleep( 1 ) # Wait 1 second between downloads
Handle network errors gracefully and provide useful error messages: try :
response = requests.get(url, timeout = 30 )
response.raise_for_status()
except requests.RequestException as e:
logger.error( f "Failed to download { url } : { e } " )
return False
Only download changed DATs by checking dates or ETags: if remote_date > local_date:
download(dat)
else :
logger.info( f "Skipping { dat } , already up to date" )
Store credentials securely in configuration, never in code: from datoso.configuration import config
username = config.get( 'SEEDNAME' , 'Username' )
password = config.get( 'SEEDNAME' , 'Password' )
Troubleshooting Seeds
Seed Not Found
Module datoso_seed_redump not found
Solution : Install the seed package
pip install datoso-seed-redump
Import Errors
Error: cannot import name 'fetch' from 'datoso_seed_redump'
Solution : Update the seed to the latest version
pip install --upgrade datoso-seed-redump
Fetch Failures
Solution : Run doctor to diagnose
datoso doctor redump --verbose
Common causes:
Network connectivity issues
Source website changes
Authentication problems
Rate limiting or IP blocks
Next Steps