ewere / app.py
andevs's picture
Update app.py
069eef8 verified
Raw
History Blame Contribute Delete
145 kB
from fastapi import FastAPI, Request, File, UploadFile, HTTPException, WebSocket, WebSocketDisconnect
from fastapi.middleware.cors import CORSMiddleware
from datetime import datetime, timedelta
import logging
import gradio as gr
import uvicorn
import random
import os
from typing import List, Dict, Any, Optional
import numpy as np
from PIL import Image
import io
import json
import base64
import asyncio
import jwt
import httpx
import re
from bs4 import BeautifulSoup
from contextlib import asynccontextmanager
import hashlib
import cv2 # <-- ADDED for face detection
# Configure logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
# ============================================
# GLOBAL VARIABLES
# ============================================
HF_TOKEN = os.getenv("HF_TOKEN")
client = None
HF_AVAILABLE = False
# Try to import Hugging Face
try:
from huggingface_hub import InferenceClient
HF_AVAILABLE = True
except ImportError:
HF_AVAILABLE = False
logger.warning("huggingface_hub not available")
# Initialize Hugging Face client if token exists
if HF_TOKEN and HF_AVAILABLE:
try:
client = InferenceClient(token=HF_TOKEN)
logger.info("✅ HF Token found - will test during first analysis")
except Exception as e:
logger.error(f"❌ Failed to initialize client: {e}")
client = None
else:
logger.warning("⚠️ DEMO MODE: No HF_TOKEN found")
# ============================================
# COMPREHENSIVE SKIN CONDITIONS LIST
# ============================================
ALL_CONDITIONS = [
# Acne & Pimples
{"id": "acne", "name": "Acne", "base_conf": 75},
{"id": "blackheads", "name": "Blackheads", "base_conf": 72},
{"id": "whiteheads", "name": "Whiteheads", "base_conf": 70},
{"id": "papules", "name": "Papules", "base_conf": 68},
{"id": "pustules", "name": "Pustules", "base_conf": 71},
{"id": "cystic-acne", "name": "Cystic Acne", "base_conf": 65},
{"id": "hormonal-acne", "name": "Hormonal Acne", "base_conf": 73},
{"id": "fungal-acne", "name": "Fungal Acne", "base_conf": 69},
{"id": "nodular-acne", "name": "Nodular Acne", "base_conf": 64},
{"id": "back-acne", "name": "Back Acne", "base_conf": 70},
# Pigmentation
{"id": "hyperpigmentation", "name": "Hyperpigmentation", "base_conf": 82},
{"id": "melasma", "name": "Melasma", "base_conf": 78},
{"id": "pih", "name": "Post-Inflammatory Hyperpigmentation", "base_conf": 80},
{"id": "sun-spots", "name": "Sun Spots", "base_conf": 75},
{"id": "age-spots", "name": "Age Spots", "base_conf": 74},
{"id": "freckles", "name": "Freckles", "base_conf": 85},
{"id": "dark-underarms", "name": "Dark Underarms", "base_conf": 76},
{"id": "dark-knees", "name": "Dark Knees", "base_conf": 75},
{"id": "dark-elbows", "name": "Dark Elbows", "base_conf": 75},
# Texture & Bumps
{"id": "keratosis-pilaris", "name": "Keratosis Pilaris", "base_conf": 70},
{"id": "enlarged-pores", "name": "Enlarged Pores", "base_conf": 76},
{"id": "sebaceous-filaments", "name": "Sebaceous Filaments", "base_conf": 72},
{"id": "milia", "name": "Milia", "base_conf": 68},
{"id": "skin-tags", "name": "Skin Tags", "base_conf": 65},
# Dry & Sensitive
{"id": "dry-skin", "name": "Dry Skin", "base_conf": 80},
{"id": "dehydrated-skin", "name": "Dehydrated Skin", "base_conf": 78},
{"id": "eczema", "name": "Eczema", "base_conf": 75},
{"id": "contact-dermatitis", "name": "Contact Dermatitis", "base_conf": 70},
{"id": "sensitive-skin", "name": "Sensitive Skin", "base_conf": 74},
{"id": "perioral-dermatitis", "name": "Perioral Dermatitis", "base_conf": 69},
{"id": "seborrheic-dermatitis", "name": "Seborrheic Dermatitis", "base_conf": 73},
{"id": "psoriasis", "name": "Psoriasis", "base_conf": 71},
{"id": "rosacea", "name": "Rosacea", "base_conf": 72},
# Oily & Combination
{"id": "oily-skin", "name": "Oily Skin", "base_conf": 78},
{"id": "combination-skin", "name": "Combination Skin", "base_conf": 76},
{"id": "oily-t-zone", "name": "Oily T-Zone", "base_conf": 77},
# Aging & Firmness
{"id": "fine-lines", "name": "Fine Lines", "base_conf": 74},
{"id": "wrinkles", "name": "Wrinkles", "base_conf": 72},
{"id": "crow-feet", "name": "Crow's Feet", "base_conf": 71},
{"id": "forehead-lines", "name": "Forehead Lines", "base_conf": 70},
{"id": "smile-lines", "name": "Smile Lines", "base_conf": 69},
{"id": "loss-of-elasticity", "name": "Loss of Elasticity", "base_conf": 68},
{"id": "sagging-skin", "name": "Sagging Skin", "base_conf": 66},
{"id": "dull-skin", "name": "Dull Skin", "base_conf": 73},
# Marks & Scars
{"id": "acne-scars", "name": "Acne Scars", "base_conf": 65},
{"id": "stretch-marks", "name": "Stretch Marks", "base_conf": 68},
{"id": "keloid-scars", "name": "Keloid Scars", "base_conf": 64},
{"id": "surgical-scars", "name": "Surgical Scars", "base_conf": 63},
# Sun & Environmental
{"id": "sunburn", "name": "Sunburn", "base_conf": 77},
{"id": "sun-damage", "name": "Sun Damage", "base_conf": 74},
{"id": "photoaging", "name": "Photoaging", "base_conf": 72},
# Razor & Hair-Related
{"id": "razor-bumps", "name": "Razor Bumps", "base_conf": 73},
{"id": "ingrown-hairs", "name": "Ingrown Hairs", "base_conf": 72},
{"id": "folliculitis", "name": "Folliculitis", "base_conf": 70},
# Scalp & Body
{"id": "dandruff", "name": "Dandruff", "base_conf": 77},
{"id": "heat-rash", "name": "Heat Rash", "base_conf": 75},
{"id": "tinea-versicolor", "name": "Tinea Versicolor", "base_conf": 70}
]
# ============================================
# LIFESPAN HANDLER
# ============================================
@asynccontextmanager
async def lifespan(app: FastAPI):
logger.info("🚀 Glow AI Starting up...")
# Start price updater
asyncio.create_task(update_all_prices_periodically())
yield
logger.info("👋 Glow AI Shutting down...")
app = FastAPI(
title="Glow AI - Skincare & Cosmetics AI",
description="AI-powered skin analysis and cosmetics matching platform",
version="2.0.0",
lifespan=lifespan
)
# CORS Configuration
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# ============================================
# AUTHENTICATION SETUP
# ============================================
SECRET_KEY = os.getenv("SECRET_KEY", "your-secret-key-here-change-in-production")
ALGORITHM = "HS256"
USERS = {
"test@example.com": {
"password": "password123",
"name": "Test User",
"user_id": "usr001",
"created_at": datetime.utcnow().isoformat()
}
}
def create_access_token(data: dict):
to_encode = data.copy()
expire = datetime.utcnow() + timedelta(hours=24)
to_encode.update({"exp": expire})
encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)
return encoded_jwt
def verify_token(token: str):
try:
payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
return payload
except jwt.PyJWTError:
return None
# ============================================
# COMPLETE PRODUCT DATABASE (150+ products)
# ============================================
class ProductDatabase:
def __init__(self):
self.products = []
self.last_updated = {}
self.load_all_products()
def load_all_products(self):
"""Load ALL 150+ products from the Nigerian market"""
self.products = [
# ===== CERAVE (13 products) =====
{
"id": "crv001",
"name": "CeraVe Hydrating Cleanser",
"brand": "CeraVe",
"category": "cleanser",
"subcategory": "hydrating",
"size": "236ml",
"price": 12400,
"original_price": 11400,
"rating": 4.8,
"reviews": 12453,
"description": "Hydrating cleanser with ceramides for normal to dry skin",
"benefits": ["Hydrating", "Non-stripping", "Ceramides"],
"skin_types": ["dry", "normal", "sensitive"],
"ingredients": ["Ceramides", "Hyaluronic Acid", "Glycerin"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/cerave-hydrating-cleanser-236ml-8oz-uk-version",
"tags": ["bestseller", "dermatologist_recommended"],
"image_url": "/images/cerave-hydrating.jpg"
},
{
"id": "crv002",
"name": "CeraVe Foaming Cleanser",
"brand": "CeraVe",
"category": "cleanser",
"subcategory": "foaming",
"size": "236ml",
"price": 15700,
"original_price": 14700,
"rating": 4.7,
"reviews": 8923,
"description": "Foaming cleanser for normal to oily skin",
"benefits": ["Removes oil", "Non-drying", "Ceramides"],
"skin_types": ["oily", "combination"],
"ingredients": ["Ceramides", "Niacinamide", "Glycerin"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/cerave-foaming-cleanser-uk-version-236ml-8oz",
"image_url": "/images/cerave-foaming.jpg"
},
{
"id": "crv003",
"name": "CeraVe Foaming Cleanser (Family Size)",
"brand": "CeraVe",
"category": "cleanser",
"subcategory": "foaming",
"size": "473ml",
"price": 19300,
"original_price": 18300,
"rating": 4.8,
"reviews": 5678,
"description": "Foaming cleanser for normal to oily skin (family size)",
"benefits": ["Removes oil", "Non-drying", "Ceramides"],
"skin_types": ["oily", "combination"],
"ingredients": ["Ceramides", "Niacinamide", "Glycerin"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/cerave-foaming-cleanser-uk-version-473ml-16oz",
"image_url": "/images/cerave-foaming-family.jpg"
},
{
"id": "crv004",
"name": "CeraVe Hydrating Cream-to-Foam Cleanser",
"brand": "CeraVe",
"category": "cleanser",
"subcategory": "hydrating",
"size": "236ml",
"price": 14600,
"original_price": 13600,
"rating": 4.7,
"reviews": 3456,
"description": "Cream-to-foam cleanser for normal to dry skin",
"benefits": ["Hydrating", "Non-stripping", "Ceramides"],
"skin_types": ["dry", "normal"],
"ingredients": ["Ceramides", "Hyaluronic Acid"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/cerave-hydrating-cream-to-foam-cleanser-236ml-8oz-uk-version",
"image_url": "/images/cerave-cream-foam.jpg"
},
{
"id": "crv005",
"name": "CeraVe SA Smoothing Cleanser",
"brand": "CeraVe",
"category": "cleanser",
"subcategory": "exfoliating",
"size": "236ml",
"price": 15200,
"original_price": 14200,
"rating": 4.7,
"reviews": 6789,
"description": "Salicylic acid cleanser for rough, bumpy skin",
"benefits": ["Exfoliates", "Smooths texture", "Ceramides"],
"skin_types": ["rough", "acne-prone", "keratosis pilaris"],
"ingredients": ["Salicylic Acid", "Ceramides", "Niacinamide"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/cerave-sa-smoothing-cleanser-236ml-8oz",
"image_url": "/images/cerave-sa.jpg"
},
{
"id": "crv006",
"name": "CeraVe SA Smoothing Cleanser (Family Size)",
"brand": "CeraVe",
"category": "cleanser",
"subcategory": "exfoliating",
"size": "473ml",
"price": 21900,
"original_price": 20900,
"rating": 4.8,
"reviews": 2345,
"description": "Salicylic acid cleanser (family size)",
"benefits": ["Exfoliates", "Smooths texture", "Ceramides"],
"skin_types": ["rough", "acne-prone"],
"ingredients": ["Salicylic Acid", "Ceramides"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/cerave-sa-smoothing-cleanser-473ml-16oz",
"image_url": "/images/cerave-sa-family.jpg"
},
{
"id": "crv007",
"name": "CeraVe Blemish Control Cleanser",
"brand": "CeraVe",
"category": "cleanser",
"subcategory": "treatment",
"size": "236ml",
"price": 16200,
"original_price": 15200,
"rating": 4.6,
"reviews": 3456,
"description": "Blemish control cleanser with salicylic acid",
"benefits": ["Fights blemishes", "Exfoliates", "Ceramides"],
"skin_types": ["acne-prone", "oily"],
"ingredients": ["Salicylic Acid", "Ceramides", "Niacinamide"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/cerave-blemish-control-cleanser-236ml-8oz",
"image_url": "/images/cerave-blemish.jpg"
},
{
"id": "crv008",
"name": "CeraVe Moisturising Lotion",
"brand": "CeraVe",
"category": "moisturizer",
"subcategory": "lotion",
"size": "236ml",
"price": 13400,
"original_price": 12400,
"rating": 4.8,
"reviews": 23456,
"description": "Daily moisturizing lotion with ceramides",
"benefits": ["Hydrating", "Lightweight", "Ceramides"],
"skin_types": ["normal", "dry"],
"ingredients": ["Ceramides", "Hyaluronic Acid"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/cerave-moisturising-lotion-236ml-8oz-uk-version",
"image_url": "/images/cerave-lotion.jpg"
},
{
"id": "crv009",
"name": "CeraVe Moisturising Lotion (Family Size)",
"brand": "CeraVe",
"category": "moisturizer",
"subcategory": "lotion",
"size": "473ml",
"price": 20000,
"original_price": 19000,
"rating": 4.9,
"reviews": 12345,
"description": "Daily moisturizing lotion (family size)",
"benefits": ["Hydrating", "Lightweight", "Ceramides"],
"skin_types": ["normal", "dry"],
"ingredients": ["Ceramides", "Hyaluronic Acid"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/cerave-moisturising-lotion-473ml-16oz-uk-version",
"image_url": "/images/cerave-lotion-family.jpg"
},
{
"id": "crv010",
"name": "CeraVe Moisturising Cream",
"brand": "CeraVe",
"category": "moisturizer",
"subcategory": "cream",
"size": "340g",
"price": 16900,
"original_price": 15900,
"rating": 4.9,
"reviews": 15678,
"description": "Rich moisturizing cream with ceramides",
"benefits": ["24hr hydration", "Restores barrier", "Non-comedogenic"],
"skin_types": ["dry", "very dry", "normal"],
"ingredients": ["Ceramides", "Hyaluronic Acid", "Glycerin"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/cerave-moisturising-cream-340g-12oz-uk-version",
"tags": ["bestseller", "dermatologist_recommended"],
"image_url": "/images/cerave-cream.jpg"
},
{
"id": "crv011",
"name": "CeraVe Moisturising Cream (Family Size)",
"brand": "CeraVe",
"category": "moisturizer",
"subcategory": "cream",
"size": "454g",
"price": 20900,
"original_price": 19900,
"rating": 4.9,
"reviews": 8921,
"description": "Rich moisturizing cream (family size)",
"benefits": ["24hr hydration", "Restores barrier", "Non-comedogenic"],
"skin_types": ["dry", "very dry"],
"ingredients": ["Ceramides", "Hyaluronic Acid"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/cerave-moisturizing-cream-454g-16oz",
"image_url": "/images/cerave-cream-family.jpg"
},
{
"id": "crv012",
"name": "CeraVe PM Facial Moisturising Lotion",
"brand": "CeraVe",
"category": "moisturizer",
"subcategory": "lotion",
"size": "52ml",
"price": 17000,
"original_price": 16000,
"rating": 4.8,
"reviews": 8921,
"description": "Night moisturizer with niacinamide",
"benefits": ["Night repair", "Niacinamide", "Oil-free"],
"skin_types": ["all"],
"ingredients": ["Niacinamide", "Ceramides", "Hyaluronic Acid"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/cerave-pm-facial-moisturising-lotion-52ml",
"image_url": "/images/cerave-pm.jpg"
},
{
"id": "crv013",
"name": "CeraVe Skin Renewing Night Cream",
"brand": "CeraVe",
"category": "moisturizer",
"subcategory": "cream",
"size": "48g",
"price": 30400,
"original_price": 29400,
"rating": 4.8,
"reviews": 3456,
"description": "Anti-aging night cream with peptides",
"benefits": ["Anti-aging", "Renews skin", "Ceramides"],
"skin_types": ["mature", "dry"],
"ingredients": ["Peptides", "Ceramides", "Niacinamide"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/cerave-skin-renewing-night-cream-48g-1-7oz",
"image_url": "/images/cerave-renewing.jpg"
},
# ===== COSRX (8 products) =====
{
"id": "cos001",
"name": "COSRX Low pH Good Morning Gel Cleanser",
"brand": "COSRX",
"category": "cleanser",
"subcategory": "gel",
"size": "150ml",
"price": 10000,
"original_price": 9000,
"rating": 4.8,
"reviews": 23456,
"description": "Gentle low pH cleanser with tea tree oil",
"benefits": ["Gentle cleansing", "pH balancing", "Soothing"],
"skin_types": ["all", "sensitive", "acne-prone"],
"ingredients": ["Tea Tree Oil", "Betaine Salicylate", "BHA"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/cosrx-low-ph-good-morning-cleanser",
"tags": ["bestseller", "kbeauty"],
"image_url": "/images/cosrx-lowph.jpg"
},
{
"id": "cos002",
"name": "COSRX Salicylic Acid Daily Gentle Cleanser",
"brand": "COSRX",
"category": "cleanser",
"subcategory": "treatment",
"size": "150ml",
"price": 10200,
"original_price": 9200,
"rating": 4.7,
"reviews": 12345,
"description": "Salicylic acid cleanser for acne-prone skin",
"benefits": ["Acne treatment", "Exfoliating", "Gentle"],
"skin_types": ["acne-prone", "oily"],
"ingredients": ["Salicylic Acid", "Tea Tree Oil"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/cosrx-salicylic-acid-daily-gentle-cleanser",
"image_url": "/images/cosrx-sa.jpg"
},
{
"id": "cos003",
"name": "COSRX Advanced Snail 96 Mucin Power Essence",
"brand": "COSRX",
"category": "essence",
"subcategory": "serum",
"size": "100ml",
"price": 14700,
"original_price": 13700,
"rating": 4.9,
"reviews": 34567,
"description": "96% snail mucin essence for repairing skin",
"benefits": ["Repairs", "Hydrates", "Plumps"],
"skin_types": ["all", "damaged", "aging"],
"ingredients": ["Snail Secretion Filtrate", "Hyaluronic Acid", "Arginine"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/cosrx-advanced-snail-96-mucin-power-essence",
"tags": ["bestseller", "kbeauty", "holy_grail"],
"image_url": "/images/cosrx-snail.jpg"
},
{
"id": "cos004",
"name": "COSRX Advanced Snail 92 All-in-One Cream",
"brand": "COSRX",
"category": "moisturizer",
"subcategory": "cream",
"size": "100g",
"price": 16300,
"original_price": 15300,
"rating": 4.8,
"reviews": 18765,
"description": "Snail mucin cream for intense hydration",
"benefits": ["Hydrating", "Repairing", "Soothing"],
"skin_types": ["dry", "damaged", "sensitive"],
"ingredients": ["Snail Mucin", "Hyaluronic Acid", "Betaine"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/cosrx-advanced-snail-92-all-in-one-cream",
"tags": ["kbeauty"],
"image_url": "/images/cosrx-snail-cream.jpg"
},
{
"id": "cos005",
"name": "COSRX Oil-Free Ultra Moisturizing Lotion",
"brand": "COSRX",
"category": "moisturizer",
"subcategory": "lotion",
"size": "100ml",
"price": 16300,
"original_price": 15300,
"rating": 4.7,
"reviews": 8921,
"description": "Oil-free lotion for oily and combination skin",
"benefits": ["Oil-free", "Hydrating", "Lightweight"],
"skin_types": ["oily", "combination"],
"ingredients": ["Birch Sap", "Tea Tree Oil"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/cosrx-oil-free-ultra-moisturizing-lotion",
"image_url": "/images/cosrx-oilfree.jpg"
},
{
"id": "cos006",
"name": "COSRX Full Fit Propolis Synergy Toner",
"brand": "COSRX",
"category": "toner",
"subcategory": "hydrating",
"size": "150ml",
"price": 13200,
"original_price": 12200,
"rating": 4.8,
"reviews": 6789,
"description": "Propolis toner for glowing skin",
"benefits": ["Glow", "Hydrating", "Soothing"],
"skin_types": ["all"],
"ingredients": ["Propolis", "Honey", "Royal Jelly"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/cosrx-full-fit-propolis-synergy-toner-150ml",
"image_url": "/images/cosrx-propolis.jpg"
},
{
"id": "cos007",
"name": "COSRX Aloe Soothing Sun Cream SPF 50",
"brand": "COSRX",
"category": "sunscreen",
"subcategory": "chemical",
"size": "50ml",
"price": 10900,
"original_price": 9900,
"rating": 4.7,
"reviews": 4567,
"description": "Aloe sunscreen with SPF 50",
"benefits": ["SPF 50", "Soothing", "Moisturizing"],
"skin_types": ["all", "sensitive"],
"ingredients": ["Aloe Vera", "Niacinamide"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/cosrx-aloe-soothing-sun-cream-spf-50",
"image_url": "/images/cosrx-aloe-sun.jpg"
},
{
"id": "cos008",
"name": "COSRX Acne Pimple Master Patch",
"brand": "COSRX",
"category": "treatment",
"subcategory": "patches",
"size": "24 patches",
"price": 6200,
"original_price": 5200,
"rating": 4.8,
"reviews": 23456,
"description": "Hydrocolloid patches for pimples",
"benefits": ["Heals pimples", "Protects", "Invisible"],
"skin_types": ["acne-prone"],
"ingredients": ["Hydrocolloid"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/cosrx-acne-pimple-master-patch",
"tags": ["bestseller"],
"image_url": "/images/cosrx-patch.jpg"
},
# ===== FACE FACTS (13 products) =====
{
"id": "ff001",
"name": "Face Facts Blemish Patches (Stars)",
"brand": "Face Facts",
"category": "treatment",
"subcategory": "patches",
"size": "24 patches",
"price": 3800,
"original_price": 2800,
"rating": 4.7,
"reviews": 3456,
"description": "Star-shaped hydrocolloid patches for blemishes",
"benefits": ["Heals pimples", "Protects", "Cute design"],
"skin_types": ["acne-prone"],
"ingredients": ["Hydrocolloid"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/face-facts-blemish-patches-stars-24-patches",
"image_url": "/images/ff-stars.jpg"
},
{
"id": "ff002",
"name": "Face Facts Blemish Patches (Hearts)",
"brand": "Face Facts",
"category": "treatment",
"subcategory": "patches",
"size": "24 patches",
"price": 3800,
"original_price": 2800,
"rating": 4.7,
"reviews": 2345,
"description": "Heart-shaped hydrocolloid patches for blemishes",
"benefits": ["Heals pimples", "Protects", "Cute design"],
"skin_types": ["acne-prone"],
"ingredients": ["Hydrocolloid"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/face-facts-blemish-patches-hearts-24-patches",
"image_url": "/images/ff-hearts.jpg"
},
{
"id": "ff003",
"name": "Face Facts Blemish Patches (Holographic Diamonds)",
"brand": "Face Facts",
"category": "treatment",
"subcategory": "patches",
"size": "24 patches",
"price": 3800,
"original_price": 2800,
"rating": 4.7,
"reviews": 1876,
"description": "Holographic diamond patches for blemishes",
"benefits": ["Heals pimples", "Protects", "Holographic"],
"skin_types": ["acne-prone"],
"ingredients": ["Hydrocolloid"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/face-facts-blemish-patches-holographic-diamonds-24-patches",
"image_url": "/images/ff-diamonds.jpg"
},
{
"id": "ff004",
"name": "Face Facts Niacinamide Serum",
"brand": "Face Facts",
"category": "serum",
"subcategory": "treatment",
"size": "30ml",
"price": 4900,
"original_price": 3900,
"rating": 4.6,
"reviews": 4567,
"description": "Niacinamide serum for oil control and brightness",
"benefits": ["Oil control", "Brightening", "Pore refining"],
"skin_types": ["oily", "combination", "acne-prone"],
"ingredients": ["Niacinamide", "Zinc", "Panthenol"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/face-facts-niacinamide-serum-30ml",
"tags": ["affordable"],
"image_url": "/images/ff-niacinamide.jpg"
},
{
"id": "ff005",
"name": "Face Facts Ceramide Oil Control Moisturising Gel Cream",
"brand": "Face Facts",
"category": "moisturizer",
"subcategory": "gel_cream",
"size": "50ml",
"price": 4900,
"original_price": 3900,
"rating": 4.5,
"reviews": 3210,
"description": "Oil control gel cream with ceramides",
"benefits": ["Oil control", "Moisturizing", "Ceramides"],
"skin_types": ["oily", "combination"],
"ingredients": ["Ceramides", "Niacinamide", "Salicylic Acid"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/face-facts-ceramide-oil-control-moisturising-gel-cream-50ml",
"image_url": "/images/ff-gel.jpg"
},
{
"id": "ff006",
"name": "Face Facts Ceramide Oil Control Hydrating Toner",
"brand": "Face Facts",
"category": "toner",
"subcategory": "hydrating",
"size": "200ml",
"price": 6600,
"original_price": 5600,
"rating": 4.4,
"reviews": 2345,
"description": "Hydrating toner with ceramides",
"benefits": ["Hydrating", "Oil control", "Ceramides"],
"skin_types": ["oily", "combination"],
"ingredients": ["Ceramides", "Niacinamide"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/face-facts-ceramide-oil-control-hydrating-toner-200ml",
"image_url": "/images/ff-toner.jpg"
},
{
"id": "ff007",
"name": "Face Facts Ceramide Oil Control Foaming Cleanser",
"brand": "Face Facts",
"category": "cleanser",
"subcategory": "foaming",
"size": "400ml",
"price": 7900,
"original_price": 6900,
"rating": 4.5,
"reviews": 3456,
"description": "Foaming cleanser with ceramides",
"benefits": ["Oil control", "Cleansing", "Ceramides"],
"skin_types": ["oily", "combination"],
"ingredients": ["Ceramides", "Salicylic Acid"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/face-facts-oil-control-foaming-cleanser-400ml",
"image_url": "/images/ff-cleanser.jpg"
},
{
"id": "ff008",
"name": "Face Facts Soothe Body Oil",
"brand": "Face Facts",
"category": "body_oil",
"subcategory": "soothing",
"size": "200ml",
"price": 7500,
"original_price": 6500,
"rating": 4.6,
"reviews": 2345,
"description": "Soothing body oil with bergamot and pepper",
"benefits": ["Soothing", "Moisturizing", "Aromatherapy"],
"skin_types": ["all"],
"ingredients": ["Bergamot Oil", "Pepper Extract", "Vitamin E"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/face-facts-soothe-body-oil-bergamot-pepper-200ml",
"image_url": "/images/ff-oil.jpg"
},
{
"id": "ff009",
"name": "Face Facts Ceramide Serum",
"brand": "Face Facts",
"category": "serum",
"subcategory": "treatment",
"size": "30ml",
"price": 4600,
"original_price": 3600,
"rating": 4.5,
"reviews": 2345,
"description": "Ceramide serum for barrier repair",
"benefits": ["Barrier repair", "Hydrating", "Soothing"],
"skin_types": ["dry", "sensitive", "damaged"],
"ingredients": ["Ceramides", "Panthenol"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/face-facts-ceramide-serum",
"image_url": "/images/ff-ceramide.jpg"
},
{
"id": "ff010",
"name": "Face Facts Ceramide Repairing Serum Cream",
"brand": "Face Facts",
"category": "moisturizer",
"subcategory": "cream",
"size": "30ml",
"price": 4500,
"original_price": 3500,
"rating": 4.5,
"reviews": 1876,
"description": "Serum cream with ceramides",
"benefits": ["Repairing", "Hydrating", "Ceramides"],
"skin_types": ["dry", "damaged"],
"ingredients": ["Ceramides", "Shea Butter"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/face-facts-ceramide-repairing-serum-cream",
"image_url": "/images/ff-cream.jpg"
},
{
"id": "ff011",
"name": "Face Facts Wonder Cream",
"brand": "Face Facts",
"category": "moisturizer",
"subcategory": "cream",
"size": "50ml",
"price": 8200,
"original_price": 7200,
"rating": 4.6,
"reviews": 3456,
"description": "Fragrance-free wonder cream",
"benefits": ["Hydrating", "Soothing", "Fragrance-free"],
"skin_types": ["sensitive", "all"],
"ingredients": ["Ceramides", "Panthenol", "Shea Butter"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/face-facts-wonder-cream-50ml-fragrance-free",
"image_url": "/images/ff-wonder.jpg"
},
{
"id": "ff012",
"name": "Face Facts Kojic Acid Body Lotion",
"brand": "Face Facts",
"category": "body_lotion",
"subcategory": "brightening",
"size": "400ml",
"price": 7700,
"original_price": 6700,
"rating": 4.6,
"reviews": 5678,
"description": "Kojic acid body lotion with retinol",
"benefits": ["Brightening", "Even tone", "Moisturizing"],
"skin_types": ["all"],
"ingredients": ["Kojic Acid", "Retinol", "Shea Butter"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/face-facts-kojic-acid-body-lotion-with-retinol-400ml",
"image_url": "/images/ff-kojic.jpg"
},
{
"id": "ff013",
"name": "Face Facts Clean Skin Towels",
"brand": "Face Facts",
"category": "accessories",
"subcategory": "towels",
"size": "50 towels",
"price": 9300,
"original_price": 8300,
"rating": 4.5,
"reviews": 2345,
"description": "Disposable clean skin towels",
"benefits": ["Hygienic", "Convenient", "Gentle"],
"skin_types": ["all"],
"ingredients": ["Cotton"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/face-facts-clean-skin-towels-50-towels",
"image_url": "/images/ff-towels.jpg"
},
# ===== PANOXYL (3 products) =====
{
"id": "pan001",
"name": "PanOxyl Acne Foaming Wash 10% BP",
"brand": "PanOxyl",
"category": "cleanser",
"subcategory": "treatment",
"size": "156g",
"price": 17500,
"original_price": 16500,
"rating": 4.7,
"reviews": 12345,
"description": "10% benzoyl peroxide foaming wash for acne",
"benefits": ["Kills acne bacteria", "Unclogs pores", "Fast acting"],
"skin_types": ["acne-prone", "oily"],
"ingredients": ["Benzoyl Peroxide 10%", "Glycerin"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/panoxyl-acne-foaming-wash-benzoyl-peroxide-10",
"tags": ["dermatologist_recommended", "acne"],
"image_url": "/images/panoxyl-10.jpg"
},
{
"id": "pan002",
"name": "PanOxyl Acne Creamy Wash 4% BP",
"brand": "PanOxyl",
"category": "cleanser",
"subcategory": "treatment",
"size": "170g",
"price": 17500,
"original_price": 16500,
"rating": 4.6,
"reviews": 8765,
"description": "4% benzoyl peroxide creamy wash for sensitive acne-prone skin",
"benefits": ["Gentle on skin", "Fights acne", "Moisturizing"],
"skin_types": ["acne-prone", "sensitive"],
"ingredients": ["Benzoyl Peroxide 4%"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/panoxyl-acne-creamy-wash-benzoyl-peroxide-4",
"image_url": "/images/panoxyl-4.jpg"
},
{
"id": "pan003",
"name": "PanOxyl Clarifying Exfoliant",
"brand": "PanOxyl",
"category": "exfoliant",
"subcategory": "liquid",
"size": "118ml",
"price": 18100,
"original_price": 17100,
"rating": 4.5,
"reviews": 4567,
"description": "2% salicylic acid clarifying exfoliant",
"benefits": ["Exfoliates", "Unclogs pores", "Clarifies"],
"skin_types": ["acne-prone", "oily"],
"ingredients": ["Salicylic Acid 2%"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/panoxyl-clarifying-exfoliant-2-salicylic-acid-118ml-4oz",
"image_url": "/images/panoxyl-exfoliant.jpg"
},
# ===== BEAUTY OF JOSEON (4 products) =====
{
"id": "boj001",
"name": "Beauty of Joseon Glow Deep Serum",
"brand": "Beauty of Joseon",
"category": "serum",
"subcategory": "brightening",
"size": "30ml",
"price": 14400,
"original_price": 13400,
"rating": 4.8,
"reviews": 15678,
"description": "Rice and alpha arbutin serum for brightening",
"benefits": ["Brightening", "Dark spot correction", "Glowing"],
"skin_types": ["all", "hyperpigmentation"],
"ingredients": ["Rice Extract", "Alpha Arbutin", "Niacinamide"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/beauty-of-joseon-glow-deep-serum-rice-alpha-arbutin-30ml",
"tags": ["kbeauty"],
"image_url": "/images/boj-deep.jpg"
},
{
"id": "boj002",
"name": "Beauty of Joseon Glow Serum",
"brand": "Beauty of Joseon",
"category": "serum",
"subcategory": "brightening",
"size": "30ml",
"price": 14400,
"original_price": 13400,
"rating": 4.8,
"reviews": 12345,
"description": "Propolis and niacinamide glow serum",
"benefits": ["Glow", "Brightening", "Soothing"],
"skin_types": ["all"],
"ingredients": ["Propolis", "Niacinamide", "Rice Extract"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/beauty-of-joseon-glow-serum-propolis-niacinamide-30ml",
"image_url": "/images/boj-glow.jpg"
},
{
"id": "boj003",
"name": "Beauty of Joseon Relief Sun SPF 50",
"brand": "Beauty of Joseon",
"category": "sunscreen",
"subcategory": "chemical",
"size": "50ml",
"price": 15700,
"original_price": 14700,
"rating": 4.9,
"reviews": 23456,
"description": "Rice and probiotics sunscreen with SPF 50",
"benefits": ["SPF 50", "Moisturizing", "No white cast"],
"skin_types": ["all", "sensitive"],
"ingredients": ["Rice Extract", "Probiotics", "Niacinamide"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/beauty-of-joseon-relief-sun-rice-probiotics-spf-50-50ml",
"tags": ["bestseller", "kbeauty", "viral"],
"image_url": "/images/boj-sunscreen.jpg"
},
{
"id": "boj004",
"name": "Beauty of Joseon Glow Replenishing Rice Milk",
"brand": "Beauty of Joseon",
"category": "toner",
"subcategory": "hydrating",
"size": "150ml",
"price": 10000,
"original_price": 9000,
"rating": 4.7,
"reviews": 5678,
"description": "Rice milk toner for glowing skin",
"benefits": ["Glow", "Hydrating", "Soothing"],
"skin_types": ["all"],
"ingredients": ["Rice Milk", "Niacinamide"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/beauty-of-joseon-glow-replenishing-rice-milk-150ml",
"image_url": "/images/boj-rice.jpg"
},
# ===== ANUA (1 product) =====
{
"id": "anua001",
"name": "Anua Niacinamide 10 + TXA 4 Serum",
"brand": "Anua",
"category": "serum",
"subcategory": "brightening",
"size": "30ml",
"price": 19900,
"original_price": 18900,
"rating": 4.8,
"reviews": 5678,
"description": "Niacinamide and tranexamic acid serum for dark spots",
"benefits": ["Dark spot correction", "Brightening", "Even tone"],
"skin_types": ["hyperpigmentation", "all"],
"ingredients": ["Niacinamide 10%", "Tranexamic Acid 4%"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/anua-niacinamide-10-txa-4-serum-30ml",
"tags": ["kbeauty", "viral"],
"image_url": "/images/anua.jpg"
},
# ===== BALANCE ACTIVE FORMULA (2 products) =====
{
"id": "baf001",
"name": "Balance Active Formula Salicylic Acid + Zinc Clarifying Toner",
"brand": "Balance Active Formula",
"category": "toner",
"subcategory": "exfoliating",
"size": "200ml",
"price": 9500,
"original_price": 8500,
"rating": 4.5,
"reviews": 3456,
"description": "Salicylic acid toner for oily and acne-prone skin",
"benefits": ["Exfoliates", "Unclogs pores", "Oil control"],
"skin_types": ["oily", "acne-prone"],
"ingredients": ["Salicylic Acid", "Zinc", "Niacinamide"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/balance-salicylic-acid-zinc-clarifying-toner-200ml",
"image_url": "/images/balance-toner.jpg"
},
{
"id": "baf002",
"name": "Balance Active Formula Niacinamide Blemish Recovery Serum",
"brand": "Balance Active Formula",
"category": "serum",
"subcategory": "treatment",
"size": "30ml",
"price": 9500,
"original_price": 8500,
"rating": 4.5,
"reviews": 4321,
"description": "Niacinamide serum for blemish recovery",
"benefits": ["Reduces blemishes", "Oil control", "Brightening"],
"skin_types": ["acne-prone", "oily"],
"ingredients": ["Niacinamide", "Zinc", "Panthenol"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/balance-active-formula-niacinamide-blemish-recovery-serum-30ml-1oz",
"image_url": "/images/balance-niacinamide.jpg"
},
# ===== THE ORDINARY (3 products) =====
{
"id": "ord001",
"name": "The Ordinary Glycolic Acid 7% Exfoliating Toner",
"brand": "The Ordinary",
"category": "toner",
"subcategory": "exfoliating",
"size": "100ml",
"price": 19100,
"original_price": 18100,
"rating": 4.7,
"reviews": 23456,
"description": "Glycolic acid toner for skin texture and brightness",
"benefits": ["Exfoliates", "Brightens", "Smooths texture"],
"skin_types": ["normal", "oily", "combination"],
"ingredients": ["Glycolic Acid 7%", "Ginseng", "Aloe Vera"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/the-ordinary-glycolic-acid-7-exfoliating-toner-100ml",
"tags": ["the_ordinary", "cult_favorite"],
"image_url": "/images/ordinary-glycolic.jpg"
},
{
"id": "ord002",
"name": "The Ordinary Niacinamide 10% + Zinc 1%",
"brand": "The Ordinary",
"category": "serum",
"subcategory": "treatment",
"size": "30ml",
"price": 16200,
"original_price": 15200,
"rating": 4.8,
"reviews": 45678,
"description": "High-strength niacinamide serum for blemishes",
"benefits": ["Oil control", "Blemishes", "Brightening"],
"skin_types": ["oily", "acne-prone"],
"ingredients": ["Niacinamide 10%", "Zinc 1%"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/the-ordinary-niacinamide-10-zinc-1-serum",
"tags": ["bestseller"],
"image_url": "/images/ordinary-niacinamide.jpg"
},
{
"id": "ord003",
"name": "The Ordinary Hyaluronic Acid 2% + B5",
"brand": "The Ordinary",
"category": "serum",
"subcategory": "hydrating",
"size": "30ml",
"price": 15800,
"original_price": 14800,
"rating": 4.7,
"reviews": 34567,
"description": "Hydrating serum with hyaluronic acid",
"benefits": ["Hydrating", "Plumping", "Smoothing"],
"skin_types": ["dry", "dehydrated", "all"],
"ingredients": ["Hyaluronic Acid", "Vitamin B5"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/the-ordinary-hyaluronic-acid-2-b5",
"image_url": "/images/ordinary-ha.jpg"
},
# ===== KOREAN SKINCARE (7 products) =====
{
"id": "kor001",
"name": "Acwell Licorice pH Balancing Cleansing Toner",
"brand": "Acwell",
"category": "toner",
"subcategory": "balancing",
"size": "300ml",
"price": 16800,
"original_price": 15800,
"rating": 4.7,
"reviews": 4567,
"description": "Licorice toner for pH balancing and brightening",
"benefits": ["pH balancing", "Brightening", "Soothing"],
"skin_types": ["all"],
"ingredients": ["Licorice Root", "Niacinamide", "Green Tea"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/acwell-licorice-ph-balancing-cleansing-toner-300ml",
"image_url": "/images/acwell.jpg"
},
{
"id": "kor002",
"name": "Isntree Hyaluronic Acid Watery Sun Gel SPF 50",
"brand": "Isntree",
"category": "sunscreen",
"subcategory": "chemical",
"size": "50ml",
"price": 16200,
"original_price": 15200,
"rating": 4.8,
"reviews": 6789,
"description": "Hyaluronic acid sunscreen with SPF 50",
"benefits": ["SPF 50", "Hydrating", "No white cast"],
"skin_types": ["all", "dry"],
"ingredients": ["Hyaluronic Acid", "Niacinamide"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/isntree-hyaluronic-acid-watery-sun-gel-spf-50-50ml",
"tags": ["kbeauty", "sunscreen"],
"image_url": "/images/isntree.jpg"
},
{
"id": "kor003",
"name": "La Roche-Posay Anthelios UVMune 400 Oil Control Sunscreen",
"brand": "La Roche-Posay",
"category": "sunscreen",
"subcategory": "chemical",
"size": "50ml",
"price": 21100,
"original_price": 20100,
"rating": 4.8,
"reviews": 8901,
"description": "Oil control sunscreen with SPF 50",
"benefits": ["SPF 50", "Oil control", "Matte finish"],
"skin_types": ["oily", "combination"],
"ingredients": ["Mexoryl 400", "Niacinamide"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/la-roche-posay-anthelios-uvmune-400-oil-control-gel-cream-spf-50-50ml",
"image_url": "/images/lrp-sunscreen.jpg"
},
{
"id": "kor004",
"name": "Jumiso Snail Mucin 88 + Peptide Cream",
"brand": "Jumiso",
"category": "moisturizer",
"subcategory": "cream",
"size": "30ml",
"price": 10200,
"original_price": 9200,
"rating": 4.6,
"reviews": 3456,
"description": "Snail mucin cream with peptides",
"benefits": ["Hydrating", "Repairing", "Plumping"],
"skin_types": ["dry", "damaged", "aging"],
"ingredients": ["Snail Mucin 88%", "Peptides"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/jumiso-snail-mucin-88-peptide-cream-30ml",
"image_url": "/images/jumiso.jpg"
},
{
"id": "kor005",
"name": "Axis Y Dark Spot Correcting Glow Serum",
"brand": "Axis Y",
"category": "serum",
"subcategory": "brightening",
"size": "50ml",
"price": 13200,
"original_price": 12200,
"rating": 4.8,
"reviews": 12345,
"description": "Niacinamide serum for dark spots and glow",
"benefits": ["Dark spot correction", "Glow", "Brightening"],
"skin_types": ["hyperpigmentation", "all"],
"ingredients": ["Niacinamide", "Arbutin", "Sea Buckthorn"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/axis-y-dark-spot-correcting-glow-serum-50ml",
"tags": ["kbeauty", "viral"],
"image_url": "/images/axis-y.jpg"
},
{
"id": "kor006",
"name": "Revox B77 Just Alpha Arbutin 2% + HA Serum",
"brand": "Revox",
"category": "serum",
"subcategory": "brightening",
"size": "30ml",
"price": 12300,
"original_price": 11300,
"rating": 4.5,
"reviews": 2345,
"description": "Alpha arbutin serum with hyaluronic acid",
"benefits": ["Brightening", "Dark spot correction", "Hydrating"],
"skin_types": ["hyperpigmentation"],
"ingredients": ["Alpha Arbutin 2%", "Hyaluronic Acid"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/revox-b77-just-alpha-arbutin-2-ha-brightening-serum-30ml",
"image_url": "/images/revox.jpg"
},
{
"id": "kor007",
"name": "Mary & May Tranexamic Acid + Glutathione Eye Cream",
"brand": "Mary & May",
"category": "eye_cream",
"subcategory": "brightening",
"size": "12g",
"price": 6200,
"original_price": 5200,
"rating": 4.5,
"reviews": 1876,
"description": "Eye cream with tranexamic acid and glutathione",
"benefits": ["Brightening", "Dark circle reduction", "Hydrating"],
"skin_types": ["all"],
"ingredients": ["Tranexamic Acid", "Glutathione", "Adenosine"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/mary-may-tranexamic-acid-glutathione-eye-cream-12g",
"image_url": "/images/mary-may.jpg"
},
# ===== GARNIER (2 products) =====
{
"id": "gar001",
"name": "Garnier Bright Complete Extra Body Lotion",
"brand": "Garnier",
"category": "body_lotion",
"subcategory": "brightening",
"size": "400ml",
"price": 9500,
"original_price": 8500,
"rating": 4.5,
"reviews": 7890,
"description": "Brightening body lotion with vitamin C",
"benefits": ["Brightening", "Moisturizing", "Vitamin C"],
"skin_types": ["all"],
"ingredients": ["Vitamin C", "Shea Butter"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/garnier-bright-complete-extra-body-lotion-400ml",
"image_url": "/images/garnier-body.jpg"
},
{
"id": "gar002",
"name": "Garnier Even & Matte Vitamin C Booster Serum",
"brand": "Garnier",
"category": "serum",
"subcategory": "brightening",
"size": "30ml",
"price": 10000,
"original_price": 9000,
"rating": 4.4,
"reviews": 5678,
"description": "Vitamin C serum for even and matte skin",
"benefits": ["Brightening", "Oil control", "Vitamin C"],
"skin_types": ["oily", "combination"],
"ingredients": ["Vitamin C", "Salicylic Acid"],
"in_stock": True,
"store": "Jumia",
"url": "https://www.jumia.com.ng/garnier-vitamin-c-serum",
"image_url": "/images/garnier-serum.jpg"
},
# ===== KOJIE SAN (2 products) =====
{
"id": "koj001",
"name": "Kojie San Lightening Body Lotion SPF 25",
"brand": "Kojie San",
"category": "body_lotion",
"subcategory": "brightening",
"size": "250g",
"price": 14500,
"original_price": 13500,
"rating": 4.6,
"reviews": 6789,
"description": "Lightening body lotion with SPF 25",
"benefits": ["Brightening", "SPF 25", "Moisturizing"],
"skin_types": ["all"],
"ingredients": ["Kojic Acid", "SPF 25"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/kojie-san-lightening-body-lotion-spf-25-250g",
"image_url": "/images/kojie-lotion.jpg"
},
{
"id": "koj002",
"name": "Kojie San Soap",
"brand": "Kojie San",
"category": "body_soap",
"subcategory": "brightening",
"size": "100g x 3",
"price": 7600,
"original_price": 6600,
"rating": 4.5,
"reviews": 12345,
"description": "Kojic acid soap for brightening",
"benefits": ["Brightening", "Exfoliating", "Kojic Acid"],
"skin_types": ["all"],
"ingredients": ["Kojic Acid", "Papaya Extract"],
"in_stock": True,
"store": "buybetter.ng",
"url": "https://buybetter.ng/kojie-san-soap",
"image_url": "/images/kojie-soap.jpg"
},
# ===== VASELINE (1 product) =====
{
"id": "vas001",
"name": "Vaseline Body Oil",
"brand": "Vaseline",
"category": "body_oil",
"subcategory": "moisturizing",
"size": "200ml",
"price": 8500,
"original_price": 7500,
"rating": 4.5,
"reviews": 23456,
"description": "Hydrating body oil with petroleum jelly",
"benefits": ["Hydrating", "Glowing", "Non-greasy"],
"skin_types": ["dry", "all"],
"ingredients": ["Petroleum Jelly", "Mineral Oil", "Vitamin E"],
"in_stock": True,
"store": "buybetter.ng",
"url": "https://buybetter.ng/vaseline-body-oil",
"image_url": "/images/vaseline-oil.jpg"
},
# ===== ADVANCED KOREAN SKIN (6 products) =====
{
"id": "aks001",
"name": "Advanced Korean Skin Bright & Clear Body Gel Wash",
"brand": "Advanced Korean Skin",
"category": "body_wash",
"subcategory": "brightening",
"size": "1200ml",
"price": 12500,
"original_price": 11500,
"rating": 4.5,
"reviews": 3456,
"description": "Brightening body gel wash with papaya",
"benefits": ["Brightening", "Cleansing", "Refreshing"],
"skin_types": ["all"],
"ingredients": ["Papaya Extract", "Vitamin C"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/advanced-korean-skin-bright-clear-body-gel-wash-papaya-1200ml",
"image_url": "/images/aks-papaya.jpg"
},
{
"id": "aks002",
"name": "Advanced Korean Skin Bright & Fair Body Gel Wash",
"brand": "Advanced Korean Skin",
"category": "body_wash",
"subcategory": "brightening",
"size": "1200ml",
"price": 12500,
"original_price": 11500,
"rating": 4.5,
"reviews": 2345,
"description": "Brightening body gel wash with vitamin C",
"benefits": ["Brightening", "Cleansing", "Refreshing"],
"skin_types": ["all"],
"ingredients": ["Vitamin C", "Citrus Extracts"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/advanced-korean-skin-bright-clear-body-gel-wash-vitamin-c-1200ml",
"image_url": "/images/aks-vitamin.jpg"
},
{
"id": "aks003",
"name": "Advanced Korean Skin Brighter Face Cream",
"brand": "Advanced Korean Skin",
"category": "moisturizer",
"subcategory": "cream",
"size": "100g",
"price": 10600,
"original_price": 9600,
"rating": 4.4,
"reviews": 1876,
"description": "Brightening face cream",
"benefits": ["Brightening", "Moisturizing", "Even tone"],
"skin_types": ["all"],
"ingredients": ["Niacinamide", "Vitamin C"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/advanced-korean-skin-brighter-face-cream-100g",
"image_url": "/images/aks-brighter.jpg"
},
{
"id": "aks004",
"name": "Advanced Korean Skin Active Fair Face Cream",
"brand": "Advanced Korean Skin",
"category": "moisturizer",
"subcategory": "cream",
"size": "100g",
"price": 10600,
"original_price": 9600,
"rating": 4.4,
"reviews": 1654,
"description": "Active fair face cream for brightening",
"benefits": ["Brightening", "Moisturizing", "Active formula"],
"skin_types": ["all"],
"ingredients": ["Kojic Acid", "Niacinamide"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/advanced-korean-skin-active-fair-face-cream-100g",
"image_url": "/images/aks-fair.jpg"
},
{
"id": "aks005",
"name": "Advanced Korean Skin Brightest Body Oil",
"brand": "Advanced Korean Skin",
"category": "body_oil",
"subcategory": "brightening",
"size": "280ml",
"price": 10000,
"original_price": 9000,
"rating": 4.5,
"reviews": 2345,
"description": "Brightest body oil for glowing skin",
"benefits": ["Glowing", "Brightening", "Hydrating"],
"skin_types": ["all"],
"ingredients": ["Vitamin C", "Oils blend"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/advanced-korean-skin-brightest-body-oil-280ml",
"image_url": "/images/aks-brightest.jpg"
},
{
"id": "aks006",
"name": "Advanced Korean Skin Fairest Body Oil",
"brand": "Advanced Korean Skin",
"category": "body_oil",
"subcategory": "brightening",
"size": "280ml",
"price": 10000,
"original_price": 9000,
"rating": 4.5,
"reviews": 1987,
"description": "Fairest body oil for even skin tone",
"benefits": ["Even tone", "Brightening", "Hydrating"],
"skin_types": ["all"],
"ingredients": ["Kojic Acid", "Vitamin E"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/advanced-korean-skin-fairest-body-oil-280ml",
"image_url": "/images/aks-fairest.jpg"
},
# ===== NIU SKIN (4 products) =====
{
"id": "niu001",
"name": "Niu Skin Total Effects Platinum White Body Lotion",
"brand": "Niu Skin",
"category": "body_lotion",
"subcategory": "brightening",
"size": "480ml",
"price": 7500,
"original_price": 6500,
"rating": 4.6,
"reviews": 3456,
"description": "Brightening body lotion with oud wood scent",
"benefits": ["Brightening", "Moisturizing", "Long lasting"],
"skin_types": ["all"],
"ingredients": ["Vitamin C", "Kojic Acid", "Shea Butter"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/niu-skin-total-effects-platinum-white-perfumed-body-lotion-oud-wood-480ml",
"tags": ["nigerian_brand", "body_care"],
"image_url": "/images/niu-lotion.jpg"
},
{
"id": "niu002",
"name": "Niu Skin Total Effects Platinum White Intensive Serum",
"brand": "Niu Skin",
"category": "serum",
"subcategory": "brightening",
"size": "30ml",
"price": 5600,
"original_price": 4600,
"rating": 4.5,
"reviews": 2345,
"description": "Intensive brightening serum for face",
"benefits": ["Brightening", "Dark spot correction", "Glow"],
"skin_types": ["all"],
"ingredients": ["Vitamin C", "Kojic Acid", "Niacinamide"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/niu-skin-total-effects-platinum-white-intensive-serum-30ml",
"tags": ["nigerian_brand"],
"image_url": "/images/niu-serum.jpg"
},
{
"id": "niu003",
"name": "Niu Skin Total Effects Platinum White Face Essence Lotion",
"brand": "Niu Skin",
"category": "moisturizer",
"subcategory": "lotion",
"size": "30ml",
"price": 5600,
"original_price": 4600,
"rating": 4.4,
"reviews": 1876,
"description": "Face essence lotion for brightening",
"benefits": ["Brightening", "Hydrating", "Essence"],
"skin_types": ["all"],
"ingredients": ["Niacinamide", "Vitamin C"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/niu-skin-total-effects-platinum-white-face-essence-lotion",
"image_url": "/images/niu-essence.jpg"
},
{
"id": "niu004",
"name": "Niu Skin Glowing Body Wash",
"brand": "Niu Skin",
"category": "body_wash",
"subcategory": "glowing",
"size": "800ml",
"price": 8500,
"original_price": 7500,
"rating": 4.5,
"reviews": 2345,
"description": "Glowing body wash for radiant skin",
"benefits": ["Glowing", "Cleansing", "Moisturizing"],
"skin_types": ["all"],
"ingredients": ["Vitamin C", "Natural Oils"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/niu-skin-glowing-body-wash-800ml",
"image_url": "/images/niu-wash.jpg"
},
# ===== ZARON / SKIN BY ZARON (3 products) =====
{
"id": "zaron001",
"name": "Skin by Zaron Skin Glow Therapy Ultra Moisturizing Body Lotion",
"brand": "Zaron",
"category": "body_lotion",
"subcategory": "moisturizing",
"size": "500ml",
"price": 14700,
"original_price": 13700,
"rating": 4.7,
"reviews": 4567,
"description": "Ultra moisturizing body lotion for glow",
"benefits": ["Moisturizing", "Glow", "Nourishing"],
"skin_types": ["dry", "normal"],
"ingredients": ["Shea Butter", "Vitamin E", "Coconut Oil"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/skin-by-zaron-skin-glow-therapy-ultra-moisturizing-body-lotion-500ml",
"tags": ["nigerian_brand"],
"image_url": "/images/zaron-lotion.jpg"
},
{
"id": "zaron002",
"name": "Zaron Liquid Foundation",
"brand": "Zaron",
"category": "foundation",
"subcategory": "liquid",
"shades": 10,
"price": 10500,
"original_price": 9500,
"rating": 4.5,
"reviews": 2345,
"description": "Liquid foundation for flawless finish",
"benefits": ["Flawless finish", "Buildable", "Natural"],
"skin_types": ["all"],
"in_stock": True,
"store": "Zaron",
"url": "https://zaroncosmetics.com/product/liquid-foundation",
"tags": ["nigerian_brand"],
"image_url": "/images/zaron-foundation.jpg"
},
{
"id": "zaron003",
"name": "Zaron Velvet Lipstick",
"brand": "Zaron",
"category": "lipstick",
"subcategory": "velvet",
"shades": 10,
"price": 6200,
"original_price": 5200,
"rating": 4.5,
"reviews": 1876,
"description": "Velvet finish lipstick for everyday wear",
"benefits": ["Velvet finish", "Hydrating", "Long-wear"],
"in_stock": True,
"store": "Zaron",
"url": "https://zaroncosmetics.com/product/velvet-lipstick",
"tags": ["nigerian_brand"],
"image_url": "/images/zaron-lipstick.jpg"
},
# ===== COSMO (1 product) =====
{
"id": "cosmo001",
"name": "Cosmo Glow White Skin Perfector Whitening Body Lotion",
"brand": "Cosmo",
"category": "body_lotion",
"subcategory": "brightening",
"size": "500ml",
"price": 8500,
"original_price": 7500,
"rating": 4.4,
"reviews": 2345,
"description": "Whitening body lotion for even skin tone",
"benefits": ["Brightening", "Whitening", "Moisturizing"],
"skin_types": ["all"],
"ingredients": ["Kojic Acid", "Vitamin C"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/cosmo-glow-white-skin-perfector-whitening-body-lotion-500ml",
"image_url": "/images/cosmo.jpg"
},
# ===== BEAUTY FORMULAS (2 products) =====
{
"id": "bf001",
"name": "Beauty Formulas Illuminating Serum 10% Niacinamide",
"brand": "Beauty Formulas",
"category": "serum",
"subcategory": "brightening",
"size": "30ml",
"price": 4500,
"original_price": 3500,
"rating": 4.4,
"reviews": 5678,
"description": "Affordable niacinamide serum for brightening",
"benefits": ["Brightening", "Oil control", "Affordable"],
"skin_types": ["oily", "combination"],
"ingredients": ["Niacinamide 10%"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/beauty-formulas-illuminating-serum-10-niacinamide-30ml",
"image_url": "/images/bf-niacinamide.jpg"
},
{
"id": "bf002",
"name": "Beauty Formulas Glowing Serum 2% Vitamin C",
"brand": "Beauty Formulas",
"category": "serum",
"subcategory": "brightening",
"size": "30ml",
"price": 4500,
"original_price": 3500,
"rating": 4.3,
"reviews": 4567,
"description": "Affordable vitamin C serum for glow",
"benefits": ["Glow", "Brightening", "Affordable"],
"skin_types": ["all"],
"ingredients": ["Vitamin C 2%"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/beauty-formulas-glowing-serum-2-vitamin-c-30ml",
"image_url": "/images/bf-vitamin.jpg"
},
# ===== TREE HUT (1 product) =====
{
"id": "tree001",
"name": "Tree Hut Foaming Gel Body Wash",
"brand": "Tree Hut",
"category": "body_wash",
"subcategory": "foaming",
"size": "532ml",
"price": 18000,
"original_price": 17000,
"rating": 4.7,
"reviews": 4567,
"description": "Foaming gel body wash in Moroccan rose",
"benefits": ["Foaming", "Hydrating", "Aromatherapy"],
"skin_types": ["all"],
"ingredients": ["Shea Butter", "Rose Oil"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/tree-hut-foaming-gel-body-wash-moroccan-rose-532ml",
"image_url": "/images/treehut.jpg"
},
# ===== APLB (2 products) =====
{
"id": "aplb001",
"name": "APLB Glutathione Niacinamide Body Wash",
"brand": "APLB",
"category": "body_wash",
"subcategory": "brightening",
"size": "300ml",
"price": 10400,
"original_price": 9400,
"rating": 4.5,
"reviews": 2345,
"description": "Body wash with glutathione and niacinamide",
"benefits": ["Brightening", "Glutathione", "Niacinamide"],
"skin_types": ["all"],
"ingredients": ["Glutathione", "Niacinamide"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/aplb-glutathione-niacinamide-body-wash-300ml",
"image_url": "/images/aplb-wash.jpg"
},
{
"id": "aplb002",
"name": "APLB Glutathione Niacinamide Body Lotion",
"brand": "APLB",
"category": "body_lotion",
"subcategory": "brightening",
"size": "300ml",
"price": 10400,
"original_price": 9400,
"rating": 4.5,
"reviews": 1987,
"description": "Body lotion with glutathione and niacinamide",
"benefits": ["Brightening", "Glutathione", "Niacinamide"],
"skin_types": ["all"],
"ingredients": ["Glutathione", "Niacinamide"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/aplb-glutathione-niacinamide-body-lotion-300ml",
"image_url": "/images/aplb-lotion.jpg"
},
# ===== LA ROCHE-POSAY (2 products) =====
{
"id": "lrp001",
"name": "La Roche-Posay Mela B3 Serum",
"brand": "La Roche-Posay",
"category": "serum",
"subcategory": "brightening",
"size": "10ml",
"price": 17000,
"original_price": 16000,
"rating": 4.8,
"reviews": 4567,
"description": "Dark spot corrector serum with Mela B3",
"benefits": ["Dark spot correction", "Brightening", "Even tone"],
"skin_types": ["hyperpigmentation"],
"ingredients": ["Mela B3", "Niacinamide"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/la-roche-posay-mela-b3-serum-dark-spot-corrector-10ml",
"image_url": "/images/lrp-mela.jpg"
},
{
"id": "lrp002",
"name": "La Roche-Posay Anthelios UVMune 400 Oil Control Sunscreen",
"brand": "La Roche-Posay",
"category": "sunscreen",
"subcategory": "chemical",
"size": "50ml",
"price": 21100,
"original_price": 20100,
"rating": 4.8,
"reviews": 6789,
"description": "Oil control sunscreen with SPF 50",
"benefits": ["SPF 50", "Oil control", "Matte finish"],
"skin_types": ["oily", "combination"],
"ingredients": ["Mexoryl 400", "Niacinamide"],
"in_stock": True,
"store": "24eleven.ng",
"url": "https://www.24eleven.ng/la-roche-posay-anthelios-uvmune-400-oil-control-gel-cream-spf-50-50ml",
"image_url": "/images/lrp-sunscreen.jpg"
},
# ===== FOUNDATIONS (7 products) =====
{
"id": "fnd001",
"name": "Fenty Beauty Pro Filt'r Soft Matte Foundation",
"brand": "Fenty Beauty",
"category": "foundation",
"subcategory": "matte",
"shades": 50,
"price": 29500,
"original_price": 28500,
"rating": 4.8,
"reviews": 23456,
"description": "Soft matte foundation with 50 shades for all skin tones",
"benefits": ["Transfer-resistant", "Buildable", "Natural matte"],
"skin_types": ["oily", "combination"],
"in_stock": True,
"store": "Jumia",
"url": "https://www.jumia.com.ng/fenty-foundation",
"image_url": "/images/fenty-foundation.jpg"
},
{
"id": "fnd002",
"name": "Maybelline Fit Me Matte Foundation",
"brand": "Maybelline",
"category": "foundation",
"subcategory": "matte",
"shades": 16,
"price": 10500,
"original_price": 9500,
"rating": 4.6,
"reviews": 56789,
"description": "Pore-minimizing foundation for normal to oily skin",
"benefits": ["Pore-minimizing", "Matte finish", "Affordable"],
"skin_types": ["oily", "combination"],
"in_stock": True,
"store": "Jumia",
"url": "https://www.jumia.com.ng/maybelline-fit-me",
"image_url": "/images/maybelline-fitme.jpg"
},
{
"id": "fnd003",
"name": "MAC Studio Fix Fluid Foundation",
"brand": "MAC",
"category": "foundation",
"subcategory": "matte",
"shades": 50,
"price": 25500,
"original_price": 24500,
"rating": 4.7,
"reviews": 34567,
"description": "Oil-controlling foundation with medium to full coverage",
"benefits": ["Oil-control", "Buildable", "Long-wear"],
"skin_types": ["oily", "combination"],
"in_stock": True,
"store": "Jumia",
"url": "https://www.jumia.com.ng/mac-foundation",
"image_url": "/images/mac-foundation.jpg"
},
{
"id": "fnd004",
"name": "Estée Lauder Double Wear Foundation",
"brand": "Estée Lauder",
"category": "foundation",
"subcategory": "longwear",
"shades": 40,
"price": 36000,
"original_price": 35000,
"rating": 4.9,
"reviews": 45678,
"description": "24-hour wear foundation with oil-free formula",
"benefits": ["24hr wear", "Transfer-resistant", "Natural finish"],
"skin_types": ["all"],
"in_stock": True,
"store": "Jumia",
"url": "https://www.jumia.com.ng/estee-lauder-foundation",
"image_url": "/images/estee-foundation.jpg"
},
{
"id": "fnd005",
"name": "L'Oreal Paris Infallible Fresh Wear Foundation",
"brand": "L'Oreal Paris",
"category": "foundation",
"subcategory": "longwear",
"shades": 20,
"price": 15500,
"original_price": 14500,
"rating": 4.6,
"reviews": 23456,
"description": "Breathable, long-lasting foundation with SPF 25",
"benefits": ["24hr wear", "SPF 25", "Natural finish"],
"skin_types": ["all"],
"in_stock": True,
"store": "Jumia",
"url": "https://www.jumia.com.ng/loreal-foundation",
"image_url": "/images/loreal-foundation.jpg"
},
{
"id": "fnd006",
"name": "House of Tara Satin Finish Foundation",
"brand": "House of Tara",
"category": "foundation",
"subcategory": "satin",
"shades": 12,
"price": 13500,
"original_price": 12500,
"rating": 4.6,
"reviews": 4567,
"description": "Satin finish foundation made for Nigerian skin tones",
"benefits": ["Satin finish", "Buildable", "Natural"],
"skin_types": ["normal", "dry"],
"in_stock": True,
"store": "House of Tara",
"url": "https://houseoftara.com/product/satin-foundation",
"tags": ["nigerian_brand"],
"image_url": "/images/hot-foundation.jpg"
},
# ===== LIPSTICKS (8 products) =====
{
"id": "lip001",
"name": "Fenty Beauty Stunna Lip Paint",
"brand": "Fenty Beauty",
"category": "lipstick",
"subcategory": "liquid",
"shades": 8,
"price": 19500,
"original_price": 18500,
"rating": 4.8,
"reviews": 34567,
"description": "Long-wear liquid lipstick in universal shades",
"benefits": ["10hr wear", "Non-drying", "Intense color"],
"in_stock": True,
"store": "Jumia",
"url": "https://www.jumia.com.ng/fenty-stunna",
"image_url": "/images/fenty-lip.jpg"
},
{
"id": "lip002",
"name": "MAC Powder Kiss Lipstick",
"brand": "MAC",
"category": "lipstick",
"subcategory": "matte",
"shades": 20,
"price": 17500,
"original_price": 16500,
"rating": 4.7,
"reviews": 23456,
"description": "Weightless, velvety matte lipstick",
"benefits": ["Weightless", "Velvety", "Long-wear"],
"in_stock": True,
"store": "Jumia",
"url": "https://www.jumia.com.ng/mac-powder-kiss",
"image_url": "/images/mac-lipstick.jpg"
},
{
"id": "lip003",
"name": "Maybelline Superstay Matte Ink",
"brand": "Maybelline",
"category": "lipstick",
"subcategory": "liquid",
"shades": 15,
"price": 8500,
"original_price": 7500,
"rating": 4.7,
"reviews": 67890,
"description": "16-hour wear liquid lipstick",
"benefits": ["16hr wear", "Transfer-proof", "Intense color"],
"in_stock": True,
"store": "Jumia",
"url": "https://www.jumia.com.ng/maybelline-superstay",
"image_url": "/images/maybelline-superstay.jpg"
},
{
"id": "lip004",
"name": "House of Tara Matte Lipstick",
"brand": "House of Tara",
"category": "lipstick",
"subcategory": "matte",
"shades": 12,
"price": 6800,
"original_price": 5800,
"rating": 4.6,
"reviews": 3456,
"description": "Matte lipstick for Nigerian skin tones",
"benefits": ["Matte", "Long-wear", "Affordable"],
"in_stock": True,
"store": "House of Tara",
"url": "https://houseoftara.com/product/matte-lipstick",
"tags": ["nigerian_brand"],
"image_url": "/images/hot-lipstick.jpg"
},
{
"id": "lip005",
"name": "Zaron Velvet Lipstick",
"brand": "Zaron",
"category": "lipstick",
"subcategory": "velvet",
"shades": 10,
"price": 6200,
"original_price": 5200,
"rating": 4.5,
"reviews": 1876,
"description": "Velvet finish lipstick for everyday wear",
"benefits": ["Velvet finish", "Hydrating", "Long-wear"],
"in_stock": True,
"store": "Zaron",
"url": "https://zaroncosmetics.com/product/velvet-lipstick",
"tags": ["nigerian_brand"],
"image_url": "/images/zaron-lipstick.jpg"
},
{
"id": "lip006",
"name": "NARS Powermatte Lip Pigment",
"brand": "NARS",
"category": "lipstick",
"subcategory": "liquid",
"shades": 12,
"price": 22500,
"original_price": 21500,
"rating": 4.8,
"reviews": 12345,
"description": "High-pigment liquid lipstick with matte finish",
"benefits": ["High pigment", "Matte", "Long-wear"],
"in_stock": True,
"store": "Jumia",
"url": "https://www.jumia.com.ng/nars-powermatte",
"image_url": "/images/nars-lip.jpg"
},
{
"id": "lip007",
"name": "Dior Rouge Lipstick",
"brand": "Dior",
"category": "lipstick",
"subcategory": "satin",
"shades": 24,
"price": 28500,
"original_price": 27500,
"rating": 4.9,
"reviews": 23456,
"description": "Hydrating lipstick with satin finish",
"benefits": ["Hydrating", "Satin finish", "Luxury"],
"in_stock": True,
"store": "Jumia",
"url": "https://www.jumia.com.ng/dior-rouge",
"image_url": "/images/dior-lip.jpg"
},
{
"id": "lip008",
"name": "NYX Soft Matte Lip Cream",
"brand": "NYX",
"category": "lipstick",
"subcategory": "matte",
"shades": 24,
"price": 5800,
"original_price": 4800,
"rating": 4.5,
"reviews": 45678,
"description": "Soft matte lip cream with comfortable feel",
"benefits": ["Matte", "Comfortable", "Affordable"],
"in_stock": True,
"store": "Jumia",
"url": "https://www.jumia.com.ng/nyx-soft-matte",
"image_url": "/images/nyx-lip.jpg"
},
# ===== LIP GLOSS (5 products) =====
{
"id": "lipg001",
"name": "Fenty Beauty Gloss Bomb Universal Lip Luminizer",
"brand": "Fenty Beauty",
"category": "lipgloss",
"subcategory": "shimmer",
"shades": 5,
"price": 17500,
"original_price": 16500,
"rating": 4.9,
"reviews": 45678,
"description": "High-shine lip gloss with non-sticky formula",
"benefits": ["High-shine", "Non-sticky", "Plumping effect"],
"in_stock": True,
"store": "Jumia",
"url": "https://www.jumia.com.ng/fenty-gloss-bomb",
"image_url": "/images/fenty-gloss.jpg"
},
{
"id": "lipg002",
"name": "NYX Butter Gloss",
"brand": "NYX",
"category": "lipgloss",
"subcategory": "cream",
"shades": 15,
"price": 6500,
"original_price": 5500,
"rating": 4.6,
"reviews": 34567,
"description": "Creamy, buttery lip gloss",
"benefits": ["Buttery", "Creamy", "Affordable"],
"in_stock": True,
"store": "Jumia",
"url": "https://www.jumia.com.ng/nyx-butter-gloss",
"image_url": "/images/nyx-butter.jpg"
},
{
"id": "lipg003",
"name": "House of Tara Lip Gloss",
"brand": "House of Tara",
"category": "lipgloss",
"subcategory": "shimmer",
"shades": 8,
"price": 5800,
"original_price": 4800,
"rating": 4.5,
"reviews": 2345,
"description": "Shimmer lip gloss for Nigerian women",
"benefits": ["Shimmer", "Hydrating", "Non-sticky"],
"in_stock": True,
"store": "House of Tara",
"url": "https://houseoftara.com/product/lip-gloss",
"tags": ["nigerian_brand"],
"image_url": "/images/hot-gloss.jpg"
},
{
"id": "lipg004",
"name": "Dior Lip Glow Oil",
"brand": "Dior",
"category": "lipgloss",
"subcategory": "oil",
"shades": 8,
"price": 26500,
"original_price": 25500,
"rating": 4.8,
"reviews": 23456,
"description": "Lip oil with cherry oil for shine and care",
"benefits": ["Shine", "Care", "Hydrating"],
"in_stock": True,
"store": "Jumia",
"url": "https://www.jumia.com.ng/dior-lip-glow",
"image_url": "/images/dior-gloss.jpg"
},
{
"id": "lipg005",
"name": "MAC Lipglass",
"brand": "MAC",
"category": "lipgloss",
"subcategory": "high-shine",
"shades": 12,
"price": 14500,
"original_price": 13500,
"rating": 4.6,
"reviews": 23456,
"description": "High-shine lip gloss with non-sticky formula",
"benefits": ["High-shine", "Non-sticky", "Long-wear"],
"in_stock": True,
"store": "Jumia",
"url": "https://www.jumia.com.ng/mac-lipglass",
"image_url": "/images/mac-gloss.jpg"
},
# ===== LIP STAIN (3 products) =====
{
"id": "lips001",
"name": "House of Tara Watermelon Lip Stain",
"brand": "House of Tara",
"category": "lipstain",
"subcategory": "tint",
"shades": 5,
"price": 6800,
"original_price": 5800,
"rating": 4.8,
"reviews": 2345,
"description": "Long-lasting lip stain for Nigerian skin tones",
"benefits": ["8hr wear", "Non-drying", "Buildable color"],
"in_stock": True,
"store": "House of Tara",
"url": "https://houseoftara.com/product/watermelon-lip-stain",
"tags": ["nigerian_brand", "bestseller"],
"image_url": "/images/hot-stain.jpg"
},
{
"id": "lips002",
"name": "Maybelline Superstay Vinyl Ink",
"brand": "Maybelline",
"category": "lipstain",
"subcategory": "liquid",
"shades": 10,
"price": 8500,
"original_price": 7500,
"rating": 4.6,
"reviews": 23456,
"description": "Long-wear lip stain with vinyl finish",
"benefits": ["Long-wear", "Vinyl finish", "Non-drying"],
"in_stock": True,
"store": "Jumia",
"url": "https://www.jumia.com.ng/maybelline-vinyl",
"image_url": "/images/maybelline-vinyl.jpg"
},
{
"id": "lips003",
"name": "Benefit Benetint",
"brand": "Benefit",
"category": "lipstain",
"subcategory": "tint",
"shades": 4,
"price": 18500,
"original_price": 17500,
"rating": 4.8,
"reviews": 34567,
"description": "Iconic rose-tinted lip and cheek stain",
"benefits": ["Multi-use", "Natural flush", "Long-lasting"],
"in_stock": True,
"store": "Jumia",
"url": "https://www.jumia.com.ng/benefit-benetint",
"image_url": "/images/benetint.jpg"
},
# ===== BLUSH (5 products) =====
{
"id": "blu001",
"name": "Rare Beauty Soft Pinch Liquid Blush",
"brand": "Rare Beauty",
"category": "blush",
"subcategory": "liquid",
"shades": 8,
"price": 19500,
"original_price": 18500,
"rating": 4.9,
"reviews": 34567,
"description": "Pigmented liquid blush that melts into skin",
"benefits": ["Pigmented", "Long-wear", "Natural finish"],
"in_stock": True,
"store": "Jumia",
"url": "https://www.jumia.com.ng/rare-blush",
"image_url": "/images/rare-blush.jpg"
},
{
"id": "blu002",
"name": "NARS Blush",
"brand": "NARS",
"category": "blush",
"subcategory": "powder",
"shades": 10,
"price": 23500,
"original_price": 22500,
"rating": 4.8,
"reviews": 45678,
"description": "Iconic powder blush for natural flush",
"benefits": ["Buildable", "Natural", "Long-wear"],
"in_stock": True,
"store": "Jumia",
"url": "https://www.jumia.com.ng/nars-blush",
"image_url": "/images/nars-blush.jpg"
},
{
"id": "blu003",
"name": "House of Tara Cream Blush",
"brand": "House of Tara",
"category": "blush",
"subcategory": "cream",
"shades": 5,
"price": 5800,
"original_price": 4800,
"rating": 4.5,
"reviews": 1876,
"description": "Cream blush for a natural flush",
"benefits": ["Creamy", "Natural", "Affordable"],
"in_stock": True,
"store": "House of Tara",
"url": "https://houseoftara.com/product/cream-blush",
"tags": ["nigerian_brand"],
"image_url": "/images/hot-blush.jpg"
},
{
"id": "blu004",
"name": "Fenty Beauty Cheeks Out Cream Blush",
"brand": "Fenty Beauty",
"category": "blush",
"subcategory": "cream",
"shades": 8,
"price": 18500,
"original_price": 17500,
"rating": 4.8,
"reviews": 23456,
"description": "Buildable cream blush with natural finish",
"benefits": ["Buildable", "Natural", "Easy blend"],
"in_stock": True,
"store": "Jumia",
"url": "https://www.jumia.com.ng/fenty-blush",
"image_url": "/images/fenty-blush.jpg"
},
{
"id": "blu005",
"name": "MAC Powder Blush",
"brand": "MAC",
"category": "blush",
"subcategory": "powder",
"shades": 15,
"price": 15500,
"original_price": 14500,
"rating": 4.7,
"reviews": 23456,
"description": "Highly pigmented powder blush",
"benefits": ["Pigmented", "Buildable", "Long-wear"],
"in_stock": True,
"store": "Jumia",
"url": "https://www.jumia.com.ng/mac-blush",
"image_url": "/images/mac-blush.jpg"
},
# ===== CONTOUR (3 products) =====
{
"id": "con001",
"name": "Fenty Beauty Match Stix Contour Skinstick",
"brand": "Fenty Beauty",
"category": "contour",
"subcategory": "stick",
"shades": 10,
"price": 19500,
"original_price": 18500,
"rating": 4.7,
"reviews": 23456,
"description": "Contour stick for easy sculpting",
"benefits": ["Easy blend", "Natural", "Buildable"],
"in_stock": True,
"store": "Jumia",
"url": "https://www.jumia.com.ng/fenty-match-stix",
"image_url": "/images/fenty-contour.jpg"
},
{
"id": "con002",
"name": "NYX Professional Makeup Wonder Stick",
"brand": "NYX",
"category": "contour",
"subcategory": "stick",
"shades": 6,
"price": 7500,
"original_price": 6500,
"rating": 4.5,
"reviews": 34567,
"description": "Dual-ended contour and highlight stick",
"benefits": ["Dual-ended", "Easy blend", "Affordable"],
"in_stock": True,
"store": "Jumia",
"url": "https://www.jumia.com.ng/nyx-wonder-stick",
"image_url": "/images/nyx-contour.jpg"
},
{
"id": "con003",
"name": "Anastasia Beverly Hills Contour Kit",
"brand": "Anastasia Beverly Hills",
"category": "contour",
"subcategory": "powder",
"shades": 6,
"price": 28500,
"original_price": 27500,
"rating": 4.8,
"reviews": 23456,
"description": "Contour kit with 6 powder shades",
"benefits": ["Buildable", "Blendable", "Natural"],
"in_stock": True,
"store": "Jumia",
"url": "https://www.jumia.com.ng/abh-contour",
"image_url": "/images/abh-contour.jpg"
},
# ===== EYESHADOW (5 products) =====
{
"id": "eye001",
"name": "Urban Decay Naked Heat Palette",
"brand": "Urban Decay",
"category": "eyeshadow",
"subcategory": "palette",
"shades": 12,
"price": 29500,
"original_price": 28500,
"rating": 4.8,
"reviews": 45678,
"description": "Warm-toned eyeshadow palette",
"benefits": ["Pigmented", "Blendable", "Long-wear"],
"in_stock": True,
"store": "Jumia",
"url": "https://www.jumia.com.ng/naked-heat",
"image_url": "/images/naked-heat.jpg"
},
{
"id": "eye002",
"name": "Anastasia Beverly Hills Soft Glam Palette",
"brand": "Anastasia Beverly Hills",
"category": "eyeshadow",
"subcategory": "palette",
"shades": 14,
"price": 27500,
"original_price": 26500,
"rating": 4.9,
"reviews": 56789,
"description": "Everyday neutral eyeshadow palette",
"benefits": ["Neutral shades", "Buttery texture", "Blendable"],
"in_stock": True,
"store": "Jumia",
"url": "https://www.jumia.com.ng/abh-soft-glam",
"image_url": "/images/abh-soft-glam.jpg"
},
{
"id": "eye003",
"name": "House of Tara Eyeshadow Palette",
"brand": "House of Tara",
"category": "eyeshadow",
"subcategory": "palette",
"shades": 9,
"price": 9500,
"original_price": 8500,
"rating": 4.4,
"reviews": 2345,
"description": "Eyeshadow palette for Nigerian skin tones",
"benefits": ["Pigmented", "Affordable", "Versatile"],
"in_stock": True,
"store": "House of Tara",
"url": "https://houseoftara.com/product/eyeshadow-palette",
"tags": ["nigerian_brand"],
"image_url": "/images/hot-eyeshadow.jpg"
},
{
"id": "eye004",
"name": "MAC Eyeshadow Single",
"brand": "MAC",
"category": "eyeshadow",
"subcategory": "single",
"shades": 50,
"price": 6500,
"original_price": 5500,
"rating": 4.7,
"reviews": 34567,
"description": "Single eyeshadow pan with high pigment",
"benefits": ["Pigmented", "Buildable", "Long-wear"],
"in_stock": True,
"store": "Jumia",
"url": "https://www.jumia.com.ng/mac-eyeshadow",
"image_url": "/images/mac-eyeshadow.jpg"
},
{
"id": "eye005",
"name": "Huda Beauty Mercury Retrograde Palette",
"brand": "Huda Beauty",
"category": "eyeshadow",
"subcategory": "palette",
"shades": 18,
"price": 32500,
"original_price": 31500,
"rating": 4.8,
"reviews": 34567,
"description": "Ethereal eyeshadow palette with pastels and neutrals",
"benefits": ["Pigmented", "Versatile", "Long-wear"],
"in_stock": True,
"store": "Jumia",
"url": "https://www.jumia.com.ng/huda-retrograde",
"image_url": "/images/huda-palette.jpg"
},
# ===== MASCARA (4 products) =====
{
"id": "mas001",
"name": "Benefit They're Real Mascara",
"brand": "Benefit",
"category": "mascara",
"subcategory": "volumizing",
"price": 19500,
"original_price": 18500,
"rating": 4.8,
"reviews": 34567,
"description": "Lengthening and volumizing mascara",
"benefits": ["Lengthening", "Volumizing", "Long-wear"],
"in_stock": True,
"store": "Jumia",
"url": "https://www.jumia.com.ng/benefit-mascara",
"image_url": "/images/benefit-mascara.jpg"
},
{
"id": "mas002",
"name": "Maybelline Lash Sensational Mascara",
"brand": "Maybelline",
"category": "mascara",
"subcategory": "volumizing",
"price": 6500,
"original_price": 5500,
"rating": 4.7,
"reviews": 123456,
"description": "Fanning effect mascara for full lashes",
"benefits": ["Fanning", "Volumizing", "Affordable"],
"in_stock": True,
"store": "Jumia",
"url": "https://www.jumia.com.ng/maybelline-lash",
"image_url": "/images/maybelline-lash.jpg"
},
{
"id": "mas003",
"name": "Too Faced Better Than Sex Mascara",
"brand": "Too Faced",
"category": "mascara",
"subcategory": "volumizing",
"price": 18500,
"original_price": 17500,
"rating": 4.8,
"reviews": 56789,
"description": "Volumizing mascara for intense lashes",
"benefits": ["Intense volume", "Long-wear", "Lengthening"],
"in_stock": True,
"store": "Jumia",
"url": "https://www.jumia.com.ng/too-faced",
"image_url": "/images/too-faced-mascara.jpg"
},
{
"id": "mas004",
"name": "MAC Extended Play Mascara",
"brand": "MAC",
"category": "mascara",
"subcategory": "lengthening",
"price": 14500,
"original_price": 13500,
"rating": 4.6,
"reviews": 23456,
"description": "Long-wear mascara for extended play",
"benefits": ["Long-wear", "Smudge-proof", "Lengthening"],
"in_stock": True,
"store": "Jumia",
"url": "https://www.jumia.com.ng/mac-mascara",
"image_url": "/images/mac-mascara.jpg"
},
# ===== EYELINER (4 products) =====
{
"id": "eln001",
"name": "Fenty Beauty Flypencil Longwear Pencil Eyeliner",
"brand": "Fenty Beauty",
"category": "eyeliner",
"subcategory": "pencil",
"shades": 10,
"price": 13500,
"original_price": 12500,
"rating": 4.7,
"reviews": 12345,
"description": "Long-wear pencil eyeliner",
"benefits": ["Long-wear", "Creamy", "Waterproof"],
"in_stock": True,
"store": "Jumia",
"url": "https://www.jumia.com.ng/fenty-flypencil",
"image_url": "/images/fenty-liner.jpg"
},
{
"id": "eln002",
"name": "Maybelline Tattoo Studio Gel Pencil Liner",
"brand": "Maybelline",
"category": "eyeliner",
"subcategory": "gel",
"shades": 6,
"price": 5500,
"original_price": 4500,
"rating": 4.6,
"reviews": 56789,
"description": "Gel eyeliner with 36-hour wear",
"benefits": ["36hr wear", "Waterproof", "Affordable"],
"in_stock": True,
"store": "Jumia",
"url": "https://www.jumia.com.ng/maybelline-tattoo",
"image_url": "/images/maybelline-liner.jpg"
},
{
"id": "eln003",
"name": "NYX Epic Ink Liner",
"brand": "NYX",
"category": "eyeliner",
"subcategory": "liquid",
"shades": 3,
"price": 5800,
"original_price": 4800,
"rating": 4.5,
"reviews": 45678,
"description": "Waterproof liquid eyeliner with felt tip",
"benefits": ["Waterproof", "Precise", "Long-wear"],
"in_stock": True,
"store": "Jumia",
"url": "https://www.jumia.com.ng/nyx-epic-liner",
"image_url": "/images/nyx-liner.jpg"
},
{
"id": "eln004",
"name": "MAC Liquidlast Liner",
"brand": "MAC",
"category": "eyeliner",
"subcategory": "liquid",
"shades": 8,
"price": 14500,
"original_price": 13500,
"rating": 4.6,
"reviews": 23456,
"description": "Waterproof liquid eyeliner",
"benefits": ["Waterproof", "Intense", "Long-wear"],
"in_stock": True,
"store": "Jumia",
"url": "https://www.jumia.com.ng/mac-liquidlast",
"image_url": "/images/mac-liner.jpg"
},
# ===== BODY CARE (5 products) =====
{
"id": "bod001",
"name": "Sol de Janeiro Brazilian Bum Bum Cream",
"brand": "Sol de Janeiro",
"category": "body_care",
"subcategory": "cream",
"size": "240ml",
"price": 29500,
"original_price": 28500,
"rating": 4.9,
"reviews": 78901,
"description": "Firming and smoothing body cream",
"benefits": ["Firming", "Smoothing", "Hydrating"],
"in_stock": True,
"store": "Jumia",
"url": "https://www.jumia.com.ng/sol-bum-bum",
"image_url": "/images/sol-bumbum.jpg"
},
{
"id": "bod002",
"name": "Tree Hut Moroccan Rose Body Scrub",
"brand": "Tree Hut",
"category": "body_care",
"subcategory": "scrub",
"size": "510g",
"price": 15500,
"original_price": 14500,
"rating": 4.8,
"reviews": 45678,
"description": "Exfoliating body scrub with shea butter",
"benefits": ["Exfoliating", "Hydrating", "Smoothing"],
"in_stock": True,
"store": "Jumia",
"url": "https://www.jumia.com.ng/treehut-scrub",
"image_url": "/images/treehut-scrub.jpg"
},
{
"id": "bod003",
"name": "Frank Body Original Coffee Scrub",
"brand": "Frank Body",
"category": "body_care",
"subcategory": "scrub",
"size": "200g",
"price": 18500,
"original_price": 17500,
"rating": 4.7,
"reviews": 34567,
"description": "Coffee-based body scrub for glowing skin",
"benefits": ["Exfoliating", "Glow", "Caffeine"],
"in_stock": True,
"store": "Jumia",
"url": "https://www.jumia.com.ng/frank-body",
"image_url": "/images/frank-body.jpg"
},
{
"id": "bod004",
"name": "The Body Shop Shea Body Butter",
"brand": "The Body Shop",
"category": "body_care",
"subcategory": "butter",
"size": "200ml",
"price": 15500,
"original_price": 14500,
"rating": 4.7,
"reviews": 56789,
"description": "Intensely moisturizing shea body butter",
"benefits": ["Moisturizing", "Nourishing", "Long-lasting"],
"in_stock": True,
"store": "Jumia",
"url": "https://www.jumia.com.ng/body-shop-shea",
"image_url": "/images/body-shop.jpg"
},
{
"id": "bod005",
"name": "Dove Deep Moisture Body Wash",
"brand": "Dove",
"category": "body_care",
"subcategory": "wash",
"size": "400ml",
"price": 5500,
"original_price": 4500,
"rating": 4.5,
"reviews": 123456,
"description": "Deep moisture body wash with NutriumMoisture",
"benefits": ["Moisturizing", "Gentle", "Affordable"],
"in_stock": True,
"store": "Jumia",
"url": "https://www.jumia.com.ng/dove-wash",
"image_url": "/images/dove-wash.jpg"
}
]
print(f"✅ Loaded {len(self.products)} initial products")
async def update_price_from_url(self, product):
"""Fetch current price from product URL"""
try:
async with httpx.AsyncClient(timeout=10.0, follow_redirects=True) as client:
response = await client.get(product['url'], headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
})
if response.status_code == 200:
soup = BeautifulSoup(response.text, 'html.parser')
# Try to find price (different for each store)
price_selectors = [
'.price', '.product-price', '.current-price',
'[itemprop="price"]', '.sale-price', '.regular-price',
'span.price', 'div.price', '.product__price',
'.money', '.price-item', '.price--sale'
]
for selector in price_selectors:
price_elem = soup.select_one(selector)
if price_elem:
price_text = price_elem.get_text(strip=True)
# Extract numbers from price text
numbers = re.findall(r'[\d,]+', price_text)
if numbers:
price_str = numbers[0].replace(',', '')
try:
new_price = int(price_str)
# Check if product is still available
out_of_stock_selectors = ['.sold-out', '.out-of-stock', '.unavailable', '.sold_out']
in_stock = True
for selector in out_of_stock_selectors:
if soup.select_one(selector):
in_stock = False
break
return {
'price': new_price,
'in_stock': in_stock,
'last_checked': datetime.utcnow().isoformat()
}
except:
pass
# If page not found (404), mark as out of stock
if response.status_code == 404:
return {
'price': product['price'],
'in_stock': False,
'last_checked': datetime.utcnow().isoformat(),
'error': 'Page not found'
}
except Exception as e:
logger.error(f"Error updating {product['id']}: {e}")
return None
async def update_all_prices(self):
"""Update prices for all products"""
logger.info("🔄 Starting price update for all products...")
for product in self.products:
if 'url' in product:
try:
update = await self.update_price_from_url(product)
if update:
old_price = product['price']
product['price'] = update['price']
product['in_stock'] = update['in_stock']
product['last_updated'] = update['last_checked']
if old_price != update['price']:
logger.info(f"💰 Price changed for {product['name']}: ₦{old_price} → ₦{update['price']}")
# Be nice to servers - don't hammer them
await asyncio.sleep(2)
except Exception as e:
logger.error(f"Failed to update {product['id']}: {e}")
logger.info("✅ Price update complete")
def get_product(self, product_id: str):
"""Get single product by ID"""
for product in self.products:
if product['id'] == product_id:
return product
return None
def get_products_by_category(self, category: str):
"""Get products by category"""
return [p for p in self.products if p['category'] == category]
def get_products_by_brand(self, brand: str):
"""Get products by brand"""
return [p for p in self.products if p['brand'].lower() == brand.lower()]
def get_products_by_price_range(self, min_price: int, max_price: int):
"""Get products within price range"""
return [p for p in self.products if min_price <= p['price'] <= max_price]
def get_in_stock_products(self):
"""Get only in-stock products"""
return [p for p in self.products if p.get('in_stock', True)]
def search_products(self, query: str):
"""Search products by name, brand, or description"""
query = query.lower()
results = []
for p in self.products:
if (query in p['name'].lower() or
query in p['brand'].lower() or
query in p.get('description', '').lower()):
results.append(p)
return results
# Initialize product database
product_db = ProductDatabase()
# ============================================
# AUTO-UPDATE TASK
# ============================================
async def update_all_prices_periodically():
"""Run price updates every 6 hours"""
while True:
try:
await product_db.update_all_prices()
logger.info("⏰ Next price update in 6 hours")
await asyncio.sleep(6 * 60 * 60) # 6 hours
except Exception as e:
logger.error(f"Price update cycle failed: {e}")
await asyncio.sleep(60) # Wait 1 minute on error
# ============================================
# REAL FACE DETECTION & SKIN ANALYSIS
# ============================================
def get_skin_tone_hex(tone):
"""Convert skin tone to hex color"""
tone_map = {
"fair": "#F5E6D3",
"light": "#E8D9C2",
"medium": "#D4B99B",
"tan": "#B58C6F",
"deep": "#8B5A3C",
"dark": "#6D3F2C"
}
return tone_map.get(tone.lower(), "#D4B99B")
def generate_shade_matches(skin_tone, undertone):
"""Generate shade matches based on skin tone and undertone"""
matches = {
"fair": {
"warm": ["Cream Nude", "Peach Nude"],
"cool": ["Pink Nude", "Rose"],
"neutral": ["Beige Nude", "Mauve"],
"olive": ["Warm Beige", "Golden Nude"]
},
"light": {
"warm": ["Golden Beige", "Honey"],
"cool": ["Rose Beige", "Dusty Rose"],
"neutral": ["Natural Beige", "Mauve Rose"],
"olive": ["Olive Beige", "Warm Nude"]
},
"medium": {
"warm": ["Caramel", "Warm Tan"],
"cool": ["Rose Tan", "Berry"],
"neutral": ["Tawny", "Mauve"],
"olive": ["Olive Tan", "Golden Olive"]
},
"tan": {
"warm": ["Amber", "Bronze"],
"cool": ["Wine", "Plum"],
"neutral": ["Copper", "Terracotta"],
"olive": ["Olive Bronze", "Warm Bronze"]
},
"deep": {
"warm": ["Mahogany", "Espresso"],
"cool": ["Burgundy", "Deep Wine"],
"neutral": ["Cocoa", "Mocha"],
"olive": ["Deep Olive", "Warm Cocoa"]
},
"dark": {
"warm": ["Rich Brown", "Dark Amber"],
"cool": ["Deep Berry", "Dark Wine"],
"neutral": ["Dark Cocoa", "Ebony"],
"olive": ["Dark Olive", "Rich Espresso"]
}
}
return matches.get(skin_tone.lower(), {}).get(undertone.lower(), ["Universal"])
# ============================================
# REAL FACE DETECTION FUNCTION (THE FIX)
# ============================================
def detect_face_and_analyze(image_bytes):
"""
Actually detect face and analyze skin using real computer vision
"""
try:
# Convert bytes to OpenCV image
nparr = np.frombuffer(image_bytes, np.uint8)
img = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
if img is None:
return None, "Could not read image"
# Load face detection model
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
# Convert to grayscale for face detection
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Detect faces
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(50, 50))
if len(faces) == 0:
return None, "No face detected in the image. Please upload a clear photo of your face with good lighting."
# Use the largest face detected
largest_face = max(faces, key=lambda rect: rect[2] * rect[3])
x, y, w, h = largest_face
# Extract face region
face_roi = img[y:y+h, x:x+w]
# Analyze skin tone from face region
hsv_face = cv2.cvtColor(face_roi, cv2.COLOR_BGR2HSV)
avg_hue = np.mean(hsv_face[:,:,0])
avg_saturation = np.mean(hsv_face[:,:,1])
avg_value = np.mean(hsv_face[:,:,2])
# Determine skin tone
if avg_value > 180:
skin_tone = "fair"
elif avg_value > 150:
skin_tone = "light"
elif avg_value > 120:
skin_tone = "medium"
elif avg_value > 90:
skin_tone = "tan"
elif avg_value > 60:
skin_tone = "deep"
else:
skin_tone = "dark"
# Determine undertone
if avg_hue < 10 or avg_hue > 170:
undertone = "cool"
elif avg_hue < 30:
undertone = "warm"
elif avg_hue < 80:
undertone = "neutral"
else:
undertone = "olive"
# Texture analysis
gray_face = cv2.cvtColor(face_roi, cv2.COLOR_BGR2GRAY)
laplacian_var = cv2.Laplacian(gray_face, cv2.CV_64F).var()
# Detect skin issues
conditions = []
# Check for acne (red spots)
red_mask = cv2.inRange(hsv_face, np.array([0, 50, 50]), np.array([10, 255, 255]))
red_mask2 = cv2.inRange(hsv_face, np.array([170, 50, 50]), np.array([180, 255, 255]))
red_spots = cv2.bitwise_or(red_mask, red_mask2)
red_percentage = np.sum(red_spots > 0) / (h * w)
if red_percentage > 0.05:
conditions.append({
"id": "acne",
"name": "Acne/Pimples",
"confidence": min(95, int(60 + red_percentage * 500))
})
# Check for oily vs dry skin
oily_mask = cv2.inRange(hsv_face, np.array([10, 80, 100]), np.array([30, 255, 255]))
oily_percentage = np.sum(oily_mask > 0) / (h * w)
if oily_percentage > 0.3:
conditions.append({
"id": "oily-skin",
"name": "Oily Skin",
"confidence": min(90, int(50 + oily_percentage * 100))
})
elif avg_saturation < 40 and avg_value > 150:
conditions.append({
"id": "dry-skin",
"name": "Dry Skin",
"confidence": 75
})
# Check for hyperpigmentation
lab_face = cv2.cvtColor(face_roi, cv2.COLOR_BGR2LAB)
l_channel = lab_face[:,:,0]
avg_l = np.mean(l_channel)
dark_spots = l_channel < (avg_l * 0.7)
dark_percentage = np.sum(dark_spots) / (h * w)
if dark_percentage > 0.03:
conditions.append({
"id": "hyperpigmentation",
"name": "Hyperpigmentation",
"confidence": min(85, int(50 + dark_percentage * 300))
})
# Check for wrinkles/fine lines
edges = cv2.Canny(gray_face, 50, 150)
edge_density = np.sum(edges > 0) / (h * w)
if edge_density > 0.15:
conditions.append({
"id": "fine-lines",
"name": "Fine Lines/Wrinkles",
"confidence": min(80, int(50 + edge_density * 150))
})
# Ensure we have at least 2 conditions
if len(conditions) < 2:
if avg_saturation < 60:
conditions.append({
"id": "dehydrated-skin",
"name": "Dehydrated Skin",
"confidence": 70
})
elif avg_saturation > 120:
conditions.append({
"id": "combination-skin",
"name": "Combination Skin",
"confidence": 68
})
return {
"skin_tone": {
"primary": skin_tone,
"undertone": undertone,
"confidence": round(70 + avg_value / 10, 1),
"hex": get_skin_tone_hex(skin_tone)
},
"conditions": conditions[:5],
"analysis_type": "real_cv",
"face_detected": True,
"face_confidence": min(99, int(len(faces) * 30)),
"timestamp": datetime.utcnow().isoformat()
}, None
except Exception as e:
logger.error(f"Face detection error: {e}")
return None, str(e)
async def real_skin_analysis(image_bytes):
"""Use REAL face detection and skin analysis"""
result, error = detect_face_and_analyze(image_bytes)
if result:
logger.info(f"✅ Face detected! Skin tone: {result['skin_tone']['primary']}, Conditions: {len(result['conditions'])}")
return result
# If no face detected, return error
return {
"error": True,
"message": error or "No face detected. Please upload a clear photo of your face with good lighting.",
"conditions": [],
"analysis_type": "error",
"success": False
}
# ============================================
# API ENDPOINTS
# ============================================
@app.get("/")
async def root():
global client, HF_TOKEN
return {
"service": "Glow AI - Skincare & Cosmetics AI",
"version": "2.0.0",
"status": "operational",
"hf_token_configured": bool(HF_TOKEN),
"hf_available": HF_AVAILABLE,
"hf_connected": bool(client),
"products_loaded": len(product_db.products),
"endpoints": [
"/health",
"/api/analyze-skin",
"/api/products",
"/api/products/{category}",
"/api/products/search/{query}",
"/api/update-prices",
"/ws/chat"
]
}
@app.get("/health")
async def health_check():
global client
return {
"status": "healthy",
"timestamp": datetime.utcnow().isoformat(),
"hf_connected": bool(client),
"products_count": len(product_db.products),
"in_stock_count": len(product_db.get_in_stock_products())
}
@app.get("/test-token")
async def test_token():
global client
result = {
"hf_token_exists": bool(os.getenv("HF_TOKEN")),
"hf_token_prefix": os.getenv("HF_TOKEN", "")[:10] + "..." if os.getenv("HF_TOKEN") else None,
"client_initialized": bool(client),
"hf_available": HF_AVAILABLE
}
# Try to test the connection
if client:
try:
test_result = client.image_classification(
"https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/pipeline-cat.jpg",
model="microsoft/resnet-50"
)
result["connection_test"] = "success"
result["sample_result"] = str(test_result[:2]) # First 2 results
except Exception as e:
result["connection_test"] = f"failed: {str(e)}"
else:
result["connection_test"] = "client not initialized"
return result
@app.get("/api/products")
async def get_all_products(
category: Optional[str] = None,
brand: Optional[str] = None,
min_price: Optional[int] = None,
max_price: Optional[int] = None,
in_stock_only: bool = False,
limit: int = 50
):
"""Get products with optional filters"""
try:
products = product_db.products
if category:
products = [p for p in products if p['category'] == category]
if brand:
products = [p for p in products if p['brand'].lower() == brand.lower()]
if min_price is not None:
products = [p for p in products if p['price'] >= min_price]
if max_price is not None:
products = [p for p in products if p['price'] <= max_price]
if in_stock_only:
products = [p for p in products if p.get('in_stock', True)]
return {
"total": len(products),
"products": products[:limit],
"filters_applied": {
"category": category,
"brand": brand,
"min_price": min_price,
"max_price": max_price,
"in_stock_only": in_stock_only
}
}
except Exception as e:
raise HTTPException(status_code=400, detail=str(e))
@app.get("/api/products/{product_id}")
async def get_product(product_id: str):
"""Get single product by ID"""
product = product_db.get_product(product_id)
if not product:
raise HTTPException(status_code=404, detail="Product not found")
return product
@app.get("/api/products/category/{category}")
async def get_products_by_category(category: str):
"""Get products by category"""
products = product_db.get_products_by_category(category)
return {
"category": category,
"count": len(products),
"products": products
}
@app.get("/api/products/search/{query}")
async def search_products(query: str):
"""Search products by name, brand, or description"""
results = product_db.search_products(query)
return {
"query": query,
"count": len(results),
"results": results
}
@app.post("/api/update-prices")
async def trigger_price_update():
"""Manually trigger price update"""
asyncio.create_task(product_db.update_all_prices())
return {"status": "started", "message": "Price update initiated"}
# ============================================
# SKIN ANALYSIS ENDPOINT (FIXED - REAL DETECTION)
# ============================================
@app.post("/api/analyze-skin")
async def analyze_skin(request: Request):
"""Analyze skin from uploaded image using REAL face detection"""
try:
# Get the image from request
body = await request.json()
image_base64 = body.get("image")
if not image_base64:
return {"success": False, "error": "No image provided", "conditions": []}
# Remove data URL prefix if present
if ',' in image_base64:
image_base64 = image_base64.split(',')[1]
# Convert base64 to bytes
image_bytes = base64.b64decode(image_base64)
# Run real face detection and analysis
result = await real_skin_analysis(image_bytes)
# Check if result contains error
if result.get("error"):
return {
"success": False,
"error": result.get("message"),
"conditions": [],
"skin_tone": None,
"analysis_type": result.get("analysis_type", "error")
}
# Format successful response
return {
"success": True,
"skin_tone": result["skin_tone"],
"conditions": result["conditions"],
"analysis_type": result["analysis_type"],
"timestamp": result["timestamp"],
"face_detected": result.get("face_detected", False),
"message": f"✅ Found {len(result['conditions'])} skin condition(s)."
}
except Exception as e:
logger.error(f"Analysis failed: {e}")
return {"success": False, "error": str(e), "conditions": []}
# ============================================
# WEBSOCKET CHAT (Customer Support)
# ============================================
class ConnectionManager:
def __init__(self):
self.active_connections: List[WebSocket] = []
self.support_online = True
self.message_history = []
async def connect(self, websocket: WebSocket):
await websocket.accept()
self.active_connections.append(websocket)
# Send message history
for msg in self.message_history[-10:]: # Last 10 messages
await websocket.send_json(msg)
def disconnect(self, websocket: WebSocket):
if websocket in self.active_connections:
self.active_connections.remove(websocket)
async def send_message(self, message: dict, websocket: WebSocket):
await websocket.send_json(message)
async def broadcast_to_support(self, message: dict):
# In production, this would go to a support dashboard
logger.info(f"💬 Support message: {message}")
self.message_history.append(message)
manager = ConnectionManager()
@app.websocket("/ws/chat")
async def websocket_endpoint(websocket: WebSocket):
await manager.connect(websocket)
try:
# Send welcome message
welcome_msg = {
"type": "system",
"message": "👋 Welcome to Glow AI Support! How can we help you today?",
"timestamp": datetime.utcnow().isoformat()
}
await manager.send_message(welcome_msg, websocket)
# Send quick replies
quick_replies = {
"type": "quick_replies",
"replies": [
"Product recommendations",
"Order status",
"Shipping info",
"Returns policy",
"Skin analysis help"
],
"timestamp": datetime.utcnow().isoformat()
}
await manager.send_message(quick_replies, websocket)
while True:
data = await websocket.receive_text()
# Parse message (could be JSON or plain text)
try:
msg_data = json.loads(data)
message = msg_data.get("message", "")
user_name = msg_data.get("user", "Customer")
except:
message = data
user_name = "Customer"
# Log to support
customer_msg = {
"type": "customer",
"user": user_name,
"message": message,
"timestamp": datetime.utcnow().isoformat()
}
await manager.broadcast_to_support(customer_msg)
# Auto-reply logic
await asyncio.sleep(1) # Simulate typing
# Smart replies based on keywords
responses = {
"product": "You can browse our products in the Shop tab. Use the search and filters to find exactly what you need! 🛍️",
"order": "To check your order status, please provide your order number and I'll look it up for you.",
"shipping": "We offer shipping throughout Nigeria. Delivery takes 2-5 business days. Free shipping on orders over ₦25,000! 🚚",
"return": "We accept returns within 14 days of delivery. Items must be unopened and in original packaging.",
"analysis": "Our AI skin analysis is in the Analysis tab! Upload a photo and get personalized recommendations. ✨",
"price": f"Our products range from ₦3,800 to ₦35,000. You can filter by price in the shop!",
"help": "I can help with: \n• Product recommendations\n• Order status\n• Shipping info\n• Returns\n• Skin analysis\nWhat would you like to know?",
"default": "Thank you for your message! A support agent will respond shortly. For faster help, try asking about: products, orders, shipping, returns, or analysis."
}
# Find best response
reply = responses["default"]
for key, response in responses.items():
if key in message.lower():
reply = response
break
support_reply = {
"type": "support",
"message": reply,
"timestamp": datetime.utcnow().isoformat()
}
await manager.send_message(support_reply, websocket)
except WebSocketDisconnect:
manager.disconnect(websocket)
logger.info("Client disconnected from chat")
except Exception as e:
logger.error(f"WebSocket error: {e}")
manager.disconnect(websocket)
# ============================================
# GRADIO UI
# ============================================
def skin_analysis_ui(image, manual_conditions):
"""Gradio interface for skin analysis"""
return "Gradio interface - Use the API endpoints instead"
with gr.Blocks(title="Glow AI API", theme=gr.themes.Soft()) as demo:
gr.Markdown("""
# ✨ Glow AI API
This Space provides API endpoints for skin analysis and product data.
Use the `/api/analyze-skin` endpoint for skin analysis.
""")
# Mount Gradio app to FastAPI
app = gr.mount_gradio_app(app, demo, path="/")
# For direct running
if __name__ == "__main__":
port = int(os.getenv("PORT", 7860))
uvicorn.run(app, host="0.0.0.0", port=port)