Discogs Collection Manager
The purr-fect tool for downloading and managing your Discogs music collection!
Note: DisCat is a fork-friendly, minimal-support project. Feel free to customize it for your needs! See CONTRIBUTING.md for details.
Three ways to manage your collection:
discogs_gui.py- GUI Application (RECOMMENDED) - Point and click interface1_download_collection.py- Download script with cache support2_sync_custom_fields.py- Sync metadata to custom fields
After running the download:
- discogs_collection_YYYYMMDD_HHMMSS.csv - Your entire collection with timestamp
- discogs_collection_YYYYMMDD_HHMMSS.json - Complete backup with timestamp
- discogs_collection_full.json - Latest version for sync script
- discogs_report.txt - Beautiful summary report with top formats, years, labels, genres, styles
- discogs_cache.json - Cache for faster subsequent downloads
The CSV includes:
- β Download timestamp - Know when data was fetched
- β Folder names - Electronic, Funk / Soul, etc.
- β All Discogs metadata (genres, styles, credits, tracklist, identifiers)
- β Marketplace pricing - Low price, median, # for sale
- β Community stats (have/want counts)
- β Your custom field values
- β Everything in one spreadsheet!
Download Python from https://python.org (check "Add to PATH" during install)
Open Command Prompt and run:
pip install requests- Go to https://www.discogs.com/settings/developers
- Click "Generate new token"
- Copy the token
All configuration now uses a single config.env file!
python discogs_gui.py- Go to Settings tab
- Enter token and username
- Click "Save Credentials"
- Creates/updates
config.envautomatically
Your credentials now work with BOTH GUI and CLI scripts!
# Copy the example file
cp config.env.example config.env
# Edit config.env with your credentials
DISCOGS_TOKEN=your_actual_token
DISCOGS_USERNAME=your_usernameOpen 1_download_collection.py and 2_sync_custom_fields.py, find:
USER_TOKEN = "YOUR_DISCOGS_TOKEN_HERE"
USERNAME = "YOUR_USERNAME_HERE"Replace with your actual credentials.
One Config File, All Tools: Whether you use GUI or CLI, credentials are shared via
config.env. No more managing multiple credential files!
cd C:\Discogs
python 1_download_collection.pyThis will:
- Download your collection (fast)
- Get custom field values (slow - 1 API call per item)
- Ask if you want full metadata (very slow - 1 API call per item)
- Export everything to CSV, JSON, and generate report
For 656 items: Basic download ~5 minutes, full metadata ~15-20 minutes
First, create custom fields in Discogs: https://www.discogs.com/settings/collection-fields
Then:
python 2_sync_custom_fields.pyEdit the script to uncomment the sync you want, run it, review the preview, then confirm.
- First download: ~15-20 minutes for full collection
- Subsequent downloads: ~2 minutes (only fetches new/changed items!)
- Automatic detection of new and modified items
- Cache stored locally in
discogs_cache.json
- Files named with date/time:
discogs_collection_20260208_143522.csv - Download date column in CSV for tracking
- Compare multiple exports to track price changes
- Folder names in CSV (Electronic, Funk / Soul, etc.)
- Organize and filter by folder
- Price Low (lowest listing)
- Price Median (average price)
- Number for Sale
- Community Have/Want counts
- Automatically handles merged/deleted releases
- Falls back to master release if specific release 404s
- No more missing metadata errors
discogs_gui.py - GUI Application
- Visual interface with tabs
- Real-time progress tracking
- Preview sync before applying
- All features in one place
- Use this for 90% of tasks
1_download_collection.py - Download Script
- Command-line interface
- Supports
-cflag for caching - Good for automation/scheduling
- All download features
2_sync_custom_fields.py - Sync Script
- Command-line interface
- Preview before syncing
- Validation for dropdowns
- Good for automation
discogs_collection_YYYYMMDD_HHMMSS.csv
- Timestamped collection export
- Open in Excel
- All metadata + custom fields
- Perfect for analysis
discogs_collection_YYYYMMDD_HHMMSS.json
- Timestamped complete backup
- Includes full tracklist, credits
- Used for comparisons
discogs_collection_full.json
- Latest version (no timestamp)
- Used by sync script
- Updated with each download
discogs_report.txt
- Summary statistics
- Top 10: formats, years, labels, genres, styles
- Collection overview
discogs_cache.json
- Local cache for incremental updates
- Stores all fetched data
- Delete to force full re-download
- Run
python discogs_gui.py - Go to Settings tab β Enter credentials
- Go to Download tab
- β Check "Use cache"
- β Check "Include custom field values"
- β Uncheck "Include full metadata" (for speed)
- Click "Download Collection"
- β±οΈ Wait ~5-10 minutes
You get: Basic collection with custom fields
- Run
python discogs_gui.py - Go to Download tab
- β Check all options
- Click "Download Collection"
- β±οΈ Wait ~15-20 minutes
You get: Everything including genres, styles, credits, pricing
# Monday - full download
python 1_download_collection.py -c
# Friday - incremental update (fast!)
python 1_download_collection.py -cCompare the CSV files to see price changes over the week.
Example: Copy release year to "Year" custom field
- Create "Year" custom field in Discogs: https://www.discogs.com/settings/collection-fields
- Run GUI β Sync Custom Fields tab
- Enter field name:
Year - Select: Year
- β Check "Ignore validation errors"
- Click "Preview Sync"
- Review changes
- Click "Execute Sync"
Now your Discogs "Year" field is populated from metadata!
# First of each month
python 1_download_collection.py -cKeep monthly snapshots:
discogs_collection_20260101_120000.csv
discogs_collection_20260201_120000.csv
discogs_collection_20260301_120000.csv
Track collection growth and value changes over time!
- Artist, Title, Year
- Format, Label, Catalog Number
- Master Release ID
- Date Added, Rating, Folder
- Genres & Styles - All genre/style tags
- Country - Country of release
- Release Date - Specific release date
- Tracklist - Complete track listing with durations
- Credits - All contributors (producers, engineers, etc.)
- Identifiers - Barcodes, matrix numbers, etc.
- Notes - Release notes from Discogs
- Companies - Manufacturing, distribution info
- Have Count - How many users own this
- Want Count - How many users want this
- Lowest Price - Current marketplace price
- Custom Field Values - All your custom fields
- Instance ID - Your specific copy ID
- Folder ID - Which folder it's in
Go to: https://www.discogs.com/settings/collection-fields
Two Types:
-
Text Fields - Free-form text
- Examples: Purchase Price, Location, Notes
-
Dropdown Fields - Predefined options
- Examples: Condition, Format Type, Want to Sell
- Options must match EXACTLY when syncing
Collector:
Purchase Date (text)
Purchase Price (text)
Purchase Location (text)
Storage Location (text)
Media Condition (dropdown: Mint, NM, VG+, VG, G)
Sleeve Condition (dropdown: Mint, NM, VG+, VG, G)
DJ:
BPM (text)
Key (text)
Energy (dropdown: High, Medium, Low)
Intro Length (text)
Outro Length (text)
Reseller:
Cost (text)
Target Price (text)
Sold Price (text)
Status (dropdown: Keep, Sell, Sold, Trade)
Platform (dropdown: Discogs, eBay, Local, N/A)
The sync script includes these extractors:
extract_year- Release yearextract_decade- Calculated decade (1970s, 1980s, etc.)extract_first_genre- First genre tagextract_format_simple- Simplified format (Vinyl, CD, Cassette, Digital, Other)
Creating Your Own Extractor:
def extract_my_field(item: Dict) -> Optional[str]:
"""Extract whatever you want from metadata."""
# Access basic info
year = item['basic_information'].get('year')
# Access detailed metadata
detailed = item.get('detailed_metadata', {})
country = detailed.get('country')
# Your logic here
if country == 'US' and year >= 2000:
return 'Modern American'
else:
return 'Other'For dropdown fields, values must match EXACTLY:
β
Correct: "Mint (M)" matches dropdown option "Mint (M)"
β Wrong: "Mint" doesn't match "Mint (M)"
β Wrong: "mint (m)" doesn't match "Mint (M)" (case-sensitive)
The sync script validates for you and shows which items fail.
Discogs API limits: 60 requests per minute
The scripts handle this automatically by:
- Pausing when rate limit gets low
- Conservative sleep times between requests
- Monitoring remaining requests
Expected times for 656 items:
- Basic collection: ~5 minutes
- Custom field values: ~15 minutes (1 API call per item)
- Full metadata: ~20 minutes (1 API call per item)
The scripts:
- β Read Discogs metadata (genres, year, etc.)
- β Update your custom fields
- β Update ratings, notes, folders
- β Never modify Discogs metadata (community-maintained)
For a 656-item collection:
- CSV: ~2-5 MB
- JSON: ~10-50 MB (depends on metadata depth)
- Report: ~5 KB
The cache stores complete metadata for all items locally:
- First download: Fetches everything (~15-20 min)
- Subsequent downloads: Only fetches new/changed items (~2 min)
- Compares by
instance_idanddate_added - Automatically updates cache after each download
Speed: 5-10x faster for subsequent downloads Smart: Only fetches what changed Automatic: No manual management needed Safe: Original data always preserved
GUI:
- β Check "Use cache" (default: ON)
- Cache saved automatically
Command Line:
# Use cache (incremental)
python 1_download_collection.py -c
# Force full download (no cache)
python 1_download_collection.py
# Clear cache and re-download
python 1_download_collection.py --clear-cache- β Cache file corrupted
- β Want to re-fetch all metadata (prices updated)
- β Testing/debugging
- β Major Discogs collection changes
discogs_cache.json - Same directory as scripts
Cause: Making API requests too fast Fix: Scripts now have smart rate limiting. This should rarely happen.
Cause: Release has been merged into master release Fix: Scripts automatically fall back to master release. You'll see:
β οΈ Release 404, trying master 123456...
β
Got data from master release
Cause: Using cached data, no new changes detected Fix: This is normal! If you want fresh data:
python 1_download_collection.py --clear-cacheCause: Using old version without folder support Fix: Re-download with latest version
Cause: Trying to sync values not in dropdown options Fix:
- Check "Ignore validation errors" to skip failed items
- Or adjust your extractor to return valid dropdown values
Cause: Rate limiting is working correctly Fix: This is normal. For large collections:
- Basic download: 5-10 minutes
- With custom fields: 15-30 minutes
- Full metadata: 20-40 minutes
Cause: Skipped full metadata enrichment Fix: Re-run download script and say 'yes' to enrichment
Cause: Some fields contain JSON data (tracklist, credits) Fix:
- Excel might show these as text - this is normal
- Use JSON file for programmatic access to this data
- Or add
json.loads()in Python to parse these fields
Run the download script monthly:
python 1_download_collection.pySave the JSON file with a date:
rename discogs_collection_full.json discogs_backup_2026-02-08.jsonAfter opening CSV in Excel:
Conditional Formatting:
- Highlight items over $50
- Color-code by condition
- Flag missing data
Pivot Tables:
- Count by format
- Total value by year
- Collection growth over time
Filters:
- Show only items to sell
- Find specific location
- Filter by genre/decade
Add columns in Excel:
- Age:
=YEAR(TODAY()) - [year] - Value/Item:
=[lowest_price](already have this) - Profit:
=[sold_price] - [purchase_price]
Sort by artist + title to spot duplicates, then:
- Keep best condition
- Mark others to sell
- Or keep different pressings
- Export monthly
- Compare
lowest_pricecolumn - Track which items are appreciating
- Identify good selling opportunities
- Custom Fields: https://www.discogs.com/settings/collection-fields
- API Documentation: https://www.discogs.com/developers
- Collection Management: https://www.discogs.com/my/collection
- Install Python: https://www.python.org/downloads/
- VS Code Editor: https://code.visualstudio.com/
If you run into issues:
- Check the error message - it usually tells you what's wrong
- Verify your token is correct
- Make sure username matches exactly
- Check file paths (Windows vs Linux)
- Try with a smaller test folder first
Common fixes:
- Token expired: Generate new one
- Username wrong: Check exact spelling
- File not found: Check working directory
- Rate limit: Script will pause automatically
These scripts are provided as-is for personal use with your Discogs collection.
MIT License - see LICENSE file for details.
DisCat is fork-friendly and minimal-support. See CONTRIBUTING.md.
- β Forks encouraged - customize for your needs!
- β Pull requests welcome - bug fixes and improvements
β οΈ Limited support - maintainer has limited time- π Documentation first - read docs before opening issues
Before opening an issue:
- Check existing issues
- Read the documentation (especially troubleshooting sections)
- Try the latest version
- Consider forking and fixing it yourself!
This is a minimal-support project - responses may be slow or not come at all.
If DisCat helps you organize your collection, consider giving it a star! β
DisCat was created to make Discogs collection management easier. It's designed to be:
- Simple and hackable
- Fork-friendly
- Cross-platform (Windows/Mac/Linux)
- Well-documented
Happy collecting! π΅