A powerful command-line tool and REST API for searching apps and downloading their icons from App Store and Google Play Store in multiple sizes.
Perfect for developers, designers, and anyone who needs quick access to high-quality app icons for mockups, presentations, or development projects.
- Interactive CLI with user-friendly menus and selection
- REST API Server for programmatic access and integration
- Cross-platform support (Windows, macOS, Linux)
- App Store search using iTunes Search API
- Google Play Store search via SerpApi integration
- Multi-store search capabilities
- Country-specific search results
- Multiple sizes: 16px to 1024px icons
- Batch downloads with progress tracking
- Custom size selection
- Organized file structure with app-specific folders
- Interactive selection - choose specific apps to download
- Bulk download option for all search results
- Real-time progress indicators
- Detailed app information display with ratings and prices
app-store-icon-hunter/
βββ README.md
βββ setup.py
βββ requirements.txt
βββ .gitignore
βββ LICENSE
βββ app_store_icon_hunter/ # Main package
β βββ __init__.py
β βββ cli/ # Command-line interface
β β βββ __init__.py
β β βββ main.py # Enhanced CLI with interactive selection
β βββ api/ # REST API server
β β βββ __init__.py
β β βββ main.py # FastAPI server
β βββ core/ # Core functionality
β β βββ __init__.py
β β βββ app_store.py # App Store API integration
β β βββ google_play.py # Google Play API integration
β β βββ downloader.py # Icon downloading logic
β βββ utils/ # Utility functions
β βββ __init__.py
β βββ helpers.py # Helper functions
βββ tests/ # Test suite
β βββ __init__.py
β βββ test_cli.py
β βββ test_api.py
β βββ test_core.py
βββ docs/ # Documentation
β βββ api.md # API documentation
β βββ cli.md # CLI documentation
β βββ examples.md # Usage examples
βββ examples/ # Example scripts
βββ basic_usage.py # Basic usage example
βββ api-example.py # API client example
βββ batch_download.py # Batch download example
# Install from PyPI (when published)
pip install app-store-icon-hunter
# Or install from source
git clone https://github.com/Garyku0/app-store-icon-hunter.git
cd app-store-icon-hunter
pip install -e .For Google Play Store search functionality, you'll need a SerpApi key:
export SERPAPI_KEY="your_serpapi_key_here"# Search and select apps interactively
icon-hunter search "Instagram"
# Search specific store
icon-hunter search "WhatsApp" --store appstore
# Auto-download all results
icon-hunter search "Spotify" --auto-download
# Custom icon sizes and output directory
icon-hunter search "Telegram" --sizes "64,128,256" --output "./my_icons"
# Interactive mode with guided prompts
icon-hunter interactiveicon-hunter search "Discord" --sizes 64,128,256,512
icon-hunter download "Twitter" --sizes 128,256
### API Server Usage
```bash
# Start the API server
icon-hunter server
# or
uvicorn app_store_icon_hunter.api.main:app --reload --port 8000
# Server will be available at:
# http://localhost:8000 - API endpoints
# http://localhost:8000/docs - Interactive documentation
The enhanced search command now provides interactive selection:
icon-hunter search [SEARCH_TERM] [OPTIONS]Options:
--store: Choose store (appstore,googleplay,both)--country: Country code (default:us)--limit: Maximum results (default:10)--output: Output directory (default:icons)--sizes: Comma-separated icon sizes--auto-download/--interactive: Download mode
Interactive Mode Example:
$ icon-hunter search "Instagram"
π Searching for 'Instagram' in both...
================================================================================
# App Name Store Price Rating
================================================================================
1 Instagram App Store Free 4.5/5
2 Instagram Lite Google Play Free 4.2/5
3 Instagram for Business App Store Free 4.1/5
================================================================================
Options:
β’ Enter numbers separated by commas (e.g., 1,3,5)
β’ Enter 'all' to download all apps
β’ Enter 'q' to quit
Your choice: 1,2
π₯ Downloading icons in sizes: 64, 128, 256, 512...
β Downloaded 4 icon sizes for Instagram
β Downloaded 4 icon sizes for Instagram Lite
β
Successfully downloaded icons for 2 apps
π Icons saved to: /path/to/iconsDirect download for specific apps:
icon-hunter download [APP_NAME] [OPTIONS]Start the API server:
icon-hunter serverView current configuration:
icon-hunter configPOST /searchRequest Body:
{
"term": "Instagram",
"store": "both",
"country": "us",
"limit": 10
}Response:
[
{
"name": "Instagram",
"bundle_id": "com.burbn.instagram",
"icon_url": "https://is1-ssl.mzstatic.com/image/thumb/Purple123/v4/...",
"store": "App Store",
"price": "Free",
"rating": 4.5,
"description": "Instagram is a simple way to capture and share..."
}
]POST /downloadRequest Body:
{
"apps": [
{
"name": "Instagram",
"icon_url": "https://...",
"bundle_id": "com.burbn.instagram"
}
],
"sizes": [64, 128, 256, 512],
"format": "zip"
}Response:
{
"job_id": "123e4567-e89b-12d3-a456-426614174000",
"status": "started",
"message": "Download job started for 1 apps",
"status_url": "/status/123e4567-e89b-12d3-a456-426614174000"
}GET /status/{job_id}Response:
{
"job_id": "123e4567-e89b-12d3-a456-426614174000",
"status": "completed",
"progress": 1,
"total": 1,
"download_url": "/download/123e4567-e89b-12d3-a456-426614174000"
}GET /download/{job_id}Returns the ZIP file with all downloaded icons.
# Google Play Store API (optional)
export SERPAPI_KEY="your_serpapi_key_here"
# Custom output directory
export ICON_HUNTER_OUTPUT_DIR="/path/to/downloads"
# API server configuration
export ICON_HUNTER_HOST="0.0.0.0"
export ICON_HUNTER_PORT="8000"The tool supports all standard icon sizes:
- Tiny: 16px, 32px
- Small: 48px, 64px
- Medium: 128px, 256px
- Large: 512px, 1024px
Platform-specific recommendations:
- iOS: 57, 72, 114, 144, 512, 1024
- Android: 48, 72, 96, 144, 192
- Web: 16, 32, 48, 96, 128
- Desktop: 128, 256, 512
import requests
# Search for apps
response = requests.post("http://localhost:8000/search", json={
"term": "Instagram",
"store": "appstore",
"limit": 5
})
apps = response.json()
# Start download
download_response = requests.post("http://localhost:8000/download", json={
"apps": apps[:2], # Download first 2 apps
"sizes": [128, 256, 512],
"format": "zip"
})
job_id = download_response.json()["job_id"]
# Check status
status_response = requests.get(f"http://localhost:8000/status/{job_id}")
print(status_response.json())#!/usr/bin/env python3
import subprocess
import time
apps_to_download = [
"Instagram", "WhatsApp", "Twitter", "Facebook", "Snapchat"
]
for app in apps_to_download:
print(f"Downloading {app}...")
subprocess.run([
"icon-hunter", "download", app,
"--sizes", "128,256,512",
"--output", f"icons/{app.lower()}"
])
time.sleep(1) # Be respectful to APIs
print("All downloads completed!")# Clone the repository
git clone https://github.com/username/app-store-icon-hunter.git
cd app-store-icon-hunter
# Create virtual environment
python -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
# Install development dependencies
pip install -e ".[dev]"
# Install pre-commit hooks
pre-commit install# Run all tests
pytest
# Run with coverage
pytest --cov=app_store_icon_hunter
# Run specific test file
pytest tests/test_cli.py# Format code
black app_store_icon_hunter/
# Lint code
flake8 app_store_icon_hunter/
# Type checking
mypy app_store_icon_hunter/# Build package
python setup.py sdist bdist_wheel
# Upload to PyPI (with proper credentials)
twine upload dist/*When running the API server, interactive documentation is available at:
- Swagger UI:
http://localhost:8000/docs - ReDoc:
http://localhost:8000/redoc
We welcome contributions! Please see our Contributing Guidelines for details.
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
git clone https://github.com/your-username/app-store-icon-hunter.git
cd app-store-icon-hunter
pip install -e ".[dev]"The project includes automated scripts for publishing to PyPI:
# Test upload to TestPyPI first (recommended)
./scripts/upload_to_pypi.sh --test
# Upload to PyPI
./scripts/upload_to_pypi.sh
# Or use the Python version
python3 scripts/upload_to_pypi.py --test # TestPyPI
python3 scripts/upload_to_pypi.py # PyPIBefore publishing:
- Update version in
setup.py - Ensure you have
twineinstalled:pip install twine - Have your PyPI API token ready
See scripts/README.md for detailed documentation.
This project is licensed under the MIT License - see the LICENSE file for details.
- iTunes Search API for App Store data
- SerpApi for Google Play Store integration
- Click for the beautiful CLI interface
- FastAPI for the high-performance API server
- Contributors who make this project better
Please use GitHub Issues to report bugs or request features.
Bug Report Template:
**Description**
A clear description of the bug.
**Steps to Reproduce**
1. Run command '...'
2. See error
**Expected Behavior**
What should happen.
**Environment**
- OS: [e.g., macOS 12.0]
- Python: [e.g., 3.9.0]
- Version: [e.g., 2.0.0]
- Image resizing with PIL/Pillow
- SVG icon support
- Batch processing from CSV files
- Desktop GUI application
- Icon optimization and compression
- Advanced filtering options
- Custom icon processing pipelines
- Integration with design tools (Figma, Sketch)
- Machine learning-based icon similarity search
- Icon generation and customization
- Cloud storage integration
- Team collaboration features
- Search Performance: ~500ms per API call
- Download Speed: ~2MB/s average (network dependent)
- Concurrent Downloads: Up to 10 simultaneous
- Memory Usage: <50MB typical
- Use smaller icon size sets for faster downloads
- Leverage the
--auto-downloadflag for batch operations - Set up API keys for Google Play Store access
- Use the API server for high-frequency operations
- CORS enabled for web integration
- Rate limiting on endpoints
- Input validation and sanitization
- Secure file handling
- No user data collection
- No icon content modification
- Temporary file cleanup
- Respect for API rate limits
Made with β€οΈ for the developer community
If this project helped you, please consider giving it a β on GitHub!