A comprehensive Flutter package to extract ASIN, product information, prices, and metadata from Amazon URLs. Supports all Amazon domains, affiliate links, shortened URLs, and provides widgets for displaying product information.
- âś… Extract ASIN from various Amazon URL formats
- âś… Extract product titles from URLs (when available)
- âś… Extract prices from URL parameters (when available)
- âś… Multi-domain support - All major Amazon domains (.com, .in, .uk, .ca, .au, .de, .fr, .it, .es, .jp, .mx, .br, .nl, etc.)
- âś… Affiliate link handling - Detect and manage affiliate tags
- âś… Short URL expansion - Expand amzn.to, amzn.eu shortened URLs
- âś… URL normalization - Convert to canonical product URLs
- âś… URL sanitization - Remove tracking parameters
- âś… Batch processing for multiple URLs
- âś… Intelligent caching with LRU eviction policy
- âś… Robust error handling with custom exceptions
- âś… URL validation and ASIN validation
- âś… Product metadata extraction - Variants, seller info, etc.
- âś… Availability detection (limited - requires API for full support)
- âś… URL builders - Build affiliate URLs, variant URLs, etc.
- âś… Product Preview Widget - Display product link previews
- âś… Product Card Widget - Rich product card component
- 🔄 Amazon Product Advertising API integration (placeholder - requires AWS SDK for full implementation)
Add this to your package's pubspec.yaml file:
dependencies:
amazon_url_extractor: ^0.1.0or run
flutter pub add amazon_url_extractorimport 'package:amazon_url_extractor/amazon_url_extractor.dart';
void main() {
const extractor = AmazonUrlExtractor();
// Extract ASIN
const url = 'https://www.amazon.com/dp/B08N5WRWNW';
final asin = extractor.extractAsin(url);
print('ASIN: $asin'); // B08N5WRWNW
}void main() async {
const extractor = AmazonUrlExtractor();
const url = 'https://www.amazon.com/dp/B08N5WRWNW?tag=affiliate-20';
try {
final result = await extractor.extractProductInfo(url);
print('ASIN: ${result.asin}');
print('Domain: ${result.domain.domain}');
print('Country: ${result.domain.countryCode}');
print('Currency: ${result.domain.currency}');
print('Title: ${result.title}');
print('Price: ${result.price?.formattedPrice}');
print('Affiliate Tag: ${result.affiliateInfo?.tag}');
print('Canonical URL: ${result.canonicalUrl}');
} catch (e) {
print('Error: $e');
}
}void main() {
const extractor = AmazonUrlExtractor();
// Product URL
final productResult = extractor.extract('https://www.amazon.com/dp/B08N5WRWNW');
if (productResult.isSuccess && productResult.value!.type == UrlType.product) {
final asin = productResult.value!.product!.asin;
print('Product ASIN: $asin');
}
// Search URL
final searchResult = extractor.extract('https://www.amazon.com/s?k=laptop');
if (searchResult.isSuccess && searchResult.value!.type == UrlType.search) {
final query = searchResult.value!.searchQuery;
print('Search query: $query');
}
}Extracts ASIN from an Amazon URL.
final asin = extractor.extractAsin(url);
if (asin != null) {
print('ASIN: $asin');
}Extracts comprehensive product information.
final result = await extractor.extractProductInfo(url);
print('ASIN: ${result.asin}');
print('Title: ${result.title}');
print('Price: ${result.price?.formattedPrice}');
print('Domain: ${result.domain.domain}');Processes any Amazon URL (expands if needed, then extracts).
final result = await extractor.processAmazonUrl(url);Expands shortened Amazon URLs (amzn.to, amzn.eu).
try {
final expanded = await ShortUrlExpander.expandShortUrl('https://amzn.to/abc123');
print('Expanded: $expanded');
} catch (e) {
print('Error: $e');
}Converts URL to canonical format.
final canonical = AmazonUrlNormalizer.canonicalProductUrl(url);
print('Canonical: $canonical'); // https://amazon.com/dp/B08N5WRWNWProcesses multiple URLs in batch.
final urls = [
'https://www.amazon.com/dp/B08N5WRWNW',
'https://www.amazon.in/dp/B08N5WRWNW',
];
final results = await extractor.processBatch(urls);
for (int i = 0; i < results.length; i++) {
if (results[i] != null) {
print('URL ${i + 1}: ASIN ${results[i]!.asin}');
}
}Validates if a URL is a valid Amazon URL.
final isValid = AmazonUrlValidators.isValidAmazonUrl(url);
print('Valid: $isValid');Validates ASIN format.
final isValid = AsinExtractor.isValidAsin('B08N5WRWNW');
print('Valid ASIN: $isValid');Extracts affiliate information from URL.
final info = AffiliateHandler.extractAffiliateInfo(url);
if (info.hasAffiliateTag) {
print('Affiliate tag: ${info.tag}');
}Adds affiliate tag to URL.
final urlWithTag = AffiliateHandler.addAffiliateTag(url, 'my-tag-20');Builds product URL with options.
final url = AmazonUrlBuilders.buildProductUrl(
asin: 'B08N5WRWNW',
domainOrUrl: 'amazon.com',
affiliateTag: 'test-20',
variants: {'size': 'large', 'color': 'black'},
);Gets domain information (country, currency, marketplace).
final domain = DomainMapper.getDomainInfo('https://www.amazon.in/dp/B08N5WRWNW');
print('Country: ${domain!.countryCode}'); // IN
print('Currency: ${domain.currency}'); // INR
print('Marketplace: ${domain.marketplace}');Clears the internal cache.
UrlExpansionCache.clear();Gets current cache size.
final size = UrlExpansionCache.size;
print('Cache size: $size');AmazonProductPreview(
imageUrl: 'https://example.com/image.jpg',
title: 'Product Title',
price: PriceInfo(formattedPrice: '\$29.99'),
availability: AvailabilityInfo(status: AvailabilityStatus.inStock),
asin: 'B08N5WRWNW',
onTap: () {
// Handle tap
},
)AmazonProductCard(
imageUrl: 'https://example.com/image.jpg',
title: 'Product Title',
subtitle: 'Product Subtitle',
price: PriceInfo(formattedPrice: '\$29.99'),
availability: AvailabilityInfo(
status: AvailabilityStatus.inStock,
isPrimeEligible: true,
),
reviewInfo: ReviewInfo(
averageRating: 4.5,
totalReviews: 1234,
),
asin: 'B08N5WRWNW',
onTap: () {
// Handle tap
},
)This package supports multiple Amazon URL formats:
- Product URLs:
/dp/ASIN,/gp/product/ASIN,/product/ASIN - Short URLs:
amzn.to,amzn.eu,a.co - Affiliate URLs: URLs with
tag,AssociateTag,linkCodeparameters - Wishlist URLs:
/gp/registry/wishlist/ID - Search URLs:
/s?k=query - Store URLs:
/stores/ID - Review URLs:
/review/ID
- amazon.com (US)
- amazon.co.uk (UK)
- amazon.ca (Canada)
- amazon.de (Germany)
- amazon.fr (France)
- amazon.it (Italy)
- amazon.es (Spain)
- amazon.in (India)
- amazon.co.jp (Japan)
- amazon.com.au (Australia)
- amazon.com.mx (Mexico)
- amazon.com.br (Brazil)
- amazon.nl (Netherlands)
- amazon.se (Sweden)
- amazon.pl (Poland)
- amazon.sg (Singapore)
- amazon.ae (UAE)
- amazon.sa (Saudi Arabia)
- amazon.tr (Turkey)
- amazon.eg (Egypt)
The package provides comprehensive error handling with custom exceptions:
try {
final result = await extractor.extractProductInfo(url);
} on InvalidUrlException catch (e) {
print('Invalid URL: ${e.message}');
} on UrlExpansionException catch (e) {
print('URL expansion failed: ${e.message}');
} on AsinExtractionException catch (e) {
print('ASIN extraction failed: ${e.message}');
} on UnsupportedDomainException catch (e) {
print('Unsupported domain: ${e.message}');
} catch (e) {
print('Unexpected error: $e');
}InvalidUrlException: Invalid URL formatUrlExpansionException: Short URL expansion failedAsinExtractionException: ASIN extraction failedInvalidAsinException: Invalid ASIN formatUnsupportedDomainException: Unsupported Amazon domainNetworkException: Network-related errorsApiException: API-related errors
- Automatic caching of expanded URLs
- LRU eviction policy to manage memory usage
- Configurable cache size (default: 100 entries)
- Cache management methods for manual control
- Efficient batch processing for multiple URLs
- Error isolation - one failed URL doesn't affect others
- Memory efficient processing
For fetching detailed product information, you can integrate with Amazon PA-API. This package provides a placeholder interface. For full implementation, use AWS SDK or implement proper AWS Signature Version 4 signing.
final api = AmazonProductAdvertisingApi(
accessKey: 'your-access-key',
secretKey: 'your-secret-key',
partnerTag: 'your-associate-tag',
);
// Note: Full implementation requires AWS Signature Version 4 signing
// See: https://webservices.amazon.com/paapi5/documentation/Contributions are welcome! Please feel free to submit a Pull Request.
This project is licensed under the MIT License. See the LICENSE file for more details.