231 lines
No EOL
6.5 KiB
Markdown
231 lines
No EOL
6.5 KiB
Markdown
# Card Data Sources Guide
|
|
|
|
This guide explains how to build out your card database using external APIs and data sources.
|
|
|
|
## 🎯 **Recommended Data Sources**
|
|
|
|
### **1. Scryfall API (Magic: The Gathering)**
|
|
**Best for MTG cards**
|
|
- **URL**: https://api.scryfall.com
|
|
- **Free**: No API key required
|
|
- **Rate Limit**: 10 requests/second
|
|
- **Coverage**: All MTG cards with images, prices, rulings
|
|
|
|
**Example Usage**:
|
|
```javascript
|
|
// Search for a card
|
|
const response = await fetch('https://api.scryfall.com/cards/named?fuzzy=lightning+bolt');
|
|
const card = await response.json();
|
|
|
|
// Search multiple cards
|
|
const searchResponse = await fetch('https://api.scryfall.com/cards/search?q=game:paper+type:creature');
|
|
const cards = await searchResponse.json();
|
|
```
|
|
|
|
### **2. Pokémon TCG API**
|
|
**Best for Pokémon cards**
|
|
- **URL**: https://api.pokemontcg.io/v2
|
|
- **Free**: No authentication required
|
|
- **Rate Limit**: Generous limits
|
|
- **Coverage**: All Pokémon cards with images
|
|
|
|
**Example Usage**:
|
|
```javascript
|
|
// Search for a card
|
|
const response = await fetch('https://api.pokemontcg.io/v2/cards?q=name:pikachu');
|
|
const cards = await response.json();
|
|
```
|
|
|
|
### **3. Yu-Gi-Oh! API**
|
|
**Best for Yu-Gi-Oh! cards**
|
|
- **URL**: https://db.ygoprodeck.com/api/v7
|
|
- **Free**: Open source API
|
|
- **Coverage**: All Yu-Gi-Oh! cards
|
|
|
|
**Example Usage**:
|
|
```javascript
|
|
// Search for a card
|
|
const response = await fetch('https://db.ygoprodeck.com/api/v7/cardinfo.php?fname=Blue-Eyes%20White%20Dragon');
|
|
const cards = await response.json();
|
|
```
|
|
|
|
### **4. Disney Lorcana**
|
|
**For Lorcana cards**
|
|
- **Status**: No official API available yet
|
|
- **Alternative**: Manual data entry or community data scraping
|
|
- **Future**: May have official API when game matures
|
|
|
|
## 🚀 **Implementation Strategy**
|
|
|
|
### **Phase 1: Core Integration**
|
|
1. **Set up rate limiting** for each API
|
|
2. **Create unified search interface** that queries all sources
|
|
3. **Implement caching** to avoid repeated requests
|
|
4. **Add error handling** for API failures
|
|
|
|
### **Phase 2: Database Population**
|
|
1. **Fetch popular cards** from each game
|
|
2. **Store in local database** with proper metadata
|
|
3. **Update pricing** regularly
|
|
4. **Add image caching** for better performance
|
|
|
|
### **Phase 3: Advanced Features**
|
|
1. **Real-time pricing** from multiple sources
|
|
2. **Set completion tracking**
|
|
3. **Market trend analysis**
|
|
4. **Deck building suggestions**
|
|
|
|
## 📊 **Data Mapping**
|
|
|
|
### **Universal Fields**
|
|
| Field | Description | Source |
|
|
|-------|-------------|--------|
|
|
| `name` | Card name | All APIs |
|
|
| `game` | Game identifier | All APIs |
|
|
| `set_name` | Set/expansion name | All APIs |
|
|
| `set_code` | Set abbreviation | All APIs |
|
|
| `card_number` | Collector number | All APIs |
|
|
| `rarity` | Rarity level | All APIs |
|
|
| `image_url` | Card image URL | All APIs |
|
|
| `current_price` | Market price | MTG, Pokémon |
|
|
|
|
### **Game-Specific Fields**
|
|
|
|
#### **Magic: The Gathering**
|
|
- `mana_cost`: Mana symbols `{W}{U}{B}{R}{G}{C}`
|
|
- `cmc`: Converted mana cost
|
|
- `card_type`: Full type line
|
|
- `colors`: Color identity
|
|
- `oracle_text`: Rules text
|
|
- `power`/`toughness`: Creature stats
|
|
|
|
#### **Pokémon**
|
|
- `mana_cost`: Energy requirements
|
|
- `cmc`: Total energy cost
|
|
- `card_type`: Card type + stage
|
|
- `colors`: Energy types
|
|
- `power`: HP value
|
|
- `oracle_text`: Effect text
|
|
|
|
#### **Yu-Gi-Oh!**
|
|
- `mana_cost`: Level/rank
|
|
- `cmc`: Level value
|
|
- `card_type`: Card type
|
|
- `colors`: Attribute
|
|
- `oracle_text`: Effect text
|
|
- `power`/`toughness`: ATK/DEF
|
|
|
|
## 🛠️ **Usage Examples**
|
|
|
|
### **Search Cards from External APIs**
|
|
```javascript
|
|
import cardDataService from '../services/cardDataSources';
|
|
|
|
// Search across all games
|
|
const cards = await cardDataService.searchCards('dragon');
|
|
|
|
// Search specific game
|
|
const mtgCards = await cardDataService.searchCards('lightning', 'MTG');
|
|
```
|
|
|
|
### **Add Cards to Database**
|
|
```javascript
|
|
// Fetch card from external API
|
|
const card = await mtgService.getCardByName('Lightning Bolt');
|
|
|
|
// Add to local database
|
|
const result = await databaseAPI.addCard(card);
|
|
```
|
|
|
|
### **Populate Database with Popular Cards**
|
|
```bash
|
|
# Run the population script
|
|
node scripts/populate-card-database.js
|
|
```
|
|
|
|
## 📈 **Performance Considerations**
|
|
|
|
### **Rate Limiting**
|
|
- **Scryfall**: 10 requests/second
|
|
- **Pokémon API**: 5 requests/second
|
|
- **Yu-Gi-Oh! API**: No strict limits
|
|
|
|
### **Caching Strategy**
|
|
- **Search results**: Cache for 5 minutes
|
|
- **Card details**: Cache for 1 hour
|
|
- **Images**: Cache indefinitely
|
|
- **Pricing**: Update every 24 hours
|
|
|
|
### **Error Handling**
|
|
- **API failures**: Retry with exponential backoff
|
|
- **Rate limits**: Implement proper queuing
|
|
- **Network issues**: Graceful degradation
|
|
|
|
## 🔧 **Setup Instructions**
|
|
|
|
### **1. Install Dependencies**
|
|
```bash
|
|
npm install node-fetch
|
|
```
|
|
|
|
### **2. Set Environment Variables**
|
|
```bash
|
|
# .env
|
|
REACT_APP_API_URL=http://localhost:8000
|
|
TCG_VAULT_TOKEN=your_auth_token_here
|
|
```
|
|
|
|
### **3. Run Database Population**
|
|
```bash
|
|
# Populate with popular cards
|
|
node scripts/populate-card-database.js
|
|
|
|
# Or use the web interface
|
|
# Navigate to Cards page → "Browse Database" button
|
|
```
|
|
|
|
### **4. Test the Integration**
|
|
```javascript
|
|
// Test external API search
|
|
const cards = await cardDataService.searchCards('pikachu', 'POKEMON');
|
|
console.log('Found cards:', cards.length);
|
|
|
|
// Test database addition
|
|
const card = await mtgService.getCardByName('Lightning Bolt');
|
|
if (card) {
|
|
await databaseAPI.addCard(card);
|
|
console.log('Card added to database');
|
|
}
|
|
```
|
|
|
|
## 🎯 **Next Steps**
|
|
|
|
### **Immediate Actions**
|
|
1. **Test the APIs** with the provided services
|
|
2. **Populate your database** with popular cards
|
|
3. **Integrate the browser component** into your app
|
|
4. **Set up regular updates** for pricing data
|
|
|
|
### **Future Enhancements**
|
|
1. **Add more games** (Lorcana, Flesh and Blood, etc.)
|
|
2. **Implement price tracking** with alerts
|
|
3. **Add set completion tracking**
|
|
4. **Create deck building suggestions**
|
|
5. **Add market analysis tools**
|
|
|
|
## 📚 **Additional Resources**
|
|
|
|
- **Scryfall API Docs**: https://scryfall.com/docs/api
|
|
- **Pokémon TCG API**: https://dev.pokemontcg.io/
|
|
- **Yu-Gi-Oh! API**: https://ygoprodeck.com/api-guide/
|
|
- **TCGPlayer API**: https://docs.tcgplayer.com/
|
|
|
|
## 🚨 **Important Notes**
|
|
|
|
1. **Respect rate limits** - Implement proper throttling
|
|
2. **Cache responses** - Avoid unnecessary API calls
|
|
3. **Handle errors gracefully** - APIs can be unreliable
|
|
4. **Update pricing regularly** - Card values change frequently
|
|
5. **Verify card data** - Cross-reference with official sources
|
|
|
|
This implementation provides a solid foundation for building a comprehensive card database that can grow with your application's needs! |